Combolist ad eliminazione dinamica

di il
12 risposte

Combolist ad eliminazione dinamica

Buongiorno,

mi sto incartando con una cosetta simpatica...ho la necessità di modificare la sorgente combolist in base ai valori "non censiti"...

-premessa:
nella mia maschera Prodotti dopo aver inserito il Prodotto con i suoi attributi (ID, codice,nome,descrizio, etc..) ho collegato nella sotto maschera i PrezziPerListino dove ho la possibilità di caricargli per ogni listino Valido un prezzo diverso (Probabilmente in seguito aggiornerò il campo prezzo con delle percentuali fisse...tutto wnp )...

per fare ciò ho modificato l'idListino in una combobox dove mi sono limitato a caricargli i listini validi (criteri sui campi datainizio e datafine)...il campo IDProdotto è agganciato alla maschera principale quindi si compila da solo ...e l'idPrezzo e num automatica...

per maggiore chiarezza la mia TBLPREZZI (IDPrezzo pk,IDListino(FK TblListini),IDProdotto(FK TblProdotti),Prezzo...mi sa che devo aggiungere anche IDIVA...)

quello che mi piacerebbe avere nella tendina sono SOLO i Listini non ancora assegnati a quel Prodotto...
tipo: carico il Listino BASE col suo Prezzo e nel record successivo BASE non deve più comparire perche ha già una relazione con quel Prodotto...

tempo fa avevo scopiazzato del codice con sottoquery e NOT EXISTS...
avrei bisogno di farmi restituire dalla query i valori di IDListino e Nome che non hanno una relazione col Prodotto...

attualmente l'origine della combo è il seguente:
SELECT TblListini.IDListino, TblListini.NomeListino
FROM TblListini
WHERE (((TblListini.DataInizio)<Date()) AND ((TblListini.DataFine)>Date()));
spero di averlo trascritto bene... non posso fare copia incolla...

il riferimento al prodotto si può prelevare dalla form principale Prodotti1.IDProdotto

grazie in anticipo a chi mi dedicherà il suo tempo
ad maiora

