Caselle combinate e aggiunta di nuovi valori - NotInList

di il
5 risposte

Caselle combinate e aggiunta di nuovi valori - NotInList

Buonasera !
Serve il Vostro aiuto per capire una cosa.
Ho un DB di ricette da cucina.
Ho tre tabelle:
1) Ingredienti: ha solo il campo NomeIngrediente
2) Ricetta: ID, NomeRicetta, TipoPiatto, Difficoltà
3) Dettagli Ricetta: ID, Ingrediente (è una cbo che ha come origine riga il campo NomeIngrediente della tabella Ingredienti), Quantità, IDRicetta (questo campo è una chiave esterna)

Ho messo in relazione uno a molti le tabelle Ricetta (lato 1) e Dettagli ricetta (lato molti).
Su queste due tabelle ho creato una maschera Ricetta ed una sottomaschera Dettagli ricetta.
In questa sottomaschera ho il campo Ingredienti che è una cbo con queste proprietà: Origine riga: Ingredienti, colonna associata 1, solo in elenco NO, consenti modifiche a elenco SI, eredita elenco valori SI, mostra solo valori origine riga NO, numero colonne 1.

Il punto è:
quando devo inserire un nuovo ingrediente, digito il nome e la cbo lo accetta senza problemi.
Ma poi non mi ritrovo i nuovi ingredienti inseriti nell'elenco della cbo e neanche nella tabella Ingredienti.
Come si risolve il problema ?
Dov'è l'errore ?
Saluti a tutti.


Per i MODERATORI: mi sono ricordato che cinque mesi fa ho aperto questa discussione:
"Scrivere in una ComboBox, ma dopo non trovare il valore nell'elenco"
e di aver risolto all'epoca quel problema per un database.
Dato che con quella soluzione non riesco a risolvere con il nuovo database RICETTE, vorrei proseguire il discorso con questa discussione appena aperta.

