Newsgroup: it.comp.appl.access
Titolo: Re: sostuire Query con Vba

> Già postato; ma non completato.
tu lo sai vero che quanto hai scritto significa piu' nulla che poco?...
-- 
--------------------------------
Pablitomf
Napoli sempre nel "Q"uore!

 IDTESTATAFATTURA))
http://allenbrowne.com/ser-42.html


> 
http://allenbrowne.com/ser-42.html
Oppure se proprio vuoi smanettare :
Private Sub TuoComando_Click()
Call CreaQuery("Select * from TuaTabella")
Dim msg         As String
msg = DLookup("TuoCampo", "TuaQuery", "ID=1")
MsgBox msg
Call EliminaQuery("TuaQuery")
End Sub
Private Sub CreaQuery(str As String)
    Dim MyQueryDef As QueryDef
    MsgBox "Adesso creo la query", vbOKOnly
    Set MyQueryDef = CurrentDb.CreateQueryDef("TuaQuery", str)
    MsgBox "Creata la Query", vbOKOnly
End Sub
Private Sub EliminaQuery(str As String)
   MsgBox "Adesso cancello la Query", vbOKOnly   
   CurrentDb.QueryDefs.Delete ("TuaQuery")
   MsgBox "Adesso cancello la query", vbOKOnly
End Sub


 Call CreaQuery("Select * from TuaTabella")
Ugo, la funzione CreaQuery si aspetta semplicemente che tu gli passi un
parametro (str) che equivale al tuo SQL... quindi quello che scriverai
sara' preso in pasto dalla stessa e trasformata in "TuaQuery" su cui
verra' fatto il Dlookup... per cui se scrivi un SQL su una tabella, ti
restituira' i risultati di quel SQL, se sara' di piu' tabelle in join, i
risultati saranno di quest'ultima...  nulla di piu' semplice...


 Call CreaQuery
Ugo ma l'esempio l'hai letto? :D
non e' definita quando la funzione non l'hai creata... ma io te l'ho
scritta pari pari nell'esempio di cui sopra... dovevi solo copiare e
incollare...


 'idTestataFattura =88 and IdDettaglioFattura 183'
IdDettaglioFattura 183 non significa nulla...


 Grazie


     Call EliminaQuery("Query2_1")


restituisce un risultato (ovvero se ci sono sottorecords)
Ciao Pablitomf
ma per non avere errore pur avendo anche questa situazione
(cioč "Mp" null)
cosa devo fare?
Grazie
santa pazienza
a monte di tutta l'elaborazione testi e se č null blocchi il tutto avvisando 
l'utente che č una capra
Antonio 

 & Me!IDTESTATAFATTURA))
Ugo, ma davvero fai o ci stai prendendo tutti per il culo? :D
te l'ho detto 20 volte come fare!...diversamente "NON PUOI" (ora gli sara'
chiaro?????)... mha'.


 complessa.
complessa? :D macche' complessa... e' semplicissima e te l'ho anche
scritta. 2 funzioncine e 3 righe di codice. Piu' di quello non puoi
perche' il DlookUp non accetta SQL puro come dominio, ma solo nomi di
Query o Tabelle... come ti avevo descritto, per renderti "libero" di
essere dinamico nella creazione della "Query" di base del tuo Dlookup devi
crearla al volo ogni volta che ti serve e in qualsiasi forma ti serve
(denominandola sempre allo stesso modo) e su quella sviluppare il tuo operato.
Diversamente non puoi.


> Diversamente non puoi.
Mi correggo... "NON PUOI" se vuoi usare DlookUp nativo... ma se ti
costruisci una funzione di DlookUp personalizzata, puoi fare cio' che ti
pare....
Es.
In un modulo inserisci : 
Public Function Dlookup2(campo As String, dominio As String, criterio As
String)
On Error Resume Next
    Dim db          As Database
    Dim rs          As DAO.Recordset
    Dim strSQL      As String
 
    If criterio <> "" Then
        strSQL = dominio & " WHERE " & criterio
    Else
        strSQL = dominio
    End If
 
    Set db = CurrentDb
    Set rs = db.OpenRecordset(strSQL)
 
        Dlookup2 = rs!campo
 
    Set rs = Nothing
    Set db = Nothing
 
 
