Leggere il tuo post non è stato facile, oltre a mancare di chiarezza nell'esposizione, non hai nemmeno formattato il codice, per cui la difficoltà nel leggere è aumentata.
Da quello che ho capito io (se ho capito),
quando elimini un documento vuoi aggiornare il campo esistenza di ogni articolo, ricaricando il valore precedentemente scaricato dal documento.
per prima cosa mi chiedo il perchè di questa istruzione:
Do While X < cn.Execute(rps).RecordCount
che esegue la query ad ogni iterazione (non ha alcun senso!).
Piuttosto dovresti fare così:
codice:
Dim nRec as long
nRec = rps.RecordCount
Do While X < nRec
'...
Loop
Ma secondo me invece il loop dovrebbe essere impostato così...
(non conoscendo le tue tabelle, te lo scrivo in pseudo-codice):
codice:
Do While Not rps.EOF
cn.Execute("UPDATE articoli SET esistenza = esistenza + qta-da-recuperare.... WHERE ....")
rps.movenext
Loop
Rem Ora posso eliminare il documento
cn.Execute("DELETE * FROM tabella where IDDocumento = " & idDocumento)
Usare Do While Not rps.EOF è importante soprattutto perchè la proprietà RecordCount restituisce un valore corretto solo se la connessione è impostata sul cursore lato client. Lato server, invece, restituisce sempre -1.
Ora, quando si eseguono operazioni di INSERT ed UPDATE è indispensabile inglobarle in una transazione (cn.BeginTrans/cn.CommitTrans), ma questo è reso possibile SOLO se si imposta il cursore della connessione su adUseServer .
Le transazioni sono fondamentali, altrimenti si rischia molto (dati inconsistenti, perdita di dati, ecc.). Metti che ti si spenga il pc proprio in quel momento...
Per concludere...
Il fatto che ti aggiorni UN solo articolo è ovvio, questa istruzione legge sempre gli stessi dati
codice:
sqe = " update articoli set esistenza ='" & Val(txtscarico.Text) + Val(txtesistenza.Text) & _
"' WHERE descrizione='" & txtdescrizione.text & "'"
Ciao