Newsgroup: it.comp.appl.access
Titolo: Esosa richiesta di parametri

Ho questo codice che crea una Query parametrica di nome "Provvisoria"
(I parametri sono presi da una form  "Miaform")
Dim dbs As DAO.Database
Dim qdfTemp As DAO.QueryDef
Dim rst As DAO.Recordset
Dim strSQL as string
Set dbs = CurrentDb
 
strSQL = "SELECT Movimenti.IDMovimento," ecc.
"FROM ecc.
"WHERE ecc. (tre parametri)
"ORDER BY ecc.
Set qdfTemp = dbs.CreateQueryDef("Provvisoria", strSQL)
La Query fa il suo dovere e popola Elenco19 attraverso:
Forms![Miaform]!Elenco19.RowSourceType = "Table/Query"
Forms![Miaform]!Elenco19.RowSource = "Provvisoria"
Ma quando apro il seguente Recordset:
Set rst = qdfTemp.OpenRecordset
Mi da errore di run-time '3061'
Parametri insufficienti.
Naturalmente se apro direttamente la Query dal pannello del db mi vengono
restituiti regolarmente gli stessi record filtrati che trovo nella form.
Come mai questo comportamento perverso e come è possibile aggirarlo?
Ho provato pure con una Query di creazione Tabella. Viene creata una
confortante tabella che corrisponde alla Query filtrata ma se tento di
ottenere da questa il corrispondente Recordset la risposta è sempre quella:
"Parametri insufficienti"
Grazie per le cortesi risposte.
-- 
E.Delacroix
_  _
o  o;
@--

 ...
 Parametri insufficienti
 
www.donkarl.com/it?FAQ6.4
 Aprire una query parametrica da VBA
 
www.donkarl.com/it?FAQ6.16
-- 
Ciao
Karl
*********
Access FAQ: 
http://www.donkarl.com/it
 

  
www.donkarl.com/it?FAQ6.16
Accidenti! Pensare che poco prima di decidermi a porre la questio sul ng
sono andato a guardare proprio sul tuo sito lasciandomi sfuggire queste
FAQ. Non ho parole.
Un saluto e ... grazie.


 ...
In questo caso basta escludere i parametri dalla stringa SQL
e invece passare i valori dei parametri.
Se non riesci, incolla il tuo vero codice invece di scrivere
un esempio senza virgolette ecc. e indica il tipo del campo
"Prodotto".


> ...
E sono passati male, almeno il primo, la data!
"...
WHERE [Movimenti.DataMovimento] Between #" & _
     Forms!formProdotti![Calendar1] & "# And #" & _
     Forms!formProdotti![Calendar2] & "# And '" & _
     Forms!formProdotti![ElencoO] & "'
... "
Bruno
PS
Dovresti mostrare l'intera stringa SQL, non come la scrivi tu
ma come la vede il programma...
 

 ... "
