Newsgroup: it.comp.appl.access
Titolo: Criterio multiplo con DLookup

ciao a tutto il NG.
Ho un problemino che non riesco a risolvere.
In una maschera di dialogo ho scritto il seguente codice:
Private Sub Trova_n°_entrata_Riparazione_e_Chiusura_AfterUpdate()
Forms![Riparazione e Chiusura].Filter = "[Entrata n°]=" & Me![Trova n°
entrata Riparazione e Chiusura]
Forms![Riparazione e Chiusura].FilterOn = True
Forms![Riparazione e Chiusura]![Entrata n°].SetFocus
If DLookup("[Provenienza merce]", "Generale", "'1 Cliente'") <> 3 Then
Forms![Riparazione e Chiusura]![Costo chiamata] = 18
If DLookup("[Provenienza merce]", "Generale", "'2 Vettore'") <> 3 Then
Forms![Riparazione e Chiusura]![Costo chiamata] = 18
If DLookup("[Provenienza merce]", "Generale", "'3 A mezzo Sael'") <> 3 Then
Forms![Riparazione e Chiusura]![Costo chiamata] = 0
DoCmd.Close
End Sub
in sostanza vorrei capire dove è l'errore dato che nel controllo "Costo
chiamata" della maschera "Riparazione e chiusura" mi viene restituito sempre
il valore "0".
I criteri della DLookup provengono da un campo"Provenienza merce" (testo)
della tabella "Generale".
Eventualmente si potrebbe unire i criteri (1 Cliente e 2 Vettore) in una
stringa unica dato che mi devono restituire il medesimo valore "18"? Io però
non conosco il giusto modo per scrivere la stringa.
Grazie in anticipo a chi ha la pazienza di rispondermi.
cesare

 ha scritto nel messaggio
news:lzHD9.12067$3l.3...@twister1.libero.it...

