Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Vb6 - Intercetta solo un errore in routine

    Ho una routine in cui devo controllare la presenza o meno di alcuni record in un database.
    Nonostante i miei inutili tentativi di usare rs.recordcount, non sono riuscito a capire il numero dei record restituito dato che mi diceva sempre e solo -1 (sulla guida sta scritto che -1=ADO non capisce il numero dei record)
    Cosi da bravo programmatore stratega ho deciso di fare una funzione speciale che fa generare un errore ai record vuoti, mentre a quelli con qualcosa dentro no.
    Ho quindi fatto cosi

    codice:
    On error goto loppata
    rs.movefirst
    set res=cos.execute("Select * from tabella where condizione = 'Bla'")
    res.movefirst
    msgbox "record esistente"
    loppata:
    rs.movenext
    loop until rs.eof
    Adesso se vado a far eseguire il codice passo passo, mi accorgo che il primo record vuoto che genera errore viene intercettato e messo a posto, mentre il secondo no, e quindi mi da la solita finestrella di errore 3021 bla bla bla...
    Cosi ho pensato che "ON ERROR" vale una sola volta a routine, cosi ne ho piazzato un'altro appena intercettato un errore, cosi da ricaricarlo, ma niente da fare il compilatore non si convince e continua a dare errore.
    Come posso risolvere, anche con una strada alternativa per capire se un record è vuoto o no?
    Graziee

  2. #2
    Utente di HTML.it L'avatar di Brainjar
    Registrato dal
    Nov 2004
    Messaggi
    1,162
    Ciao,
    se imposti la connessione con un cursore lato cliente riesci ad
    avere il recordcount :
    codice:
       With cos
         ' Altre impostazioni tue  
         .CursorLocation = adUseClient 'tipo di cursore
       End With  
       
       set res=cos.execute("Select * from tabella where condizione = 'Bla'")
       If rs.Recordcount > 0 Then
    Ciao, Brainjar

  3. #3
    Utente di HTML.it L'avatar di Brainjar
    Registrato dal
    Nov 2004
    Messaggi
    1,162
    Scusa, mi è 'scappato il messaggio, counque e' questo il
    meccanismo.

    Ciao,
    Ciao, Brainjar

  4. #4

    niente

    codice:
    res.CursorLocation = adUseClient
        res.Open "Select * from [acconti_cliente]", con, 3, 3
        rs.MoveFirst
            Do
                Set res = con.Execute("Select * from acconti_cliente where ragionesociale = '" & rs.Fields("ragionesociale").Value & "'")
                    If res.RecordCount = 0 Then GoTo Loppata

    Ho provato questo codice che dovrebbe essere giusto, ma non vuole andare per niente, restituisce sempre e solo -1

  5. #5
    Utente di HTML.it L'avatar di Brainjar
    Registrato dal
    Nov 2004
    Messaggi
    1,162
    Prova così, assegnando un cursore lato client anche al secondo
    recordset.
    codice:
        rs.CursorLocation = adUseClient
        rs.Open "Select * from [acconti_cliente]", con, 3, 3
        rs.MoveFirst 
            Do
                'Set res = con.Execute("Select * from acconti_cliente where ragionesociale = '" & rs.Fields("ragionesociale").Value & "'")
                res.Open "Select * from acconti_cliente where ragionesociale = '" & rs.Fields("ragionesociale").Value & "'", con, 3,3
                If res.RecordCount = 0 Then GoTo Loppata
    Ciao,
    Ciao, Brainjar

  6. #6
    Grazie per il tentativo (anche io sono Napoletano), ma anche provando questo codice
    codice:
     cs.Open provider
        con.Open providera
        rs.CursorLocation = adUseClient
        rs.Open "Select * from [anagclienti]", cs, 3, 3
        res.CursorLocation = adUseClient
        res.Open "Select * from [acconti_cliente]", con, 3, 3
        rs.MoveFirst
            Do
                Set res = con.Execute("Select * from acconti_cliente where ragionesociale = '" & rs.Fields("ragionesociale").Value & "'")
                    If res.RecordCount = 0 Then GoTo Loppata
    Nothing.
    -1, come sempre. E io resto impallato.
    Avete altre soluzioni? Help!!!!

  7. #7
    Utente di HTML.it L'avatar di Brainjar
    Registrato dal
    Nov 2004
    Messaggi
    1,162
    Scusa, ma non mi è chiaro quello che cerchi di fare.
    Esegui una prima query ricavandoti un recordset che ti serve per
    comporre una seconda query per l'estrazione di un altro recordset.
    Giusto?
    codice:
        cs.CursorLocation = adUseClient
        cs.Open provider
    
        ' Prova ad impostare anche la connessione con cursore lato Client
        con.CursorLocation = adUseClient
        con.Open providera
    
        ' La proprietà per i recordset è CursorType 
        rs.CursorType = adOpenKeyset
        ' 1a query
        rs.Open "Select * from [anagclienti]", cs, 3, 3
    
        res.CursorType = adOpenKeyset
    
        ' Questa è inutile 
        ' res.Open "Select * from [acconti_cliente]", con, 3, 3
    
        rs.MoveFirst
            Do
                ' 2a query   
                res.Open "Select * from acconti_cliente where ragionesociale = '" & rs.Fields("ragionesociale").Value & "'", con, 3, 3
                If res.RecordCount = 0 Then GoTo Loppata
    
            .....
            .....
    Prova a ricavare il recordest con res.Open e non con con.Execute,
    come nell'esempio.

    Ciao,
    Ciao, Brainjar

  8. #8
    SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSMACK
    Qui puoi trovare il numero di carta di credito
    30948230948324
    prelevati una cifra a piacere.

    Sei un genio. Mai a pensarci (anche se non capisco ancora il perchè).

  9. #9
    Utente di HTML.it L'avatar di Brainjar
    Registrato dal
    Nov 2004
    Messaggi
    1,162
    Probabilmente era solo necessario impostare anche la seconda
    connessione lato client.
    Ma il codice scritto in modo 'pulito' e 'lineare' non ha prezzo.
    Ti semplifica la vita e ti evita un sacco di errori.

    Grazie per i complimenti, troppo buono.
    Ciao,
    Ciao, Brainjar

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.