Consolidamento dati di un campo

di il
4 risposte

Consolidamento dati di un campo

Buongiorno, sono qui a chiedervi se con vba di acces posso aver modo di cercare in un campo una stringa di testo ed in caso positivo eseguire una mia istruzione in VBA

Ho un capo di testo dove riporto le modifiche apportate dal campo Pluto della mia maschera, annotando la data tra questi due segni >><<, poi il campo che ho modificato, riportando che prima il suo contenuto era quello evidenziato dai segni ><.

Il testo viene composto automaticamente con istruzione vba, e funziona senza problemi. utilizzando un pulsante delll Msg box Int Risposta
If intRisposta = vbYes Then
Me.DescrErrore = Me.DescrErrore & " >>" & Left(Now, 10) & _
"<< Pluto era >" & me.vecchiovalore & "<;"
end if
faccio un esempio, testo del campo: ">>01/01/2022<< il campo Pluto era>latte<; >>03/01/2022<< il campo Pluto era>osso<; "

Io vorrei ottimizzare il numero dei caratteri che si vanno accumulando e campo DescrErrore per ogni modifica; vorrei quindi evitare che succedesse questo tipo di ripetizione; nel caso specifico la data 03/01/2022 (data coincidente con la data del giorno in cui è avvenuta la modifica) verrebbe ripetuta per due modifiche
">>01/01/2022<< il campo Pluto era>latte<; >>03/01/2022<< il campo Pluto era>osso<; >>03/01/2022<< il campo Pluto era>formaggio<"

per ottenere questo altro risultato con 14 caratteri in meno: ">>01/01/2022<< il campo Pluto era>latte<; >>03/01/2022<< il campo Pluto era>osso< ed il campo Topolino era>formaggio<"

Riassumendo: cercare se nel campo DescrErrore l'ultima stringa contiene la data corrente [Left(Now, 10)], in caso positivo
Me.DescrErrore = Me.DescrErrore & " ed il campo Pluto era >" & me.vecchiovalore & "<;"

Scusate se non riesco a spiegare meglio di così la mia richiesta

4 Risposte

  • Re: Consolidamento dati di un campo

    L'impostazione è errata : dovresti normalizzare il db.
    Ovvero dovresti avere una tabella con (almeno) i seguenti 3 campi :
    DataModifica, NomeCampo, ValorePrecedenteCampo.
    Poi con una ricerca effettuata per DataModifica+NomeCampo se il record esiste aggiorni il ValorePrecedente (se non esiste inserisci il record).

    Prevenendo la tua possibile risposta (non posso/non voglio modificare il db) puoi agire tramite VBA :
    Ricerchi l'esistenza della data tramite la funzione INSTR(), se restituisce 0 puoi accodare alla stringa quello che ti serve, se restituisce >0 effettui un replace considerando che al valore restituito devi sommare la lunghezza + 1 della stringa (la data) che stai cercando. E' abbastanza semplice anche se ti serve trovare l'inizio della parte da sostituire e la lunghezza ...
    Verifica sull'help in linea per la sintassi di INSTR() e di REPLACE()
  • Re: Consolidamento dati di un campo

    max.riservo ha scritto:


    L'impostazione è errata : dovresti normalizzare il db. ........ Prevenendo la tua possibile risposta (non posso/non voglio modificare il db) puoi agire tramite VBA....... tramite la funzione INSTR(),
    Grazie per il suggerimento. Non ho però utilizzato la funzione replace () visto che ho risolto con queste istruzioni:
     If intRisposta = vbYes Then
                If InStr(1, Me.DescrErrore, Left(Now, 10), vbTextCompare) Then
                Me.DescrErrore = Left(Me.DescrErrore, Len(Me.DescrErrore) - 1) & " e Pluto era >" & me.vecchiovalore & "<;"
               Else
               Me.DescrErrore = Me.DescrErrore & " >>" & Left(Now, 10) & _
               "<< Pluto era >" & me.vecchiovalore & "<;"            End If
               End If
    End If
    End Sub
    Mi sono limitato a verificare la presenza del testo corrispondente ai 10 caratteri del giorno corrente , se si, tolgo l'ultimo carattere (il punto e virgola) e proseguo la frase con le mie leggere modifiche al testo; se no, la formula precedente resta invariata.

    A questo punto, mi pongo un secondo problema correlato alle precedenti istruzioni. Il campo descrErrore annota tutte le modifiche eventualmente apportate in 5 campi diversi della maschera (che ne contiene anche altri). Vorrei concentrare le mie istruzioni in una sub (denominata SalvaMieCorrezioni) con riferimenti a variabili connesse ai 5 diversi campi. Poi per ogni evento afterupdate dei 5 controlli, pensavo di inserire l'istruzione call SalvaMieCorrezioni.
    Promemoria:
    Nomi dei controlli: Pluto, Sansone, Lassie, Rex, Balto.
    NB agli eventi click di ognuno dei 5 controlli, Me.DescrErrore dovrebbe copiare il valore del controllo selezionato

    Facile a dirsi, ma per me difficile a realizzarsi, non so da dove cominciare . Un aiuto a realizzarlo mi aiuterebbe a efficientare le istruzioni, rendendole meno dispersive e più sintetiche.

    Buona notte
  • Re: Consolidamento dati di un campo

    Prima bisognerebbe vedere la struttura del database in quanto sembra, da quello che hai detto, che ci sia già un problema di normalizzazione.
    Potresti postare un file di esempio con un minimo di dati.
  • Re: Consolidamento dati di un campo

    Stifone ha scritto:


    Prima bisognerebbe vedere la struttura del database in quanto sembra, da quello che hai detto, che ci sia già un problema di normalizzazione.
    Potresti postare un file di esempio con un minimo di dati.
    qui un mio link per scaricarti il file di esempio.accdb
    https://share.mail.libero.it/ajax/share/05ff013201d60d434e46ae81d60d40b297fb088bfb5c630c/1/8/MzI/MzIvMg

    Non fare caso all'utilità della tabella, o a tutte le incongruenze delle informazioni ivi inserite, che ho inventato nell'immediatezza per evitare di fornirti il mio file , visto che oltre ad informazioni riservate, contiene istruzioni VBA, moduli, finestre, reports, query (non miei e quindi non condivisibili)

    Grazie per l'attenzione prestata
Devi accedere o registrarti per scrivere nel forum
4 risposte