Newsgroup: it.comp.lang.visual-basic
Titolo: SQL: modificare la struttura in "runtime"

Posso chiedervi un aiutino?  :-)
Ho un applicativo già circolante, il cui database (*.mdb) contiene un'unica 
tabella... insomma, un database semplice semplice. :-)
La prima colonna della tabella è la chiave primaria, che all'epoca era stata 
definita così:
Dimensione campo: precisione doppia
Posizioni decimali: 0
Richiesto: si
Indicizzato: si (duplicati non ammessi)
Pur essendo questo campo adatto a ricevere valori decimali, all'epoca non 
erano previsti... e così fu disegnato con "posizioni decimali=0".
Questo fu un grave errore di analisi, perché purtroppo, a seguito di 
intervenute nuove esigenze, oggi bisogna inserire anche valori decimali nel 
suddetto campo chiave!! :-(
Il software è funzionante, nel senso che tratta il valore chiave con 
variabili decimali, al suo interno. Ho fatto una simulazione, ed ho provato 
a trattare chiavi con valori decimali, e funziona tutto... ma ovviamente 
quando va a scrivere un record sul database (la cui chiave contiene 
decimali) riceve ovviamente un errore di incompatibilità di formato!
La mia domanda è la seguente:
E' possibile modificare la struttura del database direttamente da programma?
Se fosse possibile, inserirei la routine di aggiornamento nella nuova 
versione del software (di imminente rilascio), in modo da aggiornare il 
database degli utenti al primo avvio del programma.
L'istruzione SQL "ALTER" sembrerebbe adatta allo scopo, ma purtroppo data la 
mia ignoranza in materia sql, non riesco a trovare la sintassi giusta:
ALTER TABLE mytable ALTER COLUMN mycolumn (....)
Ecco... mi manca la parte finale, quella racchiusa nel (....)
Come faccio a specificare, nella comando ALTER, che la colonna "mycolumn", 
pur rimanendo del formato originale "Doppia precisione" (DOUBLE) deve essere 
modificata in "Doppia precisione, con 6 cifre decimali"??
Grazie davvero, a chiunque mi possa aiutare!!! :-))
B.
PS: modificando la struttura del database con ACCESS (cambiando i decimali 
da 0 a 6) funziona tutto! Il problema è che vorrei eseguirlo da programma 
(per poter aggiornare i database degli utenti).

A scanso di equivoci, aggiungo che utilizzo Jet 4.0.
Questo è un esempio della sintassi da me utilizzata,
per leggere tutti i records in archivio:
strconnessione = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source =" & 
archivioutente$
objConn.Open (strconnessione)
sSql = "SELECT * FROM MIOARCHIVIO"
ObjRst.Open sSql, objConn, 3, 3

 nel suddetto campo chiave!! :-(
No, no, ferma, questo fu un grave errore di demenza.
Che senso ha definire come chiave di riga un decimale senza decimali? Giusto 
per aumentare le dimensioni del DB e ridurne le performance?
Cmq, per riportare indietro il campo, hai due opzioni:
1) Scrivere una piccola routine in DAO, e' una vita che non lo uso ma sono 
sicuro che da qualche parte c'e' qualche comando per cambiare il numero di 
decimali di un decimale
2) Scrivi una routine che aggiunge un nuovo campo decimale, ci copia dentro 
i valori dal campo chiave, rimuove quest'ultimo dal DB, lo ricrea, ci copia 
dentro i valori che avevi messo nel campo decimale che hai creato per primo, 
ricrei l'indice, elimini il campo di supporto.
Io andrei con la seconda, anche se sembra piu' complicata in realta' si 
tratta di 4 o 5 Execute sul DB e sei a posto in 5 minuti, invece con la 
prima soluzione dubito che te la puoi cavare con cosi' poco...tipo che se 
non distribuisci DAO sui PC degli utenti, difficilmente ne vieni fuori...

 modificata in "Doppia precisione, con 6 cifre decimali"??
In sintassi standard sarebbe:
ALTER TABLE nome ALTER COLUMN nomecampo TYPE DECIMAL(12,6)
O con il tipo che ti serve.
-- 
DBMS Firebird
VB6 + Ado

 Ecco... mi manca la parte finale, quella racchiusa nel (....)
Questa è la sintassi che uso io in T-SQL per modificare un campo di
SQLServer, in un tipo decimal con 2 cifre decimali.
ALTER TABLE SPB_SPESEBOLLI ALTER COLUMN SPB_MINIMO DECIMAL(18, 2) NULL
Però ti consiglio di non modificare il campo, o meglio: modificalo pure, ma
aggiungi un campo ID intero e imposta quello come chiave primaria. Sebbene
sia tollerato, Access fa casino con i campi decimali quando sono campi
chiave, perché è difficile valutarne l'univocità in certe situazioni legate
agli arrotondamenti. Per cui la stessa Microsoft suggerisce caldamente di
impostare i campi chiave come interi.
Puoi aggiungere un campo decimale e leggere quello. Dovrai copiare tutti i
valori da un campo all'altro con una INSERT INTO, ma alla fine avrai un
campo IDintero, e un campo valore che accetta i decimali.
Spero ti sia d'aiuto. Ciao.
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 Spero ti sia d'aiuto. Ciao.
Ringrazio te e tutti gli altri che mi hanno risposto, con validi consigli.
Grazie a voi ho risolto.
B.