Cambiare Rowsource di una combobox

di il
8 risposte

Cambiare Rowsource di una combobox

Buongiorno,

chiedo Vostro aiuto per definire come procedere. In una form "frmOCordinicostamp" ho una subform "sfrmDOdettagliordineacquisto" in visualizzazione foglio dati con un controllo combobox "sfrmDOcboDEStabDOnote". Questa combo  ha come origine riga questa query:

SELECT DISTINCT tblEVelencovociordine.DEStabEVdescrizione, tblEVelencovociordine.NUMtabEVIDtabAFid, tblEVelencovociordine.IDtabEVid FROM tblEVelencovociordine WHERE (((tblEVelencovociordine.NUMtabEVIDtabAFid)=[Maschere]![frmOCordinicostamp]![frmOCcboNUMtabOCIDtabAFid])) ORDER BY tblEVelencovociordine.DEStabEVdescrizione;

Quindi in base al Fornitore che seleziono nella Form, la combo mi propone una lista di scelte prese dalla "tblEVelencovociordine" filtrate in base all'ID del fornitore. Questa tabella e' un listino codici di alcuni fornitori che vendono componenti normalizzati.

Siccome non tutti i fornitori hanno  un listino quindi non hanno records nella tabella "tblEVelencovociordine", vorrei cambiare la rowsource della combo in base al fornitore selezionato e proporre in alternativa una lista dei valori filtrati dell'origine dati della combo.

Pensavo di procedere in questo modo: inserire un nuovo campo "True/False" nella tabella fornitori per discriminare che ha il listino e chi no.

Poi tramite questo parametro vado a modificare la Rowsource della combo; non so pero' quale evento e' piu' corretto intercettare per fare cio': se su GotFocus della combo, o su AfterUpdate del fornitore nella form principale, o altro....

Qualche consiglio?

Grazie in anticipo