End Function 
In un Form, sul click di un pulsante metti : 
MsgBox Dlookup2("campo", "Select TuoCampo as campo, * from TuaTabella",
"TuoCriterio=TuoValore")
vedrai che funziona... in questo modo hai messo direttamente l'SQL puro
nel tuo Dlookup2 (la tua funzione emula di Dlookup)


 ha scritto nel messaggio 
news:93c07574-1b74-47a6...@h14g2000yqd.googlegroups.com...
cut
ciao Pablitomf e grazie di tutto.
Ma volevo solo sentire una sua opinione
anche perchè la soluzione al mio problema è abbastanza
complessa.
Ugo, se un pablitomf ti dà una soluzione difficilmente ce ne sarà un'altra 
migliore che ti posso dare io
diverso il caso se era un radicale qualunque a dartela
A 

> ma non so se è corretto
Hai letto la mia soluzione alternativa??????


 ma ho errore di compilazione, argomento non facoltativo su Dlookup2
se hai "studiato" la funzione Dlookup2 avrai notato che la stessa richiede 3
argomenti:  campo - dominio - criterio
sul tuo 
Dlookup2("Categoria", "Select Categoria as Categoria, * from
TbTestata_Fattura" & Me!IDTESTATAFATTURA & " and idDettaglioFattura =" &
DMax("iddettaglioFattura", "TbDettaglio_Fattura","idTestataFattura=" &
Me!IDTESTATAFATTURA))
"Categoria" rappresenta il CAMPO
"Select Categoria as Categoria, * from TbTestata_Fattura" rappresenta il DOMINIO
poi ti sei perso... il CRITERIO ndo sta?...
PS pure rispetto al DOMINIO e al CAMPO devi fare attenzione... la funzione
richiama il campo denominato "CAMPO", per cui avresti un errore richiamando
il campo "CATEGORIA" e facendo la SELECT in quel modo...
devi fare: 
Dlookup2("campo","Select Categoria as campo, * from
TbTestata_Fattura","...inserisci qua il tuo criterio...")
in questo modo la funzione ti restituira' il campo della select denominato
"CAMPO" (che nella tua specifica e' la CATEGORIA.
PS2 se non hai "CRITERI" lascia le due virgolette "".
Chiaro?


 ora non ho errori ma la finestrella di MsgBox è vuota
ovvio che lo e'... il Dlookup e' una funzione che restituisce 1 solo
valore...
per cui il Criterio va inserito obbligatoriamente a tal fine...
altrimenti la select senza criteri
restituisce + valori e la funzione va in errore
il "metti solo le virgolette" era solo per farti capire che il parametro
devi passarlo obbligatoriamente...


 dove sto sbagliando ancora?
no, questa e' fatta bene... ma sei sicuro sicuro che dia un solo risultato e che
soprattutto ne dia?
cioe' se tu fai una query :
Select Categoria as Campo, * from TbTestata_Fattura Where idTestataFattura =
tuovalore (ovvero quello restituito da Me!IDTESTATAFATTURA), il risultato che
ottieni qual'e'?


 soprattutto ne dia?
per curiosita', nel MODULO, subito dopo "ON ERROR RESUME NEXT" mettici questa : 
MsgBox "CAMPO: " & campo & Chr(10) & "DOMINIO: " & dominio & Chr(10) &
"CRITERIO: " & criterio, , "VALORI"
Avvia la procedura e dimmi che messaggio ti da...


 non trova Categoria
quindi e' sbagliata la tua select... 


 CRITERIO: idTestataFattura=115 and idDettaglioFattura=258
perfetto... quindi i valori li prende... probabilmente il campo CATEGORIA non
esiste... ma sei sicuro che la select sia giusta?????????? 
fai la prova a fare la query :
Select Categoria as Campo, * from TbTestata_Fattura Where idTestataFattura=115
and idDettaglioFattura=258
vedi che ti da


> mi chiede valore parametro categoria e iddettagliofattura
Ugo ma siamo all'ABC dell'SQL... 
se tu scrivi um SQL tipo il tuo :
Select Categoria as Campo, * from TbTestata_Fattura Where idTestataFattura=115
and idDettaglioFattura=258
si presuppone che nella tabella TbTestata_Fattura ci siano il campo CATEGORIA e
idDettaglioFattura... se non ci sono, ma di che stiamo parlando????????
se non conosci questi principi di base, come vuoi trasformare funzioni native?...


 TbDescrizione.IdDescrizione = TbDettaglio_Fattura.IDDESCRIZIONE;
perche' poi nel DLOOKUP2 ce ne passi un'altra? nella stessa devi solo fare
attenzione a risaltare il campo TUATABELLA.CATEGORIA AS CAMPO, e hai risolto...
credimi ti stai perdendo in un bicchiere d'acqua...


> credimi ti stai perdendo in un bicchiere d'acqua...
Ad occhio e croce dovrebbe essere cosi':
msgbox Dlookup2("campo","SELECT TbDescrizione.Categoria AS campo,
TbDettaglio_Fattura.IDDETTAGLIOFATTURA,
TbDettaglio_Fattura.IDTESTATAFATTURA
FROM TbDescrizione INNER JOIN TbDettaglio_Fattura ON
TbDescrizione.IdDescrizione =
TbDettaglio_Fattura.IDDESCRIZIONE;","idTestataFattura =" & Me!IDTESTATAFATTURA)


 se è si, possiamo verificare se trova tutti e tre i campi?
Ovvio che si, Ugo la Funzione che ti ho fatto, altro non e' che un DLOOKUP
personalizzato, che a differenza di "Query" ti fa mettere (come avevi chiesto)
direttamente dentro la SELECT che piu' ti pare. Mi pare ovvio che se la select
che inserisci dentro, e' sbagliata, sbagliata risultera' la funzione... si puo'
sapere la query :
SELECT TbDescrizione.Categoria AS campo,
TbDettaglio_Fattura.IDDETTAGLIOFATTURA,
TbDettaglio_Fattura.IDTESTATAFATTURA
FROM TbDescrizione INNER JOIN TbDettaglio_Fattura ON
TbDescrizione.IdDescrizione =
TbDettaglio_Fattura.IDDESCRIZIONE 
WHERE
idTestataFattura = (...tuoValoreIDTESTATAFATTURA...)
che risultato ti da?... secondo me nessuno... ecco perche' e' vuota la funzione...
Cmq fa cosi', ho affinato la Funzione con i controlli sui risultati...
sostituiscila alla precedente e fammi sapere :
Public Function Dlookup2(campo As String, dominio As String, criterio As String)
On Error Resume Next
    MsgBox "CAMPO: " & campo & Chr(10) & "DOMINIO: " & dominio & Chr(10) &
"CRITERIO: " & criterio, , "VALORI"
 
    Dim db          As Database
    Dim rs          As DAO.Recordset
    Dim strSQL      As String
 
    If criterio <> "" Then
        strSQL = dominio & " WHERE " & criterio
    Else
        strSQL = dominio
    End If
 
    Set db = CurrentDb
    Set rs = db.OpenRecordset(strSQL)
        If rs.RecordCount = 0 Then
            MsgBox "Il DOMINIO e' sbagliato, non restituisce valori." & vbCrLf &
"Ricontrollare l'SQL: " & vbCrLf & strSQL, vbCritical, "ERRORE"
            Dlookup2 = "ERRORE"
            GoTo Opz_exit:
        End If
        If rs.RecordCount > 1 Then
            MsgBox "Il DOMINIO e' sbagliato, perchè restituisce più di un
record", vbCritical, "ERRORE"
            Dlookup2 = "ERRORE"
        Else
            Dlookup2 = rs!campo
        End If
Opz_exit:
    Set rs = Nothing
    Set db = Nothing
End Function


 CRITERIO: idTestataFattura=115
che è sta roba????? 
ma sei sicuro che dia anche "CRITERIO: idTestataFattura=115"?????


 il pulsante io l'ho inserito nella "MFattura"
Caro Ugo, "se" il risultato e' quello che dici di essere, allora hai fatto una
megaminchiata nella trascrizione del mio esempio... se il messaggio ti riporta
CRITERIO: idTestataFattura=115 vuol dire non solo che non lo hai racchiuso nella
giusta sezione, quanto poi hai anche di tuo pugno scritto "CRITERIO:", perche'
nella mia funzione non e' enunciato... 
bho'... e pure la cosa e' talmente semplice che quasi mi sta irritando :D
questo ( E NON ALTRO ) devi scrivere!!!!!!!! ( FA IL COPIA E INCOLLA... NON TI
CIMENTARE NELL'INTERPRETARE PLS):
msgbox Dlookup2("campo","SELECT TbDescrizione.Categoria AS campo,
TbDettaglio_Fattura.IDDETTAGLIOFATTURA,
TbDettaglio_Fattura.IDTESTATAFATTURA
FROM TbDescrizione INNER JOIN TbDettaglio_Fattura ON
TbDescrizione.IdDescrizione =
TbDettaglio_Fattura.IDDESCRIZIONE;","idTestataFattura =" & Me!IDTESTATAFATTURA)
Se non funziona, la tua SELECT e' SBAGLIATA e io non ci posso fare nulla finche'
non la aggiusti... ti diro' di piu', SE la tua select e' sbagliata (cosa che
penso altamente), sarebbe sbagliata anche se la salvassi come QUERY e la
utilizzassi come dominio nella funzione nativa DLOOKUP.


 So che serve a poco
No, serve a poco non capire di cosa stiamo parlando... questo si che serve a poco.
Se non ti cimenti nel capire questi dati cosa sono e a cosa servono, a voglia a
fare botta e risposta per un'altro ventennio...
Tu sai a cosa serve un Dlookup? a ridarti 1 singolo valore (UNO - non piu' di
uno - ) di un determinato "CAMPO", di una determinata "TABELLA" (dominio),
rispetto a determinati "CRITERI" di filtraggio che permettono l'estrapolazione
di quel singolo elemento...
e' inutile che vai a tentoni... i tentativi non servono... bisogna essere
scientifici!
Se io faccio ad esempio : 
Select MioCampo As Campo, * From MiaTabella Where ID=1
avro' di certo 1 solo risultato (visto che il filtro e' uguale a ID=1 a cui
corrisponde 1 solo record)
se faccio invece :
Select MioCampo As Campo, * From MiaTabella Where ID=1 And ID=2
non avro' risultati, perche' ho "SBAGLIATO" a fare il filtro (e' infatti
impossibile che un ID possa allo stesso tempo essere 1 e 2)
se faccio ancora : 
Select MioCampo As Campo, * From MiaTabella Where ID=1 Or ID=2
avro' risultati (sempre che esistano entrambi i record con quegli ID), ma
saranno troppi per il DLOOKUP perche' la select restituirebbe 2 record e il
DlookUp non saprebbe quale valore di "CAMPO" dovrebbe restituire...
MORALE DELLA FAVOLA:
O aggiusti il suo DOMINIO (SQL) piu' il tuo CRITERIO, affinche' il risultato sia
DIGERIBILE dalla funzione DLOOKUP, o e' meglio che vai a mare, perche' non ne
esci da sta roba.


esci da sta roba.
per me questo thread dura di più di 
http://tinyurl.com/3lsbwzs
quanta pazienza hai pablito......

> Qui se non funziona non funziona.
io direi piuttosto "qui SE NON CAPISCO COSA STO FACENDO, DI COSA STO PARLANDO, E
QUALI SONO I SUGGERIMENTI UTILI CHE MI STANNO DANDO non funziona", perche' ti
assicuro (e se te lo dico, credimi) che funziona tranquillamente. ;)


 non può andare bene
strarotfl
cioe' adesso da 0 sei diventato tanto capace da individuare anche i problemi
nella funzione? :D
dai dai... su, fai il bravo :D
Guarda, proprio perche' e' agosto, ti vedo in seria difficolta' nel comprendere
la questione (Antonio avrebbe detto solo "comprendere"), ti ho fatto una demo
funzionantissima, che raggruppa tutto cio' che in una milionata di righe di 3d
ti ho spiegato.
Link: 
http://85.44.230.157/Maurizio/Dlookup2.zip
Giocaci, e soprattutto "NON COPIARE" semplicemente, prima COMPRENDILO...
Exit Sub.
The End ;)


 The End ;)
