Combo Box parametrizzata tramite query

di il
22 risposte

Combo Box parametrizzata tramite query

Buongiorno,

non riesco a scrivere la sintassi corretta nella cella criterio di una query di selezione dedicata a una combo box.

Cosa sto facendo:

Sto costruendo una maschera di nome OSD_ITEM_LIST che è legata alla tabella OSD_ITEM_LIST.

Nella maschera OSD_ITEM_LIST ho inserito una casella di testo come sotto al punto 1 ed una combo box come sotto al punto 2:

1) una casella di testo legata al primo campo della tabella OSD_ITEM_LIST. Tale campo ha come nome di sorgente [OSD NO] e nome elemento nella maschera OSD_NO. Campo di tipo testo breve.

2) una Combo Box a cui ho dato il nome elemento nella maschera OSD_LineItem_sub_CMB.
Questa Combo Box è legata ad una seconda tabella di nome OSD_TMMR che ha come chiave primaria un campo di tipo testo breve di nome sorgente [OSDLineItem_sub]. 

Quello che vorrei fare è:

Durante la compilazione della maschera, una volta inserito il dato nella casella di testo OSD_NO vorrei che la Combo Box mi offrisse valori filtrati con la funzione Like.

Ovvero mi proponesse solo valori che contengano nel campo OSDLineItem_sub il valore OSD_NO.

Per fare questo ho pensato di editare la query di selezione legata alla Combo Box (Proprieta -> Row Source-> ... Edito la query in visualizzazione Struttura) ed inserisco il seguente codice in corrispondenza della riga Criterio:

Like "* & [Forms]![OSD_ITEM_LIST]![OSD NO] &*"

Ma non funziona.

Ho riprovato cambiando la sintassi in qualche modo ma senza risultato. Inoltre non so se devo richiamare il nome dell'elemento in maschera o il nome della sorgente..

Ringrazio in anticipo per qualche suggerimento

francesco

