Newsgroup: it.comp.appl.access
Titolo: nidificazione Do...Loop

salve di nuovo,
riposto il problema che  sto cercando di risolvere con la speranza che il
newsgroup possa aiutarmi.
Si tratta di due recordset che ciclano l'uno sull'altro e al verificarsi
della condizione uno dei due recordset viene aggiornato con i valori
dell'altro.
Succede che quando lancio il comando dopo una serie di cicli a buon fine, la
procedura
si blocca ( o come dice task manager ... l'applicazione non risponde) e per
riprendere il
controllo della situazione non posso fare altro che  terminare sempre da
task manager l'operazione.
Ho verificato che se la stessa procedura la eseguo dalla finestra di debug
(passo passo-->cntrl F8) funziona e non si arresta anzi sembra poter
tranqullamente
arrivare alla fine... se non fosse per il fatto che dopo qualche minuto
avverto un fastidioso dolore all'articolazione della falangetta del dito
indice dx, che mi obbliga di fatto ad arrestare la procedura.
Vorrei capire quale puņ essere il motivo di siffatto comportamento per
maggiori dettagli riporto anche il codice in oggetto:
Private Sub Form_Load()
On Error GoTo Err_gest_errori
Dim cnn As ADODB.Connection
Dim rs1 As ADODB.Recordset
Dim rs2 As ADODB.Recordset
Dim lngPagCodCnt As Long
Dim lngBolCodCnt As Long
Dim lngPagAnno As Long
Dim lngBolAnno As Long
Dim strPagRata As String
Dim strBolRata As String
Dim conta As Long
Set cnn = CreateObject("ADODB.Connection")
cnn.Open "Driver={Microsoft Access Driver (*.mdb)};" & _
    "Dbq=C:\TOS.MDB;" & _
    "Uid=Admin;Pwd=;"
Set rs1 = New ADODB.Recordset
rs1.ActiveConnection = cnn
rs1.Open "SELECT PAGAMENTI.DAT_ACC, PAGAMENTI.[IMP],
PAGAMENTI.DAT_COR,'20'&Mid(([dat_cor]),5,2) AS anno, Mid(([dat_cor]),9,6) AS
CODCNT, val(Mid(([dat_cor]),15,2)) AS RATA FROM PAGAMENTI where dat_ris
='000000' and tip_doc='896'", , , , adCmdText
Set rs2 = New ADODB.Recordset
rs2.Open "BOLLETTINI", cnn, adOpenDynamic, adLockOptimistic, adCmdTable
conta = 0
Do Until rs1.EOF
    Debug.Print lngPagCodCnt, lngPagAnno, strPagRata
    rs2.MoveFirst
    Do Until rs2.EOF
        lngPagCodCnt = CLng(rs1.Fields(4))
        lngPagAnno = CLng(rs1.Fields(3))
        strPagRata = rs1.Fields(5)
        If strPagRata = 0 Then
            strPagRata = "U"
        End If
        lngBolCodCnt = rs2.Fields(0)
        lngBolAnno = CLng(rs2.Fields(4))
        strBolRata = rs2.Fields(2)
        If lngPagCodCnt = lngBolCodCnt Then
            If lngPagAnno = lngBolAnno Then
                If strPagRata = strBolRata Then
                rs2.Fields(5) = rs1.Fields(0)
                rs2.Fields(6) = Val(rs1.Fields(1)) / 100
                rs2.Update
                conta = conta + 1
                Debug.Print conta; lngPagCodCnt, lngBolCodCnt, lngPagAnno,
lngBolAnno, strPagRata, strBolRata
                Exit Do
                End If
            End If
        End If
        rs2.MoveNext
    Loop
    rs1.MoveNext
Loop
MsgBox ("FINE")
Exit_Form_Load:
    Exit Sub
Err_gest_errori:
    MsgBox (" errore: " & Err.Number & " - " & Err.Description)
     Exit Sub
End Sub
saluti cervantes

[CUT]
Ciao,
fossi in te aggiungerei dopo l'uscita dal loop le seguenti righe:
rs1.close
rs2.close
set rs1=nothing
set rs2=nothing
cnn.close
set cnn=nothing
può darsi che funzioni! ;-)
gaspare

 ha scritto nel messaggio