...e dopo tutta sta cagnara te ne esci con questo post, non 
vale......d'altro canto eri vicino vicino ci stavi quasi per riuscire, se 
solo insistevi un po' :D
-- 
Ciao
Geppo 

 solo insistevi un po' :D
Geppino, ma in compenso a sua insaputa l'ho iscritto qua :
http://www.facebook.com/group.php?gid=136689226342125


 TbDettaglio_Fattura.IDDESCRIZIONE
con simpatia :
http://www.youtube.com/watch?v=a6JTx3uBsGU&feature=related


lo so.
e dopo che lo hai compreso, spiega il perchè nella tua dlookup2 non
funzionava niente....

 Con più tb no!
uhauhauhauahuhauhauhauhauha mai sentite tante frottole in tutta la mia carriera
nell'NG... tutto tempo sprecato il mio! :D
PS x SAM...
Funziona anche con 100000 tabelle... basta saper metter su uno straccio di SQL
che funzioni, cosa che Ugo non sa fare ;)


 ;)
stra ROTFL
-- 
Ciao
Geppo 

 che funzioni, cosa che Ugo non sa fare ;)
stai perdendo la pazienza, appena appena sui bordi...
Antonio 

 Napoli sempre nel "Q"uore!
Contraccambio anch'io con simpatia
http://www.youtube.com/watch?v=BVo2CEJdoJc
Ugo
ah, se � con simpatia...
Antonio 

 mentre era il criterio.