12 Risposte

  • Re: Combolist ad eliminazione dinamica

    RISOLTO:
    SELECT TblListini.IDListino, TblListini.NomeListino
    FROM TblListini LEFT JOIN 
    (
    SELECT TblPrezzi.IDListino
    FROM TblPrezzi
    WHERE (((TblPrezzi.IDProdotto)=2))
    ) as Query2
     ON TblListini.IDListino = Query2.IDListino
    WHERE (((Query2.IDListino) Is Null));
    
    devo cercare di passargli l'idProdotto dalla maschera e filtrare la prima select per date... ma come disse la mamma di Giuliano Ferrara... il GROSSO è Fatto
  • Re: Combolist ad eliminazione dinamica

    CicciusPrime ha scritto:


    RISOLTO:
    .....
    devo cercare di passargli l'idProdotto dalla maschera e filtrare la prima select per date... ma come disse la mamma di Giuliano Ferrara... il GROSSO è Fatto
    Prima di gridare risolto, puoi verificare cosa accade se usi questo metodo in una combo di una maschera continua...?
    Magari ci spieghi il risultato... e confermiamo il "risolto"... ma solo dopo che hai provato.
  • Re: Combolist ad eliminazione dinamica

    Lo sapevo io che c'era qlc che non andava...
    mi rimangio RISOLTO...
    su origine dati non ho funziona...
    è possibile aggirare tramite l'evento "SU attivato" del controllo o o su "Current" della sottomaschera (visto che è una maschera continua) e passargli il SQL su Rowsource????
  • Re: Combolist ad eliminazione dinamica

    La cosa è piùcomplicata, in maschera continua, se vai a condizionare il RowSource per escludere quelli selezionati, come fanno le righe prima a Visualizzare il TESTO se non è in elenco...?
    Otterresti l'elenco funzionante solo su NUOVO e BIANCHI i records precedenti...

    Qualche indicazione sipuò avere da questi esempi, simili ma non identici... tuttavia perfettamente corrispondenti:
    https://www.fmsinc.com/free/newtips/access/accesstip16.asp
    https://www.experts-exchange.com/articles/5950/Cascading-Combos-on-Continuous-Forms-and-Datasheets.html
  • Re: Combolist ad eliminazione dinamica

    @Alex ha scritto:


    La cosa è piùcomplicata, in maschera continua, se vai a condizionare il RowSource per escludere quelli selezionati, come fanno le righe prima a Visualizzare il TESTO se non è in elenco...?
    Otterresti l'elenco funzionante solo su NUOVO e BIANCHI i records precedenti...
    la combobox ha come OrigineControllo IDListino e ho rimpicciolito il controllo fino a visualizzare solo la freccetta...posta ovviamente affianco al controllo NomeListino(Ad emulare una combobox)...

    non ho dubbi sulla tua affermazione in merito ai bianchi e nuovi... in realtà (AIUTO!!!) la combo mi serve solo per caricargli il dato...una volta fatto, anche se cambia "Origine"(rowsource) non dovrebbe modificarmi il dato già scritto nel record precedente... per i record Nuovo... ancora meglio... quando avrò "esaurito" le possibilità di inserimento...ovvero il Prodotto ha un prezzo per ogni listino valido... è corretto che risulti "Vuota"...

    sto chiaramente facendo dei test per passargli il parametro come desidero...o dalla sottomaschera o dalla maschera principale... devo solo capire come farglielo riconoscere...forse devo inserirlo come parametro nella sottoquery e rifare la leftjoin tra tbl e queryparametrata...

    vi faccio sapere...

    ad ogni modo grazie per i link...sempre utilissimi

    se in quanto detto sopra scorgi incongruenze...come al solito spara pure a beneficio degli utenti
  • Re: Combolist ad eliminazione dinamica

    Non so se proprio ci siamo capiti... non è che cambia il dato, ma di solito le Combo hanno 2 colonne [1° Campo ID e PK] +[2° Campo Descrittivo]
    Siccome tu escludi dal ROW source quelle già selezionate è il ROWSOURCE che non contiene il valore, ma il ControlSource si... ma non lo vedi di conseguenza non vedi la Descrizione...
    Tieni poi presente che in Form Continue i controlli NON ASSOCIATI, sono un potenziale inghippo grafico...

    Mi pare tu faccia confusione...? o sbaglio...?
  • Re: Combolist ad eliminazione dinamica

    @Alex ha scritto:



    Tieni poi presente che in Form Continue i controlli NON ASSOCIATI, sono un potenziale inghippo grafico...
    in effetti avevo già pensato di usare un controllo non associato e tramite codice passarlo al controllo IDListino.... la parte grafica non è che mi interessi poi tanto...

    appena riesco a mettere le mani sul db provo i consigli...
    ci aggiorniamo..grazie come sempre Alessandro
  • Re: Combolist ad eliminazione dinamica

    Sempre nella nuvoletta dell'idea...

    potrei lasciare la combo sulla tabella senza riferimenti ma solo coi listini validi e poi piazzare dei controlli tramite codice sui listini inseriti per evitare di inserire "Doppioni"... un pò macchinoso però potrebbe funzionare... giusto???
  • Re: Combolist ad eliminazione dinamica

    Boh... secondo me stai facendo ragionamenti che concretamente non servono.
    La Combo la lasci con l'elenco Completo, questo ti garantisce la massima gestione di tutto.
    Poi se non vuoi doppioni, hai 2 modi...:
    1) su BeforeUpdate, controlli la proprietà Dirty, e vai a testare l'eventuale doppione con DCOUNT(...) e se esiste Forzi il Cancel dell'Evento e l'Undo della Combo.
    2) su Form_Error dopo aver impostato il Campo ad Univoco(ma non sempre è fattibile nel senso che diventa Univoco con 2 Chiavi e potrebbe non essere la PK) vai a gestire l'errore, facendo l'undo...
    Personalmente, il 1° è quello più flessibile e senza tanti fronzoli.

    Per tutte le complicazioni inutili che io definisco "pippe"... ti lascio sperimentare, come è giusto che sia.
  • Re: Combolist ad eliminazione dinamica

    @Alex ha scritto:



    2) su Form_Error dopo aver impostato il Campo ad Univoco(ma non sempre è fattibile nel senso che diventa Univoco con 2 Chiavi e potrebbe non essere la PK) vai a gestire l'errore, facendo l'undo...
    ho provato a metterne la terna come chiave ma poi non riesco (meaculpa) a gestire la m-m listini-prodotti con i dettagli... quindi ho lasciato solo idprezzo pk,,,,

    penso che seguirò il 1 consiglio...anzi ti chiedo...avevo in mente di gestire i duplicati tramite evento tabella/campi beforeupdate..tralasciando la maschera di inserimento... non so se è praticabile... come dici bene.. continuo a testare...
  • Re: Combolist ad eliminazione dinamica

    Aggiornamento:

    abbandonata l'idea di creare una macro di dati sulla tabella (mi trovo meglio a scrivere codice sul modulo…) per ricerca duplicati e conseguente annullamento inserimento

    ho gestito la cosa tramite il beforeupdate della subform ma senza il dcount...bensi con il dlookup nella tabella di relazione (TblPrezzi) passandogli come criteri IDListino e IDProdotto dal record appena scritto( ma ovviamente non salvato quindi non presente in tabella)…

    se non trovava corrispondenza allora continua e salva...se la trovi annulla inserimento e avvisa l'utente che non è possibile inserire due listini/prezzi Validi e Identici per lo stesso prodotto..

    in aggiunta ho messo dei controlli sugli errori tramite l'evento afterupdate del controllo combobox incriminato dove ho settato a dovere le prorietà Enabled e Locked degli altri controlli in maschera...ovvero PrezzoProdotto e NomeListino..questo per evitare la creazione di un nuovo listino per un errore di digitazione nel campo sbagliato...visto che la maschera è dinamica…

    appena posso pubblico il codice che ho scritto.. e un paio di foto della maschera incriminata…
  • Re: Combolist ad eliminazione dinamica

    Come promesso:

    codice
    Private Sub Form_BeforeUpdate(Cancel As Integer)
    'controllo duplicati
    If Not IsNull(DLookup("IDPrezzo", "TblPrezzi", "IDListino=" & Me.IDListino & " AND IDProdotto=" & Me.IDProdotto)) Then
    'avviso dell'errore
    MsgBox "Hai già inserito un prezzo per il Listino: " & Me.NomeListino, vbCritical, gm
    Cancel = True
    'annullo l'operazione
    Me.Undo
    End If
    End Sub
    
    finestra di avviso
    avviso.PNG
    avviso.PNG

    ritorno al record con inserimento annullato

    ritorno.PNG
    ritorno.PNG

Devi accedere o registrarti per scrivere nel forum
12 risposte