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

    Vb6 - Cicli non eseguiti

    Salve a tutti
    Ho questo spezzettone di codice
    codice:
    Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    If Me.TextNumFatt = "" Then End
    If UnloadMode = 0 Then
        Cancel = True
    Else
    'Devo ricalcolare magazzino e totali
        Set cs = New ADODB.Connection
        Set rs = New ADODB.Recordset
        Set con = New ADODB.Connection
        Set res = New ADODB.Recordset
    ' How To: Chiusura form e modifica totali: _
        Stabilire le connessioni, recuperare il vecchio totale _
        calcola il nuovo totale tramite quantità * prezzo ( _
        quella già preventivamente scaricata. Effettua la sottrazione _
        rigetta i parametri nel database, chiudi le connessioni, settale _
        con valore nothing, passa al punto B (standby, DoEvents)
        
        'Res = dettagli fatture
        'Rs = anagrafica prodotti
            cs.Open provider
            rs.Open "anagprodotti", cs, 3, 3
            con.Open provider
            res.Open "dettfatture", con, 3, 3
    '   1. Connessioni stabilite
    If TextNumFatt.text = "" Then
    TextNumFatt.text = "0"
    End If
        Set res = con.Execute("Select * from dettfatture where dett_numfatt = " & TextNumFatt.text)
        If res.RecordCount < 1 Then Exit Sub
        res.MoveFirst
        rs.MoveFirst
    '   2. Risultati puntati al primo record
    
    
    While rs.EOF = False
        Set rs = cs.Execute("Select * from anagprodotti where cod_prodotto = '" & res.Fields("dett_codprodotto").Value & "'")
            vecchiototale = rs.Fields("prezzototale").Value
    '   3. Totale vecchio recuperato
            nuovototale = CCur(rs.Fields("quantita_totale").Value) * CCur(rs.Fields("pracquistoe_prodotto").Value)
    '   4. Totale nuovo recuperato
            newtot = vecchiototale - nuovototale
    '   5. Totale da mettere in db recuperato
            cs.Execute ("Update anagprodotti set prezzototale = '" & newtot & "' where cod_prodotto = '" & res.Fields("dett_codprodotto").Value & "'")
    '   6. Totale rigettato in database
    '   6.1 Per quanto riguarda le quantità
            MsgBox "Update anagprodotti set quantita_magazzino = '" & rs.Fields("quantita_magazzino").Value - res.Fields("dett_quantita").Value & "'"
            cs.Execute ("Update anagprodotti set quantita_magazzino = '" & rs.Fields("quantita_magazzino").Value - res.Fields("dett_quantita").Value & "'")
    '   7. Non chiudo le coonnessioni perchè è un ciclo
            res.MoveNext
    
    Wend
    '   8. Rifaccio il ciclo finchè non finiscono i record della fattura indicata
    End If
    Tutto ciò deve essere eseguito quando viene chiuso il form
    Accorgendomi che non funzionava, ho messo delle msgbox sparse per tutta la sub per capire cosa eseguiva e cosa no.
    Mi sono accorto che tutto va bene fino al ciclio con while
    Infatti non lo esegue per niente. Ho provato a cambiarlo con do until res.eof ma niente da fare il compilatore non lo calcola per niente, non prende via di eseguirlo, il che, dopo averlo letto varie volte, pare alquanto strano. Avete qualche idea?

  2. #2
    Sei sicuro di avere record nel recordset? La sintassi della query è giusta? Il campo dett_numfatt è numerico o di tipo testo?
    Chi non cerca trova.

  3. #3
    No io devo controllare che se non ci sono record (quindi minore di uno) deve eseguire o no il ciclo
    I record ci sono, ma quel bastardo di recordcount mi da come risultato -1, il che sembra inspiegabile...

  4. #4
    Non è che la query è sbagliata?
    Se dett_numfattura è di tipo testo dovresti scrivere:
    codice:
    Set res = con.Execute("Select * from dettfatture where dett_numfatt = '" & TextNumFatt.text) & "'"
    Chi non cerca trova.

  5. #5
    recordcount ti dà -1 perchè le impostazioni di cursortype e cursorlocation ti producono un recordset che non riempie questa proprietà.
    per vedere se non ci sono record vedi se rs.eof = false.

    però mi sembra guardando di sfuggita il codice che fai un pò di confusione tra rs e res, alterni queste due variabili ma non sono sicuro sia giusto.

    e poi è meglio se usi il debug di Visual BAsic (basta cliccare sulla barra di sinistra in prossimità della prima istruzione a cui ti vuoi fermare, ti mette un punto marroncino, poi fai F5 per eseguire e con F8 procedi passo passo) così puoi controllare i valori delle variabili con delle semplici print
    Sem nasù per patì, patèm!

  6. #6
    Utente di HTML.it L'avatar di LMondi
    Registrato dal
    Sep 2004
    Messaggi
    1,291
    Mi sembra che il problema sia qui:
    If res.RecordCount < 1 Then Exit Sub
    res.MoveFirst
    rs.MoveFirst
    LM

  7. #7
    Originariamente inviato da LMondi
    Mi sembra che il problema sia qui:
    If res.RecordCount < 1 Then Exit Sub
    res.MoveFirst
    rs.MoveFirst
    Si l'avevo individuato ieri ma resta il problema che esce à -1...

  8. #8
    Utente di HTML.it L'avatar di Brainjar
    Registrato dal
    Nov 2004
    Messaggi
    1,162
    Questo problema, come per altro ti suggeriva Tas, lo
    risolvi impostando la connessione lato Client :


    'Res = dettagli fatture
    'Rs = anagrafica prodotti
    ' Connessione lato Client
    cs.CursorLocation = adUseClient

    cs.Open provider
    rs.Open "anagprodotti", cs, 3, 3

    ' Connessione lato Client
    cnn.CursorLocation = adUseClient

    con.Open provider
    res.Open "dettfatture", con, 3, 3

    Poi mi chiedo, perchè avere due connessioni allo stesso
    db ?

    Ciao,
    Ciao, Brainjar

  9. #9
    Scuca spiegami un po meglio perchè metterli come aduseclient? Cosa cambia da aduseserver?
    Ho dovuto fare due connessioni, ma in effetti andavano bene solo due recordset...

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.