Problema in Close di una maschera.

di il
26 risposte

26 Risposte - Pagina 2

  • Re: Problema in Close di una maschera.

    OsvaldoLaviosa ha scritto:


    MsgBox contiene un vbYesNo. Se non si tratta di 6=vbYes, penso che Else significa (automaticamente--->solo) vbNo=7.
    Mi si corregga se sbaglio.
    Esattamente
  • Re: Problema in Close di una maschera.

    carlo pots ha scritto:


    OsvaldoLaviosa ha scritto:


    MsgBox contiene un vbYesNo. Se non si tratta di 6=vbYes, penso che Else significa (automaticamente--->solo) vbNo=7.
    Mi si corregga se sbaglio.
    Scusa Osvaldo non avevo tenuto conto del msgbox, anche perchè non vedo alcun collegamento tra il vbYes ed il 6

    Esattamente
    Cosa?
    In questo caso andava scritto:
    If title = Yes Then
           Fai questo.....
    else   (che vuole dire no)
        fai quest'altro....
    end if
      chiudi maschera...
    ...o no?
  • Re: Problema in Close di una maschera.

    Sono arrivato un pochetto ad inorridire per le inesattezze più disparate che sono state dette..., il Natale mi aiuta però, ma non proseguo con le osservazioni, dico quello che scriverei io... poi da li si riparte...
    Chiamare [title] una variabile che in realtà è il RISULTATO di un msgBox deve pur avere un senso... o no...?
    
    Private Sub NomeSub(....)
        Dim msgResult As VBA.VbMsgBoxResult
        msgResult = MsgBox(testomessaggio, vbYesNo, "Completamento Classifica")
        If msgResult =vbYes then
            ' Quì farai quello che serve in caso di YES
        Else
            ' Quì fai quello che serve in caso di NO
        End If
    ....
    End Sub
    Definendo la Variabile [msgResult As VbMsgBoxResult] otterremo che nella composizione del controllo in IF... l'intellisense mostra i valori che la variabile TIPIZZATA può assumere... e sono tutti quelli che la Funzione MsgBox può restituire.
    Tuttavia in questo caso il MsgBox è stato definito per restituire SOLO vbYesNo, ne consegue che ci sono SOLO 2 Casi da analizzare e che definito il primo, nel mio caso ho usato/esplicitato vbYes, rimane l'ELSE che implicitamente è SOLO il vbNO.

    I Valori delle ENUM Tipizzate si trovano nella Guida
    
    Enum VbMsgBoxResult
        Membro di VBA
    Const vbOK = 1     	Membro di VBA.VbMsgBoxResult
    Const vbCancel = 2    	Membro di VBA.VbMsgBoxResult
    Const vbAbort = 3    	Membro di VBA.VbMsgBoxResult
    Const vbRetry = 4    	Membro di VBA.VbMsgBoxResult
    Const vbIgnore = 5    	Membro di VBA.VbMsgBoxResult
    Const vbYes = 6    	Membro di VBA.VbMsgBoxResult
    Const vbNo = 7    	Membro di VBA.VbMsgBoxResult
    Serve del METODO...!!!!

    Detto questo non ho ancora capito se la maschera da chiudere è quella in cui gira questo codice o meno...!
    Se così fosse, prendete le abitudini di scrivere codice che sia COMPRENSIBILE, quindi se il codice deve chiudere la maschera stessa, fate in modo che si capisca da come scrivete il codice..., è indispensabile...? NO, ma è comprensibile per chi ha un minimo di basi... e per tutti.
    Scrivendo così, uno sa perforza che il codice è nella maschera che di deve chiudere:
    
    DoCmd.Close acForm, Me.Name
    E' indispensabile dichiarare il tipo di oggetto ed il Nome, in quanto l'azione CLOSE se non specificato agisce sull'oggetto ATTIVO, e non è detto sia quello che pensate voi...
  • Re: Problema in Close di una maschera.

    Buongiorno Alex, in primis.
    Riguardo ai primi due punti, sono concorde con te; magari ho usato una forma molto più semplice (e magari anche orrida, ma qualche volta l'orrido funziona, basta vedere quante Fiat Duna sono state vendute), ma è quanto ho potuto sempre scartabellare dai vari tutorial e, per comodità, ho un pò "fatto mio" quel tipo di codice.
    Riguardo all'Else, come detto, preferisco sempre limitare le azioni a quello che voglio fare, anche se è scontato che "se non è SI, è NO", OVVIO!

    Detto ciò, veniamo al nocciolo (e quindi rimanendo IT), al problema della chiusura.
    Premetto che tutte righe di codice si trovano in una Private Sub di tipo exit; in una delle istruzioni IF-Then, avevo impostato che, se si verifica il caso del vbYes, prima di arrivare alla Else (o, se vogliamo solo prendere in considerazione la vbYes, prima di arrivare alla Endif), lui mi deve chiudere la maschera.
    Ho provato a inserire l'istruzione di chiusura in tutti i modi:
    Da una semplice e laconica DoCmd.Close a una più dettagliata DoCmd.Close acForm, "Maschera", acSaveYes
    Niente da fare: sempre l'errore 2585.
    E' come se io avessi lasciato qualcosa in sospeso nella Sub (che ripeto: è sempre una Exit) e lui non me la fa chiudere.

    Devo dire che, per non perdere tempo e dare ai clienti la possibilità di continuare a lavorare tranquillamente, ho inserito un pulsante e, all'occorrenza ho fatto in modo da assegnargli il SetFocus in modo che all'operatore basta battere "Invio" (o "Enter") per far chiudere la maschera, ma avrei preferito gestire la cosa in automatico.
    Se hai bisogno di più notizie, chiedi pure.
  • Re: Problema in Close di una maschera.

    In definitiva, la Sub completa è questa
    Private Sub PERCCLASSE_Exit(Cancel As Integer)
    Dim PesoClasse As Double
    Dim PrezzoClasse As Double
    Dim PRPART As Double
    Dim PRMED As Double
    
    
            If IsNull(Me.PERCCLASSE) = True Then
                Me.PERCCLASSE = 0
                Me.KGCLASSE = 0
                Me.PREZKG = 0
                
                End If
                
        PRPART = Nz(DSum("[PREZKG]", "BolPerizClassTemp", "[IDBOLLETTINO]='" & Me.IDBOLLETTINO & "'"))
        Me.txtPrPartita = Round(PRPART, 2)
    
        Me.nmKgPeriziati = Nz(DSum("[KGCLASSE]", "BolPerizClassTemp", "[IDBOLLETTINO]='" & Me.IDBOLLETTINO & "'"))
        Me.nmPesoNettRest = Nz(Me.txtKGPagamento - Me.nmKgPeriziati)
        Me.txtPercent = Nz(DSum("[PERCCLASSE]", "BolPerizClassTemp", "[IDBOLLETTINO]='" & Me.IDBOLLETTINO & "'"))
        Me.txtPercent3 = Me.txtPercent2 - Me.txtPercent
    
        Me.txtPrMed = Round(((Me.txtPrPartita / Me.txtKGPagamento) * 100), 2)
        Me.A = A - 1
        
           
        If Me.A = 0 Then
                        Me.PERCCLASSE = Me.txtPercent3
            Me.KGCLASSE = Me.nmPesoNettRest
            Me.PERCCLASSE.Enabled = False
            Me.KGCLASSE.Enabled = False
            
            '---------------CALCOLO TOTALI------------------
            '
            ' calcola quantitativo e prezzo per la classe
            '-----------------------------------------------
            PrezzoClasse = Nz(Me.KGCLASSE * Me.PRCLASSE)
            Me.PREZKG = Round(PrezzoClasse, 2)
            DoCmd.RunCommand acCmdSaveRecord
            '---------------CALCOLO TOTALI------------------
            ' - Calcolo Prezzo Partita
            
            PRPART = Nz(DSum("[PREZKG]", "BolPerizClassTemp", "[IDBOLLETTINO]='" & Me.IDBOLLETTINO & "'"))
            Me.txtPrPartita = Round(PRPART, 2)
            
            Me.nmKgPeriziati = Nz(DSum("[KGCLASSE]", "BolPerizClassTemp", "[IDBOLLETTINO]='" & Me.IDBOLLETTINO & "'"))
            Me.nmPesoNettRest = Nz(Me.txtKGPagamento - Me.nmKgPeriziati)
            Me.txtPercent = Nz(DSum("[PERCCLASSE]", "BolPerizClassTemp", "[IDBOLLETTINO]='" & Me.IDBOLLETTINO & "'"))
            Me.txtPercent3 = Me.txtPercent2 - Me.txtPercent
            Me.txtPrMed = Round(((Me.txtPrPartita / Me.txtKGPagamento) * 100), 2)
            Dim testomessaggio As String
            
            testomessaggio = "Il prezzo medio è € " & Me.txtPrMed & " al Q.le; Confermi?"
            title = MsgBox(testomessaggio, vbYesNo, "Completamento Classifica")
            
                If title = 6 Then
                        [Forms]![TTBOLPEU]![PREZ_TOTALE] = Me.txtPrPartita
                        [Forms]![TTBOLPEU]![PREZ_MEDIO] = Me.txtPrPartita / Me.nmKgPeriziati
            
                        '-------- Accoda Classifica
                        'Dim stDocName As String
            
                        stDocName = "Q_ACCODAMENTO_BOLPERIZ"
                        DoCmd.OpenQuery stDocName, acNormal, acEdit
                        '-------- Fine Accodamento Classifica
            
                        CurrentDb.Execute "DELETE * FROM [BolPerizClassTemp]" '-----> Cancella la tabella temporanea
                        [Forms]![TTBOLPEU]![Classifica].Requery
                     
                     '-----------------------------------------------------------------!
                     '                         Chiudi la maschera   
                     '-------------------------------------------------------------------
                        DoCmd.Close acForm, "TTBOLPEU_CL", acSaveYes     '!
    
    
                            Exit Sub
                    
                    Else
                        If title = 7 Then
                            stDocName = "Q_ReCLASS_RIT"
                            DoCmd.OpenQuery stDocName, acNormal, acEdit
                            Me.Requery
                            Me.PERCCLASSE.Enabled = True
                            Me.txtPrMed = 0
                            Me.txtPrPartita = 0
                            Me.PERCCLASSE.SetFocus
                            Me.A = DCount("[IDCLASSIFICA]", "BolPerizClassTemp", "[PERCCLASSE]=0")
                        End If
                    End If
                End If
    
      
        
         
         
         
         
       
    End Sub
    
    Non inorridire troppo
  • Re: Problema in Close di una maschera.

    carlo pots ha scritto:


    Buongiorno Alex, in primis.
    Riguardo ai primi due punti, sono concorde con te; magari ho usato una forma molto più semplice (e magari anche orrida, ma qualche volta l'orrido funziona, basta vedere quante Fiat Duna sono state vendute), ma è quanto ho potuto sempre scartabellare dai vari tutorial e, per comodità, ho un pò "fatto mio" quel tipo di codice.
    Non diciamo cose banali... altriementi non ha senso fare discorsi tecnici, è evidente che le cose possono funzionare anche scritte male... e quello lo puoi fare tu nel tuo PC se non ti confronti con nessuno, se ti approcci ad un FORUM nel quale si ragiona in modo tecnico, no...!

    carlo pots ha scritto:


    Riguardo all'Else, come detto, preferisco sempre limitare le azioni a quello che voglio fare, anche se è scontato che "se non è SI, è NO", OVVIO!
    Questa è una cosa inutile tecnicamente, vale il concetto sopra... le cose si fanno prima di tutto TECNICAMENTE corrette, quando si hanno ottime conoscenze si può essere superficiali, di solito accade il contrario...

    carlo pots ha scritto:


    Detto ciò, veniamo al nocciolo (e quindi rimanendo IT), al problema della chiusura.
    Premetto che tutte righe di codice si trovano in una Private Sub di tipo exit; in una delle istruzioni IF-Then, avevo impostato che, se si verifica il caso del vbYes, prima di arrivare alla Else (o, se vogliamo solo prendere in considerazione la vbYes, prima di arrivare alla Endif), lui mi deve chiudere la maschera.
    Ho provato a inserire l'istruzione di chiusura in tutti i modi:
    Da una semplice e laconica DoCmd.Close a una più dettagliata DoCmd.Close acForm, "Maschera", acSaveYes
    Niente da fare: sempre l'errore 2585.
    E' come se io avessi lasciato qualcosa in sospeso nella Sub (che ripeto: è sempre una Exit) e lui non me la fa chiudere.
    Prova stupida:
    
    DoEvents 
    DoCmd.Close acForm, Me.Name
    Hai un EVENTO UNLOAD gestito nella Form in questione...?
    Hai fatto DEBUG per capire prima di Generare l'errore dove si pianta...?
    Hai messo una gestione errori seria che consenta di capire quale Routine genera l'errore ...?
    Perchè in caso di chiamate gerarchiche a varie Sub/Function in modo scalare, cosa che abitualmente chi scrive male il codice fa, poi vanno a generare errore alla PRIMA non gestita e non si capisce nulla...
    Fare codice FACILMENTE LEGGIBILE e DEBUGGABILE fa la differenza quando si scrive codice... ed il ragionamento del "tanto funziona..."... lo lasciamo al BAR.

    carlo pots ha scritto:


    Devo dire che, per non perdere tempo e dare ai clienti la possibilità di continuare a lavorare tranquillamente, ho inserito un pulsante e, all'occorrenza ho fatto in modo da assegnargli il SetFocus in modo che all'operatore basta battere "Invio" (o "Enter") per far chiudere la maschera, ma avrei preferito gestire la cosa in automatico.
    Se hai bisogno di più notizie, chiedi pure.
    Vedi tu...
  • Re: Problema in Close di una maschera.

    @Alex ha scritto:


    Prova stupida:
    
    DoEvents 
    DoCmd.Close acForm, Me.Name
    Non funge

    @Alex ha scritto:


    Hai un EVENTO UNLOAD gestito nella Form in questione...?
    Perdonami: che intendi per Evento Unload?

    @Alex ha scritto:


    Hai fatto DEBUG per capire prima di Generare l'errore dove si pianta...?
    Si, si pianta proprio esattamente così:

    -> DoCmd.Close acForm, Me.Name

    E mi da "Errore di Run_Time '2585': Impossibile eseguire questa azione durante l'elaborazione di un evento di maschera o di report".

    @Alex ha scritto:


    Hai messo una gestione errori seria che consenta di capire quale Routine genera l'errore ...?
    Non in questa sub; in altre ho messo una gestione personale degli errori per far si di sapere quale caxxata è stata fatta.

    @Alex ha scritto:


    Perchè in caso di chiamate gerarchiche a varie Sub/Fuinction in modo scalare, cosa che abitualmente chi scrive male il codice fa, poi vanno a generare erorre alla PRIMA non gestita e non si capisce nulla...
    Fare codice FACILMENTE LEGGIBILE e DEBUGGABILE fa la differenza quando si scrive codice... ed il ragionamento del "tanto funziona..."...
    Non lo metto in dubbio, tanto che mi sforzo anche di inserire dei commenti personali per andare direttamente alle righe che mi interessano in prima istanza.
    Comunque ti ho postata l'intera Subroutine, non so se l'hai vista...
  • Re: Problema in Close di una maschera.

    carlo pots ha scritto:


    Si, si pianta proprio esattamente così:

    -> DoCmd.Close acForm, Me.Name
    E mi da "Errore di Run_Time '2585': Impossibile eseguire questa azione durante l'elaborazione di un evento di maschera o di report".
    Quindi hai un processo in corso... quale lo devi scoprire tu ovviamente e non è sicuramente colpa della chiamata ad CLOSE il problema, quello è semplicmente l'annullamento della chiusura... quindi stai cercando nel posto sbagliato... dove devi cercare...?
    Ora fai DEBUG..., ma prima metti le gestioni ERRORI e vedrai che non verrà rilasciato l'errore su tetnativo di chiusura ma durante il tentativo di TERMINARE il processo che ti genera l'ultimo errore.
  • Re: Problema in Close di una maschera.

    Questa Routine, se la leggi, ha due processi in corso:
    L'esecuzione di una Query di Accodamento:
    stDocName = "Q_ACCODAMENTO_BOLPERIZ"
    DoCmd.OpenQuery stDocName, acNormal, acEdit
    e la cancellazione di una tabella temporanea:
    CurrentDb.Execute "DELETE * FROM [BolPerizClassTemp]"
    Per gli errori provo e ti faccio sapere
  • Re: Problema in Close di una maschera.

    Sempre la stessa cosa: si pianta sempre sull'istruzione di chiusura dandomi in sostanza la descrizione in una MsgBox.
    Non si pianta in nessun'altra riga, solo sul DoCmd.Close
    Solo lì.
    E sempre perché dice che ho una gestione di una maschera o un report in corso.
    Ma in realtà, gli eventi in corso sono solo l'esecuzione di una query e la cancellazione di una tabella temporanea.

    Continuo a non capire.
  • Re: Problema in Close di una maschera.

    Rimuovi le Azioni ASINCRONE come quelle che hai descritto, tutte e le reinserisci una alla volta.
  • Re: Problema in Close di una maschera.

    Niente da fare.
    Ci rinuncio; meglio mettere il pulsante e arrivederci.
Devi accedere o registrarti per scrivere nel forum
26 risposte