Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Funzione DLOOKUP in una maschera tabellare

1,807 views
Skip to first unread message

VT@Home

unread,
Jun 13, 2000, 3:00:00 AM6/13/00
to
Molto probabilmente, nella scrittura della DlookUp hai utilizzato
nell'espressione del criterio di ricerca, non il nome dei campi del
recordset associato alla maschera ma il nome dei controlli della
maschera associati a tali campi, oppure nella maschera i controlli
hanno il nome uguale a quello del campo associato.

Per spiegarmi meglio:
supponi di avere una maschera associata ad un recordset che contiene
il cap di un comune e di dover accedere alla tabella "Comuni" per
visualizzare la denominazione.
In questo caso se il campo CAP è associato al controllo che si chiama
txtCAP è sbagliato scrivere

DlookUp("Denominazione";"Comuni";"CAP = " & txtCAP)

mentre è corretto

DlookUp("Denominazione";"Comuni";"CAP = " & [CAP])

Se invece i controlli della maschera hanno nome uguale ai campi
associati, rinominali: questo ti eviterà travasi di bile dovuti ad
errori altrimenti inspiegabili.


Vincenzo Turturro

-----------------------------------------------------
Niuna impresa, per minima che sia,
può avere cominciamento e fine senza queste tre cose:
e cioè senza sapere,
senza potere,
senza, con amore, volere
(Anonimo fiorentino, XIV sec.)
-----------------------------------------------------

Andrea Wolf GUAGLIO

unread,
Jun 13, 2000, 3:00:00 AM6/13/00
to
Ciao a tutti,

ho un problema con la funzione DLOOKUP.
Immaginate che io abbia una maschera basata su una tabella, e che
questa maschera mi presenti un record della tabella per ogni riga
(maschera tabellare).
Ora, ogni controllo della maschera è associato ad un campo della
tabella.

Io, però, ho aggiunto alla maschera un controllo non associato che
tramite una funzione DLOOKUP va a prelevare in un'altra tabella un
certo valore che corrisponda al valore in due controlli associati
delal maschera.

Ho provato a far eseguire la funzione DLOOKUP su diversi eventi della
maschera e dei controlli, ma il massimo che riesco ad ottenere è di
ritrovare ripetuto su ognuna delle righe della maschera lo stesso
valore che corrisponde alla riga (record) su cui ho cliccato. Clicco
su un'altra riga, e mi ritrovo un altro valore corretto ripetuto su
tutte le righe che vedo.
Io, invece, mi dovrei aspettare di poter vedere un valore diverso per
ogni riga.

Spero di essere riuscito a spiegarmi.
Avete per favore una soluzione a questo problema?

Grazie in anticipo


Andrea
Andrea W. GUAGLIO
Milan, ITALY
PP-ASEL

If you want to privately mail me, please replace WantNoSpam with FLYING_WOLF

Roberto

unread,
Jun 13, 2000, 3:00:00 AM6/13/00
to

Andrea Wolf GUAGLIO <WantN...@hotmail.com> wrote in message
39466913...@news.worldonline.it...

Immagino che quando parli di maschera tabellare vuoi intendere una maschera
la cui proprietà "Visualizzazione predefinita" sia "Maschere continue".
Ora un controllo non associato, come dice la parola, non è associato ad un
campo di un record della tabella, è quindi da considerarsi come un elemento
intrinseco della maschera e, se è un controllo calcolato inserito nel corpo
della maschera, il calcolo viene effettuato con i dati contenuti nel record
corrente e quindi ha significato solo nel caso in cui la "Visualizzazione
predefinita" della maschera sia "Maschera singola".
Se hai comunque l'assoluta necessità di utilizzare una maschera continua,
penso che tu non abbia altra scelta che crearti una query, nella quale
effettui anche i tuoi calcoli, quindi adoperi questa query come "Origine
record" della tua maschera.
Fra l'altro, nel tuo caso, se adoperi una query, forse non hai bisogno della
funzione DLOOKUP, visto che le due tabelle possono essere messe sicuramente
in relazione fra di loro tramite i campi che hai adoperato nei criteri della
funzione DLOOKUP ed essere pertanto usate congiuntamente nella query.

Roberto


Andrea Wolf GUAGLIO

