Impostare un controllo su routine afterupdate con istruzione Dlookup

di il
6 risposte

Impostare un controllo su routine afterupdate con istruzione Dlookup

Su una combo la cui origine è [prodottoFK] ho impostato una routine "dopo aggiornamento":
------------------------------
Option Compare Database
Private Sub prodottoFK_AfterUpdate()
costo = DLookup("Costostandard", "tblLibro", "IDlibro=" & [prodottoFK])
End Sub
------------------------------

L'utente sceglie il prodotto e quindi la routine imposta il prezzo prelevandolo dal campo [Costostandard] della tblLibro e lo deposita nel campo [costo]
Non riesco a impostare un controllo nel caso in cui DOPO aver usato questo funzione (quindi dopo aver correttamente inserito un prodotto), l'utente cancella il campo [prodottoFK] ottenendo quindi l'errore di assegnazione di valore NULL a IDlibro. Insomma vorrei impostare un controllo tipo:
se [prodottoFK] è diverso da NULL allora dlookup..eccetera, altrimenti avvisa l'utente che deve inserire un valore corretto e riposiziona il cursore nel campo [prodottoFK].
Ho provato in vari modi a usare NZ( ... ma senza successo.
angelo

6 Risposte

  • Re: Impostare un controllo su routine afterupdate con istruzione Dlookup

    Angelo, le Combo supportano delle Queries come origine riga...
    La query invece di mostrare solo il Prodotto può recuperare anche il prezzo... in una colonna aggiutiva(che puoi anche non visualizzare se forzi a larghezza=0) e, su AfterUpdate non serve il DlookUp, basta prendere il valore della Colonna con il prezzo...

    Non è che ti convenga prendere un Libro di base per conoscere meglio lo strumento che hai a disposizione...?
  • Re: Impostare un controllo su routine afterupdate con istruzione Dlookup

    @Alex ha scritto:


    Angelo, le Combo supportano delle Queries come origine riga...
    La query invece di mostrare solo il Prodotto può recuperare anche il prezzo... in una colonna aggiutiva(che puoi anche non visualizzare se forzi a larghezza=0) e, su AfterUpdate non serve il DlookUp, basta prendere il valore della Colonna con il prezzo...
    Non è che ti convenga prendere un Libro di base per conoscere meglio lo strumento che hai a disposizione...?
    Di libri ne ho presi più di uno. Di base, intermedi e avanzati. Purtroppo con Access sto imparando a camminare e un sassolino mi fa cadere.
    Probabilmente ho espresso male il quesito.Il problema non è come funziona il dlookup, o come funzionano le query in una subform a servizio di una combo; il problema è che controllo inserire per evitare che l'utente inserisca un valore nella combo e poi lo vada a cancellare ottenendo un errore runtime.
    IL discorso della query sulla combo è chiara, ma a me interessa "prelevare" un valore di un campo di una tabella e inserirlo in un campo di un'altra tabella. Con le query avrei un inserimento diretto nel campo originario e NON è quello che voglio io.
    A me interessa prelevare un valore, copiarlo ed eventualmente modificarlo (posso decidere di prendere un prezzo e volerlo modificare per fare uno sconto o per aumentarlo per motivi che esulano da qui).
    Faccio un esempio:
    l'utente nella combo sceglie il prodotto I MALAVOGLIA, il dllokup prende nella tbl.libri dal campo prezzoOriginario il prezzo e lo copia del campo prezzo della tbl.dettagliovendite. Ed è tutto ok.
    Poi l'utente per motivi suoi torna sulla riga del dettaglio fattura e per motivi suoi cancella il campo con I MALAVOGLIA e preme INVIO; ottiene un errore runtime in quanto nel campo non esiste più la FK, e quindi la Dlookup va in errore.
    Spero ora di essere stato più chiaro.
    angelo
    p.s. da qualche parte nei libri "di base" ho letto come risolvere il problema ma tra le migliaia di pagine che ho sfogliato non ho proprio idea di dove si trovi la soluzione.
  • Re: Impostare un controllo su routine afterupdate con istruzione Dlookup

    angeloIS ha scritto:


    @Alex ha scritto:


    Angelo, le Combo supportano delle Queries come origine riga...
    La query invece di mostrare solo il Prodotto può recuperare anche il prezzo... in una colonna aggiutiva(che puoi anche non visualizzare se forzi a larghezza=0) e, su AfterUpdate non serve il DlookUp, basta prendere il valore della Colonna con il prezzo...
    Non è che ti convenga prendere un Libro di base per conoscere meglio lo strumento che hai a disposizione...?
    Di libri ne ho presi più di uno. Di base, intermedi e avanzati. Purtroppo con Access sto imparando a camminare e un sassolino mi fa cadere.
    In ogni caso stasera proverò ad affrontare il prblema con le queries. Grazie.
    angelo
  • Re: Impostare un controllo su routine afterupdate con istruzione Dlookup

    angeloIS ha scritto:


    ....
    IL discorso della query sulla combo è chiara, ma a me interessa "prelevare" un valore di un campo di una tabella e inserirlo in un campo di un'altra tabella. Con le query avrei un inserimento diretto nel campo originario e NON è quello che voglio io.
    Ok cerco di capire meglio se riesco.

    angeloIS ha scritto:


    A me interessa prelevare un valore, copiarlo ed eventualmente modificarlo (posso decidere di prendere un prezzo e volerlo modificare per fare uno sconto o per aumentarlo per motivi che esulano da qui).
    Faccio un esempio:
    l'utente nella combo sceglie il prodotto I MALAVOGLIA, il dllokup prende nella tbl.libri dal campo prezzoOriginario il prezzo e lo copia del campo prezzo della tbl.dettagliovendite. Ed è tutto ok.
    No, questo è già sbagliato, ed è quello che ti ho indicato nel post precedente.

    angeloIS ha scritto:


    Poi l'utente per motivi suoi torna sulla riga del dettaglio fattura e per motivi suoi cancella il campo con I MALAVOGLIA e preme INVIO; ottiene un errore runtime in quanto nel campo non esiste più la FK, e quindi la Dlookup va in errore.
    Significa che hai usato come Controllo di RICERCA un controllo che è anche associato al CAMPO...?
    Questo è un'altro ERRORE concettuale.
    Il controllo usato per la ricerca non deve essere associato al Campo dell'origine dati, che terrai anche nascosto... se coincide con il controllo ricerca...
    Il controllo di Ricerca non avrà OrigineControllo ma, essendo una Combo avrà OrigineRiga(la query scritta bene)... e su AfterUpdate andrai a cercare il Record che soddisfa il criterio di ricerca... e, se servirà valorizzerai anche il prezzo... e la Funzione Dlookuop NON SERVE...!!!!

    In sostanza
    
    Private sub NomeCombo_AfterUpdate()
       Me.RecordsetClone.Find "NomeCampo=" & Me!NomeCombo.Value
       if Me.RecordsetClone.NoMatch=False then
           Me.Bookmark=Me.RecordsetClone.Bookmark
           Me.Prezzo.Value=Me.NomeCombo.Column(2)  ' ho messo 2 per indicare un indice di colonna... questa sostituisce la DLOOKUP
       Else
          MsgBox "NON TROVATO"
       End If
    End Sub

    angeloIS ha scritto:


    Spero ora di essere stato più chiaro.
    angelo
    p.s. da qualche parte nei libri "di base" ho letto come risolvere il problema ma tra le migliaia di pagine che ho sfogliato non ho proprio idea di dove si trovi la soluzione.
    Tu sei stato chiaro, pensavo di esserlo stato pure io all'inizio..., poi non voglio insistere, se ritieni vada bene il tuo metodo...
  • Re: Impostare un controllo su routine afterupdate con istruzione Dlookup

    @Alex ha scritto:


    angeloIS ha scritto:


    ....
    IL discorso della query sulla combo è chiara, ma a me interessa "prelevare" un valore di un campo di una tabella e inserirlo in un campo di un'altra tabella. Con le query avrei un inserimento diretto nel campo originario e NON è quello che voglio io.
    Ok cerco di capire meglio se riesco.

    angeloIS ha scritto:


    A me interessa prelevare un valore, copiarlo ed eventualmente modificarlo (posso decidere di prendere un prezzo e volerlo modificare per fare uno sconto o per aumentarlo per motivi che esulano da qui).
    Faccio un esempio:
    l'utente nella combo sceglie il prodotto I MALAVOGLIA, il dllokup prende nella tbl.libri dal campo prezzoOriginario il prezzo e lo copia del campo prezzo della tbl.dettagliovendite. Ed è tutto ok.
    No, questo è già sbagliato, ed è quello che ti ho indicato nel post precedente.

    angeloIS ha scritto:


    Poi l'utente per motivi suoi torna sulla riga del dettaglio fattura e per motivi suoi cancella il campo con I MALAVOGLIA e preme INVIO; ottiene un errore runtime in quanto nel campo non esiste più la FK, e quindi la Dlookup va in errore.
    Significa che hai usato come Controllo di RICERCA un controllo che è anche associato al CAMPO...?
    Questo è un'altro ERRORE concettuale.
    Il controllo usato per la ricerca non deve essere associato al Campo dell'origine dati, che terrai anche nascosto... se coincide con il controllo ricerca...
    Il controllo di Ricerca non avrà OrigineControllo ma, essendo una Combo avrà OrigineRiga(la query scritta bene)... e su AfterUpdate andrai a cercare il Record che soddisfa il criterio di ricerca... e, se servirà valorizzerai anche il prezzo... e la Funzione Dlookuop NON SERVE...!!!!

    In sostanza
    
    Private sub NomeCombo_AfterUpdate()
       Me.RecordsetClone.Find "NomeCampo=" & Me!NomeCombo.Value
       if Me.RecordsetClone.NoMatch=False then
           Me.Bookmark=Me.RecordsetClone.Bookmark
           Me.Prezzo.Value=Me.NomeCombo.Column(2)  ' ho messo 2 per indicare un indice di colonna... questa sostituisce la DLOOKUP
       Else
          MsgBox "NON TROVATO"
       End If
    End Sub

    angeloIS ha scritto:


    Spero ora di essere stato più chiaro.
    angelo
    p.s. da qualche parte nei libri "di base" ho letto come risolvere il problema ma tra le migliaia di pagine che ho sfogliato non ho proprio idea di dove si trovi la soluzione.
    Tu sei stato chiaro, pensavo di esserlo stato pure io all'inizio..., poi non voglio insistere, se ritieni vada bene il tuo metodo...
    Ho capito. Avevo affrontato il problema da un altro punto di vista (... errato).
    Grazie. Proseguirò sulla strada che mi hai indicato.
    angelo
  • Re: Impostare un controllo su routine afterupdate con istruzione Dlookup

    angeloIS ha scritto:


    ....
    Ho capito. Avevo affrontato il problema da un altro punto di vista (... errato).
    Grazie. Proseguirò sulla strada che mi hai indicato.
    angelo
    I libri che ti suggerivo di usare, sono proprio per conoscere i METODI CORRETTI di come si usa lo strumento(poi scrivere 3 righe di codice sono capaci tutti, ma farlo bene...), perchè la mancanza di conoscenza porta a fare giri pindarici per cose semplici... li poi si inserisce la capacità di recepire i suggerimenti magari non dando per scontato di aver preso la strada giusta.
Devi accedere o registrarti per scrivere nel forum
6 risposte