Risolto. query parametrica con uso di variabili

di il
14 risposte

Risolto. query parametrica con uso di variabili

Buongiorno a tutti. Ho un problema che non riesco a superare nonostante le molte ore impiegate in ricerche su svariati forum e in molte prove.
Ho il seguente codice vba:

Option Compare Database

'------------------------------------------------------------
' pippo
'
'------------------------------------------------------------
Function pippo()
On Error GoTo pippo_Err
         
Dim qd As QueryDef
Dim strQryName As String
Dim strSQLTest As String
strQryName = "test"
Dim TQuery As QueryDef
For Each TQuery In CurrentDb.QueryDefs
If TQuery.Name = "Test" Then CurrentDb.QueryDefs.Delete ("Test")
Next
DoCmd.SetWarnings False
Dim dba As DAO.Database
Dim tabella As DAO.Recordset
Set dba = CurrentDb
Dim id As Variant
Set tabella = dba.OpenRecordset("tbl_tmp_gestione_prodotto", dbOpenDynaset)
id = tabella.Fields("codice_interno")
strSQLTest = "SELECT * FROM tbl_gestione_prodotto WHERE [codice interno] = id"
Set qd = CurrentDb.CreateQueryDef(strQryName, strSQLTest)
DoCmd.OpenQuery (strQryName), acViewNormal, acEdit

pippo_Exit:
    Exit Function

pippo_Err:
    MsgBox Error$
    Resume pippo_Exit

End Function
quando lo eseguo il codice mi presenta una finestra di dialogo chiedendomi di inderire il valore id.
quello che voglio ottenere è che la query lavori usando come parametro per la clausola WHERE la variabile id come valore.

grazie.

