Acquista i nostri libri consigliati su Amazon.it
+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 5 su 5

Verifica completamento campi maschera prima di transazione

  1. #1
    L'avatar di RaoulDuke
    RaoulDuke non è in linea Scolaretto
    Buongiorno a tutti.
    Il database sul quale sto lavorando verrà utilizzato da colleghi molto poco avvezzi all'informatica. Vorrei perciò renderlo il più user-friendly possibile.

    Sto in questo momento lavorando su una maschera che permette di aggiungere nuovi prodotti in catalogo. Siccome la maschera va ad inserire dati in più tabelle (tabProdotti e tabPrezzi), creando a volte più record (prezzo d'acquisto e prezzo di vendita) ho deciso di far gestire il tutto da una transazione che si avvia al click del pulsante "Salva".

    Il tutto funziona correttamente. Nasce però la necessità di verificare che tutti i campi obbligatori della maschera siano stati completati dall'utente prima di far partire la transazione. In caso contrario la transazione restituerà un errore che potrebbe spiazziare l'utente non esperto.

    Ho perciò aggiunto una verifica dei campi obbligatori (definiti tramite Tag) che avvisa l'utente e fa SetFocus sul controllo vuoto.

    Il codice finale è questo:

    Private Sub cmdSalva_Click()
    DAO.DBEngine.Workspaces(0).BeginTrans
    
        Dim strSQL As String
        Dim strSQL1 As String
        Dim strSQL2 As String
        Dim strSQL3 As String
        Dim dbs As Database
        Dim Controllo As Control
        Dim MascheraCorrente As Form
        Set MascheraCorrente = Forms(maschera)
            
            'Controllo riempimento campi
            For Each Controllo In MascheraCorrente.Controls
                If Controllo.Tag = "Obbligatorio" Then
                    If Len(Controllo.Value & "") = 0 Then
                        MsgBox "Attenzione! Il campo " & Controllo.Name & " è obbligatorio."
                        Controllo.SetFocus
                    End If
                End If
             Next
        Set Controllo = Nothing
        Set MascheraCorrente = Nothing
    
    
        On Error GoTo tran_Err
           
       'Se la categoria prodotto è "Prestazioni"
        If Me.cboIDCategoriaProdotto = 2 Then
            'Se non ci sono già prezzi registrati
            If DCount("IDPrezzo", "qryVerificaEsistenzaProdotto", "Descrizione = " & "'" & Me.Descrizione & "'" & " AND IDListino = 2") = 0 Then
                Set dbs = CurrentDb
                strSQL = "INSERT INTO tabPrezzi (IDProdotto, IDListino, PrezzoUnitario , DataInizioValidita, DataFineValidita ) VALUES (" & Me.txtIDProdotto & ", 2," & Me.txtPrezzoVenditaEff & "," & Str(CDbl(Me.txtDataInizioValidita)) & ", #31/12/9999#);"
                dbs.Execute strSQL, dbFailOnError
            Else
                MsgBox ("Esiste già un prezzo per questo prodotto")
            End If
             'Per le altre categorie
        Else
            'Se non ci sono già prezzi registrati
            If DCount("IDPrezzo", "qryVerificaEsistenzaProdotto", "Descrizione = '" & Me.Descrizione & "' AND IDListino = 1") = 0 Then
                
                Set dbs = CurrentDb
                strSQL1 = "INSERT INTO tabProdotti (IDProdotto, IDSottocategoriaProdotto,IDTipoIva, IDProduttore, Descrizione)" & _
                        "VALUES (" & Me.IDProdotto & "," & Me.cboIDSottocategoriaProdotto & "," & Me.IDTipoIva & "," & Me.cboIDProduttore & ", '" & Me.Descrizione & "')"
                dbs.Execute strSQL1, dbFailOnError
                strSQL2 = "INSERT INTO tabPrezzi (IDProdotto, IDListino, PrezzoUnitario , DataInizioValidita, DataFineValidita ) VALUES (" & Me.txtIDProdotto & ", 1," & Me.txtPrezzoAcq & "," & Str(CDbl(Me.txtDataInizioValidita)) & ", #31/12/9999#);"
                dbs.Execute strSQL2, dbFailOnError
                strSQL3 = "INSERT INTO tabPrezzi (IDProdotto, IDListino, PrezzoUnitario , DataInizioValidita, DataFineValidita ) VALUES (" & Me.txtIDProdotto & ", 2," & Me.txtPrezzoVenditaEff & "," & Str(CDbl(Me.txtDataInizioValidita)) & ", #31/12/9999#);"
                dbs.Execute strSQL3, dbFailOnError
            Else
                MsgBox ("Esiste già un prezzo per questo prodotto")
            End If
        End If
    
    DAO.DBEngine.Workspaces(0).CommitTrans
    MsgBox "Prodotto registrato con successo", vbOKOnly, " Nuovo Prodotto"
    tran_Exit:
        DBEngine.Workspaces(0).Close
        Set dbs = Nothing
        
    Exit Sub
    
    tran_Err:
        DAO.DBEngine.Workspaces(0).Rollback
        DoCmd.RunCommand acCmdUndo
        MsgBox "Transaction failed. Error: " & Err.Description
        Resume tran_Exit
    
    End Sub
    
    Il problema però è che la routine non si ferma al SetFocus, ma procede oltre e restituisce l'errore.

    Per ovviare al problema ho pensato di associare il controllo di ogni campo oblligatorio all'evento "Su uscita", ma l'utente potrebbe anche spostarsi tra i vari campi con il click del mouse, saltando un eventuale campo obbligatorio.

    Credo di non poter nemmeno sfruttare il controllo automatico attraverso la Proprietà "Richiesto = Sì" a causa della transazione, che parte comunque prima che il controllo possa essere effettuato.

    Vorrei sapere se secondo c'è possibilità di risolvere il problema o se mi suggerite un altro approccio.

    Grazie mille per gli eventuali aiuti!

  2. #2
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    Ovvio se non esci dal ciclo...!
    Devi sempre pensare a cosa vuoi che faccia il tuo codice...!
    Deve obbligare alla compilazione...?
    Allora non deve procedere
        'Controllo riempimento campi
            For Each Controllo In MascheraCorrente.Controls
                If Controllo.Tag = "Obbligatorio" Then
                    If Len(Controllo.Value & "") = 0 Then
                        MsgBox "Attenzione! Il campo " & Controllo.Name & " è obbligatorio."
                        Controllo.SetFocus
                        Exit Sub
                    End If
                End If
             Next
        Set Controllo = Nothing
        Set MascheraCorrente = Nothing
    
    Quando nessun controllo Obbligatorio sarà compilato... allora procedi.
    ℹ️ Leggi di più su @Alex ...

  3. #3
    L'avatar di RaoulDuke
    RaoulDuke non è in linea Scolaretto
    Grazie Alex.
    Avevo intuito e avevo già provato l'Exit Sub ma non so perché non funzionava. Ora sembra andare tutto come dovrebbe. Devo dire che ho anche spostato il controllo riempimento campi prima di

    DAO.DBEngine.Workspaces(0).BeginTrans
    
    per evitare che entri a far parte della transazione. Non so se sia corretto.

  4. #4
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    L'apertura della transazione la devi fare appena prima di eseguire le ActionQueries...
    On Error GoTo tran_Err
            
    'Se la categoria prodotto è "Prestazioni"
    DAO.DBEngine.Workspaces(0).BeginTrans
    
    ℹ️ Leggi di più su @Alex ...

  5. #5
    L'avatar di RaoulDuke
    RaoulDuke non è in linea Scolaretto
    Perfetto grazie!

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Risposte: 5
    Ultimo Post: 19-04-2016, 21:52
  2. Risposte: 15
    Ultimo Post: 21-12-2015, 15:42
  3. Risposte: 2
    Ultimo Post: 29-08-2015, 21:36
  4. Verifica se campo maschera è filtrato
    Da clod71 nel forum Microsoft Access
    Risposte: 6
    Ultimo Post: 08-07-2013, 00:48
  5. Risposte: 3
    Ultimo Post: 15-06-2010, 08:25