Newsgroup: it.comp.appl.access
Titolo: Re: OpenQuery da VBA con Parametro...

 ...
http://www.donkarl.com/it?FAQ6.4
 
 
-- 
Ciao
Karl
*********
http://www.AccessDevCon.com
 
Access FAQ: 
http://www.donkarl.com/it
 

 Set rsQry = Db.OpenRecordset("Q_QryOrdiniRitardi")
 
Togli le virgolette a "Q_QryOrdiniRitardi".
 
Bruno


Ciao Karl,scusa ma quando scrivi
 
qdf.Parameters!MioParametro2 = Valore....
Per "MioParametro" forse intendevi MioCampo?!
visto che poi metti = Valore. Di solito il Valore E' Il parametro: nel caso specifico Forms!MiaForm!etc...
 
In ogni caso... ho provato il tuo codice inserendo il nome del campo della query al posto di MioParametro:
Set db = CurrentDb
Set qdf = db.QueryDefs("QryOrdiniRitardi")
qdf.Parameters!Anno = Eval([Forms]![MiaForm]![MioCampo])
 
ma mi restituisce il messaggio
Elemento non trovato in questo insieme
(riferito a qdf.Parameters!Anno)
Dove sbaglio?
 

 
 
In mescolare due articoli e metodi diversi:
 
Prova il metodo semplice, cioè
 
Eval("Forms!MiaForm!Anno")
 
come criterio nella tua query.
 
Se non funziona incolla la stringa SQL della query qui.


 La query funziona perfettamente da Access  
 
come query di origine di una query di comando 
(o di trasformarla direttamente in query di comando)
cha accoda (o aggiorna) i dati nella tabella ricevente
E POI usare il docmd.openquery queryDiComando ?


rsSQL = ""
rsSQL = rsSQL & "SELECT Max(QryCalcoli.GGRitardo) AS MaxDiGGRitardo, QryCalcoli.Fornitore, "
rsSQL = rsSQL & "QryCalcoli.[Ordine n], QryCalcoli.Anno, QryCalcoli.NumNC, " 
rsSQL = rsSQL & "FROM QryCalcoli "
rsSQL = rsSQL & "GROUP BY QryCalcoli.Fornitore, QryCalcoli.[Ordine n], "
rsSQL = rsSQL & "QryCalcoli.Anno, QryCalcoli.NumNC, QryCalcoli.NC "
rsSQL = rsSQL & "HAVING (((QryCalcoli.Anno)=[Forms]![Q_RubricaDett]![MonitoraggioAnno])) "
 
Set rsQry = Db.OpenRecordset(rsSQL)
 
Risposta : Parametro mancante ....


Ciao Giorgio, grazie per la risposta.
Scusa ma non ho capito la domanda.
puoi riformulare ?
Mi chiedi forse perchè non uso una query di Accodamento alla tabella?
Perchè durante la routine in VBA il codice elabora i dati e trae informazioni: fa calcoli, conta i record etc...


Scusa KArl...però non hai risposto alla mia domanda:
tu scrivi nella FAQ 
 
 qdf.Parameters!MioParametro2 = Valore.... 
 
Per "MioParametro2" forse intendevi MioCampo?! 
cioè qdf.Parameters!Anno = Forms!MiaForm!Anno...
Altrimenti non capisco cosa dovrei scrivere dopo Parameters!...

Marco formulated on Thursday :

"HAVING (((QryCalcoli.Anno)=" & 
[Forms]![Q_RubricaDett]![MonitoraggioAnno] & "));"
 
Bruno

> Risposta : Parametro mancante ....
 
Concatenare la stringa SQL nel codice è una cosa molto diversa ad usare 
il nome di una query salvata come l'hai descritto prima.
 
Il comma dopo l'ultimo campo del SELECT ti deve dare un errore. Non è 
chiaro se manca il campo NC o hai un comma superfluo. Il HAVING è un 
WHERE e per non ricevere l'errore basta escludere il riferimento alla 
maschera dalla stringa:
 
