Ecco l'Esempio:
ALTER TABLE T1 ADD COLUMN ID COUNTER
CONSTRAINT pk PRIMARY KEY
--
@Alex (Alessandro Baraldi)
---------------------------------------------------------------------------
http://www.sitocomune.com/
http://www.alessandrobaraldi.it
---------------------------------------------------------------------------
Direi che si tratta di SQL non VBA.
--
:-)
Karl
*********
Access FAQ: www.donkarl.com/it
Comandi DDL per la precisione...!
Beh dai li usiamo da VBA quindi è un Mezzo e Mezzo...
;-)
Non ti accontenti mai eh?!?
:-)
Ecco il codice ADOX per aggiungere un campo testo di 20 caratteri.
Public Function AggiungiCampoTesto()
Dim cat As ADOX.Catalog
Dim tbl As ADOX.Table
Set cat = New ADOX.Catalog
cat.ActiveConnection = CurrentProject.Connection
Set tbl = cat.Tables("tbl01")
tbl.Columns.Append "CampoTesto", adVarWChar, 20
Set tbl = Nothing
Set cat = Nothing
End Function
--
PBsoft di Gabriele Bertolucci
www.pbsoft.it
skype:pbsoftsolution
"Gabriele Bertolucci" <"info[at]pbsoft[dot]it"> ha scritto nel messaggio
news:1j6fx8jysjyam$.11hwshxny1akk.dlg@40tude.net...
> > Direi che si tratta di SQL non VBA.
>
> Non ti accontenti mai eh?!?
>
> :-)
>
> Ecco il codice ADOX per aggiungere un campo testo di 20 caratteri.
Grazie Gabriele .
E se il campo fa aggiungere fosse numerico -> precisione singola -> posiz
decimale 2 ??
(sempre più difficile.... ) ^_^
E per definire un AutoNumber?
Bruno
Più che difficile, la tua richiesta in parte è impossibile da soddisfare.
Ecco il codice per aggiungere un campo a precisione singola:
Dim cat As ADOX.Catalog
Dim tbl As ADOX.Table
Dim col As ADOX.Column
Set cat = New ADOX.Catalog
cat.ActiveConnection = CurrentProject.Connection
Set tbl = cat.Tables("tbl01")
' aggiungo un campo a precisione doppia
Set col = New ADOX.Column
col.Name = "CampoNumerico"
col.Type = adSingle
tbl.Columns.Append col
Set col = Nothing
Set tbl = Nothing
Set cat = Nothing
Purtroppo tramite ADO/ADOX non è possibile agire sul numero di decimali
visualizzati.
Questa proprietà, molto probabilmente, viene salvata da Access all'interno
di qualche tabella di sistema o nascosta. Io ho provato a cercare ma non
sono riuscito a venirne a capo.
L'appetito vien mangiando, eh?
Per i campi AutoNumber la cosa è più complessa perché bisogna accedere alle
proprietà specifice del data provider.
Eccoti il codice relativo, nel quale ho anche aggiunto le istruzioni
necessarie per fare di questo campo AutoNumber la chiave primaria:
Dim cat As ADOX.Catalog
Dim tbl As ADOX.Table
Dim col As ADOX.Column
Dim key As ADOX.key
Set cat = New ADOX.Catalog
cat.ActiveConnection = CurrentProject.Connection
Set tbl = cat.Tables("tbl01")
' aggiungo un campo contatore
Set col = New ADOX.Column
col.Name = "CampoContatore"
col.ParentCatalog = cat
col.Properties("Autoincrement") = True
col.Type = adInteger
tbl.Columns.Append col
Set col = Nothing
' definisco il contatore come chiave primaria
Set key = New ADOX.key
key.Columns.Append "CampoContatore"
key.Columns("CampoContatore").RelatedColumn = "CampoContatore"
key.Name = "ChiavePrimaria"
key.Type = adKeyPrimary
tbl.Keys.Append key
Correggo il tiro relativamente al mio post precedente.
E' fattibile anche la formattazione del campo per come la richiedi tu,
anche se, in questo caso, bisogna ricorrere anche a DAO.
Public Function AggiungiCampi()
Dim cat As ADOX.Catalog
Dim tbl As ADOX.Table
Dim col As ADOX.Column
Dim key As ADOX.key
Dim dbs As DAO.Database
Dim tdf As DAO.TableDef
Dim fld As DAO.Field
Dim prp As DAO.Property
Set cat = New ADOX.Catalog
cat.ActiveConnection = CurrentProject.Connection
Set tbl = cat.Tables("tbl01")
' aggiungo un campo a precisione doppia, con due posizioni decimali
Set col = New ADOX.Column
col.Name = "CampoNumerico"
col.ParentCatalog = cat
col.Type = adSingle
tbl.Columns.Append col
Set col = Nothing
Set dbs = CurrentDb
Set tdf = dbs.TableDefs("tbl01")
Set fld = tdf.Fields("CampoNumerico")
Set prp = fld.CreateProperty
prp.Name = "Format"
prp.Type = dbText
prp.Value = "Currency"
fld.Properties.Append prp
Set prp = fld.CreateProperty
prp.Name = "DecimalPlaces"
prp.Type = dbByte
prp.Value = 2
fld.Properties.Append prp
Set fld = Nothing
Set tdf = Nothing
Set dbs = Nothing
tutto questo se la tabella è nel FE... e se invece è nel BE???
ciao
Max
> tutto questo se la tabella è nel FE... e se invece è nel BE???
> ciao
> Max
Aggiungi:
Dim cnn As New ADODB.Connection
Sostituisci:
Set cat.ActiveConnection = CurrentProject.Connection
con:
cnn.Open "Provider='Microsoft.Jet.OLEDB.4.0';" & _
"Data Source='C:\Temp\db1.mdb';"
Set cat.ActiveConnection = cnn
Bruno
Max, ti chiedo il favore di quotare il minimo indispensabile, altrimenti si
arriva a post illeggibili.
Tornando al quesito proposto, puoi arrivare alle tabelle del BE
conoscendone ovviamente il percorso.
Tra le dichiarazioni iniziali devi aggiungere:
Dim cnn As ADODB.Connection
poi, subito prima della linea di codice
Set cat = New ADOX.Catalog
inserisci le seguenti
Set cnn = New ADODB.Connection
cnn.Open "Provider='Microsoft.Jet.OLEDB.4.0';" & _
"Data Source = 'C:\Access\2003\GEN_ClassValidate_XP.mdb'"
infine, modifichi (due righe piů sotto) l'assegnazione della connection al
catalog, nel seguente modo
cat.ActiveConnection = cnn
;-)
Sì, in effetti con DAO, ADO, ADOX, ODBC, etc...
è un gran casino.
Con uno solo non si riuscirebbe a far tutto, per non
parlare poi di tutti i più esotici References che occorre attivare.
Per fortuna che c'è l'SQL...
Bruno
PS
Una delle amenità che ho poi scoperto in questo giro di
sperimentazioni è che l'ADOX implementato in Access 2007
non riconosce, né di nome né di fatto, i file .accdb generati
da A2007. Occorre convertirglieli in A2003!!!
Purtroppo io non ho nemmeno mai visto A2007... ho abbandonato
molto(completamente)
in quest'anno tutta la programmazione e non mi sono più aggiornato.
Credo però che se mi venisse voglia di ricominciare lo farei da NET...
mi da un errore di tipo definito dall'utente non definito, su Dim cat As
ADOX.Catalog immagino manchi un riferimento.. quale?
ho attivi:
visual basic for application
microsoft access 11.0 objet library
microsoft DA0 3.6 objet library
ole automation
microsoft activex data objects 2.1 library
ciao
Max
ciao
max
> mi da un errore di tipo definito dall'utente non definito, su Dim cat As
> ADOX.Catalog immagino manchi un riferimento.. quale?
> ho attivi:
> visual basic for application
> microsoft access 11.0 objet library
> microsoft DA0 3.6 objet library
> ole automation
> microsoft activex data objects 2.1 library
Aggiungi (Access 2007):
Microsoft ADO Ext. 6.0 for DDL and Security
Microsoft ActiveX Data Object 6.6 Library
Bruno
Ciao Bruno,
Se la tabella da modificare è nel Db aperto e imposti la connessione di
Access2007 CurrentProject.Connection funziona.
Se devi modificare un accdb esterno bisogna aprire la connessione con il
provider appropriato,
----
Microsoft Office 12.0 Access Database Engine Object Library
----
perchè il provider Microsoft.Jet.OLEDB.4.0 non può leggere gli accdb
Ciao
--
Giorgio Rancati
[Office Access MVP]
> Ciao Bruno,
>
> Se la tabella da modificare è nel Db aperto e imposti la connessione di
> Access2007 CurrentProject.Connection funziona.
> Se devi modificare un accdb esterno bisogna aprire la connessione con il
> provider appropriato,
> ----
> Microsoft Office 12.0 Access Database Engine Object Library
> ----
> perchè il provider Microsoft.Jet.OLEDB.4.0 non può leggere gli accdb
Ok, ne prendo buona nota.
¡Muchas gratias!
Bruno
PS
Già che siamo in argomento..., comunque fuori da ADOX.
Con:
Set NewTab = db.CreateTableDef("NewT")
NewtTab.Fields.Append NewTab.CreateField("F1", dbLong)
db.TableDefs.Append NewTab
si crea la tabella col campo F1, Long.
Come lo si definisce AutoNumber?
Bruno
Ciao Bruno,
gli imposti l'attributo dbAutoIncrField
----
Set NewTab = Db.CreateTableDef("NewT")
NewTab.Fields.Append NewTab.CreateField("F1", dbLong)
NewTab.Fields("F1").Attributes = dbAutoIncrField
Db.TableDefs.Append NewTab
----
qui qualche link riguardante la discussione in generale
----
ACC2000: How to Use DAO to Programmatically Add an AutoNumber Field to a
Table
http://support.microsoft.com/kb/210405/en-us
ACC2000: How to Create a Table with Jet Data Types via ADOX
http://support.microsoft.com/kb/275252/en-us
Use ADOX to Manipulate AutoNumber Fields
http://msdn2.microsoft.com/en-us/library/aa155430(office.10).aspx
----
> Ciao Bruno,
> gli imposti l'attributo dbAutoIncrField
> ----
> Set NewTab = Db.CreateTableDef("NewT")
> NewTab.Fields.Append NewTab.CreateField("F1", dbLong)
> NewTab.Fields("F1").Attributes = dbAutoIncrField
> Db.TableDefs.Append NewTab
> ----
>
> qui qualche link riguardante la discussione in generale
> ----
> ACC2000: How to Use DAO to Programmatically Add an AutoNumber Field to a
> Table
> http://support.microsoft.com/kb/210405/en-us
>
> ACC2000: How to Create a Table with Jet Data Types via ADOX
> http://support.microsoft.com/kb/275252/en-us
>
> Use ADOX to Manipulate AutoNumber Fields
> http://msdn2.microsoft.com/en-us/library/aa155430(office.10).aspx
Ok, grazie ancora.
Si trova tutto a saper cercare...
Ciao
Bruno