Row source da query in codice vba per access

di il
16 risposte

Row source da query in codice vba per access

Salve sono un vecchio programmatore che si cimenta con access per realizzare un data base per il suo lavoro.
premetto che questo è il primo forum al quale partecipo, per cui chiedo scusa se contravvengo a qualche regola.
vengo al problema.
ho scritto questo codice per popolare una list box denominata "Elenco38" da una tabella denominata "ARMI" con una stringa SQL, dove "CARCASSA" è una casella di testo dove inserisco un valore che la query deve trovare nel campo "MATRICOLA_CARCASSA" della tabella "ARMI":
Private Sub Comando23_Click()
Dim srtSQL As String

Me.Elenco38.RowSourceType = "Table/Query"
If IsNull(Me.CARCASSA) = True Then
   Me.Elenco38.RowSourceType = "Tabella / query"
   strSQL = "SELECT ARMI.ID, ARMI.[ID DETENTORE], ARMI.Arma, ARMI.Classificazione, ARMI.[Tipo Arma], ARMI.Calibro, ARMI.Marca, ARMI.Modello, ARMI.[Matr Carcassa], ARMI.[Nr Catalogo], ARMI.[Matr Canna], ARMI.[Acquisita Ceduta], ARMI.NOTE, ARMI.[Indirizzo Detenzione], ARMI.Provincia, ARMI.k FROM ARMI WHERE (((ARMI.[Matr Carcassa]) Like " & Me.CARCASSA & "*" & "));"
   Me.Elenco38.RowSource = SQL
   Me.Elenco38.Requery
End If
End Sub
il problema è che al netto di una moltitudine di correzioni e prove sulla grammatica della stringa SQL la listbox, pur non dando errore, non si popola-
grazie per l'aiuto