5 Risposte

  • Re: Caselle combinate e aggiunta di nuovi valori - NotInList

    Tu hai preferito "Solo in elenco: No" perchè pensavi di sbrigarti facendo passare ugualmente un "nuovo valore". Poi però "pretendi" che tale valore si vada a popolare nella tabella madre. Dovresti gestire l'evento NotInList.
    Prova a leggere questo, Scenario 2
  • Re: Caselle combinate e aggiunta di nuovi valori - NotInList

    Ho duplicato il DB, ed ho risolto in due modi.

    Primo.
    Nella prima copia del DB, nelle proprietà della cbo, in Evento NotInList, ho usato il seguente codice VBA:
    
    Private Sub cboIngredienti_NotInList(NewData As String, Response As Integer)
        Dim db As DAO.Database, rs As DAO.Recordset ' Variabili per gestire oggetti DAO
        Dim strMsg As String    'Variabile stringa per la finestra di messaggio
        
        'Costruisce la stringa per la domanda da visualizzare
        'nella finestra di messaggio usando l'argomento intrinseco NewData
        strMsg = "'" & NewData & "' non è un nome di un ingrediente disponibile"
        strMsg = strMsg & vbCrLf & "Desidera aggiungerlo all'elenco degli ingredienti ?"
        strMsg = strMsg & vbCrLf & "Clic su Sì per aggiungerlo, su No " & _
                "per selezionarne uno esistente."
        'Presenta l'alternativa all'operatore
        If MsgBox(strMsg, vbQuestion + vbYesNo, _
                "Aggiungere un nuovo ingrediente ?") = vbNo Then
            'Se l'operatore rinuncia a modificare l'elenco,
            'imposta il valore della costante intrinseca Response
            Response = acDataErrContinue
        Else
        
        'Se l'operatore vuole aggiungere il nuovo valore
        'apre la tabella Corrieri e vi inserisce un nuovo
        'record corrispondente al valore
            Set db = CurrentDb
            Set rs = db.OpenRecordset("INGREDIENTE", dbOpenDynaset)
            rs.AddNew
            'Esegue il metodo AddNew specificando il campo Nome
                rs!NomeIngrediente = NewData
            'Inserisce materialmente il nuovo valore
            'nella tabella e poi la chiude
            rs.Update
            rs.Close
            
            'Imposta un valore di uscita
            'per la costante intrinseca Response
                Response = acDataErrAdded
        End If
    End Sub
    
    Con questo codice, quando nella casella combinata scrivo un ingrediente che non è compreso nella tabella INGREDIENTE, esce una maschera che mi chiede se voglio inserire il nuovo valore, clicco su si, e proseguo. Poi il valore me lo ritrovo nella tabella INGREDIENTE ....... ma non viene messo in ordine alfabetico !!
    Comunque, è un rimedio molto performante.

    Secondo.
    Nella seconda copia del DB, ho usato un paio di query.

    Prima ho creato una query unione, mettendo insieme il campo NomeIngrediente della tabella INGREDIENTE con il campo Ingrediente della tabella Dettagli Ricetta (è la tabella su cui è costruita la sottomaschera). I valori sono ordinati in modo crescente e senza duplicati.
    Questo il SQL:
    
    SELECT [DETTAGLI RICETTA].INGREDIENTE
    FROM [DETTAGLI RICETTA]
    GROUP BY [DETTAGLI RICETTA].INGREDIENTE
    ORDER BY [DETTAGLI RICETTA].INGREDIENTE
    UNION SELECT INGREDIENTE.NomeIngrediente
    FROM INGREDIENTE;
    
    Questa query unione sta nell'origine riga della cbo che sta nella sottomaschera "Dettagli Ricetta". Nelle proprietà - evento non c'è nessun codice VBA.
    Quando scrivo nella cbo un ingrediente non presente nelle due tabelle (che stanno alla base della query union), non esce nessun avviso, scrivo senza problemi. Se l'ingrediente c'è, dopo le prime lettere il campo si compila da solo, se l'ingrediente non c'è, lo scrivo per intero senza problemi.

    Poi ho creato una query di creazione tabella di nome "Elenco ingredienti".

    Poi ho creato due pulsanti sulla maschera Ricetta.

    Un pulsante "Aggiorna elenco ingredienti", che ha una macro che esegue la query di creazione tabella. Questa query ha come fonte la query unione di prima.
    In questo modo, quando clicco sul pulsante, mi aggiorna l'elenco degli ingredienti della cbo mettendoli in ordine alfabetico.

    Un pulsante "Visualizza elenco ingredienti" che ha una macro che mi visualizza tutti gli ingredienti in ordine alfabetico, prendendoli dalla tabella "Elenco ingredienti" (la tabella ottenuta ogni volta cliccando sul pulsante "Aggiorna elenco ingredienti").

    Questo secondo metodo è lungo e tortuoso, ma almeno mi ritrovo con un elenco ingredienti in ordine alfabetico, e non esce nessun avviso che ti chiede di confermare l'inserimento di un nuovo ingrediente.
    Ha comunque lo svantaggio che quando si digita sul pulsante "Aggiorna elenco ingredienti" escono tre avvisi da confermare.

    Buona domenica a tutti.
  • Re: Caselle combinate e aggiunta di nuovi valori - NotInList

    Perchè nella 1a soluzione non stabilisci che Origine riga di sottomaschera DettagliRicette.Ingrediente sia una query (IngredientiOrdinati) avente la tabella Ingredienti ordinata Crescente sul campo Ingrediente?
    Se leggi attentamente il mio documento, e lo adatti così:
    A = Ricette
    B = Ingredienti
    C = DettagliRicette
    non è necessario scomodare i Recordset. Direi anche che mi sembra opportuno/ortodosso che, dopo aver impostato un nuovo valore in Ingredienti, questo nuovo valore vada a popolare il valore in sottomaschera DettagliRicette.Ingrediente con conseguente Requery. Mi sembra che oltre il codice NotInList devi prevedere un clic di pulsante Aggiorna in "piccola maschera" Ingredienti.
  • Re: Caselle combinate e aggiunta di nuovi valori - NotInList

    @OsvaldoLaviosa
    Ho provato come hai indicato.
    Nelle proprietà della cboIngredienti della sottomaschera, in origine dati, ho messo una query creata sulla tabella ingredienti, con ordinamento crescente e raggruppamento.
    Adesso, quando c'è un nuovo ingrediente, esce la maschera per confermare l'inserimento, e poi mi trovo il dato in ordine crescente nella tabella.
    Grazie per il suggerimento.

    Per quanto riguarda il codice VBA postato prima, ci sono migliorie da fare ?
  • Re: Caselle combinate e aggiunta di nuovi valori - NotInList

    ProgrammD ha scritto:


    Per quanto riguarda il codice VBA postato prima, ci sono migliorie da fare ?
    Mi pare di capire che ti sia servito di qualcosa del genere
    http://www.donkarl.com/it/?FAQ4.1
    dove si sfruttano i recordset, mentre il mio documento è una mia "ricostruzione" e lavora solo con le maschere e loro rispettivi controlli.
    Il tuo funziona? Per me OK.
Devi accedere o registrarti per scrivere nel forum
5 risposte