Newsgroup: it.comp.appl.access
Titolo: apertura query parametrata

Ho la necessità di creare ed aprire una query con parametri.
La query la crea senza problemi, ma quando provo ad aprire mi da un
messaggio di errore:
"Troppi pochi parametri, previsti 2."
Ho consultato il manuale dello sviluppatore di access97, e mi presentava
questa soluzione, ma non va.
Ecco il codice da me utilizzato (chiaramente la maschera fattura è aperta):
    Dim rt As Recordset, rm As Recordset, rr As Recordset, mq As QueryDef
    Dim strSQL As String, strPRM As String
    strPRM = "PARAMETERS daID Text, aID Text;"
    strSQL = strPRM & "SELECT IDCliente FROM [Bolle] WHERE ((IDCLiente)
between daID and aID);"
      Set mq = CurrentDb.CreateQueryDef("contacl", strSQL)
          mq.Parameters!daID = Forms!fattura!daIDCliente
          mq.Parameters!aID = Forms!fattura!aIDCliente
      Set rr = CurrentDb.OpenRecordset("contacl")
Grazie per l'interessamento.
Davide Pigoni


se devi aprirla non e' necessario parametrizzarla.
strSQL = "SELECT IDCliente FROM [Bolle] WHERE IDCLiente between " &
Forms!fattura!daIDCliente & " and " & Forms!fattura!aIDCliente 
Set mq = CurrentDb.CreateQueryDef("contacl", strSQL)
mq.close
docmd.openquery "contacl"
se pero' e' una query che usi abitualmente, ti sconsiglio di ricrearla di
continuo;
createne una che fa riferimento ai due campi, cioe'
SELECT IDCliente FROM [Bolle] WHERE IDCLiente between Forms!fattura!daIDCliente
and Forms!fattura!aIDCliente 
-- 
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
--------------------------------------

 Federico
Grazie a Federico Luciani per avermi risposto,
ho provato a fare come nel II caso ma mi dice che ci sono: Troppi pochi
parametri.
Il motivo per il quale ho parametrizzato la query è che i controlli
daIDCliente e aIDCliente
sono delle caselle combinate non associate appartenenti alla maschera
fattura.
Sul manuale ho trovato che in questi rari casi è necessario definire i
parametri poiché altrimenti
si genera il suddetto errore.
Probabilmente non ho capito bene io la questione.
Ti sarò grato se potrai darmi maggiori delucidazioni.
Ciao e Buon Lavoro.
Davide

 Ti sarò grato se potrai darmi maggiori delucidazioni.
Lascia stare il codice.
Crea una query senza scegliere alcuna tabella, visualizza SQL e copiaci dentro
questo:
SELECT IDCliente FROM Bolle WHERE IDCLiente Between Forms!fattura!daIDCliente
And Forms!fattura!aIDCliente
poi visualizza la struttura, cosi' puoi capire come funziona e salvala.
Adesso apri la form fattura, inserisci dei valori nei controlli daIDCliente e
aIDCliente e poi lancia la query.
Se vuoi aprire la query da codice, con un pulsante dalla form fattura, ti basta
eseguire:
Docmd.openquery "nomeQuery"


 Docmd.openquery "nomeQuery"
Ti ringrazio per avermi risposto un'altra volta.
E ho paura di aver creato una gran confusione.
La query suddetta non mi serve aperta per visualizzarne i dati o utilizzare
l'istruzione Docmd.openquery,
ma ho bisogno di utilizzare il metodo openrecordset per esguire un ciclo di
controllo così:
'La query è già creata con l'oggetto querydef, istruzioni SQL e PARAMETERS.
Set rs=currentdb.openrecordset ("miaquery")      ' e qui mi da il messaggio
di errore, oppure
Set rs= mq.openrecordset() 'stessa cosa
        'Vorrei poter fare così:
        rs.movefirst
        Do Until rs.EOF
        'Istruzioni
        Loop
Mi dispiace averti fatto perdere del tempo, e non voglio disturbarti
ulteriormente, mi hai già dedicato abbastanza tempo.
Ti sarò comunque grato se vorrai rispondermi.
Grazie Mille.
Davide

 ulteriormente, mi hai già dedicato abbastanza tempo.
