Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Modificare tabella da VBA

1,523 views
Skip to first unread message

Roberto Genova

unread,
Mar 11, 2008, 1:49:07 PM3/11/08
to
Buonasera a tutti.
E' possibile da VBA aggiungere un campo in una tabella FE ?

ALESSANDRO Baraldi

unread,
Mar 11, 2008, 2:07:59 PM3/11/08
to
> Buonasera a tutti.
> E' possibile da VBA aggiungere un campo in una tabella FE ?

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
---------------------------------------------------------------------------


Karl Donaubauer

unread,
Mar 11, 2008, 3:14:44 PM3/11/08
to
ALESSANDRO Baraldi wrote:
>> E' possibile da VBA aggiungere un campo in una tabella FE ?
>
> Ecco l'Esempio:
>
> ALTER TABLE T1 ADD COLUMN ID COUNTER
> CONSTRAINT pk PRIMARY KEY

Direi che si tratta di SQL non VBA.

--
:-)
Karl
*********
Access FAQ: www.donkarl.com/it

ALESSANDRO Baraldi

unread,
Mar 11, 2008, 3:24:32 PM3/11/08
to
Direi che si tratta di SQL non VBA.
>
> --
> :-)
> Karl

Comandi DDL per la precisione...!
Beh dai li usiamo da VBA quindi è un Mezzo e Mezzo...

;-)

Gabriele Bertolucci

unread,
Mar 11, 2008, 4:13:37 PM3/11/08
to
> 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.

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

Roberto Genova

unread,
Mar 12, 2008, 2:09:11 AM3/12/08
to

"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.... ) ^_^

Bruno Campanini

unread,
Mar 12, 2008, 5:13:27 AM3/12/08
to
"Gabriele Bertolucci" <"info[at]pbsoft[dot]it"> wrote in message
news:1j6fx8jysjyam$.11hwshxny1akk.dlg@40tude.net...

E per definire un AutoNumber?

Bruno

Gabriele Bertolucci

unread,
Mar 12, 2008, 11:27:20 AM3/12/08
to
> E se il campo fa aggiungere fosse numerico -> precisione singola -> posiz
> decimale 2 ??
> (sempre più difficile.... ) ^_^

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.

Gabriele Bertolucci

unread,
Mar 12, 2008, 11:29:48 AM3/12/08
to
> E per definire un AutoNumber?

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

Gabriele Bertolucci

unread,
Mar 12, 2008, 12:06:18 PM3/12/08
to
> E se il campo fa aggiungere fosse numerico -> precisione singola -> posiz
> decimale 2 ??

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

max

unread,
Mar 12, 2008, 1:10:15 PM3/12/08
to

"Gabriele Bertolucci" <"info[at]pbsoft[dot]it"> ha scritto nel messaggio
news:1uma4nuvgekb6$.r0m6elrfmlfd.dlg@40tude.net...

tutto questo se la tabella è nel FE... e se invece è nel BE???
ciao
Max


Bruno Campanini

unread,
Mar 12, 2008, 1:26:39 PM3/12/08
to
"max" <pi...@pippo.it> wrote in message news:fr92ls$8s0$1...@aioe.org...

> 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

Gabriele Bertolucci

unread,
Mar 12, 2008, 1:49:07 PM3/12/08
to
> tutto questo se la tabella č nel FE... e se invece č nel BE???

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

ALESSANDRO Baraldi

unread,
Mar 12, 2008, 3:34:39 PM3/12/08
to
Adesso però spiegategli che avete scherzato... e che se ascoltava me con 1
riga di codice
faceva tutto... dai basta giocare...!

;-)

Bruno Campanini

unread,
Mar 13, 2008, 4:10:05 AM3/13/08
to
"ALESSANDRO Baraldi" <ik2...@libero.it> wrote in message
news:eR1wYhH...@TK2MSFTNGP05.phx.gbl...

> Adesso però spiegategli che avete scherzato... e che se ascoltava me con 1
> riga di codice
> faceva tutto... dai basta giocare...!

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!!!

ALESSANDRO Baraldi

unread,
Mar 13, 2008, 4:25:17 AM3/13/08
to
> 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...

max

unread,
Mar 13, 2008, 5:33:35 AM3/13/08
to

"Gabriele Bertolucci" <"info[at]pbsoft[dot]it"> ha scritto nel messaggio
news:zgyw3pmqp7ks.p...@40tude.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


max

unread,
Mar 13, 2008, 5:40:10 AM3/13/08
to

"max" <pi...@pippo.it> ha scritto nel messaggio
news:frasap$pvc$1...@aioe.org...
mi rispondo da solo
microsoft ado ext. 2.8 for ddl and security

ciao
max


Bruno Campanini

unread,
Mar 13, 2008, 5:44:00 AM3/13/08
to
"max" <pi...@pippo.it> wrote in message news:frasap$pvc$1...@aioe.org...

> 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

giorgio rancati

unread,
Mar 13, 2008, 6:09:13 AM3/13/08
to

"Bruno Campanini" <B...@gmail.com> ha scritto nel messaggio
news:ea1xjGOh...@TK2MSFTNGP04.phx.gbl...

> 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!!!

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]


Bruno Campanini

unread,
Mar 13, 2008, 6:25:53 AM3/13/08
to
"giorgio rancati" <giorgio_No_Sp...@tiscali.it> wrote in message
news:ONkJMJPh...@TK2MSFTNGP02.phx.gbl...

> 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

giorgio rancati

unread,
Mar 13, 2008, 6:54:40 AM3/13/08
to

"Bruno Campanini" <B...@gmail.com> ha scritto nel messaggio
news:%23u9GcSP...@TK2MSFTNGP06.phx.gbl...

> "giorgio rancati" <giorgio_No_Sp...@tiscali.it> wrote in message
> news:ONkJMJPh...@TK2MSFTNGP02.phx.gbl...
> 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?

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
----

Bruno Campanini

unread,
Mar 13, 2008, 7:16:39 AM3/13/08
to
"giorgio rancati" <giorgio_No_Sp...@tiscali.it> wrote in message
news:e%23CrmiPh...@TK2MSFTNGP04.phx.gbl...

> 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

0 new messages