unread,
Jun 14, 2000, 3:00:00 AM6/14/00
to
Ciao Roberto,


visto che ho imparato? ;-)

Anyway, grazie per la tua risposta.

>Immagino che quando parli di maschera tabellare vuoi intendere una maschera
>la cui proprietà "Visualizzazione predefinita" sia "Maschere continue".

Precisamente. Scusa, la mia proprietà di linguaggio va migliorata.


>Ora un controllo non associato, come dice la parola, non è associato ad un
>campo di un record della tabella, è quindi da considerarsi come un elemento
>intrinseco della maschera e, se è un controllo calcolato inserito nel corpo
>della maschera, il calcolo viene effettuato con i dati contenuti nel record
>corrente e quindi ha significato solo nel caso in cui la "Visualizzazione
>predefinita" della maschera sia "Maschera singola".

Ok.

>Se hai comunque l'assoluta necessità di utilizzare una maschera continua,

eh sì, per il tipo di cosa che devo fare non ho alternative purtroppo.

>Fra l'altro, nel tuo caso, se adoperi una query, forse non hai bisogno della
>funzione DLOOKUP, visto che le due tabelle possono essere messe sicuramente
>in relazione fra di loro tramite i campi che hai adoperato nei criteri della
>funzione DLOOKUP ed essere pertanto usate congiuntamente nella query.

E no, purtroppo. Sarebbe bello, ma non posso.
Consentimi di spiegarti.
Il mio problema originale, ossia quello che ha potuto essere risolto
solo con la DLOOKUP, è apparentemente semplice.
Cerco di essere sintetico e di spiegarlo al meglio.

Io sono un agente, e quindi metto in relazione Fornitori con Clienti.
Ho quindi:

Tabella Fornitori: FORNITORE ecc. ecc.
Tabella Clienti: CODICECLIENTE, NOME CLIENTE ecc. ecc.
Tabella Fatture: NUMEROFATTURA, FORNITORE, CODICECLIENTE

e:
Tabella Fornitori Vs Clienti: FORNITORE, CODICECLIENTE, CODFOR

dove CODFOR è il codice che ogni fornitore assegna a ciascun cliente.


Le 4 tabelle di cui sopra sono tutte legate tra loro da relazioni, ma
per un limite di Access non è possibile creare una maschera (o un
report) basato su più di 3 tabelle che siano collegate tra loro.
Non c'è nulla da fare, ci ho provato in tutti i modi fino a che mi
sono scontrato con l'Help in linea che mi ha rivelato questa cosa.

Quindi, l'unica soluzione è la DLOOKUP che uso in una maschera FATTURE
(a visualizzazione maschera singola) che uso per inserire le fatture
fatte dai Fornitori ai Clienti.
Ho un controllo non associato che, all'inserimento di Fornitore e di
Cliente, restituisce tramite la DLOOKUP il CODFOR.
Vorrei che questa cosa fosse possibile in una maschera a
visualizzazione continua in cui mi vengono elencate tutte le fatture
(ad esempio non ancora pagate) con il cliente ed accanto il CODFOR
assegnatogli dal fornitore..

Tu mi suggerisci:

>penso che tu non abbia altra scelta che crearti una query, nella quale
>effettui anche i tuoi calcoli, quindi adoperi questa query come "Origine
>record" della tua maschera.

però non ho capito come posso far rientrare la questione del DLOOKUP
nella query dal momento che tale funzione va applicata per forza ad un
controllo non associato, che in quanto tale non si riferisce ad un
campo da far rientrare nella query.
O forse no nho compreso bene il tuo suggerimento.

Se hai tempo da buttare via, quando vuoi, mi farebbe piacere un
approfondimento su questo.

Grazie mille e buon lavoro!

Ciao

Roberto

unread,
Jun 14, 2000, 3:00:00 AM6/14/00
to

Andrea Wolf GUAGLIO <WantN...@hotmail.com> wrote in message
39465e7d...@news.worldonline.it...

> Ciao Roberto,
>
>
> visto che ho imparato? ;-)
>

Ciao Andrea,

Ho notato con soddisfazione che hai imparato e visto che mi inviti ad
approfondire il tuo problema, lo faccio volentieri.

Per prima cosa puntualizziamo una tua affermazione: quando tu scrivi:
."...per un limite di Access non è possibile creare una maschera (o un