14 Risposte

  • Re: Risolto. query parametrica con uso di variabili

    Ci sono molte cose da correggere nel tuo codice...
    Per cancellare una Query non si cilca tutta la collection sperando di trovarla...! E' una terribile perdita di tempo inutile.
    Si cancella a prescindere e se non c'è, verrà generato un errore XXXX che gestirai con un Resume Next.
    Poi una volta creata la Query esiste il metodo EXECUTE sull'oggetto QueryDef... senza dover usare OpenQuery...!

    Nello specifico commetti un errore nella costruzione del predicato SQL che avresti facilmente individuato facendo DEBUG sulla stringa...!
    
    strSQLTest = "SELECT * FROM tbl_gestione_prodotto WHERE [codice interno] = " & id
  • Re: Risolto. query parametrica con uso di variabili

    Grazie per il suggerimento. Il debug lo faccio dal visual basic editor e non mi dava errori.
    Ora mi si presenta il problema che all'esecuzione del codice mi torna : "tipi di dati non corrispondenti nell'espressione criterio".
    il valore che assume la variabile id è un numero di 7 cifre che in questo caso è 0020044 ma quando apro la query creata il dato che leggo è 20044
    Ho cambiato la riga
    Dim id As Variant
    con
    Dim id As String
    ma il risultato non cambia.
  • Re: Risolto. query parametrica con uso di variabili

    Secondo me devi decidere "corerentemente" il tipo dati del campo [codice esterno]. Mi pare di capire che è di tipo Numerico, quindi direi Long, ma tu lo gestisci digitando anche gli "zeri" iniziali che per un campo Numerico non servono. Per questo motivo la query legge 20044.
    Se invece preferisci avere anche gli zeri iniziali, devi modificare il tipo dati del campo in "testo breve"...di conseguenza
    Dim id As String

    andrebbe bene.
    Spero di non aver sbagliato...altrimenti @Alex rettificherà al meglio.
  • Re: Risolto. query parametrica con uso di variabili

    Grazie per la risposta, ma il valore del campo per [codice interno] è di tipo testo.
  • Re: Risolto. query parametrica con uso di variabili

    Non è che nella query hai fatto una conversione di tipo dati? Se 0020044 è di tipo Testo, è impossibile che la query mostri 20044, se non viene manipolato in numerico.
  • Re: Risolto. query parametrica con uso di variabili

    ash_79 ha scritto:


    Grazie per la risposta, ma il valore del campo per [codice interno] è di tipo testo.
    Forse sarebbe meglio che tu studiassi un po' le regole basi del linguaggio SQL.
    Suggerisco: in particolare riguardo alla formattazione di stringhe e date...
  • Re: Risolto. query parametrica con uso di variabili

    Se facessi debug avresti visto che nella stringa SQL non veniva valorizzata la variabile ID in quanto come l'avevi scritta tu era una costante di testo in una stringa...
    Detto questo se è un campo di tipo testo servono gli apicetti delimitatori per formattare il valore.
    Se invece fosse data.... perché il dubbio viene se parli di inversioni.... Usa la formattazione delle date.
  • Re: Risolto. query parametrica con uso di variabili

    Dai un'occhiata qui
    http://www.fontstuff.com/access/acctut15.ht
    in particolare al paragrafo "Working with Variables".
  • Re: Risolto. query parametrica con uso di variabili

    Grazie per i suggerimenti.
    Nella guida proposta da OsvaldoLaviosa ho trovato la soluzione al problema (dopo gli accorgimenti fatti in base all'aiuto di @Alex).
    Il codice funzionante risulta:
    
    strSQLTest = "SELECT * FROM tbl_gestione_prodotto WHERE [codice interno] = ' " & id & " ' ; "
    
    Grazie a tutti per l'aiuto.
    P.s.
    @Alex mi potresti gentilmente spiegare cosa si può migliorare nel resto del codice?
    "Ci sono molte cose da correggere nel tuo codice..."
    Grazie.
  • Re: Risolto. query parametrica con uso di variabili

    ash_79 ha scritto:


    ....
    @Alex mi potresti gentilmente spiegare cosa si può migliorare nel resto del codice?
    "Ci sono molte cose da correggere nel tuo codice..."
    Grazie.
    Cosa non ti è chiaro delle 2 indicazioni che ho inserito come premessa...?
  • Re: Risolto. query parametrica con uso di variabili

    1 la variabile risolta ==> ok
    2 non usare un ciclo per cancellare la query ==> ok

    Nella tua frase dici : "Ci sono molte cose da correggere nel tuo codice..."


    Quindi volevo sapere se oltre a queste ce ne sono altre, in quanto la parola "molte" mi fa pensare a più di 2 problemi.
    Grazie.
  • Re: Risolto. query parametrica con uso di variabili

    A parte che mi parevano già molte.... mi pare manchi un pezzo... che dici...?
    Parlavo di usare il metodo Execute... lo hai letto...?

    Dichiari DAO.Database ma della QueryDef non fai riferimento alla LIB... usa un po di coerenza anche nelle dichiarazioni.
  • Re: Risolto. query parametrica con uso di variabili

    @Alex ha scritto:


    Parlavo di usare il metodo Execute... lo hai letto...?
    Prova a leggere qui
    http://www.utteraccess.com/wiki/index.php/RunSQL_vs_Execute
    dove ti fa capire che le "query di comando" possono essere dichiarate ed eseguite direttamente in VBA...senza usare DoCmd.OpenQuery...penso che Alex si riferisce a questo. Nel link parla del fatto che si può ottenere sia con DoCmd.RunSQL, sia con Execute. Execute è ritenuto più diretto e meno rognoso riguardo l'aspetto dei Warnings...

    @Alex ha scritto:


    Dichiari DAO.Database ma della QueryDef non fai riferimento alla LIB... usa un po di coerenza anche nelle dichiarazioni.
    Anch'io avrei notato questa incorerenza. Se dichiari
    Dim dba As DAO.Database
    e poi
    Set dba = CurrentDb
    da questo momento in poi sfrutta sempre dba (che già incorpora in sè CurrentDB), altrimenti hai sprecato un paio di istruzioni inutilmente.

    Spero di aver interpretato bene il pensiero/intenzione di @Alex.
  • Re: Risolto. query parametrica con uso di variabili

    Scusate, ho avuto modo solo ora di vedere le vostre risposte.
    Grazie mille per l'aiuto.
Devi accedere o registrarti per scrivere nel forum
14 risposte