Newsgroup: it.comp.appl.access
Titolo: Aiuto per aggiungere record tramite VBA utilizzando DO LOOP

Ciao a tutti,
sto impazzendo per capire come mai questo LOOP non funge! Ho visto
svariati esempi nel NG, SitoComune, DonKarl, MSDN...ma non riesco ad
applicarli al mio caso...
Ho un db così strutturato:
Tabelle: "pagamenti" (IDpagamento, descrizione), "pagamenti_dettaglio"
(IDpagamentodettaglio, IDpagamento, mese, percentuale), "scadenze"
(IDscadenza, IDpagamento) e "scadenze_dettaglio" (IDscadenzadettaglio,
IDscadenza, mesi, percentuale).
Maschera "frmscadenze" con sottomaschera "frmscadenze_dettaglio".
Vorrei un evento AfterUpdate su IDpagamento della maschera che mi crei
tanti record quanti sono in IDpagamentodettaglio (tabella
"pagamnti_dettaglio) copiandoci alcuni campi.
Ecco il mio codice:
---------------------------------------------------------
Private Sub IDpagamento_AfterUpdate()
Dim rst As Recordset
Dim rstpag As Recordset
Set rst = CurrentDb.OpenRecordset("scadenze_dettaglio")
Set rstpag = CurrentDb.OpenRecordset("pagamenti_dettaglio")
rstpag.MoveFirst      'punta all'inizio della tabella
"pagamenti_dettaglio"
Do While rstpag!IDpagamento = Me!IDpagamento      'confronta il campo
IDpagamento della tabella "pagamenti_dettaglio con la combo
"IDpagamento" della maschera
' aggiungi record
rst.AddNew
rst!IDscadenza = Me.IDscadenza      'in questo modo aggancio la
sottomaschera alla maschera principale
rst!mesi = rstpag!mesi
rst!percentuale = rstpag!percentuale
rst.Update
[frmscadenza_dettaglio].Requery      'aggiorna i record visualizzati
nella sottomaschera
rstpag.MoveNext      'scorre il puntatore al prossimo recordset della
tabella "pagamenti_dettaglio"
Loop
End Sub
-------------
Ho provato anche mettendo rstpag.FindFirst (rstpag!IDpagamento =
Me!IDpagamento) ma niente!
Grazie


Ciao Riccardo,
mi sembra inutile aprire il recordset e agiungere un record alla volta io,
fare una bella query di accodamento
di questo tipo
Dim strsql as string
strsql = "INSERT INTO  scadenze_dettaglio  (IDscadenza, mesi, percentuale)
" & _
            " SELECT " & me.IDScadenza & ", mesi, percentuale FROM
pagamenti_dettaglio Where idPagmento = " & me.idPagamento
DoCmd.runsql strsql
[frmscadenza_dettaglio].Requery
-- 
Cinzia
---------------------------------------
|  
http://www.riolab.org
  |
---------------------------------------

Cinzia ha scritto:

Ciao Cinzia, grazie per la tua risposta.
Un dubbio: utilizzando una query di accodamento, nel caso debba
rigenerare le scadenze (cambiando il tipo di pagamento e quindi tutti i
record della sottomschera), la tebella scadenze manterrà i vecchi
record, giusto?

 record, giusto?
Si giusto, dovresti allora verificare se ci sono già dei record e in quel
caso anzichè inserire aggiornerai con un'update quelli che ci sono.


Cinzia ha scritto:

Stò per ora cercando di far funzionare questa routine...ma non capisco
perchè al riga
***Do While "IDpagamento = '" & Me!IDpagamento***
mi dà l'errore "data type mismatch"...eppure sono entrambi di tipo
numerico...
Hai un'idea?
Grazie ancora per il tuo tempo

 Grazie ancora per il tuo tempo
Ciao Riccardo,
scritta così non può funzionare  stai facendo una concatenazone (&) tra la
stringa "IDPagamento" e il controllo Me!IdPagamento e la stai usando come
condizione del While....  non sta in piedi.
Nella tua routine originale c'era:
      Do While rstpag!IDpagamento = Me!IDpagamento
      loop
che invece sta in piedi un po' meglio ma il ciclo viene eseguito solo se al
primo test la condizione è vera, siccome tu apri la tabella
pagamenti_dettaglio con questa istruzione
Set rstpag = CurrentDb.OpenRecordset("pagamenti_dettaglio")
e poi ti sposti sul primo record   con quest'altra:
rstpag.MoveFirst
non è affatto detto che il primo record della tabella pagamenti_dettaglio
abbia un IDPagamento uguale a quello che tu hai appena selezionato nella
maschera, dunque il loop molto probabilmente non  verrà eseguito.


Cinzia ha scritto:

mm questi loop...si vede che sono alle prime armi con VBA... penso
potebbe andare così, cioè mi posiziono sul primo record, poi trovo il
primo record che soddisfa l'espressione (IDpagamento uguali) e poi
faccio iniziare il loop a seconda di quanti IDpagamento trovo...
--------------------------
Private Sub prova_AfterUpdate()
Dim rst As Recordset
Dim rstpag As Recordset
Set rst = CurrentDb.OpenRecordset("table2 query")
Set rstpag = CurrentDb.OpenRecordset("pagamenti dettaglio query")
rstpag.MoveFirst    'mi posiziono sul primo record
rstpag.FindFirst (rsrpag!IDpagamento = Me!IDpagamento)   'trovo il
primo record che soddisfa l'espressione
Do
' aggiungi record
rst.AddNew
rst!IDnumero = Me.IDnumero 'in questo modo aggancio la sottomaschera
alla maschera principale
rst!dettaglio = rstpag!IDpagamento
rst!mesi = rstpag!mesi
rst!percentuale = rstpag!percentuale
rst.Update
rstpag.FindNext (rstpag!IDpagamento = Me!IDpagamento)
Loop Until rstpag!IDpagamento = Me!IDpagamento
[table2 query subform].Requery
End Sub
----------------------------
e mi da errore "object required" sulla riga "rstpag.FindFirst
(rsrpag!IDpagamento = Me!IDpagamento)"...
non ne esco fuori, sto fumando =((

 non ne esco fuori, sto fumando =((
-- 


 > potebbe andare così, cioè mi posiziono sul primo record, poi trovo il

Ed è quella giusta! Grazie mille...Per il bene comune posto il codice
finito:
---------------
Private Sub prova_AfterUpdate()
Dim rst As Recordset
Dim rstpag As Recordset
Set rst = currentdb.OpenRecordset("table2 query", dbOpenDynaset)
Set rstpag = currentdb.OpenRecordset("pagamenti dettaglio query",
dbOpenDynaset)
rstpag.FindFirst ("[IDpagamento] =" & Me!IDpagamento) 'trovo il primo
record che soddisfa l'espressione
Do Until rstpag.NoMatch
' aggiungi record
rst.AddNew
rst!IDnumero = Me.IDnumero 'in questo modo aggancio la sottomaschera
alla maschera principale
rst!dettaglio = rstpag!IDpagamento
rst!mesi = rstpag!mesi
rst!percentuale = rstpag!percentuale
rst.Update
[table2 query subform].Requery
rstpag.FindNext ("[IDpagamento] =" & Me!IDpagamento)
Loop
End Sub
-----------------
da notare che nel mio caso il controllo DO...UNTIL è impostato per
rstpag...
Do Until rstpag.NoMatch
Saluti a tutti!