Newsgroup: it.comp.appl.access
Titolo: Creazione automatica codice Sql definizioni tabelle

Devo spesso lavorare con delle tabelle temporanee, in cui riverso dei
dati, poi le svuoto, poi riverso altri dati, e cosi' via.
Quando i dati sono tanti, lo svuotamento tramite DELETE * FROM TABELLA
mi fa perdere secondi o minuti inutili.
In Sql server 7 o 2000 uso TRUNCATE TABLE TABELLA e sono a posto, ma
in access tale costrutto sql non funziona.
Allora avevo pensato di usare una query con DROP TABLE TABELLA,
seguita da una query di definizione dati che ricreasse la tabella con
tutti i campi ed i vari indici.
Il problema è che quando la tabella è grossa, nel senso che ha molti
campi (ben dimensionati) ed indici, diventa pallosissimo scrivere a
mano il codice sql di creazione. Se poi le tabelle da gestire sono
tante, non ne parliamo.
Quindi mi chiedevo se c'era un modo per ottenere il codice SQL di
generazione tabella partendo da una tabella già esistente.
Insomma io mi creo la tabella tramite gli strumenti di access
(visualizzazione struttura) e quando è pronta scatto, in qualche modo
che mi dovrete dire voi, una foto SQL della sua struttura che poi
salvo in una query.
Cosi' anche quando avro' eliminato la tabella la potro' rigenerare al
volo semplicemente eseguendo la query.
Ciao
Fabrizio

> "Fabrizio Ramponi" [...]:

    Prova un po' a vedere se questo puo' andar bene:
  Const c_sSrcTableName = "tabIndirizzi"
  Const c_sDstTableName = "tabIndirizzi temp"
  Dim oDaoSrcTableDef As DAO.TableDef
  Dim oDaoDstTableDef As DAO.TableDef
  Dim oDaoSrcField    As DAO.Field
  Dim oDaoDstField    As DAO.Field
  With CurrentDb
    Set oDaoSrcTableDef = .TableDefs(c_sSrcTableName)
    With oDaoSrcTableDef
      Set oDaoDstTableDef _
        = CurrentDb.CreateTableDef( _
              c_sDstTableName _
            , .Attributes _
            , .Name _
            , .Connect)
      For Each oDaoSrcField In .Fields
        With oDaoSrcField
          Set oDaoDstField _
            = oDaoDstTableDef _
              .CreateField(.Name, .Type, .Size)
          oDaoDstTableDef.Fields.Append oDaoDstField
        End With
      Next
    End With
    With .TableDefs
      .Append oDaoDstTableDef
      .Delete oDaoSrcTableDef.Name
      oDaoDstTableDef.Name = c_sSrcTableName
      .Refresh
    End With
  End With
  Set oDaoDstField = Nothing
  Set oDaoSrcField = Nothing
  Set oDaoDstTableDef = Nothing
  Set oDaoSrcTableDef = Nothing
--
Ciao.
Maurizio
--------
?SPQR(C)
 X
--------

 ..... 
Non l'ho ancora provato, ma da quello visto dovrebbe essere un codice
che duplica la struttura della tabella sorgente in una tabella
destinazione.
Ad un metodo simile ci avevo pensato pure io, usando un semplice:
DoCmd.CopyObject , SrcTableName, acTable, DstTableName
In questo caso (al contrario del tuo codice) viene copiata l'intera
tabella e non solo la sua struttura. Quindi per operare correttamente
dovrei tenere una copia sorgente (e vuota) per ogni tabella temp che
voglio usare.
Poi copiare la table sorgente in una table destinazione, usare la
table destinazione, cancellare la table destinazione,  ricopiare la
table sorgente in una table destinazione, e cosi' via.
Con il tuo codice invece sarei + efficiente perchè tengo una sola
copia per ogni tabella temp. Poi riempio quella copia e prima di
cancellarla ne duplico la struttura su una nuova tabella con un nome
leggermente diverso.
Cancellata la copia piena non mi resta che rinominare l'altra copia in
modo che prenda il posto giusto.
Sii, il tuo codice potrebbe già risolvere il mio problema. Dovrei solo
fargli delle piccole modifiche per operare non sul db corrente ma su
un file esterno. Questo perchè tengo tutte le tabelle temp in un mdb
separato, in modo che quando questo è cresciuto troppo, invece di
perdere tempo a compattarlo, semplicemente lo cancello e ricreo.
Solo che anche se cosi' sono già abbastanza soddisfatto, mi piacerebbe
di +, avere il codice sql di creazione, invece di usare solo VBA.
Stavo già pensando di scrivermi un funzione VBA che dato il nome di
una tabella restituisse la stringa SQL per crearne una copia identica
nella struttura.
Sarebbe un esercizio carino sia di programmazione vba che di
programmazione SQL.
Non penso di essere in grado di riprodurre sotto SQL tutte le
proprietà impostabili tramite il pannello struttura di una tabella,
pero' per la maggior parte dovrebbe esistere l'equivalente in SQL.
Inoltre quelle minime che servono a me non dovrebbero essere troppo
difficili da implementare.
Cioè:
I campi con i loro tipo dato e la loro dimensione
Gli eventuali limiti (tipo "valido se", richiesto, non null, ...) per
i campi.
Gli eventuali valori di default dei campi
Gli indici e la chiave primaria.
Prima di cimentarmi nell'impresa, vorrei pero' essere sicuro che un
tale codice non esista già in forma free o che non esista un metodo
analogo per ottenere tale risultato senza scrivere una riga di codice.
Ciao
Farbrizio

 table sorgente in una table destinazione, e cosi' via.
