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

    [VB6] Condizione sul Form

    Ciao ragazzi. Ecco il mio nuovo dilemma.
    Devo gestire la condizione che un db sia pieno o vuoto in una form.
    Mi spiego meglio: ho un db, nel momento in cui questo è vuoto, quando carico il form, da cui carico le informazioni del db, devo poter avere un msg "DB VUOTO". Quando successivamente accedo nuovamente allo stesso form, ma nel db ho inserito dei dati, mi deve lasciar accedere alle info del db.
    Il mio problema è dove mettere la condizione.
    Io ho fatto così:
    codice:
    Private Sub Form_Activate()
    
       If (RsOrdNFor.BOF = True And RsOrdNFor.EOF = True) Then
           MsgBox "Nessun Fornitore esistente per creare un ordine"
        Else
           Inizializza_Combo 'Questa attività se esistono fornitori
           ControlloDB = False
       End If
    
    End Sub
    
    Private Sub Form_Load()
    
       CnOrdNCli.Open "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data " & _
                      "Source=GetsMag.mdb;"
       CnOrdNCli.CursorLocation = adUseClient
       qOrdNFor = "SELECT * FROM Fornitori"
     
       RsOrdNFor.Open qOrdNFor, CnOrdNCli, adOpenDynamic, _
                  adLockOptimistic
      
    End Sub

    Il problema insomma è in quale evento mettere il controllo.
    L'ho messo nell' "Activate", perchè questo form perde il focus, quando bisogna inserire un fornitore.Poi lo riacquista a fornitore inserito.

    Mi aiutate?



    ****************
    Nota del moderatore: invece delle righe bastava utilizzare i tag appositi per il codice: [*code][*/code] (senza *)

  2. #2
    Allora, ho provato a spostare l'inizializzazione della connessione e del recordset nel form_activate, e li richiudo nel form_deactivate:

    codice:
    Private Sub Form_Activate()
     CnOrdNCli.Open "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=GetsMag.mdb;"
     CnOrdNCli.CursorLocation = adUseClient
     qOrdNFor = "SELECT * FROM Fornitori"
     RsOrdNFor.Open qOrdNFor, CnOrdNCli, adOpenDynamic, adLockOptimistic
    If (RsOrdNFor.BOF = True And RsOrdNFor.EOF = True) Then
    MsgBox "Nessun Fornitore esistente per creare un ordine"
    Else
    With RsOrdNFor
        .MoveFirst
        While Not .EOF
        cmbCliente.AddItem !CognomeNome
        cmbCliente.ItemData(cmbCliente.NewIndex) = RsOrdNFor("IDFornitore").Value
        .MoveNext
        Wend
     End With
    RsOrdNFor.Close
    End If
    
    End Sub
    e

    codice:
    Private Sub Form_Deactivate()
    RsOrdNFor.Close
    CnOrdNCli.Close
    End Sub
    Ma in questo caso, se provo ad entrare e uscire dal form (senza fare altre operazioni) mi da "ERRORE di run-time 3704"-L'operazione non è consentita se l'oggetto è chiuso".
    Questo msg me lo da in fase di esecuzione, ma non se faccio il debug.

    Idee?
    Grazie.

  3. #3
    Forse potendo sapere a priori se un recordset e una connessione sono aperti o no, potrei risolvere.
    C'è un modo per verificare lo stato del RS e della CN?

    Ho provato a fare una ricerca sul forum, ma non ho trovato nulla che mi possa veramente aiutare.

  4. #4
    codice:
    Rs.State = adStateOpen
    
    Cn.State = adStateOpen
    prova a testarli in questo modo.

  5. #5
    fammi capire bene,
    tu vuoi caricare un recordset con una select sulla tabella fornitori e caricare la combo solo se esiste almeno un fornitore, giusto?

    bene, se così fosse utilizza la sub Form_Load() controllando la proprietà RecordCount del recordset, in questo modo:
    codice:
    Private Sub Form_Load()
    
       CnOrdNCli.Open "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data " & _
                      "Source=GetsMag.mdb;"
       CnOrdNCli.CursorLocation = adUseClient
       qOrdNFor = "SELECT * FROM Fornitori"
     
       RsOrdNFor.Open qOrdNFor, CnOrdNCli, adOpenDynamic, _
                  adLockOptimistic
    
       If RsOrdNFor.RecordCount = 0 Then
                MsgBox "Nessun Fornitore esistente per creare " & _
                       "un ordine"
           Else
                'Questa attività se esistono fornitori
                Inizializza_Combo 
                ControlloDB = False
       End If
      
    End Sub

    05.08.2005 - by alka
    Auguri all'angelo custode dei moderatori.

  6. #6
    Originariamente inviato da anatroccolo
    codice:
    Rs.State = adStateOpen
    
    Cn.State = adStateOpen
    prova a testarli in questo modo.
    Ho provato a testarli in questo modo, e funziona :gren:

    codice:
    If Rs.State = adStateOpen Then
            lblState.Caption = "APERTO"
        Else
            lblState.Caption = "CHIUSO"
     End If

  7. #7
    Originariamente inviato da ladyBlu
    fammi capire bene,
    tu vuoi caricare un recordset con una select sulla tabella fornitori e caricare la combo solo se esiste almeno un fornitore, giusto?

    bene, se così fosse utilizza la sub Form_Load() controllando la proprietà RecordCount del recordset, in questo modo:
    codice:
    Private Sub Form_Load()
    
       CnOrdNCli.Open "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data " & _
                      "Source=GetsMag.mdb;"
       CnOrdNCli.CursorLocation = adUseClient
       qOrdNFor = "SELECT * FROM Fornitori"
     
       RsOrdNFor.Open qOrdNFor, CnOrdNCli, adOpenDynamic, _
                  adLockOptimistic
    
       If RsOrdNFor.RecordCount = 0 Then
                MsgBox "Nessun Fornitore esistente per creare " & _
                       "un ordine"
           Else
                'Questa attività se esistono fornitori
                Inizializza_Combo 
                ControlloDB = False
       End If
      
    End Sub
    Ok, con il recordcount posso sfruttare una caratteristica dell'oggetto, a cui non avevo pensato. Grazie.
    Ma il problema rimane. Nel senso che io ho la necessità di testare questa condizione ogni volta che entro nel form.
    Io quando passo da un form ad un altro li nascondo solamente:
    codice:
    Private Sub cmdPrincipale_Click()
    frmOrdineNuovo.Hide
    Principale.Show
    End Sub
    qusto significa che se metto la condizione nel Form_Load, la condizione è verificata solo la prima volta che lo carico e non ogni volta che lo visualizzo.

  8. #8
    Credo che si potrebbe risolvere mettendo il controllo sulla Form_Activate, e richiudendo RS e CN nella form_Deactivate, ma mi restituisce l'errore di run-time di cui parlavo prima.

  9. #9
    La tua idea di usare il Form_Activate può essere giusta ma tutte le volte che esci da un form devi chiudere il Rs e la Cn (chiamata a nuovo Form) e quando lo riattivi nell'evento Form_Activate testi lo stato della connessione se è aperta bypassi le righe per l'apertura altrimenti la apri.
    Nel Debug funziona perchè quando chiudi un Form per aprire l'altro Win ti costringe a clikkare sulla barra delle applicazioni ed ecco che parte l'evento.

    Ciao

  10. #10
    Risolto, proprio come diceva Anatroccolo. Grazie.

    Posto:

    codice:
    Private Sub Form_Activate()
    If Not (CnOrdNCli.State = adStateOpen And RsOrdNFor.State = adStateOpen) Then
    CnOrdNCli.Open "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=GetsMag.mdb;"
     CnOrdNCli.CursorLocation = adUseClient
     qOrdNFor = "SELECT * FROM Fornitori"
     RsOrdNFor.Open qOrdNFor, CnOrdNCli, adOpenDynamic, adLockOptimistic
    End If
    If RsOrdNFor.RecordCount = 0 Then
    MsgBox "Nessun Fornitore esistente per creare un ordine"
    ControlloDB = False
    Else
    With RsOrdNFor
        .MoveFirst
        While Not .EOF
        cmbCliente.AddItem !CognomeNome
        cmbCliente.ItemData(cmbCliente.NewIndex) = RsOrdNFor("IDFornitore").Value
        .MoveNext
        Wend
     End With
    ControlloDB = True
    End If
    RsOrdNFor.Close
    CnOrdNCli.Close
    End Sub
    
    Private Sub Form_Deactivate()
    If ControlloDB = True Then
        cmbCliente.RemoveItem (All)
    End If
    End Sub

    Ciao e grazie.
    Sempre preziosissimi.

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.