Visualizza versione completa : char(1) in oracle.
Fast-M
12-01-2005, 11.50.54
Salve, dovrei scrivere in una tabella di oracle usando access con odbc un flag di tipo 0-1 in un campo che è dichiarato char(1).
Nella maschera di access ho usato una checkbox, ma appena eseguo un click su di questa mi compare il messaggio di errore che informa di non potere scrivere il valore nella tabella perchè ci sono troppi dati nel valore.
E' sicuramente un problema di tipo di dato che in access viene trattato come integer mentre quel campo in oracle è dichiarato come char(1) che dovrebbe essere un byte.
Come faccio a risolvere il problema?
Grazie in anticipo!
:)
Xtefano
12-01-2005, 12.22.06
In Oracle una colonna CHAR è di tipo carattere a lunghezza fissa (= CHAR 10 occupa sempre 10 caratteri, eventualmente con blank a destra). Per quanto ne so è praticamente in disuso. Viene utilizzato il VARCHAR che, com'è ovvio, è a lunghezza variabile.
Di Access so poco e niente e replicare la tua situazione è per me lunghetto ora come ora. Ho però fatto la prova direttamente su Oracle
SQL> create table xx (pippo char(1));
Creata tabella.
SQL> create table xxx (pippo integer);
Creata tabella.
SQL> insert into xxx values (1);
Creata 1 riga.
SQL> select * from xxx;
PIPPO
----------
1
SQL> insert into xx select * from xxx;
Creata 1 riga.
SQL> select * from xx;
P
-
1
Come vedi va via sparato anche senza "strane" funzioni.
Mi sa che il problema è da qualche altra parte ....
HTH
Byez
Stefano
Fast-M
12-01-2005, 12.58.06
Non è il problema ad essere un altro, ma è proprio l'oggetto della domanda che è diverso da quello che hai trattato.
Grazie comunque.
:)
Xtefano
12-01-2005, 14.13.04
Mmmhhh... allora non ho capito io.
Riepilogo e vediamo se ci prendo:
* hai un checkbox in Access (trattato come integer) che può valere 0/1
* questo valore deve finire in una colonna di una tabella Oracle definita CHAR 1
* se ci provi ti restituisce l'errore "valore troppo lungo" o qc di simile
Isolando il problema "dentro" Oracle ho creato una tabella con una sola colonna INTEGER ed un'altra con una sola colonna CHAR 1. Inserendo un valore ad 1 cifra nella colonna INTEGER e da qui nella colonna CHAR ottengo una TO_CHAR implicita che, come puoi vedere, funziona.
Suppongo quindi che il problema sia "fuori" da Oracle, o nel driver (mi sembra di ricordare che qualche tempo fa ne abbiamo parlato ...) o in Access ....
.... ma può anche essere che non ho proprio capito la questione ....
cmq HTH
Byez
Stefano
LoryOne
12-01-2005, 14.45.54
Molto probabilmente la checkbox fa riferimento ad una colonna in una tabella in cui il Tipo dati è Si/No. Indifferentemente dal formato, dalla guida di ACCESS questo tipo dati risulta pesare 1 bit, mentre la tipologia char di Oracle prende in considerazione byte, cioè 8 bit.
Fast-M
12-01-2005, 14.48.43
Si il problema è in access, non in oracle. Dovrei fare in modo che il controllo checkbox che ho associato ad un campo di una tabella di oracle, generi un valore di 1 byte anzicchè di 2 byte(cioè integer) come è di default.
In modo che quando seleziono la checkbox, access non vada a scrivere in quel campo della tabella 16 bit, ma 8.
Forse non conosco io il modo in access per convertire il tipo di dato generato da un controllo.
:|
LoryOne
12-01-2005, 15.16.28
Dunque:
Inserisco una checkbox (non associata) in una maschera e la chiamo Pippo, poi inserisco un pulsante e lo chiamo Pluto.
Nell'evento Click di Pluto scrivo 'ste poche righe di codice e...
msgbox Pippo.Value
Se spuntato vale -1
Se non spuntato vale 0
msgbox LenB(Pippo.Value) equivalente a sizeof(...)
Se spuntato vale 4
Se non spuntato vale 2
A questo punto la vedo dura ma solo se il controllo è associato , mentre non dovrebbero esserci problemi utilizzando SQL.
Fast-M
12-01-2005, 15.45.38
Scusa Lory, ma ho difficoltà a capire perchè hai messo in gioco anche un pulsante.
Il problema è un po più semplice di come lo hai descritto.
C'è solo una checkbox associata che di default in access genera un valore integer, mentre la mia tabella di Oracle richiede un byte.
C'è una via per convertire il tipo di default di un controllo in access?
O la via più breve è quella di non associare il controllo e lavorare tremite degli Execute("...") a mano?
Grazie tante!
:)
LoryOne
12-01-2005, 16.20.30
E' proprio questo il problema.
Non è il valore ma la dimensione in bytes atta a contenere un determinato dato. (e non è da poco)
Tralasciando VBA, conosci un linguaggio che possa ridurre da integer a byte la memoria destinata a contenere un valore ?
Se fosse solo un problema di valore e non di memoria atta a contenerlo nel tuo caso non vi sarebbero problemi, invece l'associazione di un controllo è strettamente legato alla tipologia della colonna inserita nella struttura di una tabella.
Se anche esistesse la possibilità di ridefinire la quantità di memoria atta a contenrre un dato, questa dovrebbe necessariamente essere riallocata prima dello scatenarsi dell'evento change del controllo e sinceramente non saprei come intervenire.
Sarebbe una cosa eccezzionale se una volta definita una variabile Integer, tale variabile si potesse ridefinirla Byte, liberando un byte di memoria usufruibile in altro modo, non credi ?
Ps: Può darsi che io stia sparando la più grande cazzata del secolo ma che io sia pazzo è risaputo :D
Deep73
12-01-2005, 18.21.27
Ma scusa la check non la puoi associare ad un OnClick e lì dentro esegui la variazione del campo Oracle prima del post (tipo check True => 'S' , check False => 'N')?
La conversione devi farla a mano: il tipo Booleano di VBA è complicato e molto + grande del char(1) che di fatto è 1 byte.
Fast-M
12-01-2005, 18.43.03
Beh, il problema infatti è proprio di tipo di dato e non di valore. Ma comunque in qualsiasi linguaggio ci sono le funzioni di conversione dei tipi come per esempio in vb o in access con vba come cbyte, cbool e simili che servono proprio a questo scopo e cioè a definire quanti byte debbano essere usati in memoria per memorizzare un valore che di default ha invece una sua rappresentazione.
Mi chiedevo quindi se era possibile da codice, magari in un evento click, modificare il tipo della proprietà value di un controllo o comunque quale è la via che si segue in questi casi.
:|
vBulletin® v3.8.6, Copyright ©2000-2025, Jelsoft Enterprises Ltd.