8 Risposte

  • Re: Cambiare Rowsource di una combobox

    In alternativa cosa dovrebbe mostrare la combo?

    Nel dubbio

    Select bla bla ...

    Where

    (La tua where and ckechbox=true)

     Or

    (La tua alternativa)

    Order bla bla...

    Se il flag è true esegue per come stai eseguendo altrimenti mostra altro.

    In alternativa alla check puoi usare il nome del campo flag.

    Dubbio: se non ha un listino cosa deve mostrare?

  • Re: Cambiare Rowsource di una combobox

    Come ho scritto sopra dovra' mostrare "una lista dei valori filtrati dell'origine dati della combo". Siccome il modulo d'ordine non lo uso solo per acquistare normalizzati ma anche per l'acquisto di materia prima (acciaio tagliato a misura), oppure per lavorazioni esterne (quindi materiale che viene inviato a fornitori esterni per eseguire rilavorazioni o trattamenti termici), o per acquisto materiale non codificato, in questi casi non ho il listino codificato per cui vorrei pescare dallo storico di righe d'ordine vecchie  (se ci sono) che poi andrei ad adattare all'occorrenza solo cambiando alcuni valori...

    La richiesta comunque verte su quale evento effettuare il cambio del Rowsource, come farlo lo so....

  • Re: Cambiare Rowsource di una combobox

    Ah ok.

    Fornitore1 e fornitore2 hanno il listino.

    Adesso come fai a caricare i dati dell'uno o dell'altro al cambio fornitore?

    Modificando la query con l'opzione listino si/no non devi fare altro.

    Se fornitore3 non ha listino esegui l'altra opzione.

    Tuttavia, di solito si ricaricano le query figlie nel momento in cui cambia il record. Magari se l'id cambia fai un requery.

  • Re: Cambiare Rowsource di una combobox

    La procedura per nuovo ordine e' questa: da combobox seleziono il fornitore (se gia' in anagrafica) altrimenti doppio click sul controllo mi si apre popup la form dell'anagrafica fornitore, inserisco tutti i dati, chiudo la form e seleziono il nuovo fornitore. Poi inserisco altri dati relativi all'ordine tipo il riferimento al nostro DDT nel caso di un conto lavoro, e/o l'offerta se presente e/o la conferma d'ordine quando mi ritorna dal fornitore.

    Poi mi sposto nella subform ed inserisco le singole voci dell'ordine, fra cui la descrizione, il codice, il prezzo, ecc. Adesso nella combobox della descrizione trovo valori solo se il fornitore ha un listino (che  ho caricato in un'altra tabella che si chiama "tblEVelencovociordine" e da cui popolo la Rowsource della combo filtrando i dati in base al fornitore).

    Se il fornitore non ha un listino, quindi non ha records nella tabella "tblEVelencovociordine", la combo della descrizione e' vuota, mentre quello che vorrei avere e' una lista delle descrizioni relative ad altri ordini dello stesso fornitore.

    Per esempio ho il fornitore PINCO che ha un listino: quando seleziono PINCO nella testata ordine, nella subform, quando apro la combo descrizione, trovero' tutte le voci del listino di PINCO.

    Se ho il fornitore PALLINO che non ha un listino perche' la sua attivita' non prevede listini, allora vorrei cambiare la lista dei valori della combo popolandola con le voci di descrizione di ordini precedenti (di fatto filtrando i dati dell'origine controllo).

    Posto di seguito il link al layout della form con la subform (il controllo Descrizione nella subform e' la combo che devo modificare):

    https://imgur.com/a/yHiN6NK

    Comunque ribadisco che la richiesta di questo post e' di sapere a quale evento e' meglio associare il cambio Rowsource della combo...

  • Re: Cambiare Rowsource di una combobox

    Ok, la risposta te l'ho data... Appena selezioni il fornitore nel caricare la query hai due opzioni

    La prima è quella che hai fatto ma devi aggiungere alla where 

    And campo listino=true

    Così, se non esiste un listino ti restituisce un insieme vuoto (non ci sono record che popolano la combo)

    La seconda, nel modo della programmazione hai n-mila modi.

    Visto che campo listino accetta solo true o false abbiamo queste situazioni

    Se true esegue la sql che hai già chiamiamolo insiemeA

    Adesso aggiungi la nuova sql che serve se non esiste listino

    Union

    Select...quello che vuoi where listino=false

    Chiamiamolo insiemeB

    Poiché non esiste per un boolean il valore contemporaneo true e false abbiamo:

    Listino= true

    InsiemeA pieno + insiemeB vuoto

    Listino=false

    InsiemeA vuoto + insiemeB pieno

    Non so cosa conterrebbe la sql insieme b, questo lo elabori tu ma in questo modo non devi fare altro.

    Per come popoli adesso con listino popoli anche senza listino.

    Spero di essermi spiegato meglio.

    Aggiungo, se vai a variare il fornitore magari perché hai sbagliato, l'unico campo che cambia sicuramente è idfornitore. Appena cambia l'id riesegui la sql et voilà te ne freghi se ha o no un listino perché avrai almeno lo storico. Sullo storico, nella sql fai attenzione all'ultimo prezzo quindi max idvecchioordine x prodotto ma a questo ci pensi tu che conosci il db.

  • Re: Cambiare Rowsource di una combobox

    26/09/2025 - Mailman ha scritto:

    su AfterUpdate del fornitore nella form principale

    Secondo me questa è una buona idea.

  • Re: Cambiare Rowsource di una combobox

    Grazie a tutti,

    oggi, se riesco, faccio qualche test e ritorno con il codice della soluzione adottata.

  • Re: Cambiare Rowsource di una combobox

    Ho testato la soluzione e sembra che funzioni (non ho pero' ancora verificato tutte le possibili combinazioni). Ho solo modificato l'evento che a mio avviso e' preferibile l'Activate del controllo della combo nella suboform invece che l'AfterUpdate del controllo combo Fornitore. 

    Posto di seguito il codice utilizzato:

    Private Sub sfrmDOcboDEStabDOnote_GotFocus()
    On Error GoTo Err_handler
    
    Dim bln As Boolean
        bln = DLookup("FLAGtabAFlistino", "tblAFanagraficafornitori", "IDtabAFid=" & Me.Parent!frmOCcboNUMtabOCIDtabAFid.Value)
        If bln Then
            Me.sfrmDOcboDEStabDOnote.RowSource = "SELECT DISTINCT tblEVelencovociordine.DEStabEVdescrizione, tblEVelencovociordine.NUMtabEVIDtabAFid, 			tblEVelencovociordine.IDtabEVid FROM tblEVelencovociordine" _
            & " WHERE tblEVelencovociordine.NUMtabEVIDtabAFid = " & Me.Parent!frmOCcboNUMtabOCIDtabAFid.Value & " ORDER BY tblEVelencovociordine.DEStabEVdescrizione"
        Else
            Me.sfrmDOcboDEStabDOnote.RowSource = "SELECT DISTINCT tblDOdettagliordine.DEStabDOnote, tblOCordinicostamp.NUMtabOCIDtabAFid FROM tblOCordinicostamp INNER JOIN tblDOdettagliordine ON tblOCordinicostamp.IDtabOCid = tblDOdettagliordine.NUMtabDOIDtabOCid " _
            & " WHERE tblOCordinicostamp.NUMtabOCIDtabAFid = " & Me.Parent!frmOCcboNUMtabOCIDtabAFid.Value & " ORDER BY tblDOdettagliordine.DEStabDOnote"
        End If
        
    Exit_Err_handler:
        Exit Sub
    
    Err_handler:
        MsgBox Err.Number & " " & Err.Description
        Resume Exit_Err_handler
    
    End Sub

    Grazie a tutti e Vi tengo aggiornati se ci fosse qualche modifica

Devi accedere o registrarti per scrivere nel forum
8 risposte