Scrivere in una ComboBox, ma dopo non trovare il valore nell'elenco

di il
11 risposte

Scrivere in una ComboBox, ma dopo non trovare il valore nell'elenco

Buongiorno !
Chiedo il Vostro aiuto, dato che non riesco a capire una cosa.
In una maschera (Ordine Acquisto) ho i seguenti campi:
- ID chiave primaria
- IDOrdineAcq chiave esterna
- IDProdotti chiave esterna
- DataAcq campo Data/Ora
- QuantitaAcq campo numerico
- PrezzoAcq campo valuta
- Fornitore campo testo
Le due chiavi esterne sono caselle combinate, e fanno riferimento a due tabelle che hanno un solo campo.
La tabella OrdineAcq ha solo un campo numerico chiamato Numero Ordine Acquisto, ed è anche la chiave primaria.
La tabella PRODOTTI ha un solo campo di tipo testo chiamato Prodotti, ed è anche la chiava primaria.
Nella maschera "Ordine Acquisto" le chiavi esterne sono caselle combinate ed hanno queste proprietà in DATI:
- colonna associata 1
- Solo in elenco NO
- Consenti modifiche a elenco SI
- Eredita elenco valori NO
- Mostra solo valori origine riga NO
e queste proprietà in FORMATO:
- numero colonne 1
- larghezza colonne (vuoto)
- intestazioni colonne NO

Il problema è: nelle tabelle Prodotti ed OrdineAcq ho alcuni valori, che mi ritrovo nelle caselle combinate, e nella maschera riesco ad inserire nuovi valori nelle caselle combinate.
Poi questi nuovi valori non me li ritrovo nell'elenco delle tabelle e quindi neanche nelle caselle combinate.
Cioè se in Prodotti ho: mela, pera, arancio; poi nella maschera, nella casella combinata IDProdotti inserisco LIMONE, questo nome non mi compare nella tabella Prodotti e neanche nella combobox IDProdotti.
Perchè ?
Sbaglio qualcosa o funziona in questo modo ?

