Gestione applicativo versione demo

di il
21 risposte

21 Risposte - Pagina 2

  • Re: Gestione applicativo versione demo

    zio Ken ha scritto:


    @Alex ha scritto:


    Se usi in modo corretto la compilazione condizionale si.
    ciao Alex, perdonami ma ho provato a convertire l'applicativo da 32 a 64 bit dove giusto qualche chiamata alle API era da settare.
    Però ho riscontrato che se ad esempio, in fase di creazione documento, sul 32 bit nel caso in cui tentavo di salvare, sul btnSalva vi erano una serie di controlli, quali il metodo di pagamento e varie.
    Il metodo di pagamento è indicizzato e nel caso in cui non inserito ho inserito un allert dove veniva richiesto.
    diversamente nel 64 bit tale controllo viene totalmente ignorato e compare a video l'allert di access dove richiede l'inserimento del dato perchè non previsti valori nulli.

    Come mai questo "comportamento"? Anche i controlli bisogna gestire? Mi sembrava di aver capito che la questione fosse relativa solo a chiamate API e function
    Il codice Nativo di Access non subisce varianti... quindi la risposta teorica è SI non serve alcuna precauzione... tuttavia sai anche tu che chi scrive codice alcune volte fa cose per scontate non sempre in piena consapevolezza e magari incappa in qualche rogna.

    Ad esempio quando dici che solo le API hanno il problema, l'affermazione può essere FALSA... perchè mal interpretata.
    Ti faccio un esempio banale:
    Versione 32Bit
    
    Private Declare Function FindWindow Lib "User32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Versione 64Bit
    
    Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
    Cosa significa per te concretamente che le API generano il problema...?
    Se la tua idea è che ti basta sostituire la 2° alla 1°... beh direi che stai sbagliando...!
    Come vedi le 2 Chiamate, al di la del PTRSAFE, restituiscono un Valore che altro non è che l'Handle della Finestra, ma mentre nella versione a 32Bit è un [Long], nella versione a 64Bit è un [LongPtr].
    Quindi dove usi queste chiamate, se hai a versione 32 dichiari
    
    Dim hWnd As Long
    mentre dove hai la versione 64 Bit non va bene e devi dichiarare
    
    Dim hWnd As LongPtr
    Ne consegue che anche il Codice che interagisce con le API deve essere considerato e gestito con la Compilazione condizionale...!
    Andrà quindi scritta una cosa simile
    
    #If VBA7 Then      
        Private Declare PtrSafe Function FindWindow Lib "USER32" Alias "FindWindowA" _
            (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
    #Else
        Private Declare Function FindWindow Lib "USER32" Alias "FindWindowA" _
            (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    #End If
    
    Public Sub Tua Function(ByVal WindowTitle As String)
    #If VBA7 Then
        Dim hwnd As LongPtr
    #Else
        Dim hwnd As Long
    #End If
    
        hwnd = FindWindow(vbNullString, WindowTitle)
    	' ecc....
    End Sub
    Chiarito questo, mi chiedo tuttavia se, prima di COMPILARE tu non abbia fatto un DEBUG serio sulla versione 64Bit... ti fidi a compilare e sperare che funzioni tutto...? Non conviene provare la versione ACCDB e testarla prima...?

    Come fai DEBUG sulla versione COMPILATA...? (non si può se non hai predisposto un tool apposito di LOG interno...)

    Insomma secondo me serve un minimo di metodo... che probabilmente devi consolidare.
  • Re: Gestione applicativo versione demo

    Si, trasportato dall'entusiasmo pensavo che bastasse l'aggiunta del PtrSafe laddove necessario...non pensavo che potessi riscontrare problemi anche su un semplice tasto di salvataggio...il fatto è che il codice mi restituisce errore di runtime 2427.

    Il controllo in questo caso non segnala la differenza importi ma bensì compare a video l'errore sopra citato...eppure non ci sono dichiarazioni ne altro...
    If IsNull(TotaleNettoDocumento) Then
        If (Forms![FormInserisciDocumenti]![FormDocumentoScadenzePagamenti].Form![TotScad] <> Forms![FormInserisciDocumenti]![TotaleDocumento]) Then
            MsgBox "La somma del totale scadenze non corrisponde al Totale Netto Documento." & vbLf & _
            "Controllare Importi in scadenza", vbOKOnly + vbCritical, "Errore totali documento": Exit Sub
        End If
    Else
        If (Forms![FormInserisciDocumenti]![FormDocumentoScadenzePagamenti].Form![TotScad] <> Forms![FormInserisciDocumenti]![TotaleNettoDocumento]) Then
            MsgBox "La somma del totale scadenze non corrisponde al Totale Netto Documento." & vbLf & _
            "Controllare Importi in scadenza", vbOKOnly + vbCritical, "Errore totali documento": Exit Sub
        End If
    End If
    qui non sto riuscendo a capire...devo impostare diversamente? O c'è un errore che ignoro?
  • Re: Gestione applicativo versione demo

    DEVI FARE DEBUG... altrimenti non ne esci e noi non riusciamo a farlo non avendo il modo di lavorare sul tuo prodotto...
    In sostanza non c'è un'errore sostanziale ma se fai debug cercando cosa non va... magari abituati ad usare una gestione errori ben fatta e non delegare il sw a rilasciare errori, perché potrebbe essere da tutt'altra parte ed essere rilasciato lì...
  • Re: Gestione applicativo versione demo

    @Alex ha scritto:


    DEVI FARE DEBUG... altrimenti non ne esci e noi non riusciamo a farlo non avendo il modo di lavorare sul tuo prodotto...
    In sostanza non c'è un'errore sostanziale ma se fai debug cercando cosa non va... magari abituati ad usare una gestione errori ben fatta e non delegare il sw a rilasciare errori, perché potrebbe essere da tutt'altra parte ed essere rilasciato lì...
    ho fatto DEBUG ed il problema è sempre legato all'if e l'errore è questo
    Nessun valore nell'espressione immessa.L'espressione fa riferimento a un oggetto che non ha alcun valore, ad esempio una maschera, un report o un'etichetta.
    Presumo sia dovuto al fatto che il campo TotScad che è presente nel piè della FormDocumentoScadenzePagamenti fa la sommatoria di tutte gli importi delle scadenze. Questi vengono generati tramite una funzione che a seconda del pagamento selezionato ricalcola le n scadenze ma se non si seleziona il pagamento, questo campo non si valorizza. Ho inserito nell'origine controllo di TotScad
    =Nz(Somma([ImportoRata]))
    ma anche facendo così non si valorizza a 0.
    Ho provato assegnando un valore currency durante il salvataggio del documento ma il problema resta
    dim totScadDocumento as Currency
    totScadDocumento = 0
    
    If IsNull(Forms![formInserisciDocumenti]![FormDocumentoScadenzePagamenti].Form![TotScad]) Then
        totScadDocumento = 0
    Else
        totScadDocumento = Forms![formInserisciDocumenti]![FormDocumentoScadenzePagamenti].Form![TotScad]
    End If
    
    If totNettodocumentoCur = 0 Then
        If totScadDocumento <> (Forms![formInserisciDocumenti]![TotaleDocumento]) Then
            MsgBox "La somma del totale scadenze non corrisponde al Totale Netto Documento." & vbLf & _
            "Controllare Importi in scadenza", vbOKOnly + vbCritical, "Errore totali": Exit Sub
        End If
    Else
        If totScadDocumento <> (Forms![formInserisciDocumenti]![TotaleNettoDocumento]) Then
            MsgBox "La somma del totale scadenze non corrisponde al Totale Netto Documento." & vbLf & _
            "Controllare Importi in scadenza", vbOKOnly + vbCritical, "Errore totali": Exit Sub
        End If
    End If
    
    durante l'assegnazione a totScadDocumento ho provato anche (Forms![formInserisciDocumenti]![FormDocumentoScadenzePagamenti].Form![TotScad])= 0 ma nulla, mi segnala sempre lo stesso errore come se l'if che verifica se TotScad è nullo o uguale a zero non riuscisse a rilevare nulla...come potrei risolvere?
  • Re: Gestione applicativo versione demo

    Perdonatemi se riscrivo ma avrei necessità di supporto perchè ho davvero finito le idee
  • Re: Gestione applicativo versione demo

    zio Ken ha scritto:


    ... Ho inserito nell'origine controllo di TotScad
    =Nz(Somma([ImportoRata]))
    ma anche facendo così non si valorizza a 0...
    Cosa ottieni se sommi un valore Null a dei valori numerici?
    Cosa succede se, in caso di valore Null, fai impostare a Zero il valore restituito dalla funzione Nz()?
    Può avere senso per te, impostare a Zero (se null), l'ImportoRata invece di porre a zero la Sommatoria delle rate?
    Insomma, se pensi che il tuo problema sia sulla sommatoria prova queste varianti :
    
    =Nz(Somma([ImportoRata]),0)
    =Somma(Nz([ImportoRata],0))
    
    Occhio al separatore in funzione del contesto ( ',' oppure ';' ) ...
  • Re: Gestione applicativo versione demo

    Premesso che l'ultimo argomento esula dal titolo oggetto del 3D, in ogni caso parti dall'errore di runtime 2427 il quale indica che l'espressione fa riferimento a un oggetto non valorizzato, quindi, come ti è stato consigliato, impiega il Debug è controlla il valore di ciò che determina l'errore.
    Schematicamente, dovrai individuare l'elemento dell'errore e superare l'inconvenente:
    
    If IsNull(Me![Elemento]) Then ...
    If Me![Elemento] = "" Then ...
    If Me.Elemento.Value = True Then ...
    
    Considera, ad esempio, che lo scopo della funzione Nz() è quello di rendere un valore in caso il record sia NULL, se la tabella non ha righe non c'è nessun valore NULL da trasformare.
    In ogni caso implementare una gestione degli errori che copra i vari casi è sempre auspicabile:
    https://highaltitudesql.wordpress.com/2015/04/15/the-importance-of-vbas-on-error-with-reports-and-run-time-error-2427/
Devi accedere o registrarti per scrivere nel forum
21 risposte