ACCESS verifica esistenza record

Anonimo
2016-02-10T15:24:19+00:00

Buona sera a tutti. Inserendo records nella tabella "immissione dati" ho l'esigenza di verificare se il campo "fornitore" ha alcune caratteristiche; la tabella "immissione dati" è composta tra l'altro da: Fornitore numerico; ID_Ditta numerico; anno numerico.

Quando inserisco un record che si riferisce ad un periodo >= 365 giorni una query accoda i tre elementi sopra descritti nella tabella "Fornitori_annuali". Nella maschera "immissione dati" ho inserito il seguente codice che avverte l'operatore se quel fornitore è presente nella tabella "Fornitori_annuali", se cioè per lui è già stato inserito un record avente valenza almeno annuale:

If DCount("*", "Fornitori_annuali", "ID_Fornitori=" & Me!Fornitore) <> 0 Then

MsgBox "Il fornitore " & Me!Fornitore & " è già stato inserito con dati annuali: vuoi inserirlo comunque ?", vbYesNo + vbDefaultButton2, "Dati annuali"

If intRisposta = vbNo Then

Me.Fornitore.setfocus

Else

Me.ID_ristoranti.SetFocus

End If

End If

Ho ben 3 problemi da risolvere:

1)  Se rispondo NO alla msgbox il cursore non si posizione sulla combo "Fornitore" (non funziona setfocus);

  1. così come strutturata la msgbox si attiva anche nel caso in cui per quel fornitore sia stato inserito almeno un dato annuale anche 5 anni prima e anche per un'altra ditta; avrei invece la necessità che il controllo della presenza del fornitore nella tabella "Fornitori_annuali" non fosse limitato all'ID fornitore ma anche all'ID_ditta e all'anno; cioè, tradotto in pratica la msgbox si dovrebbe attivare solo se il fornitore che sto inserendo è presente nella tabella "Fornitori_Annuali" per quell'anno e per quella ditta (spero sia chiaro);
  2. a quale evento devo associare il codice se il fornitore viene inserito nel campo "Fornitore" automaticamente da un doppio clic su un controllo di ricerca ? Non "dopo aggiornamento", non "su modifica" ma.........?

Grazie di nuovo per la pazienza.

Andrea

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
2016-02-10T15:45:50+00:00

ciao Andrea,

punto 2 3 per il punto 1 non può non funzionare.

tutte le funzioni di aggregazione sui domini permettono di elaborare la clausula where considerando più parametri...nella fattispecie,  nel tuo caso oltre che al fornitore necessiti dell'anno e l'id.

quindi "ID_Fornitori=" & Me!Fornitore & "and idDitta=" & me.idditta....

e poi concateni l'anno con la stessa tecnica,

io procederei con l'evento before update della form .....se al msgbox decidi di annullare l'inserimento avrai un cancel=true e me.undo.

prova a vedere se con queste indicazioni ti ispirano qualcosa...altrimenti....siamo qua!

Ciao, Sandro.

La risposta è stata utile?

0 commenti Nessun commento

11 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2016-02-11T18:59:07+00:00

    ciao Andrea,

    sfruttiamo l'evento before update e after update della form e proviamo a semplificare un po' il tuo codice, ok?

    nel modo che segue se il fornitore è duplicato hai l'avviso e se alla risposta clicchi no annulli l'inserimento.

    Se clicchi si apri il report.

    Ovviamente in questo modo il report si apre sempre in caso di inserimento di fornitore ex  novo.

    ciao, Sandro.

    Private Sub Form_AfterUpdate()

    DoCmd.OpenReport reportname:="fornitori annuali report", view:=acViewPreview, filtername:=Null, wherecondition:="ID_immissione_dati=" & Me.ID_immissione_dati

    End Sub

    Private Sub Form_BeforeUpdate(Cancel As Integer)

    If DCount("ID_Fornitori", "Fornitori_annuali", "ID_Fornitori=" & Me!Fornitore & " and ID_ditte=" & Me!ID_Ditte & " and anno=" & Me!Anno) > 1 Then

        if vbaMsgBox ("Il fornitore " & Me!Fornitore & " è già stato inserito con dati annuali: vuoi inserirlo comunque ?", vbYesNo + vbDefaultButton2, "Dati annuali")=vbno then

               Cancel = True

                Me.Undo

     end if

    end if

    End Sub

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2016-02-11T18:23:00+00:00

    Grazie di nuovo ma mi sopravvaluti. Ho 57 anni e solo da 2 anni e mezzo mi sono avvicinato ad Access, grazie al suggerimento di un mio cliente programmatore che aveva intuito che Excel ormai mi stava stretto; senza basi di studio ma solo con la mia testardaggine piano piano sto utilizzando questo utilissimo strumento professionale, ma i codi VBA sono quasi un tabù per me. Non è mia abitudine ma spesso copio i codici qua e la senza capirne appieno il significato. Purtroppo non ho molto tempo da dedicare allo studio.

    Fatta questa doverosa premessa per illustrare il mio "pietoso stato" torno alla domanda perché qualcosa non funziona:

    1. qualunque sia la risposta alla msgbox apre il report;
    2. all'apertura del report mi chiede l'ID_immissione_dati (se apro però il report non da codice funziona).

    Ti incollo qui il codice rielaborato con i tuoi suggerimenti:

    If DCount("*", "Fornitori_annuali", "ID_Fornitori=" & Me!Fornitore & " and ID_ditte=" & Me!ID_Ditte & " and anno=" & Me!Anno) <> 0 Then

    MsgBox "Il fornitore " & Me!Fornitore & " è già stato inserito con dati annuali: vuoi inserirlo comunque ?", vbYesNo + vbDefaultButton2, "Dati annuali"

    If intRisposta = vbNo Then

    Cancel = True

    Me.Undo

    Else

                        If Not IsNull(Me.ID_immissione dati) Then

    DoCmd.OpenReport reportname:="fornitori annuali report", view:=acViewPreview, filtername:=Null, wherecondition:="ID_immissione_dati=" & Me.ID_immissione_dati

    End if End If

    End If

    Grazie per la pazienza.

    Andrea

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2016-02-10T17:41:19+00:00

    ciao Andrea,

    puoi togliere il costrutto with...end with...non serve in questo scenario.

    prova in questo modo, testando anche la validità della where condition. supponendo .ID_immissione dati numerico:

    If Not IsNull(Me.ID_immissione dati) Then

    DoCmd.OpenReport reportName:="fornitori annuali report", _

                    View:=acViewPreview, _

                    filterName:=Null, _

                    whereCondition:="ID_immissione dati=" & Me.ID_immissione dati

    End If

    Ciao, Sandro.

    ps. non mescolare argomenti diversi nello stesso 3D...  :-) grazie.

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2016-02-10T17:16:20+00:00

    Grandissimo, come sempre del resto ! Ho fatto tutte le prove e funziona alla perfezione.

    Se volessi aprire il report con la visualizzazione del solo record (identificato con l'ID) già immesso, ho provato a scrivere il seguente codice:

    If intRisposta = vbNo Then

    Me.Fornitore.SetFocus

    Else

    With CodeContextObject

    DoCmd.OpenReport "fornitori annuali report", acViewReport, , "[report].[fornitori annuali report].[ID_immissione dati]=" & .[ID_immissione dati], acNormal

    End With

    End If

    O meglio apre il report vuoto (il filtro non funziona).

    Grazie tanto di nuovo.

    Andrea

    La risposta è stata utile?

    0 commenti Nessun commento