allora, a meno che tu non abbia esigenze particolari, non ti serve creare la
query;
ti basta aprire un recordset sulla tabella filtrata, cioe'
dim strSQL as string
dim rs as recordset
strSQL = "SELECT IDCliente FROM Bolle WHERE IDCLiente between " &
Forms!fattura!daIDCliente & " and " & forms!fattura!aIDCliente
Set rs = CurrentDb.openrecordset(strSQL)
rs.movefirst
Do
 'Istruzioni
 rs.movenext
Loop Until rs.EOF
quindi se:
Forms!fattura!daIDCliente = 1
Forms!fattura!aIDCliente = 100
la stringa sql diventa:
SELECT IDCliente FROM Bolle WHERE IDCLiente between 1 and 100


>[cut]
Grazie di nuovo, hai davvero una gran pazienza per sopportarmi ;-)
Il problema è che:
Set rs = CurrentDb.openrecordset(strSQL)
non lo fa.
In Debugging da il messaggio d'errore "Troppi pochi parametri".
Boh?!#*
Che dire? Se mi rispondi nuovamente...     G R A Z I E.
Davide

 In Debugging da il messaggio d'errore "Troppi pochi parametri".
Hai messo i doppi apici al posto giusto?
Copia e incolla questo, funziona al 100%
Dim strSQL As String
Dim rs As Recordset
strSQL = "SELECT IDCliente FROM Bolle " & _
   "WHERE IDCLiente Between " & Forms!fattura!daIDCliente & _
   " And " & Forms!fattura!aIDCliente
Debug.Print strSQL
Set rs = CurrentDb.OpenRecordset(strSQL)
rs.MoveFirst
Do
 Debug.Print rs![IdCliente]
 rs.MoveNext
Loop Until rs.EOF


 Loop Until rs.EOF
Ho paura che funzioni al 99.99999%, ed io ho proprio paura di essere quel
0.00001 sfortunato %.
Scherzi a parte, quanti reply si possono fare prima di bucare il monitor?
Io non so più che pesci prendere.
Il codice che mi hai dato và bene.
Infatti la stringa strSQL nell'immediata del debug è =
SELECT IDCliente FROM Bolle WHERE IDCLiente Between 12515 And 12516
ma su
Set rs = CurrentDb.OpenRecordset(strSQL)
mi salta furoi quel maledetto errore:
Errore di run-time '3061':
Parametri insufficienti. Previsto 1.
Grazie davvero tanto per il tuo interessatissimo interessamento.
Davide

 Loop Until rs.EOF
Ho paura che funzioni al 99.99999%, ed io ho proprio paura di essere quel


Io non lo so cosa diavolo è successo comunque adesso va!!
Federico, Grazie Mille per il tempo che mi hai dedicato ed ecco qui il
codice
per manipolare dati con controlli non associati di maschere.  "Funziona".
' Maschera "Valori" già aperta
  Dim rs As Recordset
  Dim strSQL As String, strPar As String
      strPar = "PARAMETERS daValore Text, aValore Text;"
      strSQL = strPar & "SELECT IDCliente FROM [Bolle] WHERE IDCliente
between " & _
      "[daValore] and [aValore];"
      ' verifica la stringa SQL
      Debug.Print strSQL
      Set mq = CurrentDb.CreateQueryDef("miaquery", strSQL)
      mq.Parameters("daValore") = Forms![Valori]!daValore
      mq.Parameters("aValore") = Forms![Valori]!aValore
      Set rs = mq.OpenRecordset()
      rs.quello che vuoi
  rs.close
  CurrentDb.QueryDefs.Delete ("miaquery")
Grazie e scusate per lo spazio occupato con tutti questi reply.
Ciao e Buon Lavoro
Davide

 [cut]
Ok, ma ti ripeto, non ha senso che tu crei ed elimini una query tutte le volte
che devi fare operazioni di questo tipo.
Provala cosi e fammi sapere.
Dim strSQL As String
Dim dbs as database
Dim rs As Recordset
strSQL = "SELECT IDCliente FROM Bolle " & _
   "WHERE IDCLiente Between " & Forms!fattura!daIDCliente & _
   " And " & Forms!fattura!aIDCliente
set dbs = currentdb()
Set rs = dbs.OpenRecordset(strSQL)
rs.MoveFirst
Do
 Debug.Print rs![IdCliente]
 rs.MoveNext