No, il problema e' che ancora non hai capito che nel DLOOKUP il campo, il
dominio e il criterio si fondono risultando nel loro insieme il "dominio"... ;)
dlookup("miocampo","miaquery","miocriterio = miovalore")
equivale a dire in SQL :
select miocampo from miaquery where miocriterio = miovalore


> stai perdendo la pazienza, appena appena sui bordi...
onesto? no, mi sta anzi divertendo perche' non ha ancora capito che non si deve
mai spingere in "non funziona perche'..." finche' non e' davvero padrone di cio'
su cui si pronuncia... in realta' lui dice "immaginando" di sapere, pur forse
conscio che e' tutt'altro che la verita', e la cosa bella e' che la mette come
verita' assoluta anche per gli altri dando cosi' un messaggio distorto della
realta' :D
cmq se avessi un tantinino perso la pazienza sarei giustificatissimo :D


 select miocampo from miaquery where miocriterio = miovalore
e ti diro' di piu'... quella funzione che ho fatto al volo e' migliorabilissima...
Es.
Public Function Dlookup2(campo As String, dominio As String, criterio As String)
On Error Resume Next
    MsgBox "CAMPO: " & campo & Chr(10) & "DOMINIO: " & dominio & Chr(10) &
"CRITERIO: " & criterio, , "VALORI"
 
    Dim db          As Database
    Dim rs          As DAO.Recordset
    Dim strSQL      As String
 
    If criterio <> "" Then
        strSQL = "SELECT " & campo & " as campo FROM (" & dominio & ") WHERE " &
