Condividi tramite

Passare parametro a query da VBA

Anonimo
2023-03-18T15:27:20+00:00

Buon pomeriggio a tutti,

avrei bisogno di eseguire una query da vba, ma avendo il problema che il comando

Set rstObj = CurrentDb.OpenRecordset(strSQL) non riceve i parametri da una query esterna al codice, non riesco a proseguire.

Provo ad andare con ordine sapendo però che dovrò essere un po lungo:

Ho queste tre query esterne al modulo VBA che funzionano alla grande:

Query OpuscoloSelezionato

SELECT tblProdotti.ID, tblPagine.ID, tblOpuscoli.ID, tblListaProd.ID, tblProdotti.CodiceProd, tblListaProd.Categoria, tblOpuscoli.OpuscoloN°, tblOpuscoli.TitoloVolantino, tblOpuscoli.VolantinoDa, tblOpuscoli.VolantinoA, tblPagine.NumeroPagina, tblPagine.NumeroMaxProd, tblPagine.PagDelGrMer, tblProdotti.CodiceEan, tblProdotti.Marca, tblProdotti.ProdottoFROM (tblOpuscoli INNER JOIN tblPagine ON tblOpuscoli.ID = tblPagine.IdVolantino) INNER JOIN (tblListaProd RIGHT JOIN tblProdotti ON tblListaProd.CodiceProd = tblProdotti.CodiceProd) ON tblPagine.ID = tblProdotti.IdPaginaWHERE (((tblOpuscoli.OpuscoloN°)=[forms]![frmOpuscoli].[txtOpuscoloN°]));Query CategorieSELECT tblListaProd.Categoria, tblListaProd.DescrizioneCategorieFROM tblListaProdGROUP BY tblListaProd.Categoria, tblListaProd.DescrizioneCategorie;

come potrete notare la prima ha come parametro il numero opuscolo selezionato che viene pescato da una maschera aperta. Adesso ho la necessità di sapere tra la lista di prodotti inseriti in quell'opuscolo quale categoria manca e se lo faccio con una query esterna al modulo tipo questa sotto tutto funziona correttamente.

Query CategorieMancanti

SELECT qryCategorie.Categoria AS CategorieNONinserite, qryCategorie.DescrizioneCategorieFROM qryOpuscoloSelezionato RIGHT JOIN qryCategorie ON qryOpuscoloSelezionato.Categoria = qryCategorie.CategoriaGROUP BY qryCategorie.Categoria, qryCategorie.DescrizioneCategorie, qryOpuscoloSelezionato.CategoriaHAVING (((qryOpuscoloSelezionato.Categoria) Is Null));


ADESSO IL PROBLEMA

Dim strSQL As StringDim DB As DAO.DatabaseDim rstObj As DAO.RecordsetSet DB = CurrentDb

strSQL = "SELECT qryCategorie.Categoria, qryCategorie.DescrizioneCategorie"strSQL = strSQL & " FROM qryOpuscoloSelezionato RIGHT JOIN qryCategorie ON qryOpuscoloSelezionato.Categoria = qryCategorie.Categoria"strSQL = strSQL & " GROUP BY qryCategorie.Categoria, qryCategorie.DescrizioneCategorie, qryOpuscoloSelezionato.Categoria"strSQL = strSQL & " HAVING (((qryOpuscoloSelezionato.Categoria) Is Null))"Set rstObj = CurrentDb.OpenRecordset(strSQL)DoCmd.OpenForm "frmListaCatMancanti"Forms!frmListaCatMancanti!Elenco4.RowSource = strSQLrstObj.CloseDB.CloseSet rstObj = NothingSet DB = Nothing


Ho riprodotto la stessa query CategorieMancanti nel modulo VBA ma mi da l'errore "Errore di RUN-TIME 3061" Parametri insufficienti. Previsto 1"

In pratica non riconosce il parametro : WHERE (((tblOpuscoli.OpuscoloN°)=[forms]![frmOpuscoli].[txtOpuscoloN°]))

Se tolgo il parametro dalla query il messaggio non compare e il codice prosegue senza problemi.

Come poso fare per passare questo parametro?

So che sarebbe possibile anche passarlo internamente alla routine ed ho fatto mille tentativi senza esito positivo. Potreste indirizzarmi alla soluzione?

Grazie Michele

Microsoft 365 e Office | Access | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

5 risposte

