Newsgroup: it.comp.appl.access
Titolo: Re: aggiungere campi alle tabelle da codice

Alla C.A. di Carlo Costarella.
innanzitutto mi scuso per l'apertura di un nuovo post uguale a
http://groups.google.com/group/it.comp.appl.access/browse_thread/thread/592f9fcb592d4286/c5ad8db7ee247182?hl=it&lnk=gst&q=aggiungere+campi+a+tabelle+da+codice#c5ad8db7ee247182
ma ho provato a rispondere su quello ma, nonostante il messaggio di
post riuscito, la mia richiesta non viene visualizzata.
Ho provato a mettere in atto il procedimento suggerito da te Carlo.
Ho fatto:
1) aggiunta manuale del campo alla tabella (presso il mio pc);
2) costruzione di una query (nel FE) che prevede solo quel campo nuovo
di quella tabella;
3) eliminazione manuale del campo dalla tabella
Devo fare:
4) da codice verifico se eseguendo la query mi restituisce un errore;
se l'errore è diverso da zero vuol dire che il campo non esiste...in
questo caso eseguo il codice che mi accoda il nuovo campo alla
tabella.
Alcune domande:
1) La mia query è una query di selezione. E' giusto?
2) Dopo averla creata e aver cancellato nel mio be il campo che voglio
aggiungere, se eseguo la query mi esce la finestra in cui mi dice
"Immettere valore campo" e mi indica quale campo manca. E' questo il
procedimento?
3) Se sì, come faccio da codice a verificare l'errore e se diverso da
zero far partire il codice di cui ho ovviamente cambiato il nome del
campo, della tabella e del percorso?
Ultima annotazione il mio campo da inserire è di tipo Si/No.
Grazie anticipate.
Giuseppe.

 ha scritto nel messaggio 
news:dd374d47-fd26-4b72...@l14g2000pre.googlegroups.com...


--------------------------------------
Io faccio così:
A partire da una tabella che ha il campo da aggiungere creo una query di 
selezione raggruppata, per esempio:
SELECT First(TblCisterne.IDCisterna) AS Cisterna
FROM TblCisterne;
Salvo la query p.e. "VerificaCisterne"
Tolgo il campo dalla tabella per simulare un db senza quel campo.
Creo una funzione che mi restituisce un valore booleano (si/No):
Public Function VerificaSeCisterne() As Boolean
Dim dbs As Database, rst As Recordset
Set dbs = CurrentDb()
    On Error Resume Next
    Set rst = dbs.OpenRecordset("VerificaCisterne")
    If Err = 0 Then
        VerificaSeCisterne = True
        rst.Close
        Set dbs = Nothing
    Else
        VerificaSeCisterne = False
        rst.Close
       Set dbs = Nothing
    End If
End Function
La funzione di cui sopra non fa altro che aprire la query e se l'errore 
restituito è diverso da zero restituisce False altrimenti Vero (True). Se è 
False vuol dire che devo accodare il nuovo campo alla tabella con la 
funzione che sai o quella (molto più semplice) di Giorgio Rancati.
Questo un esempio per aggiungere un campo di tipo Sì/No:
Public Sub NuovoCampoAB01()
 On Error Resume Next
    Dim dbs As Database
    Dim tdf As TableDef, fld1 As Field
    Dim i As Integer
    Set dbs = OpenDatabase(MiaDir & "\frabase.mdb")
    For i = 0 To dbs.TableDefs.Count - 1
    If dbs.TableDefs(i).Name = "Servizi" Then
    Set tdf = dbs.TableDefs(i)
    Exit For
    End If
    Next i
    Set fld1 = tdf.CreateField("AB01", dbBoolean)
    tdf.Fields.Append fld1
    DoEvents
    Set dbs = Nothing
End Sub
Rimanendo agli esempi qui scritti una possibile strada per fare il tutto 
potrebbe essere questa di scrivere, per esempio su Form Load della maschera 
di apertura del db,:
If VerificaSeCisterne = False Then
    NuovoCampoAB01
End If
Ciao, Carlo 

 Ciao, Carlo
Ciao Carlo.
Ho creato la tabella tblcisterne come da tuo esempio con i campi
IdCisterne e descr.
Ho creato la query esattamente come la tua.
Ho creato il primo modulo e secondo modulo come nel tuo post,
sostituendo nel secondo
Set dbs = OpenDatabase(MiaDir & "\frabase.mdb")  con Set dbs =
OpenDatabase("c:\Allegato_G" & "\allegato_G.mdb")
e
If dbs.TableDefs(i).Name = "Servizi" Then  con If
dbs.TableDefs(i).Name = "tblcisterne" Then
e
Set fld1 = tdf.CreateField("AB01", dbBoolean) con Set fld1 =
tdf.CreateField("IdCisterne", dbBoolean)
Poi ho messo su caricamento della maschera che si apre con l'apertura
del db
If VerificaSeCisterne = False Then
    NuovoCampoAB01
