CODICE VBA PER VERIFICA ESISTENZA VALORE CAMPO

Anonimo
2019-05-20T07:50:28+00:00

Ciao a tutti,

ogni tanto devo chiedere il vs aiuto per risolvere qualche mio problema.

Il problema di cui chiedo il vs aiuto è il seguente:

"Vorrei, a mezzo cidice VBA, verificare se esiste, nella tabella di riferimento, il valore digitato in un campo specifico. CIò al fine di evitare di creare delle duplicazioni".

Ho creato una tabella chiamata "PROGETTI", composta da numerosi record, in cui ho la necessità di verificare, una volta digitato mediante un maschera, se il valore inserito per il campo CUP_PROGETTO è già presente nella tabella.

Una immagine della tabella (ridotta a pochi campi)

Esempio:

Per un nuovo progetto dopo aver digitato l'oggetto, scelto il settore, inserisco il cup_progetto.

Il codice VBA mi dovrebbe verificare se il CUP appena digitato e già presente fra tutti i codici cup_progetto già presenti nella tabella e, nel caso fosse presente mi dovrebbe indicare mediante msgbox "Il codice CUP digitato è già presente in archivio ed è associato al progetto n. xxx".

Grazie per il vs validissimo aiuto.

Luca

Microsoft 365 e Office | Access | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2019-05-21T05:30:08+00:00

ciao Luca,

boh, senza vedere l'applicazione non riesco ad intuire il problema.

prova in quest'altro modo :

Private Sub Sub CUP_PROGETTO_BeforeUpdate(Cancel As Integer)

Dim lngIDprogetto As Long

With Me

    If Len(.CUP_PROGETTO & vbNullString) = 0 Then

        VBA.MsgBox prompt:="Il progetto non e' stato compilato!", _

                   buttons:=vbCritical, _

                   Title:="Attenzione"

        Cancel = True

        Exit Sub

    End If

    If DCount("*", "PRogetti", "CUP_PROGETTO='" & Replace(.CUP_PROGETTO, "'", "''") & "'") > 0 Then

           lngIDprogetto = dlookUP("id_prog","Progetti","CUP_PROGETTO='" & Replace(.CUP_PROGETTO, "'", "''") & "'")

        VBA.MsgBox prompt:="Il codice CUP digitato -->" & .CUP_progetto & " <--? gia' presente in archivio ed ? associato al progetto n." & lngIDprogetto, _

                   buttons:=vbCritical, _

                   Title:="Attenzione"

        Cancel = True

        .Undo

    End If

End With

End Sub

ciao, Sandro.

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

11 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2019-05-20T13:54:04+00:00

    ciao Luca,

    vedi se come segue centri l'obbiettivo

    Private Sub Sub CUP_PROGETTO_BeforeUpdate(Cancel As Integer)

    Dim lngIDprogetto As Long

    With Me

        If Len(.CUP_PROGETTO & vbNullString) = 0 Then

            VBA.MsgBox prompt:="Il progetto non e' stato compilato!", _

                       buttons:=vbCritical, _

                       Title:="Attenzione"

            Cancel = True

            Exit Sub

        End If

        If DCount("*", "PRogetti", "CUP_PROGETTO='" & Replace(.CUP_PROGETTO, "'", "''") & "'") > 0 Then

           .RecordsetClone.FindFirst "CUP_PROGETTO='" & Replace(.CUP_PROGETTO, "'", "''") & "'"

            If Not .RecordsetClone.NoMatch Then

               lngIDprogetto = .RecordsetClone!ID_prog

            End If

            .RecordsetClone.Bookmark = .Bookmark

            VBA.MsgBox prompt:="Il codice CUP digitato -->" & .CUP_progetto & " <--? gia' presente in archivio ed ? associato al progetto n." & lngIDprogetto, _

                       buttons:=vbCritical, _

                       Title:="Attenzione"

            Cancel = True

            .Undo

        End If

    End With

    End Sub

    ciao, Sandro.

    La risposta è stata utile?

    1 persona ha trovato utile questa risposta.
    0 commenti Nessun commento
  2. Anonimo
    2019-05-20T09:28:19+00:00

    ciao Luca,

    ….mmmm…..hai provato come consigliato in precedenza su before update?

    inoltre questa riga :

    If Len(Me!CUP_PROGETTO & "") = 0 Then

    modificala con & vbnullstring, con "" l'esecuzione e' piu'lenta.

    copia incolla il resto del codice e rimuovi il commento nella riga cancel=true.

    Modifica anche la dlookup, non serve il controllo is not null, ma la sola presenza del progetto.

    Alternativa alla dlookup, la dcount con verifica =1.

    Facci sapere.

    ciao, Sandro.

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2019-05-20T09:24:11+00:00

    ciao Luca,

    puoi agire in due diversi modi almento.

    Imposti un indice univoco o una PK nella tabella e gestisci l'errore a livello di DB engine nel caso di duplicato, oppure, su evento before update della form/controllo verifichi il duplicato e gestisci oppurtunamente il cancel=true.

    Spero non sia troppo criptico come consiglio...

    Ciao, Sandro.

    Ciao Sandro

    grazie per le indicazioni! In realtà ho provato con questo codice, adattato da altro dbase,

    Private Sub CUP_PROGETTO_AfterUpdate()

    If Len(Me!CUP_PROGETTO & "") = 0 Then

        Exit Sub

    End If

        If Not IsNull(DLookup("CUP_PROGETTO", "PROGETTI", "CUP_PROGETTO='" & Replace(Me!CUP_PROGETTO, "'", "''") & "'")) And Me!CUP_PROGETTO <> Nz(Me!CUP_PROGETTO.OldValue) Then

    MsgBox "Il CUP digitato è già presente in archivio !", vbInformation

        Me.Undo

        'Cancel = True

        CUP_PROGETTO.SetFocus

        End If

    End Sub

    L'unica cosa che non riesco a fare è ricavare, una volta eseguita la verifica, l'ID_PROG (desumibile dalla tabella PROGETTI, del cup duplicato da inserire nel messaggio:

    MsgBox "Il CUP digitato è già presente in archivio ed è associato al progetto n. ID_PROG !", vbInformation

    Grazie per la risposta spero mi potrai indicare il modo migliore per risolvere l'ultimo ostacolo.

    Luca

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2019-05-20T08:07:33+00:00

    ciao Luca,

    puoi agire in due diversi modi almento.

    Imposti un indice univoco o una PK nella tabella e gestisci l'errore a livello di DB engine nel caso di duplicato, oppure, su evento before update della form/controllo verifichi il duplicato e gestisci oppurtunamente il cancel=true.

    Spero non sia troppo criptico come consiglio...

    Ciao, Sandro.

    La risposta è stata utile?

    0 commenti Nessun commento