news:7VRte.13867$D7.3...@twister1.libero.it...

Ciao Crevantes,
prova a cambiare il tipo di connessione e ad usare il JET OLE DB Provider
4.0:
Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=C:\TOS.mdb;Jet
OLEDB:Database Password="";
per il resto non sembrano esserci errori, se proprio volessimo ottimizzare
sposterei questi assegnamenti prima del secondo Do:
      lngPagCodCnt = CLng(rs1.Fields(4))
      lngPagAnno = CLng(rs1.Fields(3))
      strPagRata = rs1.Fields(5)
          If strPagRata = 0 Then
             strPagRata = "U"
        end if
facci sapere!
Cinzia

 
ciao cervantes.
Non per entrare nei tuoi affari ma rs1 quanti record ha e quanti ne ha rs2?
(potrebbe essere questo?   lngPagCodCnt = lngBolCodCnt)
Non sarebbe meglio fare un accoppiamento di files (immagino che i due 
qualche attributo in comune lo avranno) e fare un unico passaggio?
--
a.cara

 qualche attributo in comune lo avranno) e fare un unico passaggio?
mi cospargo di cenere c'e' stato un copia-incolla incasinato
Non per entrare nei tuoi affari ma rs1 quanti record ha e quanti ne ha rs2?
Non sarebbe meglio fare un accoppiamento di files (immagino che i due
  qualche attributo in comune lo avranno,potrebbe essere questo? 
lngPagCodCnt = lngBolCodCnt)


[CUT]
;-) 

 e fare un unico passaggio?
in effetti i due recordset hanno in comune tre campi : lngPagCodCnt
=lngBolCodCnt; lngPagAnno=lngBolAnno;
strPagRata=strBolRata;
... ma preferivo gestire il riscontro direttamente da codice piuttosto che
usare una query d'aggiornamento basata sulle due tabelle (in paratica rs1 e
rs2). se comunque hai un'idea su come posso uscire da qesta situazione te ne
sono grato.
ciao cervantes


ciao, Cinzia  ho seguito le tue indicazioni ma l'applicazione continua
...(misteriosamente) a bloccarsi.
Dal task manager  vedo che access mi riapre una nuova sessione
dell'applicativo poi rimane lě .. a pensare ... ma!.
ciao cervantes


cervantes lascia stare. cambia la logica. Non ti rendi conto che il 
secondo file lo elabori 7700  volte stai elaborando 7700 * 8041 record 
che a occhio fanno 60 milioni di record una giornatella gli ci vuole.
Cerca di fare una join che accoppia i due rs e dovresti cavartela con un 
passo solo.
--
a.cara

 passo solo.
p.s.
un po' di tempo fa mi sono trovato a dover generare un po' di record per 
un caricamento su oracle. Ho notato, con grande disappunto, che
1) Fai partire la macchina
2) Access per i primi 100K 200K record va come una spada
3) poi rallenta
4) chiudi access
5) lo fai ripartire
6) "nun c'e' verso" continua a essere lento
7) riavvii la macchina
8)ricomincia ad andare come una spada
--
a.cara

 8)ricomincia ad andare come una spada
ovviamente dopo aver tirato a billgates un po' di moccoli che ancora 
cammina gobbo mi sono dovuto inventare un'altra cosa.
Temo che il tutto sia dovuto ad una mala gestione da parte del 
garbagecollector di windows ma non ho approfondito piu' di tanto.
Piu' o meno lo so che per quanti sforzi faccia ancora non riesco a fare 
venire a me le montagne. Allora ci sono andato io.
--
a.cara

 passo solo.
non avevo visto la exit do ma credo che la sostenza cambi di poco.
Elabori comunque un "fracco" di records. Se i due recordset sono
ordinati per la chiave non dovresti fare la movefirst, forse una move -1 
  prima della exit do potrebbe gia' risolvere la questione.
--
a.cara