16 Risposte

  • Re: Row source da query in codice vba per access

    Scusate c'è un errore. SQL e strSQL ...ma l'ho corretto e putroppo il problema permane
  • Re: Row source da query in codice vba per access

    Ti faccio alcune considerazioni... poi vedi tu...

    1)Perchè lo fai da codice...? Tutto quello che hai scritto in realtà richiede solo 1 riga di codice... ovvero il Requery, definisci tutto nella modalità struttura della ListBox incluso il RowSource ed il Criterio dal Controllo di Form, quindi su modifica del criterio basta:
    Me.NomeListBox.Requery
    2) Sarà mai vero che ti servono tutti quei campi per popolare una ListBox...? non sarebbe meglio una SubForm a quel punto...?
    3) Che tipi di campo è ARMI.[Matr Carcassa], quello che genera il Criterio nella WHERE...? Se fosse "Testo" non ti pare manchino gli APICETTI..?

    4) Nel caso si dovesse fare da codice, il Requery non serve perchè l'assegnazione del RowSource di fatto ricarica la Query... non ti pare...?
    5) Tu scrivi 2 cose diverse, ma la 2°, quella che vince è ["Tabella / query"]... sei sicuro sia giusto...?
    Secondo me è "Table/Query" e non è proprio la stessa cosa...!

    6) Scrivi: IsNull(Me.CARCASSA)
    Che tipo di Campo è associato a questo controllo...? Se è testo, potrebbe valere NullString e la verifica fallirebbe... Null<>NullString

    Ora vedi tu quanti dei punti segnalati possono aiutarti.
  • Re: Row source da query in codice vba per access

    Ciao alex ti ringrazio.
    la necessità di eseguire la query da codice viene da due esigenze. la prima è quella di imparare a fare anche questo, visto che mi sto approcciando ad access, all'SQL, ed al VBA da poco. sono un diplomato nel '94 che poi non ha proseguito questa attività e che nella sua breve esperienza programmava in pascal.
    la seconda esigenza, pratica, nasce dal fatto che ho bisogno di "agganciare" la list box a più query, quindi avere una sorta di query dinamica. per cui manipolare la stringa SQL con degli if e poi assegnarla con rowsource alla list box.
    infatti vorrei avviare una ricerca che possa essere basata su un campo, su due o tre, a seconda se l'utente inserisce nel campo di ricerca un valore o lo lascia vuoto. quindi per esempio se inserisce, due valori, fare una query in base a due parametri, se ne inserisce tre, effettuare una query su tre criteri...
    per quanto riguarda i vari errori, di cui mi vergogno un po', ti posso dire che ho provato tutte le combinazioni possibili, perdendo veramente tanto tempo, togliendo e mettendo righe, corregendo la grammatica suggerita dal generatore di query, ma nulla.
    a parziale spiegazioni delle altre osservazioni da te sollevate, ti dirò che sono nella fase sperimentale, e quindi cerco di far funzionare le righe di codice, poi ripulisco il tutto e lo inserisco nel progetto.
    cmq se puoi ancora aiutarmi, ti volevo chiedere, ma basta inserire la stringa nella rowsource e automaticamnte la list box si aggiona?
  • Re: Row source da query in codice vba per access

    La risposta è SI se scrivi le cose giuste..., quindi se vuoi fare le cose, anche ai fini di studio, convierrebbe dare dei passi più piccoli..., ad esempio popola la ListBox con una Select Semplice senza Criteri... vedi se funziona e poi implementi 1 criterio...!

    La tua idea, è in linea di principio possibile, ma poco pratica e poco funzionale, mi spiego meglio...
    La ListBox è un oggetto definito DataBound, completamente programmabilem da quì il fatto sia possibile fare quasi tutto.
    Pensa però alle varianti a cui andresi incontro per fare quello che dici... ovvero al cambio di CAMPI di TIPO da gestire...
    Chiaramente il modo per fare le cose ben fatte c'è, si possono riconoscere i campi in automatico e popolare ad esempio una Combo con l'elenco dei Campi che popolano la ListBox e flessibilizzare in questo modo sia la selezione dei campi che dei criteri...
    Tutto tecnicamente bello, ma tutto tecnicmanete difficile e, inutile nell'insieme, ti accorgerai che queste tecniche non hanno un gran vantaggio...

    Mi permetto di esporti queste considerazioni in quanto, a parte lavorare con Access da 20 anni, per passione personale ho spinto molte mie realizzazioni nell'ottica della Flessibilità... quindi ho qualche sostanziale esperienza in questo approccio.

    Ti propongo, giusto perchè tu possa renderti conto delle possibilità, questo DEMO:
    "forum.masterdrive.it/access-79/maschera-filtri-86836/"
    Non è banale, anzi... si tratta di una Form(Custom) che si può applicare a qualsiasi Form/subForm per la gestione flessibile ed avanzata dei criteri di FILTRAZIONE dei dati.

    Questa form si AUTOCONFIGURA in relazione ai dati presenti nell'Oggetto chiamante, dentro trovi parti di codice interessanti... come studio.

    Prova questa:
    
    Private Sub Comando23_Click()
    Dim srtSQL As String
    Me.Elenco38.RowSourceType = "Table/Query"
       strSQL = "SELECT ARMI.ID, ARMI.[ID DETENTORE], ARMI.Arma FROM ARMI;"
       Me.Elenco38.ColumnCount= 3
       Me.Elenco38.ColumnWidths= "567;1134;1701"   ' 1cm;2cm;3cm il VBA lavora in TWIPS non [cm]   1cm=567Twips
       Me.Elenco38.RowSource = SQL
    End If
    End Sub
    Ti accorgerai che funziona...!
  • Re: Row source da query in codice vba per access

    Ti ringrazio Alex. Farò tesoro dei tuoi consigli, e sicuramente approfitterò della tua competenza e della tua cortesia.
  • Re: Row source da query in codice vba per access

    HO PROVATO LA TUA RUOTIN E FUNZIONA.
    HO APPORTATO UNA MODIFICA COME DI SEGUITO:
    
    Private Sub Comando23_Click()
    
    Dim srtSQL As String
       Prova = Me.CARCASSA   ' ASSEGNO ALLA VARIABILE "PROVA" IL VALORE DELLA CASELLA DI TESTO " CARCASSA" 
       Me.Elenco38.RowSourceType = "Table/Query"
       srtSQL = "SELECT ARMI.ID, ARMI.[ID DETENTORE], ARMI.Arma FROM ARMI WHERE ARMI.ID =" & Prova & ";"
       Me.Elenco38.ColumnCount = 3
       Me.Elenco38.ColumnWidths = "567;1134;1701"  ' 1cm;2cm;3cm il VBA lavora in TWIPS non [cm]   1cm=567Twips
       Me.Elenco38.RowSource = srtSQL
    
    End Sub
    E QUESTA FUNZIONA PERFETTAMENTE.
    MA NON APPENA EFFETTUO LA RICERCA DEI RECORD SU UN CAMPO STRINGA, MI SI APRE UNA FINESTRA DI DIALOGO CHE MI CHIEDE DI IMMETTERE UN PARAMETRO CHE CHIAMA COME IL VALORE CHE IO HO IMMESSO IN ME.CARCASSA ED HO ASSEGNATO ALLA VARIABILE PROVA...??????
    MANNACCIA MANNACCIA
  • Re: Row source da query in codice vba per access

    ECCO CON QUESTA HO PROBLEMI PERCHE' IL CAMPO ARMI.Armi E' UNA STRINGA:
    Private Sub Comando23_Click()
    Dim srtSQL As String
    DIM Prova as String
    Prova = Me.CARCASSA
    
    Me.Elenco38.RowSourceType = "Table/Query"
       srtSQL = "SELECT ARMI.ID, ARMI.[ID DETENTORE], ARMI.Arma FROM ARMI WHERE ARMI.Arma =" & Prova & ";"
       Me.Elenco38.ColumnCount = 3
       Me.Elenco38.ColumnWidths = "567;1134;1701"  ' 1cm;2cm;3cm il VBA lavora in TWIPS non [cm]   1cm=567Twips
       Me.Elenco38.RowSource = srtSQL
    
    End Sub
    HO PROVATO ARCAICAMENTE SIA CON "=" CHE CON "like" NELLA STRINGA sql, MA IL RISULTATO è IL MEDESIMO.....
    HO CERCATO SUL WEB E PROVATO TUTTI I TITPI DI SEPARATORI E DI GRAMMATICHE...MA NULLA---
  • Re: Row source da query in codice vba per access

    Non scrivere in Maiuscolo non è educato... equivale a strillare... non è ben visto.

    IRONMAN ha scritto:


    HO PROVATO LA TUA RUOTIN E FUNZIONA.
    HO APPORTATO UNA MODIFICA COME DI SEGUITO:
    
    Private Sub Comando23_Click()
    
    Dim srtSQL As String
       Prova = Me.CARCASSA   ' ASSEGNO ALLA VARIABILE "PROVA" IL VALORE DELLA CASELLA DI TESTO " CARCASSA" 
       Me.Elenco38.RowSourceType = "Table/Query"
       srtSQL = "SELECT ARMI.ID, ARMI.[ID DETENTORE], ARMI.Arma FROM ARMI WHERE ARMI.ID =" & Prova & ";"
       Me.Elenco38.ColumnCount = 3
       Me.Elenco38.ColumnWidths = "567;1134;1701"  ' 1cm;2cm;3cm il VBA lavora in TWIPS non [cm]   1cm=567Twips
       Me.Elenco38.RowSource = srtSQL
    
    End Sub
    E QUESTA FUNZIONA PERFETTAMENTE.
    MA NON APPENA EFFETTUO LA RICERCA DEI RECORD SU UN CAMPO STRINGA, MI SI APRE UNA FINESTRA DI DIALOGO CHE MI CHIEDE DI IMMETTERE UN PARAMETRO CHE CHIAMA COME IL VALORE CHE IO HO IMMESSO IN ME.CARCASSA ED HO ASSEGNATO ALLA VARIABILE PROVA...??????
    MANNACCIA MANNACCIA
    Questo codice funziona se fai la ricerca sul campo Numerico definito dalla WHERE che è [ARMI.ID] se metti del testo ti insulta... giustamente.

    IRONMAN ha scritto:


    ECCO CON QUESTA HO PROBLEMI PERCHE' IL CAMPO ARMI.Armi E' UNA STRINGA:
    Private Sub Comando23_Click()
    Dim srtSQL As String
    DIM Prova as String
    Prova = Me.CARCASSA
    
    Me.Elenco38.RowSourceType = "Table/Query"
       srtSQL = "SELECT ARMI.ID, ARMI.[ID DETENTORE], ARMI.Arma FROM ARMI WHERE ARMI.Arma =" & Prova & ";"
       Me.Elenco38.ColumnCount = 3
       Me.Elenco38.ColumnWidths = "567;1134;1701"  ' 1cm;2cm;3cm il VBA lavora in TWIPS non [cm]   1cm=567Twips
       Me.Elenco38.RowSource = srtSQL
    
    End Sub
    HO PROVATO ARCAICAMENTE SIA CON "=" CHE CON "like" NELLA STRINGA sql, MA IL RISULTATO è IL MEDESIMO.....
    HO CERCATO SUL WEB E PROVATO TUTTI I TITPI DI SEPARATORI E DI GRAMMATICHE...MA NULLA---
    Intanto [=] si usa per Testi e Numeri
    [Like] solo per Testi... ma solo se la ricerca include un carattere Jolly... [*] prima o dopo a seconda di cosa e come si vuole cercare...

    POi, quello che accade è ovvio, i campi si distinguno in 3 Tipi:
    1) Numeri(questi hanno delle particolarità di sintassi se si usa la Virgola come separatore dei decimali e va gestito..)
    2) Testo (questi hanno delle particolarità se si ha del testo con Accenti ed Apostrofi e va gestito)
    3) Date
    Queste 3 tipologie richiedono 3 sintassi differenti... che serve conoscere, e che trovi in qualsiasi libro di VBA di base.

    Tuttavia ti suggerisco di cercare nella Guida in Linea il Metodo [BuildCriteria] che può fare gran parte del lavoro per te... anche se prima è meglio tu conosca le regole...!
  • Re: Row source da query in codice vba per access

    Ciao alex grazie ancora. odio chi urla. in ogni caso non vorrei abusare della tua cortesia, ma non potresti dirmi come impostare la stringa sql per il testo?
    grazie
  • Re: Row source da query in codice vba per access

    Con una variabile esterna dichiarata in vba intendo
  • Re: Row source da query in codice vba per access

    IRONMAN ha scritto:


    Con una variabile esterna dichiarata in vba intendo
    NOn credi sia meglio leggere queste specificità studiandole come ti ho detto su qualsiasi libro di base...?

    Il primo Link che ho trovato ad esempio spiega queste cose, esattamente per i 3 Casi che ti ho esposto, credo siano ricerche che puoi riuscire a fare in piena autonomia:
    https://codekabinett.com/rdumps.php?Lang=2&targetDoc=vba-sql-string-tutorial

    In tutti i modi:
    
    Me.Elenco38.RowSourceType = "Table/Query"
       srtSQL = "SELECT ARMI.ID, ARMI.[ID DETENTORE], ARMI.Arma FROM ARMI WHERE ARMI.Arma ='" & Prova & "';"
       Me.Elenco38.ColumnCount = 3
       Me.Elenco38.ColumnWidths = "567;1134;1701"  ' 1cm;2cm;3cm il VBA lavora in TWIPS non [cm]   1cm=567Twips
       Me.Elenco38.RowSource = srtSQL
    End Sub
  • Re: Row source da query in codice vba per access

    Ciao alex. ho risolto cercando un po' sul web.
    ecco la sintassi con cui mi funziona.
     srtSQL = "SELECT ARMI.ID, ARMI.Arma, ARMI.[Tipo Arma], ARMI.Calibro, ARMI.Marca, ARMI.Modello, ARMI.[Matr Carcassa], ARMI.[Matr Canna] FROM ARMI WHERE ARMI.[Matr Carcassa] Like'" & PROVA & "*" & "';"
    grazie cmq
  • Re: Row source da query in codice vba per access

    Salve.
    Ho trovato questa discussione grazie alla quale ho potuto risolvere quasi completamente un mio problema, credo più semplice di quello qui esposto.
    Ho una listbox popolata con i dati di una query, e fin qui tutto ok.
    Vorrei che l'utente potesse ordinarla secondo parametri diversi in base alla sua esigenza: in base a un paio di campi testo (Nominativo, Descrizione Ente) o a un campo Data.
    Il problema è che, mentre gli ordinamenti per i campi testo funzionano alla perfezione, quello in base al campo Data no.
    Cioè: quando attivo l'evento che dovrebbe ordinare la query il programma mi chiede l'immissione del parametro Data, anche se in realtà la query viene ugualmente eseguita anche se do l'ok senza inserire nessun valore (anche se il risultato non mi convince granché).
    Grazie per qualunque indicazione e consiglio
  • Re: Row source da query in codice vba per access

    Direi cheil 3D è molto datato e serve che tu ne apra uno dedicato, li spiega bene la tua problematica magari fornendo il codice o la Query che usi e come la usi.
Devi accedere o registrarti per scrivere nel forum
16 risposte