criterio & ";"
    Else
        strSQL = "SELECT " & campo & " as campo FROM (" & dominio & ");"
    End If
 
    Set db = CurrentDb
    Set rs = db.OpenRecordset(strSQL)
        If rs.RecordCount = 0 Then
            MsgBox "Il DOMINIO e' sbagliato, non restituisce valori." & vbCrLf &
"Ricontrollare l'SQL: " & vbCrLf & strSQL, vbCritical, "ERRORE"
            Dlookup2 = "ERRORE"
            GoTo Opz_exit:
        End If
        If rs.RecordCount > 1 Then
            MsgBox "Il DOMINIO e' sbagliato, perchè restituisce più di un
record", vbCritical, "ERRORE"
            Dlookup2 = "ERRORE"
        Else
            Dlookup2 = rs!campo
        End If
Opz_exit:
    Set rs = Nothing
    Set db = Nothing
 
 
End Function
 
a questo punto nel DEMO che ti ho girato, se sostituisci la funzione vecchia con
questa nuova, i campi del Form possono anche assumere questi valori direttamente : 
campo="cmp_Campo1" (o cmp_Campo2, cmp_Campo3,...)
dominio="Select * from tbl_Test"
criterio="ID=1" (o 2,3,...)
eccoti cosi' slegato dalla "rottura" di evidenziare "tu" il campo denominato
"CAMPO". Lo fara' la funzione per te.


 cmq se avessi un tantinino perso la pazienza sarei giustificatissimo :D
sui bordi
A 

che funzioni, cosa che Ugo non sa fare ;)
lo so, lo so
era ugo che non lo sa...