Vedi il metodo TransferDatabase di DoCmd, ti permette di copiare solo
la struttura di una tabella presente in un altro database.
- --
Matteo Palmieri - Cybercreations
www.cybercreations.it
-----BEGIN PGP SIGNATURE-----
Version: 6.5.8ckt
Comment: KeyID: 0xC83A8FFAC838BA1F
Comment: Fingerprint: 69F4 29D4 5913 B3B6 EDD2  B335 C83A 8FFA C838 BA1F
iQA/AwUBPWXHN8g6j/rIOLofEQL4YgCg64USemCealKCr6PiXb8LkPp9/WEAn2E2
iYbKkkxINST5lpu3LLfL7vsX
=sfSb
-----END PGP SIGNATURE-----

 la struttura di una tabella presente in un altro database.
    Oops!... Mi pareva impossibile non ci fosse qualcosa del genere!...
Dovrei dormire di piu'. :-)


 genere!... Dovrei dormire di piu'. :-)
In effetti però sarebbe molto comodo avere un generatore di script
SQL per la creazione delle tabelle (ma non solo, anche delle
relazioni...) come quello di SQL Server.
- --
Matteo Palmieri - Cybercreations
www.cybercreations.it
-----BEGIN PGP SIGNATURE-----
Version: 6.5.8ckt
Comment: KeyID: 0xC83A8FFAC838BA1F
Comment: Fingerprint: 69F4 29D4 5913 B3B6 EDD2  B335 C83A 8FFA C838 BA1F
iQA/AwUBPWXPH8g6j/rIOLofEQKqpACgvSLY/Q4ljDpHMAvp/g61gSSkb88AniE0
Yg20ERVIACbmIDkVlnYFgr0Y
=wrkz
-----END PGP SIGNATURE-----

 ha scritto nel messaggio
news:jg3bmu056tdc7t5js...@4ax.com...

Una idea che mi è venuta leggendo il tuo post.
Potresti creare una tabella "IstantaneaSQL" con due campi: "NomeTabella" di
tipo testo (255) e "CreaSQL" di tipo memo.
Quando vuoi tu scatti una istantanea di tutte le tabelle o di quelle che
desideri (ovviamente da codice) nel senso che accoderai alla tabella
"IstantaneaSQL" il nome della tabella e la possibile sintassi per ricreare
la stessa tabella con l'istruzione CREATE TABLE.
Ora la sintassi di "CREATE TABLE" è del tipo "CREATE TABLE
NomeTabella(campo1 tipo[(dimensioni)][NOT NULL] [indice1] [, campo2 tipo
[(dimensioni)] [NOT NULL] [indice2] [, ...]] [, CONSTRAINT indicemulticampo
[, ...]])" quindi non dovrebbe essere difficile scrivere tutti gli elementi
che compongono la tabella di origine nel campo "CreaSQL" della tabella
"IstantaneaSQL": cicli attraverso le proprietà dei campi della tabella di
origine, scegli le proprietà che ti servono (NomeCampo tipo dimensioni
ecc...)e scrivi i valori rispettando la sintassi di CREATE TABLE.
Fatto questo sarà uno scherzo ricreare la tabella. Potrai inoltre  usare
CREATE INDEX per creare una chiave primaria o indici aggiuntivi alla nuova
tabella creata.
Che ne dici?
Ciao, Carlo


Ciao
Fabrizio