report) basato su più di 3 tabelle che siano collegate tra loro. "

immagino che tu voglia dire che Access non permette di adoperare più di due
livelli di sottomaschere o sottoreport; è vero ma mi sembra di capire che,
almeno per il momento, tu non hai né intenzione né necessità di adoperare
sottomaschere.

Per seconda cosa ti dico come organizzerei la struttura delle tue quattro
tabelle:
La tabella Fornitori contiene i campi CodiceFornitore (che ne è la chiave
primaria), NomeFornitore ecc. ecc.
La tabella Clienti contiene i campi CodiceCliente (che ne è la chiave
primaria), NomeCliente ecc. ecc.
La tabella Fatture contiene i campi Fattura (che ne è la chiave primaria),
CodiceFornitore, CodiceCliente, Importo, Data, Pagamento, ecc. ecc.
La tabella FornitoriVsClienti contiene i campi CodiceFornitore,
CodiceCliente (l'insieme di questi due campi rappresentano la chiave
primaria) CodFor.
Quando crei la tabella Fatture, tramite l' "Autocomposizione Ricerca..."
dichiarati sia CodiceFornitore che CodiceCliente come caselle combinate
Facendo riferimento rispettivamente alla tabella Fornitori e alla tabella
Clienti. Per questi due campi fai la stessa cosa quando crei la tabella
FornitoriVsClienti.
Così facendo aumenti notevolmente la facilità dell'immissione dei dati nelle
tabelle Fatture e FornitoriVsClienti, inoltre Access ti crea automaticamente
le relazioni fra le quattro tabelle (lo puoi verificare selezionando il
comando Relazioni... dal menu Strumenti).

A questo punto dividerei il problema del caricamento delle fatture dalla
loro visualizzazione.
Pertanto prima creerei una maschera (Maschera1) a visualizzazione "Maschera
singola" e che abbia come "Origine record" la tabella Fatture e la
adopererei per caricare le fatture; in questa fase non mi preoccuperei
ancora di CodFor.
Mi creerei poi una query basata su tutte e quattro le tabelle (come potrai
notare Access indica da solo la relazione tra le tabelle); in questa query
metterei tutti i campi della tabella Fatture ed in più CodFor, trascinandolo
dalla tabella FornitoriVsClienti.
Ora creerei una seconda maschera (Maschera2) a visualizzazione "Maschere
continue" e che abbia come "Origine record" la query e la adopererei per
vedere tutti i campi della query compreso il famigerato CodFor. Inoltre,
utilizzando i "Criteri:" della query puoi anche selezionare solamente alcune
fatture da vedere (ad esempio non ancora pagate).
Aprendo Maschera2 dovresti vedere quello che ti serve. Spero :-))

Questa soluzione ti dà un'altra possibilità: se crei una terza maschera
(Maschera3) che abbia come "Origine record" la tabella Clienti ed inserisci
in Maschera3, come sottomaschera, Maschera2 collegandole tramite
CodiceCliente,
Aprendo Maschera3 vedrai tra l'altro solo le fatture relative al cliente
corrente.
Lo stesso giochino lo puoi fare con i fornitori, assegnando come "Origine
record" di Maschera3 la tabella Fornitori.

Alla prossima, Roberto


Lorenzo Coronati

unread,
Jun 14, 2000, 3:00:00 AM6/14/00
to
Scrisse WantN...@hotmail.com (Andrea Wolf GUAGLIO):

>ho un problema con la funzione DLOOKUP.
No, hai un altro problema: non hai capito come funzionano le
maschere continue.
Quello che hai sperimentato e' il comportamento normale.

>Avete per favore una soluzione a questo problema?

Basa la form su una query.

--
Lorenzo Coronati
--
<<Il materiale sul NG non è di particolare
qualità... cioè siti... magari in inglese in
cui si possono trovare maggiori informazioni...>>
(Matteo Testoni, 24/05/2000)
--

Paolo Beltrame

unread,
Jun 14, 2000, 3:00:00 AM6/14/00
to
Ciao Andrea e Roberto,