Loop Until rs.EOF
rst.close
set dbs = nothing


 [cut]
Ok, ma ti ripeto, non ha senso che tu crei ed elimini una query tutte le volte
che devi fare operazioni di questo tipo.
Provala cosi e fammi sapere.
Dim strSQL As String
Dim dbs as database
Dim rs As Recordset
strSQL = "SELECT IDCliente FROM Bolle " & _
   "WHERE IDCLiente Between " & Forms!fattura!daIDCliente & _
   " And " & Forms!fattura!aIDCliente
set dbs = currentdb()
Set rs = dbs.OpenRecordset(strSQL, dbOpenDynaset)
rs.MoveFirst
Do
 Debug.Print rs![IdCliente]
 rs.MoveNext
Loop Until rs.EOF
rst.close
set dbs = nothing


 set dbs = nothing
Grazie per essere ancora qui.
Ho provato con il codice esattamente come sopra.
Risultato...
NIENTE DA FARE "Err. '3061'.
E' vero è assurdo creare una query ogni volta e poi cancellarla, solamente
per un'interrogazione.
Ma altrimenti cosa devo fare?
Come ho letto su un libro:
Inviate la risposta in busta chiusa a: Microsoft via Bill Gates, 1.
Scherzi a parte se ti viene in mente qualcos'altro sono prontissimo a
provarlo.
Grazie ancora.
Davide

 [cut]
mah!!
prova a non usare i riferimenti, cioe':
strSQL = "SELECT IDCliente FROM Bolle WHERE IDCLiente Between 1 And 10000"


 strSQL = "SELECT IDCliente FROM Bolle WHERE IDCLiente Between 1 And 10000"
E' assurdo mi da errore anche cosě ma che cos'č un problema di tabella o
cosa?
Davide


ma se crei una query di quel tipo funziona?
prova anche:
strSQL = "SELECT IDCliente FROM Bolle WHERE IDCLiente >= 1 And IDCLiente <=
110000"


 110000"
Stessa cosa.
Il problema che il dato IDCliente non è numerico ma è composto da un codice
alfanumerico di 6 caratteri (es.: FRASDF)
Se io creo una query con Access (senza codice e senza SQL) basata sulla
tabella
Bolle e nei criteri IDCliente Between Forms!Fattura...
La esegue senza problemi.

 alfanumerico di 6 caratteri (es.: FRASDF)
ma porca malora!!! :-)
sbaglio o non m'avevi detto che IDCliente no e' numerico?
prova cosi', attento agli apici:
Dim strSQL As String
Dim dbs as database
Dim rs As Recordset
strSQL = "SELECT IDCliente FROM Bolle " & _
   "WHERE IDCLiente Between '" & Forms!fattura!daIDCliente & _
   "' And '" & Forms!fattura!aIDCliente & "'"
set dbs = currentdb()
Set rs = dbs.OpenRecordset(strSQL, dbOpenDynaset)
rs.MoveFirst
Do
 Debug.Print rs![IdCliente]
 rs.MoveNext
Loop Until rs.EOF
rst.close
set dbs = nothing
-- 


 set dbs = nothing
Mai detto...   e mai smentito
Mi dispiace proprio tanto d'averti fatto perdere tanto tempo.
Adesso va tutto.
Era quindi solamente un problema di apici?
PaZzEsCo!!
Vado a ripassarmi bene a modino il metodo Openrecordset e tutta la sintassi
di VB.   :-((
Grazie e scusami ancora.
Alla prossima.
P.S.
Mi pare di aver capito tu sia del Lazio (forse). Io sono dell'Emilia.
Quando passi da queste parti  devo proprio offrirti da bere!!  :-)

 Quando passi da queste parti  devo proprio offrirti da bere!!  :-)
Vivo a Trieste, ma per lavoro vado spesso a Bologna ;-)


Vivo a Trieste, ma per lavoro vado spesso a Bologna ;-)
Ci sono andato vicino vero? :-/
Io sono di Reggio Emilia, quindi se passi...
Scherzi a parte devo ancora farmi le ossa con Access.
Quindi potrà capitare ancora che io crei questi ingorghi.
Ciao e buon lavoro.
Davide
-----------------------
rimuovi mail per e-mail
-----------------------