11 Risposte

  • Re: Scrivere in una ComboBox, ma dopo non trovare il valore nell'elenco

    ProgrammD ha scritto:


    Nella maschera "Ordine Acquisto" le chiavi esterne sono caselle combinate ed hanno queste proprietà in DATI:
    - colonna associata 1
    - Solo in elenco NO
    - Consenti modifiche a elenco SI
    - Eredita elenco valori NO
    - Mostra solo valori origine riga NO
    e queste proprietà in FORMATO:
    - numero colonne 1
    - larghezza colonne (vuoto)
    - intestazioni colonne NO

    ProgrammD ha scritto:


    nelle tabelle Prodotti ed OrdineAcq ho alcuni valori, che mi ritrovo nelle caselle combinate, e nella maschera riesco ad inserire nuovi valori nelle caselle combinate.
    Poi questi nuovi valori non me li ritrovo nell'elenco delle tabelle e quindi neanche nelle caselle combinate.
    Il problema cardine (per me) risiede qui:
    - Solo in elenco NO
    imposta
    Solo in elenco: Sì

    Per arrivare a ottenere quello che cerchi, prova a leggere questo documento

    Nel documento si parla anche di sottomaschera (per complicare il discorso), ma sostanzialmente il giochetto che mira a:
    - aprire maschera superiore
    - scrivere nuovo valore
    - impostarlo nella casella combinata
    - aggiornare con Requery
    deve funzionare così.

    ProgrammD ha scritto:


    - larghezza colonne (vuoto)
    Io scriverei un valore concreto in
    Larghezza colonne: 3 cm (per esempio)
  • Re: Scrivere in una ComboBox, ma dopo non trovare il valore nell'elenco

    La soluzione delle sottomaschere, l'ho già praticata in altri DB, la conosco. A me interessa avere un'unica maschera e poi usare le combobox per scegliere/aggiungere i valori.

    Tra le proprietà delle caselle combinate c'è:
    1) Nella scheda DATI - Solo in elenco: NO bisogna mettere NO per far capire ad Access che voglio inserire nuovi valori nella combobox.
    2) Nella scheda EVENTO - Su non in elenco: bisogna mettere un'azione. Ma quale ???

    Io ho provato con una macro:
    EseguiComandoMenu
    Comando ModificaVociElenco

    Comunque non funziona.

    Dov'è l'errore ?
  • Re: Scrivere in una ComboBox, ma dopo non trovare il valore nell'elenco

    ProgrammD ha scritto:


    1) Nella scheda DATI - Solo in elenco: NO bisogna mettere NO per far capire ad Access che voglio inserire nuovi valori nella combobox.
    Impostare "Solo in elenco: No" significa dire:
    Cara casella combinata, tu dammi pure una lista di valori (provenienti da una tabella), ma dammi la possibilità di scrivere anche un valore nuovo che voglio io. STOP.
    Tutto questo riguarda solo la casella combinata. Nulla va a intaccare la tabella madre che fornisce i valori.

    ProgrammD ha scritto:


    2) Nella scheda EVENTO - Su non in elenco: bisogna mettere un'azione. Ma quale ???
    L'evento "Su non in elenco" è il tipico evento che si usa per la gestione dei casi che hai esattamente citato tu. "Su non in elenco" (NotInList) si può gestire solo in VBA.
    Se leggi attentamente il mio documento, propongo 2 soluzioni: con macro o VBA. Con macro puoi cavartela solo con un Click di pulsante.
    In entrambi i casi, non ce la si cava con 2-3 istruzioni soltanto, ma occorre impiantare tutto quel discorso che credo/spero di aver documentato il più dettagliatamente possibile.
  • Re: Scrivere in una ComboBox, ma dopo non trovare il valore nell'elenco

    OsvaldoLaviosa ha scritto:


    ProgrammD ha scritto:


    2) Nella scheda EVENTO - Su non in elenco: bisogna mettere un'azione. Ma quale ???
    L'evento "Su non in elenco" è il tipico evento che si usa per la gestione dei casi che hai esattamente citato tu. "Su non in elenco" (NotInList) si può gestire solo in VBA.
    Se leggi attentamente il mio documento, propongo 2 soluzioni: con macro o VBA. Con macro puoi cavartela solo con un Click di pulsante.
    In entrambi i casi, non ce la si cava con 2-3 istruzioni soltanto, ma occorre impiantare tutto quel discorso che credo/spero di aver documentato il più dettagliatamente possibile.
    Ti ringrazio per il link. Proverò se funziona con il VBA.
    Per quanto riguarda l'uso dei pulsanti che aprono le tabelle, si immette il valore, poi si clicca su un pulsante che aggiorna il tutto e si ritorna alla maschera principale, l'ho già fatto e funziona.
    Voglio vedere se ci riesco con le combo-box.
  • Re: Scrivere in una ComboBox, ma dopo non trovare il valore nell'elenco

    Ho provato il codice VBA del punto 7 del documento allegato.
    Riesco ad inserire il testo non compreso nell'elenco della combo-box, ma non esce nessun avviso, e la tabella non si aggiorna.
    Al rigo:
    If intReturn = vbYes Then DoCmd.OpenForm "B", acForm (a questo punto il mio database mi da solo acFormDS, non c'è nell'elenco acForm) forse la mia versione di access è più vecchia o più nuova rispetto alle istruzioni ?
    Per quanto riguarda il secondo VBA, si tratta del primo record della tabella B ? e va scritto B1 ? (ovviamente mettendo il nome della maschera al posto di B).
  • Re: Scrivere in una ComboBox, ma dopo non trovare il valore nell'elenco

    ProgrammD ha scritto:


    Riesco ad inserire il testo non compreso nell'elenco della combo-box, ma non esce nessun avviso
    Hai impostato "Solo in elenco: Sì"?

    ProgrammD ha scritto:


    DoCmd.OpenForm "B", acForm (a questo punto il mio database mi da solo acFormDS, non c'è nell'elenco acForm) forse la mia versione di access è più vecchia o più nuova rispetto alle istruzioni ?
    È un errore di mia battitura. Grazie per avermelo rilevato.
    Puoi lasciare vuoto quell'argomento che di default significa acNormal.

    ProgrammD ha scritto:


    Per quanto riguarda il secondo VBA, si tratta del primo record della tabella B ? e va scritto B1 ? (ovviamente mettendo il nome della maschera al posto di B).
    Non ti seguo...perfettamente.
    Nel mio documento [nome tabella] = [nome maschera], quindi B è sia la tabella, sia la maschera corrispondente.
    B1 è il secondo campo di B. In molti casi, quando si crea una casella combinata, si tende a mettere come primo campo il CampoID (IDB), ma nascosto (0 cm in Larghezza colonne). Di conseguenza si tende a mostrare il primo campo "utile" (di solito di tipo Testo breve) e su di esso giocarsi tutto il discorso di NotInList...ecc...

    ProgrammD ha scritto:


    si tratta del primo record della tabella B ?
    No perchè ho scritto acFormAdd che significa "predisponi la maschera solo per inserire". La maschera si posiziona automaticamente su Record Nuovo, senza neanche mostrare tutti i record precedenti.
  • Re: Scrivere in una ComboBox, ma dopo non trovare il valore nell'elenco

    OsvaldoLaviosa ha scritto:


    ProgrammD ha scritto:


    Riesco ad inserire il testo non compreso nell'elenco della combo-box, ma non esce nessun avviso
    Hai impostato "Solo in elenco: Sì"?

    ProgrammD ha scritto:


    DoCmd.OpenForm "B", acForm (a questo punto il mio database mi da solo acFormDS, non c'è nell'elenco acForm) forse la mia versione di access è più vecchia o più nuova rispetto alle istruzioni ?
    È un errore di mia battitura. Grazie per avermelo rilevato.
    Puoi lasciare vuoto quell'argomento che di default significa acNormal.

    ProgrammD ha scritto:


    Per quanto riguarda il secondo VBA, si tratta del primo record della tabella B ? e va scritto B1 ? (ovviamente mettendo il nome della maschera al posto di B).
    Non ti seguo...perfettamente.
    Nel mio documento [nome tabella] = [nome maschera], quindi B è sia la tabella, sia la maschera corrispondente.
    B1 è il secondo campo di B. In molti casi, quando si crea una casella combinata, si tende a mettere come primo campo il CampoID (IDB), ma nascosto (0 cm in Larghezza colonne). Di conseguenza si tende a mostrare il primo campo "utile" (di solito di tipo Testo breve) e su di esso giocarsi tutto il discorso di NotInList...ecc...

    ProgrammD ha scritto:


    si tratta del primo record della tabella B ?
    No perchè ho scritto acFormAdd che significa "predisponi la maschera solo per inserire". La maschera si posiziona automaticamente su Record Nuovo, senza neanche mostrare tutti i record precedenti.
    In corrispondenza della combo-box IDProdotti (che corrisponde a IDB del documento che hai allegato) che si trova nella maschera "Ordine Acquisto" (che corrisponde alla maschera C del tuo documento allegato), ho queste proprietà:
    1. Solo in elenco: Si
    2. Consenti modifiche a elenco: Si
    3. Eredita elenco valori: Si
    4. Mostra solo valori origine riga: No

    Poi nella maschera "Ordine Acquisto", in corrispondenza delle proprietà del campo IDProdotti, in Evento, Su Non in elenco, ho inserito il seguente codice VBA:

    Private Sub IDProdotti_NotInList(NewData As String, Response As Integer)
    Dim intReturn As Integer
    intReturn = MsgBox(NewData & " non esiste nella lista NomeProdotto. Vuoi inserirlo ?", vbYesNo)
    If intReturn = vbYes Then DoCmd.OpenForm "PRODOTTI",,,,, acFormAdd, acDialog, NewData
    Response = acDataErrContinue
    End Sub
    .....................................
    esce il seguente errore, in corrispondenza di DoCmd.OpenForm: Errore di compilazione: Numero errato di argomenti o assegnazione di proprietà non valida


    Nella tabella PRODOTTI, in Dati, su Caricamento, ho inserito il seguente codice VBA:

    Private Sub Form_Load()
    If IsNull(Me.OpenArgs) = False Then Me!NomeProdotto = Me.OpenArgs
    End Sub

    C'è qualche errore da qualche parte ?

    P.S.: nel mio database, le maschere "ORDINE ACQ", "PRODOTTI" e "Ordine Acquisto" non hanno sottomaschere.
  • Re: Scrivere in una ComboBox, ma dopo non trovare il valore nell'elenco

    ProgrammD ha scritto:


    1. Solo in elenco: Si
    2. Consenti modifiche a elenco: Si
    3. Eredita elenco valori: Si
    4. Mostra solo valori origine riga: No
    1.: OK
    Le altre proprietà, conviene lasciare i valori di default...io manco li conosco.

    DoCmd.OpenForm "PRODOTTI",,,,, acFormAdd, acDialog, NewData
    Hai messo 5 virgole, quando ce ne vogliono 4. Se scrivi il codice VBA, digitando carattere per carattere, servendoti dell'intellisense, queste cose saltano fuori automaticamente.

    ProgrammD ha scritto:


    nel mio database, le maschere "ORDINE ACQ", "PRODOTTI" e "Ordine Acquisto" non hanno sottomaschere.
    Il problema in generale non è se si sta lavorando su maschera o sottomaschera. La logica è la stessa, solo che quando vai a IMPOSTARE da MascheraLivelloSuperiore dentro CasellaCombinataMascheraInferiore, anzichè scrivere
    Forms!NomeMascheraPrincipale!NomeSottomaschera!NomeCasellaCombinata
    scriverai
    Forms!NomeMaschera!NomeCasellaCombinata
    tutto il resto deve andare di conseguenza.
  • Re: Scrivere in una ComboBox, ma dopo non trovare il valore nell'elenco

    OsvaldoLaviosa ha scritto:


    ProgrammD ha scritto:


    1. Solo in elenco: Si
    2. Consenti modifiche a elenco: Si
    3. Eredita elenco valori: Si
    4. Mostra solo valori origine riga: No
    1.: OK
    Le altre proprietà, conviene lasciare i valori di default...io manco li conosco.

    DoCmd.OpenForm "PRODOTTI",,,,, acFormAdd, acDialog, NewData
    Hai messo 5 virgole, quando ce ne vogliono 4. Se scrivi il codice VBA, digitando carattere per carattere, servendoti dell'intellisense, queste cose saltano fuori automaticamente.

    ProgrammD ha scritto:


    nel mio database, le maschere "ORDINE ACQ", "PRODOTTI" e "Ordine Acquisto" non hanno sottomaschere.
    Il problema in generale non è se si sta lavorando su maschera o sottomaschera. La logica è la stessa, solo che quando vai a IMPOSTARE da MascheraLivelloSuperiore dentro CasellaCombinataMascheraInferiore, anzichè scrivere
    Forms!NomeMascheraPrincipale!NomeSottomaschera!NomeCasellaCombinata
    scriverai
    Forms!NomeMaschera!NomeCasellaCombinata
    tutto il resto deve andare di conseguenza.
    Ho aggiornato il primo codice VBA. Ora funziona, mi chiede se voglio inserire un nuovo valore nel campo NomeProdotto, dico di Si e mi si apre la maschera PRODOTTI con solo il nuovo valore. Poi quando cerco di chiudere la maschera per tornare alla maschera principale, escono una serie di errori, poi si bloccano tutte le macro, e poi quando torno alla maschera principale, mi ritrovo il nuovo valore nella combo-box.
    Diciamo che alla fine il valore entra nella combo-box ma vorrei togliere tutti quegli errori.
    Il secondo codice VBA, credo che vada migliorato, dato che mi da come errore:
    Errore di compilazione: La variabile non è ancora stata crerata in questo contesto

    P.S.: nella maschera PRODOTTI ho un pulsante "Indietro" che mi riporta alla maschera principale "Ordine Acquisto" ed ha questa macro:
    - ChiudiFinestra: Salva: Chiedi conferma
    - ApriMaschera: Nome maschera: Ordine Acquisto
    Visualizzazione: Maschera
    Modalità finestra: Normale
    - RieseguiQuery: Nome controllo:
  • Re: Scrivere in una ComboBox, ma dopo non trovare il valore nell'elenco

    Non posso sapere dove e come nascono i tuoi errori se non descrivi dettagliatamente tutto (codici, oggetti, ecc...).
    Dici di usare sia macro sia VBA. Io ho indicato 2 soluzioni OR...ma non mischiare le carte...
  • Re: Scrivere in una ComboBox, ma dopo non trovare il valore nell'elenco

    Grazie per l'interessamento e per l'aiuto.
    Ho risolto, togliendo gli errori, con le istruzioni riportate a questo link: https://support.microsoft.com/it-it/kb/19752


    P.S.: come si fa a indicare che la discussione è RISOLTA ? C'è qualche pulsante, o lo devo scrivere io nel testo ?
Devi accedere o registrarti per scrivere nel forum
11 risposte