Ciao se ti posso aiutare, stavo leggendo è ti rispondo ....
’errore “Run-time error 3061 — Parametri insufficienti. Previsto 1” in Access indica che la query o il comando SQL fa riferimento a campi o parametri che Access non riesce a risolvere al momento dell’esecuzione.
Nel tuo caso ci sono due punti critici principali:
- La query QryRicercaUnico non è una tabella
Quando usi CurrentDb.Execute con una query di aggiornamento, la query di origine (QryRicercaUnico) deve essere aggiornabile.
Se si basa su un’altra query (qry_Ricerca_Generale) contenente riferimenti a form o campi calcolati, Access non riesce a risolverli e genera l’errore “Parametri insufficienti”.
Cosa fare quindi:
Devi eseguire l’UPDATE direttamente sulla tabella di origine (non sulla query) oppure costruire la stringa SQL includendo il valore filtrato del form.
Il filtro del Like con parametri da maschera
Nel comando SQL che hai scritto, le virgolette e le concatenazioni non sono corrette.
Access non interpreta correttamente " * " e l’uso di [Forms]![RicercaGeneraleM]![CopiaCasella] dentro la stringa SQL.
Il mio codice corretto si scrive cosi
Private Sub SelezionaTutti_Click()
Dim sql As String
Dim filtro As String
' Salva eventuali modifiche prima dell’aggiornamento
Me.Dirty = False
' Legge il valore della casella di ricerca
filtro = Nz(Me!CopiaCasella, "")
' Costruisce la stringa SQL completa
sql = "UPDATE qry_Ricerca_Generale " & _
"SET Selezione = True " & _
"WHERE SottocategoriaID LIKE '*" & filtro & "*';"
' Esegue l’aggiornamento
CurrentDb.Execute sql, dbFailOnError
' Aggiorna la maschera
Me.Requery
MsgBox "Tutti i record filtrati sono stati selezionati.", vbInformation
End Sub
Ti spiego cosa ho fatto in modo tale che puoi capire ma ti consiglio prima di procedere di studiare, di approfondire comunque
- Nz(Me!CopiaCasella, "") evita errori se la casella è vuota.
- Il filtro viene inserito nella query come testo puro, non come riferimento a form, perciò Access riesce a interpretarlo correttamente.
- dbFailOnError ti segnala eventuali errori SQL veri, invece di ignorarli.
- L’UPDATE viene fatto sulla stessa origine dati usata dalla maschera (qry_Ricerca_Generale), non su QryRicercaUnico, che è solo una query di visualizzazione.
Puoi fare per una comodità poi vedi te:
Se QryRicercaUnico ti serve per logica o join specifici, puoi creare una query salvata che includa solo i campi aggiornabili e usarla come base per l’UPDATE.
In caso contrario, Access continuerà a restituire errori perché non può scrivere su query non aggiornabili.
NB=
- L’errore 3061 dipende da parametri non riconosciuti nella query.
- L’errore 13 (“tipo non corrispondente”) deriva dalle virgolette e concatenazioni sbagliate.
- Riscrivendo la SQL come sopra, il codice funziona perfettamente.
Quindi ricapitolando il tuo errore che ti esce, ti esce perchè è l’errore di run-time “3061 – Parametri insufficienti. Previsto 1” appartiene proprio a Microsoft Access, e più precisamente al motore di esecuzione delle query (DAO/VBA).
Questo errore non viene da un bug del codice VBA in sé, ma dal tentativo di eseguire una query che contiene riferimenti non risolti, cioè campi o parametri che Access non riesce a trovare.
a te succede questo :
La istruzione VBA è:
CurrentDb.Execute "UPDATE QryRicercaUnico SET Selezione = True"
NB=
La query QryRicercaUnico però si basa su un’altra query (qry_Ricerca_Generale) che a sua volta contiene un riferimento a una maschera:
WHERE qry_Ricerca_Generale.SottocategoriaID Like "*" & [Forms]![RicercaGeneraleM]![CopiaCasella] & "*"
NB=
Quando Access esegue la query da VBA (CurrentDb.Execute), non ha accesso al contesto delle maschere aperte, quindi non trova il controllo [Forms]![RicercaGeneraleM]![CopiaCasella] ? e per questo genera l’errore “Parametri insufficienti”.
Quindi:::::::
NB=
L’errore Run-time 3061 – Parametri insufficienti. Previsto 1 è tipico di Access quando la query richiamata tramite VBA fa riferimento a oggetti o parametri non risolti, come controlli di maschera o campi mancanti.
Nel tuo caso, la query QryRicercaUnico dipende da qry_Ricerca_Generale, che filtra i record usando [Forms]![RicercaGeneraleM]![CopiaCasella].
Quando esegui CurrentDb.Execute, Access non è in grado di interpretare i riferimenti ai controlli del form.
Per risolvere puoi costruire la stringa SQL direttamente nel codice VBA, sostituendo il riferimento con il suo valore:
Dim filtro As String
filtro = Forms!RicercaGeneraleM!CopiaCasella
CurrentDb.Execute _
"UPDATE qry_Ricerca_Generale " & _
"SET Selezione = True " & _
"WHERE SottocategoriaID Like '*" & filtro & "*';"
Me.Requery
In questo modo il valore della casella viene letto prima dell’esecuzione della query e passato al database in modo esplicito.
Ti consiglio inoltre di usare la proprietà Me.Dirty = False solo se serve salvare le modifiche nella maschera corrente, non è obbligatoria per l’update.
Prova il codice quello di sopra che ti ho scritto e cerca di capire quello che ti ho scritto ciao