Ordina per: Più utili
  1. Anonimo
    2023-03-20T13:52:55+00:00

    Ringrazio tutti,

    ma mi sono arreso :-( alla mia poca conoscenza del VBA ed SQL! Ho risolto il problema interrogando una query esterna al codice che funziona come deve.

    Ancora grazie a tutti per il vostro tempo

    Michele

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2023-03-20T12:04:10+00:00

    Il problema con il messaggio di errore ricevuto potrebbe essere dovuto alle clausole GROUP BY e HAVING nell'istruzione SQL. Prova a rimuovere la clausola HAVING e verifica se l'errore persiste. È inoltre possibile provare a modificare l'istruzione SQL per utilizzare una sottoquery che include il parametro e quindi unirlo alle altre tabelle, anziché utilizzare un parametro direttamente nell'istruzione SQL. Ciò potrebbe aiutare a evitare problemi con le clausole GROUP BY e HAVE.

    Di seguito sono riportati alcuni errori comuni correlati a queste clausole che possono causare errori di runtime:

    1. Dimenticare di includere tutte le colonne non aggregate in GROUP BY: Se una colonna è selezionata in SELECT ma non inclusa in GROUP BY o in una funzione di aggregazione, verrà generato un errore di runtime.
    2. Utilizzo di WHERE invece di AVERE: la clausola WHERE filtra le righe prima del raggruppamento mentre HAVING filtra i gruppi dopo il raggruppamento. Se una funzione di aggregazione viene utilizzata senza una clausola GROUP BY o se una colonna non aggregata viene utilizzata con HAVING anziché GROUP BY, può verificarsi un errore di runtime.
    3. Utilizzo di alias anziché di nomi di colonna: se vengono utilizzati alias anziché nomi di colonna nelle clausole GROUP BY o HAVE, può verificarsi un errore di runtime.

    Se hai altre domande o hai bisogno di assistenza con qualsiasi cosa, non esitare a farmelo sapere. Sarà mio piacere assistervi.

    Migliori saluti Sneha

    Questa risposta è stata tradotta automaticamente. Di conseguenza, potrebbero esserci errori grammaticali o espressioni strane.

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2023-03-20T07:16:28+00:00

    Forse se posti il file è più semplice aiutarti, potendo vedere realmente che cosa accade.

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2023-03-20T05:54:38+00:00

    Buongiorno Sneha,

    voglio ringraziarti per aver risposto e per il tuo tempo.

    Anche con il tuo suggerimento non riesco a far partire la query, avevo già provato questo metodo ma ottengo sempre un errore diverso.

    Con il tuo codice l'errore è:

    "Errore di run-time 3122: La query non include l'espressione "qryOpuscoloSelezionato.Categoria IsNull And tblOpuscoli.OpuscoloN°=forms!frmOpuscoli!txtOpuscoloN°"

    specificata come parte di una funzione di aggregazione.

    Nella clausola HAVING ho provato anche a selezionare la query invece della tabella in questo modo :

    "qryOpuscoloSelezionato.Categoria IsNull And qryOpuscoloSelezionato.OpuscoloN°=forms!frmOpuscoli!txtOpuscoloN°"

    ma l'errore è sempre lo stesso.

    Durante il debug il codice si ferma sull'istruzione di assegnazione parametri:

    qdfObj.Parameters("Forms!frmOpuscoli!txtOpuscoloN°") = Forms!frmOpuscoli!txtOpuscoloN°

    Ringraziandoti ancora ti saluto

    Michele.

    La risposta è stata utile?

    0 commenti Nessun commento
  5. Anonimo
    2023-03-18T17:57:06+00:00

    Ciao

    Sono Sneha e sarei felice di aiutarti con la tua domanda. Ci scusiamo per l'inconveniente causato.

    Per passare il parametro dal codice VBA alla query, è possibile utilizzare l'oggetto QueryDef in DAO. Ecco un esempio di come è possibile modificare il codice per passare il parametro:

    Dim strSQL come stringa Dim DB come DAO. Banca dati Dim rstObj As DAO. Set di record Dim qdfObj As DAO. Metodo QueryDef

    Imposta DB = CurrentDb

    Create a QueryDef object and set its SQL and parameter values Impostare qdfObj = DB. CreateQueryDef("") qdfObj.SQL = "SELECT qryCategories.Category, qryCategories.CategoriesDescription " & _ "FROM qryBrochureSelected RIGHT JOIN qryCategories ON qryBrochureSelected.Category = qryCategories.Category " & _ "RAGGRUPPA PER qryCategories.Category, qryCategories.CategoriesDescription, qryBrochureSelected.Category " & _ "HAVING (((qryBrochureSelected.Category) è null) AND ((tblOpuscoli.OpuscoloN°)= [Forms]![ frmOpuscoli]! [txtBrochureN°]))" qdfObj.Parameters("Forms!frmOpuscoli!txtBrochureN°") = Forms!frmOpuscoli!txtBrochureN°

    Open the recordset using the QueryDef object Set rstObj = qdfObj.OpenRecordset()

    Use the recordset to populate the form's list box DoCmd.OpenForm "frmListaCatMissing" Moduli!frmListaCatMissing! List4.RowSource = rstObj.Source Moduli!frmListaCatMissing! List4.Requery

    Clean up objects rstObj.Close Set rstObj = Niente Set qdfObj = Nothing .DB. Chiudere Imposta DB = Niente

    In questo codice viene creato un oggetto QueryDef e la relativa istruzione SQL viene impostata sulla query che si desidera eseguire. Il valore del parametro viene quindi impostato utilizzando l'insieme Parameters dell'oggetto QueryDef. Infine, il metodo OpenRecordset dell'oggetto QueryDef viene utilizzato per aprire un recordset, che viene quindi utilizzato per popolare la casella di riepilogo del modulo. Si noti che l'istruzione SQL nell'oggetto QueryDef include il parametro, impostato utilizzando l'insieme Parameters.

    Se hai altre domande o hai bisogno di assistenza con qualsiasi cosa, non esitare a farmelo sapere. Sarà mio piacere assistervi.

    Migliori saluti Sneha

    Questa risposta è stata tradotta automaticamente. Di conseguenza, potrebbero esserci errori grammaticali o espressioni strane.

    La risposta è stata utile?

    0 commenti Nessun commento