Ciao cix, il terzo parametro della funzione dlookup è il criterio di
estrazione e seque la sintassi della clausola SQL WHERE (senza mettere
WHERE) ovvero, poniamo che il campo su cui applicare il criterio sia [Tipo
Trasporto] ....
If DLookup("[Provenienza merce]", "Generale", "[Tipo Trasporto]='1
Cliente'") <> 3 then
Forms![Riparazione e Chiusura]![Costo chiamata] = 18
e per una selezione su più valori ....
If DLookup("[Provenienza merce]", "Generale", "[Tipo Trasporto]='1 Cliente'
OR [Tipo Trasporto]='2 Vettore'") <> 3 then
Forms![Riparazione e Chiusura]![Costo chiamata] = 18
Ciao Giorgio.


Ciao Giorgio,
innanzitutto grazie per l'aiuto.
Ho scritto il codice in questo modo:
Private Sub Trova_n°_entrata_Riparazione_e_Chiusura_AfterUpdate()
Forms![Riparazione e Chiusura].Filter = "[Entrata n°]=" & Me![Trova n°
entrata Riparazione e Chiusura]
Forms![Riparazione e Chiusura].FilterOn = True
Forms![Riparazione e Chiusura]![Entrata n°].SetFocus
If DLookup("[Provenienza merce]", "Generale", "[Provenienza merce]='1
Cliente'OR [Provenienza merce]='2 Vettore'") <> 3 Then Forms![Riparazione e
Chiusura]![Costo chiamata] = 18
If DLookup("[Provenienza merce]", "Generale", "[Provenienza merce]='3 A
mezzo Sael'") <> 3 Then Forms![Riparazione e Chiusura]![Costo chiamata] = 0
DoCmd.Close
End Sub
il problema continua a persistere, continua a rendermi il valore 0 con ogni
criterio.
Forse è meglio che io cerchi di spiegarmi meglio:
Mediante un bottone apro la maschera di dialogo che ha il codice in
questione, dalla maschera "Riparazione e Chiusura" e richiamo un record
della tabella "Generale" tramite il controllo "Entrata n°". In questa
tabella ho altri campi, tra i quali [Provenienza merce] nel quale ci possono
essere solo 3 valori: 1 Cliente, 2 vettore o 3 A mezzo Sael.
 Se il valore è 1 Cliente o 2 Vettore, nel campo [Costo chiamata]della
maschera [Riparazione e Chiusura] devo avere il risultato 18.
Se invece il valore è 3 A mezzo Sael, nel campo [Costo chiamata]della
maschera [Riparazione e Chiusura] devo avere il risultato 0.
Forse c'è un errore nel primo parametro "[Provenienza merce]"?
Ormai sto fondendo, magari mi perdo nel classico bicchier d'acqua.
HELP ME!!
grazie1000
cesare


Ok, l'errore è che il criterio è sbagliato. La ricerca la devi fare sul
campo che ti definisce il record di "Riparazione e chiusura" selezionato
in quel momento. Immagino che il campo Entrata sia quello giusto (ma non
si capisce bene): il criterio diventa
"[Entrata n°] = " &
nomeControlloEntrataNumeroNellaMascheraRiparazioneEChiusura
dove ovviamente questo nome assurdo deve essere sostituito dal vero nome
che ha il controllo nella tua maschera.
Bye
giaconet

 > >

Vediamo se ho capito, a te interessa testare il campo [Provenienza merce] e
se uguale a '3 A mezzo Sael'  nel campo [Costo chiamata] della maschera
[Riparazione e Chiusura] devi inserire il valore 0 antrimenti 18.
Se il campo [Provenienza merce] è nella maschera [Riparazione e Chiusura] la
funzione Dlookup non serve, e puoi utilizzare..
IF Forms![Riparazione e Chiusura].[Provenienza merce]="3 A mezzo Sael" Then
Forms![Riparazione e Chiusura]![Costo chiamata]=0
ELSE
Forms![Riparazione e Chiusura]![Costo chiamata] =18
END IF
Altrimenti Con Dlookup ....
If  "" & DLookup("[Provenienza merce]", "Generale", "[Entrata n°]=" &
Me![Trova n°entrata Riparazione e Chiusura])="3 A mezzo Sael"  Then
Forms![Riparazione e Chiusura]![Costo chiamata] = 0
ELSE
Forms![Riparazione e Chiusura]![Costo chiamata] = 18
END IF
Come vedi la condizione per trovare il campo [Provenienza merce] dalla
tabella [Generale] è [Entrata n°]  che è la stessa condizione che usi per
filtrare i record della maschera [Riparazione e Chiusura].
Ciao Giorgio.

 > > >
Scusa correggi
IF Forms![Riparazione e Chiusura].[Provenienza merce]="3 A mezzo Sael" Then
Con
IF Forms![Riparazione e Chiusura]![Provenienza merce]="3 A mezzo Sael" Then
Ciao Giorgio.


Ciao, scusa se non ero stato chiaro. L'ipotesi giusta era la tua seconda: il
CAMPO "Provenienza merce" è nella TABELLA "Generale" e i dati vengono
inseriti precedentemente tramite la MASCHERA "Accettazione" nella quale ho
il corrispettivo CONTROLLO [Provenienza merce].N.B. la maschera
"Accettazione" non è aperta quando apro la maschera "Riparazione e chiusura"
per richiamare il record che mi interessa.
Ho fatto un copia e incolla del tuo codice aggiungendo solo gli apicini (')
al criterio in quanto è testo. il codice è il seguente:
Private Sub Trova_n°_entrata_Riparazione_e_Chiusura_AfterUpdate()
Forms![Riparazione e Chiusura].Filter = "[Entrata n°]=" & Me![Trova n°
entrata Riparazione e Chiusura]
Forms![Riparazione e Chiusura].FilterOn = True
Forms![Riparazione e Chiusura]![Entrata n°].SetFocus
If "" & DLookup("[Provenienza merce]", "Generale", "[Entrata n°]=" &
Me![Trova n° entrata Riparazione e Chiusura]) = "'3 A mezzo Sael'" Then
Forms![Riparazione e Chiusura]![Costo chiamata] = 0
Else
Forms![Riparazione e Chiusura]![Costo chiamata] = 18
End If
DoCmd.Close
End Sub
Non mi da nessun errore, solo che mi restituisce sempre il valore 18 nel
controllo [Costo chiamata]. Ti può essere d'aiuto sapere che l'origine di
questo controllo è un campo valuta nella TABELLA "Generale"?
Ciao e grazie per la pazienza.
Cesare

 > > > >[SUPER CUT]
Non devi aggiungere i singoli apici in quel contesto perchè è il confronto
con il risultato di ritorno della funzione Dlookup, comunque...
Ripartiamo da 0
Posta un'esempio di un record tabella Generale tipo...
[Id_record] (Identificativo record numerico contatore ) Valore = 1
[Provenienza merce] (Codice provenienza merce testo Valore = '3 A mezzo
Sael'
[Costo chiamata] (Importo costo della chiamata) Valore = 18
[Id_record] (Identificativo record numerico contatore ) Valore = 2
[Provenienza merce] (Codice provenienza merce testo Valore = ''1 Cliente'
[Costo chiamata] (Importo costo della chiamata) Valore = 0
quindi posta il nome del controllo che hai a disposizione nel form per
identificare un record di questa tabella es. [Provenienza merce].
Ciao Giorgio.

 ha scritto nel messaggio
news:arqdmm$80o$1...@lacerta.tiscalinet.it...

Ciao,
se ho capito bene quello che vuoi è un esempio di record ( ti posto solo i
campi che sono interessati):
Nome della  tabella: [Generale]
[Entrata n°] (Identificativo record numerico contatore ) Valore = 1
[Provenienza merce] (Provenienza della merce testo) Valore = '3 A mezzo
Sael'
[Costo chiamata] (Importo costo della chiamata Valuta) Valore = 0
oppure
[Entrata n°]  (Identificativo record numerico contatore ) Valore = 2
[Provenienza merce] (Provenienza della merce testo) Valore = '1 Cliente'
[Costo chiamata] (Importo costo della chiamata Valuta) Valore = 18
oppure
[Entrata n°] (Identificativo record numerico contatore ) Valore = 3
[Provenienza merce] (Provenienza della merce testo) Valore = '2 Vettore'
[Costo chiamata] (Importo costo della chiamata Valuta) Valore = 18
Per identificare il record [Entrata n°] della tabella [Generale], nel form
[Riparazione e chiusura] uso una casella di testo (controllo) che che si
chiama "Entrata n° ". L'identificazione (ricerca) del record  avviene
attraverso una maschera di dialogo che si chiama:[Trova n° entrata
Riparazione e Chiusura] e il codice per cercare il recordo è nell'evento
"dopo aggiornamento".
il codice attuale (evidentemente errato) della maschera di dialogo è il
seguente:
Private Sub Trova_n°_entrata_Riparazione_e_Chiusura_AfterUpdate()
Forms![Riparazione e Chiusura].Filter = "[Entrata n°]=" & Me![Trova n°
entrata Riparazione e Chiusura]
Forms![Riparazione e Chiusura].FilterOn = True
Forms![Riparazione e Chiusura]![Entrata n°].SetFocus
If "" & DLookup("[Provenienza merce]", "Generale", "[Entrata n°]=" &
Me![Trova n° entrata Riparazione e Chiusura]) = "'3 A mezzo Sael'" Then
Forms![Riparazione e Chiusura]![Costo chiamata] = 0
Else
Forms![Riparazione e Chiusura]![Costo chiamata] = 18
End If
DoCmd.Close
End Sub
Mi vergogno di abusare così della tua pazienza, se la cosa sta diventando
troppo pesante per la mia inesperienza, lasciamo perdere, capisco che non è
facile trattare con chi non ne sa niente.
comunque grazie.
cesare

 >

Quindi se si deve assegnare al controllo [Costo chiamata] del form
[Riparazione e Chiusura] il valore contenuto nel campo [Costo chiamata]
della tabella [Generale] identificato da [Entrata n°]=Me![Trova n°entrata
Riparazione e Chiusura].....
Private Sub Trova_n°_entrata_Riparazione_e_Chiusura_AfterUpdate()
Forms![Riparazione e Chiusura].Filter = "[Entrata n°]=" & Me.[Trova n°
entrata Riparazione e Chiusura]
Forms![Riparazione e Chiusura].FilterOn = True
Forms![Riparazione e Chiusura]![Entrata n°].SetFocus
Forms![Riparazione e Chiusura]![Costo chiamata] = Nz(Dookup("[Costo
chiamata]","Generale","[Entrata n°]=" & Me.[Trova n° entrata Riparazione e
Chiusura]) ,0)
 DoCmd.Close
End Sub
Se il form [Riparazione e Chiusura] ha come origine record la tabella
Generale la funzione dlookup non serve a nulla perchè il costo della
chiamata è contenuto nel record cercato quindi il problema è la ricerca del
record e non il valore del costo della chiamata, non è consigliabile usare
il nome del controllo uguale al nome del campo collegato ad esso, questo
genera ambiguità, se il nome del campo è [Costo chiamata] chiamerai il
controllo [txCosto chiamata], fai anche attenzione al punto e al punto
esclamativo, Me.[Trova n°entrata Riparazione e Chiusura] punta al controllo
e Me![Trova n°entrata Riparazione e Chiusura] punta al campo della tabella
sottostante.
Ciao Giorgio.

[CUT]
purtroppo non sono riuscito ad esprimermi bene.
devo assegnare al controllo [Costo chiamata] del form [Riparazione e
Chiusura] un valore che cambia a seconda di quello che c'è nel campo
[Provenienza merce]della tabella [Generale] identificato da [Entrata
n°]=Me![Trova n°entrata Riparazione e Chiusura].
Se nel campo [Provenienza merce]della tabella [Generale] c'è "1 Cliente",
nel controllo [Costo chiamata] del form [Riparazione e Chiusura] il codice
mi deve restituire il valore "18" nel momento in cui vado a richiamare
l'identificativo [Entrata n°]=Me![Trova n°entrata Riparazione e Chiusura].
Se nel campo [Provenienza merce]della tabella [Generale] c'è "2 Vettore",
nel controllo [Costo chiamata] del form [Riparazione e Chiusura] il codice
mi deve restituire il valore "18" nel momento in cui vado a richiamare
l'identificativo [Entrata n°]=Me![Trova n°entrata Riparazione e Chiusura].
Se nel campo [Provenienza merce]della tabella [Generale] c'è "3 A mezzo
Sael", nel controllo [Costo chiamata] del form [Riparazione e Chiusura] il
codice mi deve restituire il valore "0" nel momento in cui vado a richiamare
l'identificativo [Entrata n°]=Me![Trova n°entrata Riparazione e Chiusura].
ciao
cesare

 ha scritto nel messaggio
news:x8uE9.21523$2B1.5...@twister2.libero.it...

In questo caso dovrebbe funzionare la seguente Dlookup
If DLookup("[Provenienza merce]", "Generale", "[Entrata n°]=" & Me.[Trova
n°entrata Riparazione e Chiusura])="3 A mezzo Sael" Then Forms![Riparazione
e Chiusura].[Costo chiamata] = 0
If DLookup("[Provenienza merce]", "Generale", "[Entrata n°]=" & Me.[Trova
n°entrata Riparazione e Chiusura])="2 Vettore" Then Forms![Riparazione e
Chiusura].[Costo chiamata] = 0
ecc..
Ti consiglio di inserire un break nel codice al primo Dlookup e controllare
il valore dei controlli (gioco di parole) nella finestra di Debug
Per curiosità quale è l'origine record del form [Riparazione e Chiusura] ?
Alla prossima, ciao Giorgio.

 ha scritto nel messaggio
news:aru3ms$531$1...@lacerta.tiscalinet.it...

ciao, l'origine record del form [Riparazione e Chiusura] è una select fatta
su due tabelle:
SELECT [Generale].[Entrata n°], [Generale].[Ragione Sociale], [Anagrafica
Clienti].[Città], [Anagrafica Clienti].[Provincia], [Anagrafica
Clienti].[Telefono], [Anagrafica Clienti].[Fax], [Anagrafica
Clienti].[Cellulare], [Generale].[Difetto riscontrato],
[Generale].[Preventivo accettato], [Generale].[Data accettazione
preventivo], [Generale].[Intervento], [Generale].[Stato della lavorazione],
[Generale].[Tecnico], [Generale].[Costo intervento], [Generale].[Parti
sostituite], [Generale].[Costo chiamata], [Generale].[Totale costo],
[Generale].[Data intervento], [Generale].[Data avviso merce pronta],
[Generale].[Note2] FROM [Anagrafica Clienti] INNER JOIN Generale ON
[Anagrafica Clienti].[Ragione Sociale]=[Generale].[Ragione Sociale];
 adesso vado a provare i tuoi codici. Ti saprò dire come vanno
per adesso grazie ancora.
cesare