rsSQL = "SELECT Max(GGRitardo) AS MaxDiGGRitardo, Fornitore," & _
        " [Ordine n], Anno, NumNC"  & _
        " FROM QryCalcoli" & _
        " WHERE Anno=" & Forms!Q_RubricaDett!MonitoraggioAnno
  & _
        " GROUP BY Fornitore, [Ordine n], Anno, NumNC, NC"



Hai ragione che sono due cose diverse: Aprire il recordset della query (quello che volevo fare) e scrivere SQL su VBA
ma essendo che quella soluzione dava il problema del parametro 
ho provato con la stringa SQL. Quando ho visto che il problema era identico 
ho postato l'SQL 
Adesso proverò il codice che hai postato
(anche se mi è rimasta la curiosità di capire la prima soluzione che mi avevi dato )  
intanto ti ringrazio.


Grazie Bruno
proverò pure questa soluzione!

 ...
 
Ti ho segnalato e scritto due volte la soluzione semplicissima con 
Eval() per la query salvata. Costa nemmeno 1 minuto. Non è chiaro perché 
non l'hai usata.



No Karl, non era chiaro perchè chissà dove XXXX l'avevo scritto quel Eval...
pensavo fosse una funziona di VBA. Ora ho capito che è una funzione di Access... quindi nella Query :-)
Infatti alla fine sto usando questa soluzione
Scusami... ;)
ciao Grazie mille!!!

 Il parametro che sto passando è un campo numerico...
 
Sei uno strazio...
Il parametro [MonitoraggioAnno] com'è fatto? scrivilo qui!
Il campo [Anno] come è definito nella tabella? quale VarType?
 
Bruno


PS.
Ti Risulta che 2 parametri Eval non siano accettati?
Ne ho appena inserito un altro di tipo stringa ed insieme i parametri non funzionano. Se ne tolgo 1 si.... 


Bruno...
MonitoraggioAnno è un campo non associato della Form
Serve a dare il parametro alla Query il cui campo (in Tabella) è di tipo Numerico. ...E poi scusa... il tipo di dati finora non è stato un problema in nessuna delle soluzioni che sto provando.

 nessuna delle soluzioni che sto provando.
 
Se togli la clausola HAVING il recordset viene creato senza errori?
Se così è allora il guaio sta nel fatto che Anno e MonitoraggioAnno,
ancorché numerici entrambi, non hanno lo stesso VarType.
Diversamente... ma tu alle domande non rispondi e io non
ho più voglia di farne altre.
 
Bruno

Bruno, se sono qui a far domande significa che non ne so abbastanza. Questo implica il fatto che se non si   risponde è perché non si è compresa la domanda. Ho provato a risponderti dicendoti il tipo di campo di anno in tabella. Se mi chiedi di varType io capisco che (forse) mi stai chiedendo che variabile ho dichiarato. Ma i due campi sono fisici, non sono dichiarati come variabili. 
Se poi non ti va piu di rispondere a prescindere,  lo capisco a prescindere dalle motivazioni.

 
 
Come si esprime "non siano accettati"? Cosa succede?
Se ricevi un errore: con quale numero e messaggio?
 
Se non riesci vai in visualizzazione SQL della query e copia/incolla la 
stringa SQL della query nel prossimo messaggio. Forse si vede il problema.


Forse se alleghi un file dimostrativo si riesce a concludere qualche cosa

It happens that 
mariopu...@gmail.com
 formulated :

La cosa migliore sarebbe che tu creassi un nuovo database nel quale
importare la tabella dalla quale hai creato la query QryCalcoli.
Anche con soltanto alcuni record; m'interessano quelli e
sprattutto la struttura.
 
Bruno

 sprattutto la struttura.
 
E lo mettessi online!
 
Bruno


Allora: Partiamo dalla soluzione con la Funzione Eval.
 
So benissimo che la query dovrebbe restituire 3 records ma da quando ho aggiunto EVAL sul campo Fornitore, oltre che sul campo Anno, la query (e di conseguenza il recordset) si apre con Record Zero.
 