>
> Immagino che quando parli di maschera tabellare vuoi intendere una
maschera
> la cui proprietà "Visualizzazione predefinita" sia "Maschere continue".
> Ora un controllo non associato, come dice la parola, non è associato ad un
> campo di un record della tabella, è quindi da considerarsi come un
elemento
> intrinseco della maschera e, se è un controllo calcolato inserito nel
corpo
> della maschera, il calcolo viene effettuato con i dati contenuti nel

record
> corrente e quindi ha significato solo nel caso in cui la "Visualizzazione
> predefinita" della maschera sia "Maschera singola".

Quasi vero.
Se il DLookUp e` posto dentro la proprieta` Origine controllo di un
controllo
in maschera modalita` continua, funziona.

Paolo


Roberto

unread,
Jun 14, 2000, 3:00:00 AM6/14/00
to

Paolo Beltrame <ita...@agemont.it> wrote in message
8i8mf2$bus$1...@fe2.cs.interbusiness.it...

Verissimo, mi accorgo di aver fatto un'affermazione gratuita, ed aver
trovato una soluzione macchinosa.
Comunque ho tribolato un pò a farlo funzionare, sino a quando non ho
scoperto che in questo caso, come separatore dei parametri all'interno della
parantesi, non va adoperata la virgola, ma il punto e virgola.

Roberto

Federico Luciani

unread,
Jun 15, 2000, 3:00:00 AM6/15/00
to
Roberto wrote:
> Paolo Beltrame <ita...@agemont.it> wrote in message
> > Ciao Andrea e Roberto,
> > > Immagino che quando parli di maschera tabellare vuoi intendere una
> > maschera
> > > la cui proprietà "Visualizzazione predefinita" sia "Maschere continue".
> > > Ora un controllo non associato, come dice la parola, non è associato ad
> un
> > > campo di un record della tabella, è quindi da considerarsi come un
> > elemento
> > > intrinseco della maschera e, se è un controllo calcolato inserito nel
> > corpo
> > > della maschera, il calcolo viene effettuato con i dati contenuti nel
> > record
> > > corrente e quindi ha significato solo nel caso in cui la
> "Visualizzazione
> > > predefinita" della maschera sia "Maschera singola".
> > Quasi vero.
> > Se il DLookUp e` posto dentro la proprieta` Origine controllo di un
> > controllo
> > in maschera modalita` continua, funziona.
> Verissimo, mi accorgo di aver fatto un'affermazione gratuita, ed aver
> trovato una soluzione macchinosa.
> Comunque ho tribolato un pò a farlo funzionare, sino a quando non ho
> scoperto che in questo caso, come separatore dei parametri all'interno della
> parantesi, non va adoperata la virgola, ma il punto e virgola.

E' come per le query!!

--
Federico

--------------------------------------
Sito Comune di it.comp.appl.access
http://members.xoom.it/it_db_access
mailto:it_db_...@usa.net
--------------------------------------
Tutte le richieste che mi arrivano
in privato, vengono cestinate.
--------------------------------------
Rimuovi paperino. per e-mail
--------------------------------------

Paolo Beltrame

unread,
Jun 15, 2000, 3:00:00 AM6/15/00
to

> parantesi, non va adoperata la virgola, ma il punto e virgola.
> ...
Anch'io la prima volta ci ho perso un bel po` di tempo
per capire l'errore. Pure in una pagina dell'help la funzione riferita
a query era riportata con la virgola. Suppongo che tutti abbiamo patito
in questa circostanza.
Tanto per concludere, diro` che la funzione DLookUp la uso assai
raramente nella proprieta` origine del controllo perche` quanto ha
scritto Lorenzo e` molto piu` efficiente e canonico: una INNER JOIN
nella query.
Solitamente, per ragioni di complessita` insolubili in una query,
nell'origine
del controllo ci schiaffo il nome di una funzione es. =NomeFunzione(),
nel cui script compongo quanto mi necessita.


Paolo

Andrea Wolf GUAGLIO

unread,
Jun 16, 2000, 3:00:00 AM6/16/00
to
Roberto,
prima di affronatre la tua soluzione ho provato autonomamente quella
che poi è stata la soluzione proposta da Paolo. E non andava. Mi sono
rotto la testa sul perché non andasse ed ora mi hai dato la risposta.
Grazie mille.
Ora funzia.
Mannaggia al punto e virgola.

Grazie a tutti per il preziosissimo aiuto.
Mi auguro un giorno di essere in grado di dare il mio contributo.