No. In principio si puo includere i parametri nella stringa come
l'ha fatto. In questo caso non è necessario di scrivere # ecc.
Però così funziona solo per metodi di Access come
DoCmd.RunSQL o per un CreateQueryDef come qui dove
Access (o meglio l'Expression Service di JET/ACE) puo evaluare
i parametri e si occuppa dei tipi di dati.
Invece non funziona con metodi di DAO.
Questo è il suo problema col Recordset o Execute ecc.
Se invece si vuole passare i valori, come l'hai suggerito tu, non
bastano i # per un parametro di tipo data, ma ci vuole più lavoro
(
www.donkarl.com/it?FAQ6.8
).
-- 
Ciao
Karl
*********
Access FAQ: 
www.donkarl.com/it
 

 (
www.donkarl.com/it?FAQ6.8
).
Sė, giusto, dimenticavo:
le date in formato YYYY/MM/DD.
Bruno 

 "Prodotto".
Il vero codice è:
Public Sub Elenco0_AfterUpdate()
    Dim dbs As DAO.Database
    Dim qdfTemp As DAO.QueryDef
    Dim rst As DAO.Recordset
    Dim strSQL As String
 
 
'--------Passa alla form giacenza e livello di riordino--------
Forms![formProdotti]!Elenco21.RowSourceType = "Table/Query"
Forms![formProdotti]!Elenco21.RowSource = "Prodotti Query"
'-------------------------------------------------------------------------------
Set dbs = CurrentDb
strSQL = "SELECT Movimenti.IDMovimento," & _
"Movimenti.DataMovimento, Movimenti.Prodotti_IDProdotto," & _
"Movimenti.Quantità," & _
"Movimenti.Quantità as Giacenza_Relativa " & _
"FROM Prodotti INNER JOIN Movimenti ON " & _
"Prodotti.IDProdotto = Movimenti.Prodotti_IDProdotto " & _
"WHERE (((Movimenti.DataMovimento) Between " & _
"(Forms!formProdotti!Calendar1) AND " & _
"(Forms!formProdotti!Calendar2)) AND ((Prodotti.Prodotto)=" & _
"(Forms!formProdotti.Elenco0))) " & _
"ORDER BY Movimenti.DataMovimento, Movimenti.IDMovimento;"
Nota: "Prodotto" è tipo string ricavato dalla tabella Prodotti
Set qdfTemp = dbs.CreateQueryDef("P", strSQL)
Nota: la stringa  strSQL contine il campo "Quantità" due volte; la seconda
volta è rinominato come "Giacenza_Relativa" in quanto nel recordset qui di
seguito tramite Edit e Update dovrebbe cambiare il valore nel totale
progressivo.
Set rst = qdfTemp.OpenRecordset
Nota: qui dovrebbe esservi  il codice per ottenere il totale progressivo,
ma l'esecuzione si ferma prima per via dell'errore 3061.
dbs.QueryDefs.Delete qdfTemp.Name
Dunque io ho provato ad usare Eval nella stringa SQL senza ottenere
alcunchè. Credo che Eval non funzioni con Between.
Perchè voglio fare tutto ciò? Perchè non sono riuscito a far funzionare
come vorrei nessuno dei metodi suggeriti sul sito comune per ottenere il
totale progressivo. Ed inoltre ormai sono intestardito nel voler verificare
la potenza dell'oggetto Recordset, però se già va in difficoltà con gli
oggetti di Access ...
Si tratta di una maschera in cui una casella di riepilogo mostra tra due
date i movimenti di un determinato prodotto e la giacenza relativa
movimento per movimento (altre due caselle di testo mostrano invece la
giacenza alla data odierna ed il livello di riordino).
Un saluto.


 ...
Funziona, se usato correttamente. Però come già scritto non ci
sono necessari trucchi ecc. se passi i valori dei parametri
come mostrato sopra.


 Set rst = dbs.OpenRecordset(strSQL, dbopendynaset)
Perchè così:
Forms![formProdotti]!Elenco19.RowSourceType = "Table/Query"
Forms![formProdotti]!Elenco19.RowSource = "P"
Elenco19 si popola, mentre non so come fare a popolarlo con il Recorset, il
quale non ha nome. Ho l'help corrotto su questo Access! Devo aspettare
lunedì e guardare su quello dell'ufficio per documentarmi.


E. Delacroix ha scritto:

Dato StrSql l'enunciato della query
Forms![formProdotti]!Elenco19.RowSource = StrSql
-- 

 "ORDER BY Movimenti.DataMovimento, Movimenti.IDMovimento;"
A questo punto inserisci:
MsgBox strSQL: Exit Sub
e invia il contenuto del MsgBox.
Bruno
 

 Forms![formProdotti]!Elenco19.RowSource = StrSql
Grazie. Col vostro aiuto ho fatto cose eccezionali! E vanno come una
scheggia.
-- 
E. Delacroix