Ecco la query (già pubblicata)
SELECT Max(QryCalcoli.GGRitardo) AS MaxDiGGRitardo, QryCalcoli.Fornitore, QryCalcoli.[Ordine n], QryCalcoli.Anno, QryCalcoli.NumNC, QryCalcoli.NC
FROM QryCalcoli
GROUP BY QryCalcoli.Fornitore, QryCalcoli.[Ordine n], QryCalcoli.Anno, QryCalcoli.NumNC, QryCalcoli.NC
HAVING (((QryCalcoli.Fornitore)=Eval("[Forms]![Q_RubricaDett]![Nome]")) AND ((QryCalcoli.Anno)=Eval("[Forms]![Q_RubricaDett]![MonitoraggioAnno]")));
 
La query si apre con i 3 records se provo ad eliminare uno dei due parametri. Se vi sono entrambi restituisce Records Zero.
Questo dimostra la bontà delle informazioni provenienti dalla maschera Q_RubricaDett
 

 Questo dimostra la bontà delle informazioni provenienti dalla maschera Q_RubricaDett
 
Prova se invece dei parametri scrivi i due valori concreti come criteri 
nella query veramente restituiscono 3 record?
 
Puoi anche fare un'altra prova per vedere cosa succede. Copia questa 
stringa nella vis. SQL di una query nuova:
 
SELECT Eval("Forms!Q_RubricaDett!Nome"), 
Eval("Forms!Q_RubricaDett!MonitoraggioAnno")
FROM QryCalcoli
 
Nella vis. dati vedi i due valori aspettati?
 
L'unica cosa non corretta che vedo è che il HAVING in verità è un WHERE, 
cioè:
 
SELECT Max(QryCalcoli.GGRitardo) AS MaxDiGGRitardo, 
QryCalcoli.Fornitore, QryCalcoli.[Ordine n], QryCalcoli.Anno, 
QryCalcoli.NumNC, QryCalcoli.NC
FROM QryCalcoli
WHERE QryCalcoli.Fornitore=Eval("Forms!Q_RubricaDett!Nome") AND 
QryCalcoli.Anno=Eval("Forms!Q_RubricaDett!MonitoraggioAnno")
GROUP BY QryCalcoli.Fornitore, QryCalcoli.[Ordine n], QryCalcoli.Anno, 
QryCalcoli.NumNC, QryCalcoli.NC
 


 Bruno
 
Ciao Bruno
Ho risolto con la Funzione EVAL ma come sai sto studiando ugualmente perchè mi da quell'errore di  Tipo Dati.
Andando a ritroso, a monte della Query in oggetto, mi sono ricordato 
che quel campo ANNO deriva dal formato data così formattato:
Anno: Format([DataConsegna];"aaaa")
 
ora, mi chiedo, se il problema è questo, perchè non si manifesta in tutte le altre soluzioni varie? 
p.s.
ovviamente se non hai voglia di approfondire lascia stare, ti ringrazio lo stesso gli aiuti che hai tentato di darmi. 

 Access FAQ: 
http://www.donkarl.com/it
 
 
Ciao KARL Finalmente ho risolto. 
o meglio hai risolto!
Non ero stato io a mettere quel HAVING ma Access con la vis. Struttura Query
Sostituendo WHERE a HAVING funziona!...
Grazie mille!!! :-)

 Sostituendo WHERE a HAVING funziona!...
 
Ah, sei stato tu.
 
Se nella vis. struttura scrivi un criterio in una colonna che contiene 
un raggruppamento o una funzione di aggregazione (Min, Max ecc.) si 
tratta di un HAVING. Cioè Access prima esegue il raggruppamento/la 
funzione e poi applica il criterio al risultato.
 
Se invece vuoi prima filtrare i record con il criterio e dopo applicare 
il raggruppamento o la funzione, devi srivere il criterio in una colonna 
diversa con "Dove" nella riga "Formula". Così si tratta di una clausola 
WHERE.
 
Spesso i risultati di HAVING e WHERE sono identici ma non sempre.



:-) è Proprio vero!... Sbagliando si Impara!!! :-)