22 Risposte

  • Re: Combo Box parametrizzata tramite query

    Occhio alle virgolette

    "*" & .... & "*"

  • Re: Combo Box parametrizzata tramite query

    21/04/2025 - oregon ha scritto:

    Occhio alle virgolette

    "*" & .... & "*"

    Probabilmente anche gli apici all'esterno 

    "'*" & .... & "*'"

    se il campo è testo, come mi pare di aver capito, ma forse ho frainteso il giro relazioni...

  • Re: Combo Box parametrizzata tramite query

    Se avessi provato avresti visto che degli apici, in questo caso, non c'è necessità.

    È corretto il suggerimento di Oregon, ovvero

    Like "*" & [Forms]![OSD_ITEM_LIST]![OSD NO] & "*"
  • Re: Combo Box parametrizzata tramite query

    21/04/2025 - Stifone ha scritto:

    Se avessi provato avresti visto che degli apici, in questo caso, non c'è necessità.

    È corretto il suggerimento di Oregon, ovvero

    Like "*" & [Forms]![OSD_ITEM_LIST]![OSD NO] & "*"

    Premesso che non ho capito a chi ti riferivi... e magari alcune volte il "quote" serve..!

    Io farei un distinguo in realtà, in quanto si tratta proprio di campo Testo da come riporto sotto...

    Normalmente i criteri di tipo Testo richiedono gli Apicetti in una normale sintassi SQL, a meno di usare i Parameter per passare il criterio o, per quanto mi pare tu abbia ipotizzato, quando si lascia a JET la completa risoluzione implicita del criterio.

    Se componi il predicato SQL così:

    Dim sCriterio As String
    sCriterio="SELECT * FROM T1 WHERE TuoCampo Like *" & [Forms]![OSD_ITEM_LIST]![OSD NO] & "*"
    Me!NomeList.RowSource=sCriterio

    Ovviamente non funziona perchè il campo Testo richiede l'apicetto.... mentre dovrebbe essere come sotto:

    Dim sCriterio As String
    sCriterio="SELECT * FROM T1 WHERE TuoCampo Like '*" & [Forms]![OSD_ITEM_LIST]![OSD NO] & "*'"
    Me!NomeList.RowSource=sCriterio

    Se il predicato lo metti in QBE da quanto dici tu non si mette, ma non sono così certo non avendolo provato, ma non perchè non serve ma solo perchè JET lo mette al tuo posto quando risolve il predicato, e solo perchè quel predicato deve essere risolto in quel modo... cosa peraltro da non incentivare... per una serie di ragioni che sappiamo.

    21/04/2025 - fcaliandro ha scritto:

    .....

    1) una casella di testo legata al primo campo della tabella OSD_ITEM_LIST. Tale campo ha come nome di sorgente [OSD NO] e nome elemento nella maschera OSD_NO. Campo di tipo testo breve.

    Saluti.

  • Re: Combo Box parametrizzata tramite query

    Buongiorno,

    vi ringrazio per i suggerimenti di sopra.

    per la combo box parametrizzata con query ho un aggiornamento: ho adottato un filtro senza like con il WHERE di sotto nel codice. Questo codice è quello associato alla combo box inserita nella maschera OSD_ITEM_LIST

    SELECT OSD_OPEN_Table.OSD_Index, OSD_OPEN_Table.OSD_NO_CAL, OSD_OPEN_Table.[TAG NUMBER], OSD_OPEN_Table.[IDENT CODE/TAG NO DESC], OSD_OPEN_Table.[COMMENT(EXPEDITING)], OSD_OPEN_Table.[DEL QTY] FROM OSD_OPEN_Table WHERE (((OSD_OPEN_Table.OSD_NO_CAL)=[Forms]![OSD_ITEM_LIST]![OSD NO])) ORDER BY OSD_OPEN_Table.OSD_Index; 

    Questa combo box funziona correttamente finché lavoro sulla maschera OSD_ITEM_LIST.

    Ma ahimè non funziona nella maschera OSD_REGISTER che è una maschera principale che contiene come sotto-maschera la maschera OSD_ITEM_LIST.

    Si può creare un codice che funziona in entrambi i casi? Cioè su maschera principale o su sotto-maschera indifferentemente?

    Non ho provato ma forse qualcosa del genere potrebbe funzionare?

    WHERE (((OSD_OPEN_Table.OSD_NO_CAL)=[Forms]![Me]![OSD NO])) 

    Grazie

    Francesco

  • Re: Combo Box parametrizzata tramite query

    Ciao,

    Domanda : l' [OSD NO] dove si trova nel caso in cui la Form viene utilizzata come Form a se stante oppure come SubForm ?

    Presumo che si trovi nella Form della ComboBox... se ho capito bene  ;-(

  • Re: Combo Box parametrizzata tramite query

    Poniamo che [OSD NO]  si trovi nella [OSD_ITEM_LIST]

    Scrivere in un Modulo di Codice questa Public Function MyGetOSD_NO() :

    • La function restituisce un valore di tipo Variant (verifica se è corretto nel tuo scenario)
    • La function controlla se :
      • viene aperta la Form come SubForm : viene ricavato il valore OSD_NO con il riferimento alla SubForm
      • viene aperta Direttamente la Form : viene ricavato il valore OSD_NO con il riferimento alla Form
    • La function restituisce Null se viene richiamata quando nessuna delle Form sono aperte (vedere il controllo If con IsLoaded)
    • La function "deve funzionà"  ;-)   (controllare se ho riportato i nomi in modo corretto)
    ' GET VALUE OSD_NO
    Public Function MyGetOSD_NO() As Variant
        On Error GoTo noValue
    
        ' With SubForm
        If CurrentProject.AllForms("OSD_REGISTER").IsLoaded Then
            MyGetOSD_NO = Forms!OSD_REGISTER!OSD_ITEM_LIST.Form!OSD_NO
            Exit Function
        End If
    
        ' Only Form
        If CurrentProject.AllForms("OSD_ITEM_LIST").IsLoaded Then
            MyGetOSD_NO = Forms!OSD_ITEM_LIST!OSD_NO
            Exit Function
        End If
    
    noValue:
        MyGetOSD_NO = Null
    End Function

    :
    Adesso nella Select si imposta il richiamoo della Function nella Where Condition
    Con questo metodo non sarà necessario racchiudere tra Apicini o altro... 
    ci pensa MsAccess a risolvere automaticamente, trattando il confronto, secondo il Tipo di Dati

    WHERE OSD_OPEN_Table.OSD_NO_CAL = MyGetOSD_NO()

    .
    Penso che si volesse ottenere una cosa di questo tipo:  (in questo esempio vengono filtrati i Personaggi sulla base della Città di appartenenza)


    Apertura come Form 

    Apertura della Form come SubForm


    Verifica e ... prova a provare ;-))    secondo me funziona la Function... e non avrai nessun problema se apri la Form come SubForm oppure no.

    Io farei in questo modo... a mio avviso risulta molto semplice e veloce.

  • Re: Combo Box parametrizzata tramite query

    Franco Grazie!

    Ho aggiunto un modulo nuovo con la public function che mi hai suggerito e funziona quasi perfettamente.

    Manca un ritocco perchè il valore [OSD NO] non si aggiorna quando mi sposto da un record all'altro all'interno della maschera o sottomaschera.

    Non ho trovato una soluzione migliore di inserire un "evento su click" sulla casella di testo [OSD NO] con il seguente codice:

    OSD_LineItem_sub_CMB è la combo box in questione.

    Però è scomodo dover cliccare sempre sulla casella di testo ogni volta..

    Private Sub OSD_NO_CMB_Click()
    Me.OSD_LineItem_sub_CMB.Requery
    End Sub
  • Re: Combo Box parametrizzata tramite query

    16/05/2025 - fcaliandro ha scritto:

    Ho aggiunto un modulo nuovo con la public function che mi hai suggerito e funziona quasi perfettamente.

    e no !   frenaaaa !   Funziona "Perfettamente"  !   ;-) 
    A parte gli scherzi, la function funziona bene e, come già detto, risolve anche qualche problemino di sintassi.
    Perchè e quando creare e  usare delle proprie Function ?
    Molto semplice... si usa questa tecnica quando si devono estendere controlli che o sarebbe troppo complicato risolverli in linea nella stringa Sql, opppure per eseguire controlli e funzioni non presenti in Sql/Query.

    16/05/2025 - fcaliandro ha scritto:

    Manca un ritocco perchè il valore [OSD NO] non si aggiorna quando mi sposto da un record all'altro all'interno della maschera o sottomaschera.

    Qui non riesco a seguirti... non capisco quale problema riscontri, qual'èil  flusso del codice, la logica, lo scopo e l'obbiettivo.

    16/05/2025 - fcaliandro ha scritto:

    Non ho trovato una soluzione migliore di inserire un "evento su click" sulla casella di testo [OSD NO] con il seguente codice:

    Beh... direi che questa non è una soluzione.  ;-)

    Comunque dalle poche notizie e dettagli che hai dato, non vedo nessun problema nell'aggiornare una TextBox e/o una ComboBox mentre stai operando su dei records...

    Magari se fornisci qualche dettaglio in più, sarà possibile indicarti l'approccio migliore.

    Fai sapere   ;-)

  • Re: Combo Box parametrizzata tramite query

    16/05/2025 - fcaliandro ha scritto:

    Però è scomodo dover cliccare sempre sulla casella di testo ogni volta..

    Allora, assodato e confermato, nonchè chiarito che la mia function funziona... ;-)

    Anche se ancora non mi è chiaro il tuo scenario, comunque parli di spostamento tra i records ... ti faccio un esempio pratico, sempre se ho capito bene la tua richiesta:  ;-)

    Poniamo di avere dei records. Alla selezione di un record si deve aggiornare una TexBox e il contenuto di una ComBox sulla base del valore presente nella TextBox

    1. Nella stessa Form, ma nulla cambia se sono Form separate, SubForm oppure no :
      1. Si seleziona un record
    2. Alla selezione di un record si aggiorna :
      1. Una TextBox
      2. Una ComboBox
    3. Automaticamente la ComboBox si popola sulla base del contenuto dellaTexBox ( vedere la mia function che funziona ;-)  )
      :

    Esempio :

    • Viene Selezionato un Personaggio che abita a Paperopoli
      • la TextBox si popola con la Città del personaggio e la ComboBox viene popolata con tutti i personaggi di Paperopoli
    • Viene Selezionato un Personaggio che abita a Puffolandia
      • la TextBox si popola con la Città del personaggio e la ComboBox viene popolata con tutti i personaggi di Puffolandia
    • Viene Selezionato un Personaggio che abita a Topolinia
      • la TextBox si popola con la Città del personaggio e la ComboBox viene popolata con tutti i personaggi di Topolinia
    • Extra ;-)
      • Quando viene selezionato un Personaggio nella ComboBox, viene spostato il Cursore sul Personaggio nella "Visualizzazione Foglio Dati"

    Ogni volta che viene selezionato un record, in automatico si popola :
    la TextBox con la Città del personaggio selezionato
    la ComboBox con i Personaggi della Città presente nella TextBox

    Ogni volta che viene selezionato un Personaggio nella Combobox :
    il Cursore nel "Foglio dati" si sposta nel record corrispondente

    E' molto molto semplice, veloce e richiede solo due righe di codice.... 
    Quando si aggiornano le SubForm, l'uno aggiorna l'altra e l'altra aggiorna l'uno  ...insomma, s'aggiornano tra di loro  ;-))

    E' una cosa di questo tipo che devi realizzare, con questa logica ?

    Se posso darti un consiglio... fai cose semplici e standard. Otterrai un codice e una soluzione Robusta, Semplice e Affidabile... perchè a tutto esiste sempre una soluzione altrettanto semplice, standard e affidabile.

  • Re: Combo Box parametrizzata tramite query

    Ciao Franco,

    Ti posso fornire qualche dettaglio in più?

    Ho due tabelle:

    OSD_REGISTER

    OSD_ITEM_LIST

    Le due tabelle sono in relazione 1 to molti tramite il campo [OSD NO].

    [OSD NO] è chiave primaria nella tabella OSD_REGISTER

    La combo box è localizzata all'interno della sottomaschera OSD_ITEM_LIST

    Quando apro la maschera OSD_REGISTER (che contiene la sottomaschera OSD_ITM_LIST) posso scorrere tra i record. Ovviamente ad ogni record corrisponde un [OSD NO] diverso. 

    Quello che noto è che la combo box non si aggiorna automaticamente dopo aver cliccato su next record (spostamento tra record). Però se, dopo essermi spostato di record, clicco sulla cella di testo [OSD NO] e poi apro la combo box scopro che essa mi propone i dati filtrati correttamente.

    Forse il codice che mi hai postato devo inserirlo nella maschera? Quindi "non pubblico".

    Non so..

    Francesco

  • Re: Combo Box parametrizzata tramite query

    Ciao Francesco ... 

    più o meno mi sembra di aver capito ... 

    Facciamo una cosa , ti lascio questo demo di cui parlato in precedenza.

    Non guardare il codice posto in FormMain, serve solo per mostrare la Demo, pertanto non ti serve.

    Concentrati sugli eventi e i controlli posti nelle due SubForm. Qui trovi dei metodi che puoi usare per Controllare lo stato delle subform e gli Eventi che potresti utilizzare.

    Mentre la function da impostare nei criteri della query la trovi nel MyModUtility

    Quindi osserva come funziona e, fatte le tue dovute considerazioni, applica i metodi alla tua soluzione.

    qui puoi scaricare la demo :  https://www.transfernow.net/dl/20250520eQphnZ8w è solo un esempio di come poter navigare tra i controlli e farli parlare tra di loro.

    In ultimo vorrei chiederti : ma la casella di testo per quale motivo l'hai creata ? ... solo per filtrare la combobox ? 
    Se si , beh non è necessario averla per tale scopo, è sufficiente solo la combobox alla quale fare riferimento.

  • Re: Combo Box parametrizzata tramite query

    17/05/2025 - By65Franco ha scritto:

    Ogni volta che viene selezionato un record, in automatico si popola :
    la TextBox con la Città del personaggio selezionato
    la ComboBox con i Personaggi della Città presente nella TextBox

    Ogni volta che viene selezionato un Personaggio nella Combobox :
    il Cursore nel "Foglio dati" si sposta nel record corrispondente

    uhm.. una text box per selezionare un gruppo ed una combo per selezionare il nome?

    la logica vuole che paperopoli sia selezianata da combo e topolino da textbox.

    il contrario implica, supponendo di utilizzare città reali della regione sicilia, che la combo si popoli di 9 valori, poi dalla editbox cerchi la città di quella provincia.

    dubito che topolino risieda a paperopoli o puffolandia rendendo inutile il tipo di filtraggio.

  • Re: Combo Box parametrizzata tramite query

    20/05/2025 - sihsandrea ha scritto:

    • uhm.. una text box per selezionare un gruppo ed una combo per selezionare il nome?

      la logica vuole che paperopoli sia selezianata da combo e topolino da textbox.

      il contrario implica, supponendo di utilizzare città reali della regione sicilia, che la combo si popoli di 9 valori, poi dalla editbox cerchi la città di quella provincia.

      dubito che topolino risieda a paperopoli o puffolandia rendendo inutile il tipo di filtraggio.

    Ciao, non so cosa dirti... questo è il risultato emerso dalla discussione del Thread.

    Il fatto è che le subform possono essere anche richiamate separatamente come semplici Form.   
    Presumo pertanto l'esistenza di una certa logica a noi per adesso sconosciuta.

    Ma detto questo, l'intento è quello di far capire all' OP come far parlare i Controlli presenti nella varie Form, SubFomr, etc... e con quali eventi poter eseguire il tutto.

    Quindi metterei da parte la Logica ;-)) 

    Mi concentrei sulle possibili tecniche da utilizzare e qui vengono presentate alcune di queste... 
    ma come si sa, le stesse cose si possono fare anche con altri metodi...

    sempre "Logica" a parte ;-)

Devi accedere o registrarti per scrivere nel forum
22 risposte