Stranezza con OldValue

di il
6 risposte

Stranezza con OldValue

Ogni tanto vi tedio con la mia applicazione... portate pazienza
Ho due funzioni pubbliche nei Moduli che uso per scrivere un log dei valori che gli utenti modificano sul DB
La prima scrive una semplice riga di testo in un file log
Public Function ScriviLog(myTesto)
If Len(Dir(P_Path_Log)) > 0 Then
    Open P_Path_Log For Append As #1
Else
    Open P_Path_Log For Output As #1
End If
Print #1, Left(Now(), 10) & ";" & Right(Now(), 8) & ";" & P_User & ";" & P_Computer & ";" & myTesto
Close #1
End Function
La seconda, quella problematica, genera una riga di testo con i nomi dei campi ed i valori che sono stati modificati dall'utente
Public Function TutteLeModifiche(myMe)

' campi logici
' falso 0
' vero -1

Dim ctlC As Control
Dim myResp As String
Dim myCampo, myPrima, myDopo
myResp = ""
For Each ctlC In myMe
    If ctlC.ControlType = acTextBox Or ctlC.ControlType = acCheckBox Or ctlC.ControlType = acComboBox Then
         If ctlC.Enabled Then
            myCampo = ctlC.Name
            myDopo = ctlC.Value
            myPrima = ctlC.OldValue
            If ctlC.ControlType = acCheckBox Then
                If myPrima <> myDopo Or IsNull(myPrima) Or IsNull(myDopo) Then
                    myPrima = IIf(IsNull(myPrima), myPrima, IIf(myPrima = 0, "F", "V"))
                    myDopo = IIf(IsNull(myDopo), myDopo, IIf(myDopo = 0, "F", "V"))
                End If
            End If
            If myPrima <> myDopo Or (IsNull(myPrima) And Not IsNull(myDopo)) Or (Not IsNull(myPrima) And IsNull(myDopo)) Then
                If myCampo = "NOTE_VELOCI" Or myCampo = "LISTINO" Or myCampo <> "NOTE" Then
                    myPrima = IIf(IsNull(myPrima), "", myPrima)
                    myDopo = IIf(IsNull(myDopo), "", myDopo)
                    myPrima = Replace(myPrima, Chr(10), Chr(32))
                    myPrima = Replace(myPrima, Chr(13), Chr(32))
                    myDopo = Replace(myDopo, Chr(10), Chr(32))
                    myDopo = Replace(myDopo, Chr(13), Chr(32))
                End If
                myResp = myResp & myCampo & ":" & myPrima & "->" & myDopo & ";"
            End If
        End If
    End If
Next ctlC
TutteLeModifiche = myResp
End Function
Le richiamo alla chiusura di alcune forms dove l'utente puo' modificare dei valori nelle tabelle
ad esempio chiudendo la form cosi':
Private Sub pulExit_Click()

' qui non funziona per dati da piu' tabelle o query

Dim myTesto As String
If Me.Dirty Then
    myTesto = TutteLeModifiche(Me.Controls)
    ScriviLog ("MODIFICA ESITO ESAME GUIDA CANDIDATO;" & Me.ID_ANAGRAFE & ";" & Me.NOME & ";" & myTesto)
End If
DoCmd.Close
If PV_Mask <> "" Then
    Forms(PV_Mask).Visible = True
End If
End Sub
Tutto funziona egregiamente finche' nella form sono editabili campi di una sola tabella
Ma quando nella form sono editabili campi di tabelle diverse, ovviamente collegate, mi esce in errore alla istruzione
myPrima = ctlC.OldValue
Ovviamente l'applicazione funziona correttamente ormai da un paio di anni
Ho solo aggiunto queste funzioni per tracciare il lavoro giornaliero e tutto ritorna a funzionare a dovere se 'taglio' la chiamata alle suddette funzioni e chiudo le forms senza chiamare
TutteLeModifiche()
Ho provato gia' a lavorare Controls direttamente dal codice della form senza trasmetterlo alla funzione ma l'errore rimane il medesimo

Avete suggerimenti???