Buon weekend a tutti!

Andrea Wolf GUAGLIO

unread,
Jun 16, 2000, 3:00:00 AM6/16/00
to
Roberto,

dirai che sono instupidito dalla vita.
Forse è così, ma per un motivo a me ignoto non riesco ad implementare
in un'espressione quello che in codice funziona.
In poche parole, nel benedetto controllo associato vorrei mettere
un'espressione DLOOKUP= che equivalga a quanto trovi qua sotto:


Private Sub CodiceInterno_AfterUpdate()
Dim strFiltro As String
Dim strFiltro1 As String
strFiltro = "CodFor = '" & Me!CodFor & "'"
strFiltro1 = "CodInt = " & Me!CodiceInterno
Me!CF = DLookup("CodiceIntFor", "Fornitori Vs Clienti", strFiltro1 & "
AND " & strFiltro)

Exit Sub
End Sub


Al di là delle virgole che devono diventare dei punti-e-virgola, hai
modo per favore di aiutarmi a risolvere questo enigma?
Grazie tante


Ciao!
Andrea

Roberto

unread,
Jun 16, 2000, 3:00:00 AM6/16/00
to

Andrea Wolf GUAGLIO <WantN...@hotmail.com> wrote in message
394a3c7d...@news.worldonline.it...

Roberto

unread,
Jun 16, 2000, 3:00:00 AM6/16/00
to

Andrea Wolf GUAGLIO <WantN...@hotmail.com> wrote in message
394a3c7d...@news.worldonline.it...
> Roberto,
>
> dirai che sono instupidito dalla vita.
> Forse è così, ma per un motivo a me ignoto non riesco ad implementare
> in un'espressione quello che in codice funziona.
> In poche parole, nel benedetto controllo associato vorrei mettere
> un'espressione DLOOKUP= che equivalga a quanto trovi qua sotto:
>
>
> Private Sub CodiceInterno_AfterUpdate()
> Dim strFiltro As String
> Dim strFiltro1 As String
> strFiltro = "CodFor = '" & Me!CodFor & "'"
> strFiltro1 = "CodInt = " & Me!CodiceInterno
> Me!CF = DLookup("CodiceIntFor", "Fornitori Vs Clienti", strFiltro1 & "
> AND " & strFiltro)
>
> Exit Sub
> End Sub
>
>
> Al di là delle virgole che devono diventare dei punti-e-virgola, hai
> modo per favore di aiutarmi a risolvere questo enigma?
> Grazie tante
>
>
> Ciao!
> Andrea
[CUT]

Scusami ma il messaggio precedente mi è partito inavvertitamente.

Fermo restando che anche per me i criteri della LookUp sono stati sempre un
tormentone, forse perché adopero di rado la clausola WHERE, ipotizzando che
la maschera in cui stai lavorando si chiami MASCHERA1, prova a scrive così
nell'origine controllo del tuo campo calcolato:

= LookUp("CodiceIntFor" ; "Fornitori Vs Clienti" ; "[CodFor] =
[Forms]![MASCHERA1]![CodFor] AND [CodInt]=
[Forms]![MASCHERA1]![CodiceInterno]")

sempre che [CodFor] e [CodInt] siano i nomi di due campi della tabella
Fornitori Vs Clienti.

Ti anticipo che non l'ho provato.

Roberto

Federico Luciani

unread,
Jun 16, 2000, 3:00:00 AM6/16/00
to
Roberto wrote:
> Andrea Wolf GUAGLIO <WantN...@hotmail.com> wrote in message
> > Roberto,
> > dirai che sono instupidito dalla vita.
> > Forse è così, ma per un motivo a me ignoto non riesco ad implementare
> > in un'espressione quello che in codice funziona.
> > In poche parole, nel benedetto controllo associato vorrei mettere
> > un'espressione DLOOKUP= che equivalga a quanto trovi qua sotto:
> > Private Sub CodiceInterno_AfterUpdate()
> > Dim strFiltro As String
> > Dim strFiltro1 As String
> > strFiltro = "CodFor = '" & Me!CodFor & "'"
> > strFiltro1 = "CodInt = " & Me!CodiceInterno
> > Me!CF = DLookup("CodiceIntFor", "Fornitori Vs Clienti", strFiltro1 & "
> > AND " & strFiltro)
> > Exit Sub
> > End Sub
> > Al di là delle virgole che devono diventare dei punti-e-virgola, hai
> > modo per favore di aiutarmi a risolvere questo enigma?
> > Grazie tante
> [CUT]

> Fermo restando che anche per me i criteri della LookUp sono stati sempre un
> tormentone, forse perché adopero di rado la clausola WHERE, ipotizzando che
> la maschera in cui stai lavorando si chiami MASCHERA1, prova a scrive così
> nell'origine controllo del tuo campo calcolato:
> = LookUp("CodiceIntFor" ; "Fornitori Vs Clienti" ; "[CodFor] =
> [Forms]![MASCHERA1]![CodFor] AND [CodInt]=
> [Forms]![MASCHERA1]![CodiceInterno]")
> sempre che [CodFor] e [CodInt] siano i nomi di due campi della tabella
> Fornitori Vs Clienti.
> Ti anticipo che non l'ho provato.
> Roberto

Scusate, ma non e' proprio cosi', bensi':
=DLookUp("[CodiceIntFor]"; "Fornitori Vs Clienti"; "[CodFor]=" & [CodFor] & "
AND [CodInt]=" & [CodiceInterno])

Bye

Roberto

unread,
Jun 16, 2000, 3:00:00 AM6/16/00
to

Federico Luciani <fluc...@paperino.libero.it> wrote in message
394A6470...@paperino.libero.it...

> Roberto wrote:
> > Andrea Wolf GUAGLIO <WantN...@hotmail.com> wrote in message
[CUT]

>
> Scusate, ma non e' proprio cosi', bensi':
> =DLookUp("[CodiceIntFor]"; "Fornitori Vs Clienti"; "[CodFor]=" & [CodFor]
& "
> AND [CodInt]=" & [CodiceInterno])
>
> Bye
> --
> Federico
>

[CUT]

L'avevo detto ad Andrea che con i criteri della LookUp non ci azzecco!!!

E poi se lo dice Federico.......

Contro la forza la ragion non vale. :-))))

Roberto

Andrea Wolf GUAGLIO

unread,
Jun 16, 2000, 3:00:00 AM6/16/00
to
>Scusate, ma non e' proprio cosi', bensi':
>=DLookUp("[CodiceIntFor]"; "Fornitori Vs Clienti"; "[CodFor]=" & [CodFor] & "
>AND [CodInt]=" & [CodiceInterno])


Ragazzi,

grazie per l'aiuto, ma non va.
L'espressione suggerita da Roberto l'avevo provata anch'io ma mi dava

#Nome?

nel controllo non associato.

Quella di Federico mi dà invece

#Errore?


Ho pensato che forse devo chiarire di più le cose.
Il CodFor è un campo TESTO, mentre il CodInt ed il CodiceInterno sono
campi NUMERICI.
Scusate, son di coccio!

Ciao

Federico Luciani

unread,
Jun 19, 2000, 3:00:00 AM6/19/00
to
Andrea Wolf GUAGLIO wrote:
> >Scusate, ma non e' proprio cosi', bensi':
> >=DLookUp("[CodiceIntFor]"; "Fornitori Vs Clienti"; "[CodFor]=" & [CodFor] & "
> >AND [CodInt]=" & [CodiceInterno])
> Ragazzi,
> grazie per l'aiuto, ma non va.
> L'espressione suggerita da Roberto l'avevo provata anch'io ma mi dava
> #Nome?
> nel controllo non associato.
> Quella di Federico mi dà invece
> #Errore?
> Ho pensato che forse devo chiarire di più le cose.
> Il CodFor è un campo TESTO, mentre il CodInt ed il CodiceInterno sono
> campi NUMERICI.

Allora e' cosi':

=DLookUp("[CodiceIntFor]"; "Fornitori Vs Clienti"; "[CodFor]=" & chr$(34) &
[CodFor] & chr$(34) & " AND [CodInt]=" & [CodiceInterno])

Andrea Wolf GUAGLIO

unread,
Jun 19, 2000, 3:00:00 AM6/19/00
to
Federico,

grazie mille. La soluzione funziona perfettamente.
Ti sono molto grato per l'aiuto.

Buona serata!

0 new messages