Newsgroup: it.comp.appl.access
Titolo: Funzione DLOOKUP in una maschera tabellare

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.)
-----------------------------------------------------

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

 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

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



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

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)
--

 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

 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

 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
--------------------------------------

 ...
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

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!


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


 wrote in message
394a3c7d...@news.worldonline.it...


 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

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


[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

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


 campi NUMERICI.
Allora e' cosi':
=DLookUp("[CodiceIntFor]"; "Fornitori Vs Clienti"; "[CodFor]=" & chr$(34) &
[CodFor] & chr$(34) & " AND [CodInt]=" & [CodiceInterno])


Federico,
grazie mille. La soluzione funziona perfettamente.
Ti sono molto grato per l'aiuto.
Buona serata!