6 Risposte

  • Re: Stranezza con OldValue

    Walter61 ha scritto:


    Ma quando nella form sono editabili campi di tabelle diverse, ovviamente collegate, mi esce in errore alla istruzione
    myPrima = ctlC.OldValue
    Qual è l'errore che restituisce? In assenza di quelle funzioni di log la maschera registra le modifiche?
    Si verifica su ogni controllo, già sul primo esaminato nella IF, o solo su alcuni?
    Qual è l'origine dati della maschera e del/i controllo/i che da/nno errore? Usi raggruppamenti?
    Secondo me si tratta di un errore nella struttura della maschera, in cui il lato "molto" è mescolato con il lato "uno" invece di essere diviso tra maschera principale e sottomaschera.
  • Re: Stranezza con OldValue

    Grazie Phil
    Nella maschera sii editano campi di 3 trabelle tutte collegate uno a uno da un'unica chiave univoca che identifica l'anagrafica.
    Ho fatto diversi tentativi con lo scopo di isolare il problema, ebbene
    se rendo editabili solo i campi di una delle tre tabelle non ci sono errori
    ma basta che renda editabile un solo campo di un'altra tabella e senza neanche editarlo che esce in errore
    run time 3251
    operazione non supportata per questo tipo di oggetto
    senza dipendere da quale delle tre tabelle abilito o disabilito
    va in errore quanco cicla i controls
    ho provato a creare una query ad hoc ed alimentare la form con la query
    ma sempre con lo stesso risultato
    con tutte le altre forms di editing non esce mai in errore perche' lavorano su dati di una sola tabella
  • Re: Stranezza con OldValue

    Ciao.
    Faccio prima a darti il link.
    https://docs.microsoft.com/it-it/office/troubleshoot/access/cannot-add-delete-records-ado
  • Re: Stranezza con OldValue

    Walter61 ha scritto:


    ...ma basta che renda editabile un solo campo di un'altra tabella e senza neanche editarlo che esce in errore
    run time 3251
    operazione non supportata per questo tipo di oggetto
    ...
    Non sono riuscito a riprodurre l'errore. Potresti creare una versione dimostrativa ridotta all'osso in cui ovviamente il problema si presenta?
  • Re: Stranezza con OldValue

    Comunque anche a me ultimamente accadono cose strane.
    Ho un database che mi porto dietro da access 97, negli anni modificato, ed integrato. Sempre funzionato. L altro giorno decido di aggiungere una formattazione condizionale. Una banalissima scritta in rosso per i valori inferiori inferiori a 3, realizzata con l opzione di access, neanche in vb. Tutto perfetto. Oggi errore, l'oggetto non supporta l'azione. Cancello la regola, la rifaccio. Sembra tutto ok. Boh.
  • Re: Stranezza con OldValue

    da Philcattivocarattere » 21 ago 2022, 16:29
    Volentieri provo a sintetizzare e poi posto.
    Non sono comunque riuscito a trovare altre soluzioni che questa:
    creare una array da controls dove memorizzare campi e valori alla apertura della form
    poi rielaborare l'array alla richiesta di chiusura form
    per verificare quali campi sono stati modificati
    Public Function ContamiCampi(myMe)
    
    Dim ctlC As Control
    Dim myResp As Integer
    myResp = 0
    For Each ctlC In myMe
        If ctlC.ControlType = acTextBox Or ctlC.ControlType = acCheckBox Or ctlC.ControlType = acComboBox Then
             If ctlC.Enabled Then myResp = myResp + 1
        End If
    Next ctlC
    ContamiCampi = myResp
    End Function
    
    Public Function LeggimiCampi(myArr, myFase, myMe, x)
    
    ' campi logici
    ' falso 0
    ' vero -1
    '
    ' costruisce un array: Campo Tipo Prima Dopo
    '
    Dim myCounter As Integer
    Dim ctlC As Control
    Dim myCampo, myDopo, myTipo
    myCounter = 0
    For Each ctlC In myMe
        If ctlC.ControlType = acTextBox Or ctlC.ControlType = acCheckBox Or ctlC.ControlType = acComboBox Then
             If ctlC.Enabled Then
                myCounter = myCounter + 1
                myCampo = ctlC.Name
                myTipo = ctlC.ControlType
                myDopo = ctlC.Value
                If myFase = 1 Then
                    myArr(myCounter, 0) = myCampo
                    myArr(myCounter, 1) = myTipo
                    myArr(myCounter, 2) = myDopo
                ElseIf myFase = 2 Then
                    myArr(myCounter, 3) = myDopo
                End If
            End If
        End If
    Next ctlC
    LeggimiCampi = myArr
    End Function
    
    Public Function TutteLeModifiche2(x, myArr)
    
    ' campi logici
    ' falso 0
    ' vero -1
    '
    ' lavora un array: Campo Tipo Prima Dopo
    '
    Dim myCounter As Integer
    Dim myResp As String
    Dim myCampo, myTipo, myPrima, myDopo
    myResp = ""
    For myCounter = 1 To x
        myCampo = myArr(myCounter, 0)
        myTipo = myArr(myCounter, 1)
        myPrima = myArr(myCounter, 2)
        myDopo = myArr(myCounter, 3)
        If myTipo = acCheckBox Then
            If myPrima <> myDopo Or IsNull(myPrima) Or IsNull(myDopo) Then
                myPrima = IIf(IsNull(myPrima), myPrima, IIf(myPrima = 0, "F", "V"))
                myDopo = IIf(IsNull(myDopo), myDopo, IIf(myDopo = 0, "F", "V"))
            End If
        End If
        If myPrima <> myDopo Or (IsNull(myPrima) And Not IsNull(myDopo)) Or (Not IsNull(myPrima) And IsNull(myDopo)) Then
            If myCampo = "NOTE_VELOCI" Or myCampo = "LISTINO" Or myCampo <> "NOTE" Then
                myPrima = IIf(IsNull(myPrima), "", myPrima)
                myDopo = IIf(IsNull(myDopo), "", myDopo)
                myPrima = Replace(myPrima, Chr(10), Chr(32))
                myPrima = Replace(myPrima, Chr(13), Chr(32))
                myDopo = Replace(myDopo, Chr(10), Chr(32))
                myDopo = Replace(myDopo, Chr(13), Chr(32))
            End If
            myResp = myResp & myCampo & ":" & myPrima & "->" & myDopo & ";"
        End If
    Next myCounter
Devi accedere o registrarti per scrivere nel forum
6 risposte