End If
il risultato è che non si apre più neanche la form iniziale.
Cosa non ho capito?
Grazie, Giuseppe

 messaggionews:dd374d47-fd26-4b72-b1bf-cut
Ciao Carlo.
Ho creato la tabella tblcisterne come da tuo esempio con i campi
IdCisterne e descr.
Ho creato la query esattamente come la tua.
Ho creato il primo modulo e secondo modulo come nel tuo post,
sostituendo nel secondo
Set dbs = OpenDatabase(MiaDir & "\frabase.mdb")  con Set dbs =
OpenDatabase("c:\Allegato_G" & "\allegato_G.mdb")
e
If dbs.TableDefs(i).Name = "Servizi" Then  con If
dbs.TableDefs(i).Name = "tblcisterne" Then
e
Set fld1 = tdf.CreateField("AB01", dbBoolean) con Set fld1 =
tdf.CreateField("IdCisterne", dbBoolean)
Poi ho messo su caricamento della maschera che si apre con l'apertura
del db
If VerificaSeCisterne = False Then
    NuovoCampoAB01
End If
il risultato è che non si apre più neanche la form iniziale.
Cosa non ho capito?
Grazie, Giuseppe
----------------------------
Il mio era solo un esempio. E' evidente che devi opportumanete cambiare i 
nomi e quindi i campi interessati.
Quindi la prima cosa da verificare sono appunto i nomi usati.
Poi i moduli non sono due ma uno solo, pubblico, con due routine pubbliche. 
La routine di chiamata va sistemata su form Load della prima maschera che si 
apre.
Le tabelle coinvolte devono essere allegate e il codice deve puntare al db e 
al suo percorso con le tabelle allegate.
Compila il codice e vedi se restituisce errori.
Ciao, Carlo 

 al suo percorso con le tabelle allegate.
Ho spostato la tabella originale nel be, e nel fe l'ho collegata.
Ora se apro il db con il tasto shift e apro manualmente la prima form
(quella su apertura del db) mi dà in Vba errore di compilazione e mi
evidenzia il segno di uguale in
If VerificaSeCisterne = False Then
se la apro senza usare il tasto shift, la form non si apre.
Giuseppe.

 ha scritto nel messaggio 
news:9ad2e35b-3338-46ef...@g7g2000pro.googlegroups.com...


---------------------
La funzione Public Function VerificaSeCisterne() As Boolean
contiene al suo interno la chiamata ad una query salvata che si chiama 
"VerificaCisterne".
Esiste questa query? Se si prova ad aprirla e vedi se ti da errore.
La query punta ad una tabella che si chiama TblCisterne (con la e finale e 
non la a) che ha un campo chiamato IDCisterna.
Controlla questi dati.
Nel codice i riferimenti presuppongono solo DAO e non ADO: controlla.
Ciao, Carlo 

 Nel codice i riferimenti presuppongono solo DAO e non ADO: controlla.
Questo non saprei come controllare.
E' giusto aver cancellato il campo idcisterna dalla tabella dopo aver
creato la query? Questo è il mio dubbio.
Scusa se non ci riesco e ti impegno più del previsto.
Ciao, Giuseppe.

 Nel codice i riferimenti presuppongono solo DAO e non ADO: controlla.
Questo non saprei come controllare.
-------------------
Apri un modulo qualsiasi e poi dal menù "Strumenti" scegli "Riferimenti".
Nella maschera che ti compare dovrebbe essere spuntato (tra gli altri 
riferimenti) Microsoft DAO 3.51...
Se non c'è aggiungilo (sono in ordine alfabetico) spuntando la casellina di 
lato.
Se c'è anche Microsoft Activex Data Object 2.xx spuntato, togli la spunta.
E' giusto aver cancellato il campo idcisterna dalla tabella dopo aver
creato la query? Questo è il mio dubbio.
-----------------------
Si è giusto se questo è il campo che vuoi aggiungere.
Se dopo aver fatto tutte queste modifiche o controlli ancora non funziona, 
mandami i due db (FE e BE) zippati che gli do un'occhiata.
Ciao, Giuseppe.
Ciao, Carlo 

 Ciao, Carlo
Allora Carlo, l'unica cosa che potevo provare era togliere la spunta
da Microsoft Activex Data Object 2.xx, mentre Microsoft DAO 3.51... a
me è la 3.6.
Ma non funziona, quando apro la form principale mi dà errore in Vba e
mi seleziona il segno uguale che sta in
If VerificaSeCisterne = False Then
se apro il file senza tasto shift, apre la form iniziale ma l'aggiunta
del campo non avviene.
Ti invio i due file zippati.
Ciao e grazie, Giuseppe.