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.