Mi sono impigliato nell'evento "non in elenco" di Access

di il
21 risposte

Mi sono impigliato nell'evento "non in elenco" di Access

Ho costruito un piccolo database a mio uso e consumo e per divertimento. Consiste in due tabelle: tbAttori e tbFilm e sono collegate in una relazione M-M.

Poi costruito due maschere una che mostra i dati dell'attore e con sottomaschera che elenca i film interpretrati, l'altra maschera al contrario mostra i dati del film e nella sottomaschera gli attori del cast.

In entrambe le sottomaschere ho impiegato combobox dal quale scegliere l'attore o il film a seconda di quale maschera sto usando.

Ebbene, nella maschera Attore+sfFilm posso scegliere il film e all'evento non in elenco il titolo si aggiunge regolarmente nella relativa tabella mentre nella frFilm+sfAttore il meccanismo "non in elenco" non funziona.

Qualcuno è disposto a farmi capire perché? Grazie

Private Sub KEidAttore_NotInList(NewData As String, Response As Integer)
Response = acDataErrAdded
Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("tbAttori", dbOpenDynaset)
rs.AddNew
'la stringa attore è costituita dal cognome e dal nome separati da *
'quindi si individua la pos(izione) di * e siestrae il cognome
pos = InStr(NewData, "*")
cogn = Left(NewData, pos - 1)
'e poi il nome
nom = Mid(NewData, pos + 1)
' e ora si aggiornano i relativi campi
rs!cognome = cogn
rs!nome = nom
rs.Update
rs.Close
Set rs = Nothing
Response = acDataErrContinue
Set db = Nothing
End Sub

NSantini

21 Risposte

  • Re: Mi sono impigliato nell'evento "non in elenco" di Access

    Elenca le tabelle e i relativi campi.

    mostra il codice lato maschera Attore+sfFilm e il codice lato frFilm+sfAttore.

  • Re: Mi sono impigliato nell'evento "non in elenco" di Access

    TbAttori: idAttore, cognome, nome, natoil, sesso, e un campo "allegati" dove inserisco la foto (in grassetto chiave primaria)

    tbFilm: idFilm, Titolo

    tbMM: KEidAttore, KEidfilm (dove KE sta per key esterna)

    Codice "non in elenco" sulla combo della Attore-sfFilm e questa funziona regolarmente

    Private Sub KEidFilm_NotInList(NewData As String, Response As Integer)
    Response = acDataErrAdded
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Set db = CurrentDb
    Set rs = db.OpenRecordset("tbFilm", dbOpenDynaset)
    rs.AddNew
    rs!Titolo = NewData
    rs.Update
    rs.Close: Set rs = Nothing
    Set db = Nothing
    End Sub

    ora segue il codice della fr Film-sfAttori e questa invece toppa da qualche parte.

    
    Private Sub KEidAttore_NotInList(NewData As String, Response As Integer)
    Response = acDataErrAdded
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Set db = CurrentDb
    Set rs = db.OpenRecordset("tbAttori", dbOpenDynaset)
    rs.AddNew
    'la stringa attore è costituita dal cognome e dal nome separati da *
    'quindi si individua la pos(izione) di * e si estrae il cognome
    pos = InStr(NewData, "*")
    cogn = Left(NewData, pos - 1)
    'e poi il nome
    nom = Mid(NewData, pos + 1)
    ' e ora si aggionano i relativi campi
    rs!cognome = cogn
    rs!nome = nom
    rs.Update
    rs.Close
    Set rs = Nothing
    Response = acDataErrContinue
    Set db = Nothing
    End Sub

    le join delle relazioni sono: idAttore-KEidAttore  e idFilm-KEidFilm

    Credo di averti dato tutte le informazioni e soprattutto spero di essere stato chiaro

    Grazie per l'aiuto, Saluti

    NSantini

  • Re: Mi sono impigliato nell'evento "non in elenco" di Access

    Innanzitutto perchè non dichiariu le variabili...? Perchè non usi "OPTION EXPLICIT"...? Questo ovviamente ti metterà in difficoltà...!

    Cosa intendi per "NON FUNZIONA"...? Quale sarebbe l'effetto che ti fa dire che non funziona...?

    Se intendi che non aggiorna la Combo è ovvio si così, non la ricarichi dopo aver aggiunto... serve un Requery non è automatico... 

    Se intendi che non inserisce il RECORD... non ci credo molto, quel codice via da erorri grossolani, visibili solo con il Debug, anche se non è bellissimo e non ha la corretta dichiarazione delle variabili, fa un ADDNEW dei dati separati da "*"... direi 2 righe in croce.

    Per verificare in modo semplice fai generare l'evento, chiudi la maschera, vai ad aprire la Tabella [tbAttori] e verifica se il nuovo dato è stato inserito... se così riapri la maschera e come per magia la combo sarà aggiornata, ... ed il problema era la Query non aggiornata come premesso.

    Prova questa versione che è uguale solo più pulita

    Private Sub KEidAttore_NotInList(NewData As String, Response As Integer)
    	Dim Items	As Variant
    
    	If Len(NewData)>0 then
    		Items=split(Replace(NewData,"'","''"),"*")
    		DbEngine.Execute "INSERT INTO tbAttori (cognome,nome) Values ('" & Items(0) & "','" & Items(1) & "');"
    				
    		Me!KEidAttore.Requery
    		Response = acDataErrAdded
    	Else
    		Response = acDataErrContinue
    	End if
    End Sub
  • Re: Mi sono impigliato nell'evento "non in elenco" di Access

    Grazie per la risposta e grazie anche per il rimprovero che accetto. La mia giustificazione è che non sono un programmatore professionista, nella vita ho fatto tutt'altro lavoro, quello che come "programmatore" (parola molto impegnativa per me) ho imparato a fare l'ho imparato da autodidatta leggiucchiando qua e là e come già affermato programmo Access solo per mio uso e per divertimento.

    Per non funziona intendo che Access mi dice tramite popup che "il testo immesso non corrisponde a una voce dell'elenco"  e mi suggerisce di inserire una delle voci in elenco e quindi non può registrare il record

    Ho sostituito il codice che hai postato con quello da me creato e accade che si blocca su:

    DBEngine.Execute  

    e viene fuori un popup che dice:

    Errore di compilazione:  Impossibile trovare il metodo o il membro dei dati

    Non so darti altre indicazioni. Ancora grazie, ciao

    NSantini

  • Re: Mi sono impigliato nell'evento "non in elenco" di Access

    22/07/2025 - nsantini ha scritto:

    Grazie per la risposta e grazie anche per il rimprovero che accetto. La mia giustificazione è che non sono un programmatore professionista, nella vita ho fatto tutt'altro lavoro, quello che come "programmatore" (parola molto impegnativa per me) ho imparato a fare l'ho imparato da autodidatta leggiucchiando qua e là e come già affermato programmo Access solo per mio uso e per divertimento.

    Se vuoi usare lo strumento programmatore o no... serve conoscere come si usa e si impara studiandolo, sia per usarlo correttamente ma soprattutto per confrontarsi con chi è più esperto... io non conosco altri modi.

    Per non funziona intendo che Access mi dice che cioò che ho inserito nella combo non è in elenco e quindi non può registrare il record

    Ho sostituito il codice che hai postato con quello da me creato e accade che si blocca su:

    DBEngine.Execute  

    e viene fuori un popup che dice:

    Errore di compilazione:  Impossibile trovare il metodo o il membro dei dati

    Avevo commesso un errore di memoria... questa sintassi è quella corretta...

    DbEngine(0)(0).Execute "INSERT INTO tbAttori (cognome,nome) Values ('" & Items(0) & "','" & Items(1) & "');"

    Non so darti altre indicazioni. Ancora grazie, ciao

    NSantini

    Se non funziona ancora ed hai erorri di Conflitto di accessibilità in contemporanea... allora hai un problema di natura di strutturazione di accesso ai dati... e su questo è complicato darti indicazioni...

  • Re: Mi sono impigliato nell'evento "non in elenco" di Access

    Certamente hai ragione: bisogna studiare! Ma a 70anni i neuroni non ne vogliono sapere di conoscere novità: ho lavorato come infermiere per 43 anni, ho imparato a giocare scacchi e Access l'ho sempre visto come una chimera e mi sono sempre arrabbattato. E poi sono convinto che per conoscere Access bisognerebbe frequentare corsi seri e frequentare persone che se ne intendono veramente. Non è il mio caso, non vivo in una grande città né ci abito vicino: abito in un paesino della periferia sud della Sicilia. Veniamo al mio DB

    Ho sostituito la riga che hai postato e questo è il risultato: viene fuori un popup con scritto

    Errore di run-time '2118': È necessario salvare il campo corrente prima di eseguire l'azione RieseguiQuery

    sicuramente sbaglio, ma credo a sto punto di trasferire la riga:

     Me!KEidAttore.Requery

    prima della riga 

    End Sub

    Ancora grazie, apprezzo che un professionista dia spago a un ultra diletante come me. Ciao

    NSantini

  • Re: Mi sono impigliato nell'evento "non in elenco" di Access

    >> poi sono convinto che per conoscere Access bisognerebbe frequentare corsi seri

    .

    Si e no. Un corso e' utile, MA spesso i corsi suppongono che lo studente abbia gia' le basi di qualcosa, che tu potresti non avere.

    Devi smontare la conoscenza di Access in diverse parti:

    1. come si progetta un database, cosa e' una tabella una colonna un record, un campo. Si chiama 'teoria relazionale dei dati, ed e' abbastanza semplice. Acquisisci concetti come selezione, proiezione, join, chiave primaria, chiave esterna, normalizzazione, tipi di dato e poco altro. Wikipedia e' piu' che sufficente. Per le forme normali, ti bastano quelle piu' semplici, le altre sono per casi 'arzigogolati'
    2. programmazione procedurale. Ci sono pochi concetti anche qui: sequenza, ciclo, condizione, funzione, variabili, parametri, strutture dati, tipi di dato
    3. interfaccia utente e programnazione basata su 'eventi': premi un tasto, selezioni un elemento in una combo, ecc
    4. Model View Controller: il meccanismo standard per fare una interfaccia utente mantenento il CONTROLLO delle iterazioni. Senza questo dopo un po' diventi matto.

    .

    Il consiglio standard e', che poi e' quello seguito da ogni programmatore: quando qualcosa non fa quello che ti aspetti, sospendi tutto e riparti da zero con un progettino MINIMALE che ha l'unico scopo di investigare come funziona la funzionalita' che ti serve.

    Io ho decinaia di questi mini progettini, a volte composti da un singolo file sorgente e da poche righe di codice.

    Una volta diventato confidente con le varie parti separatamente, metterle assieme e' un semplice gioco di Lego.

    L'altra cosa da imparare (ma ci vuole tempo) e': la tua applicazione deve essere composta da pezzettini/moduletti/funzioni piu' piccoli che hai gia' testato e sai per certo che funzionano.

    NON scrivere blocchi giganteschi di codice, da centinaia di righe. Il limite dovrebbe essere 10/20/50 righe. Una funzione da 100 righe ootrebve essere composta da 3 righe che sono chiamate a funzioni ed ogni funzione ha 30 righe

  • Re: Mi sono impigliato nell'evento "non in elenco" di Access

    Già, "lo studente abbia gia' le basi di qualcosa" quindi devi fare un corso di base e poi continuare con corsi più impegnativi. Io ho scoperto Access all'età di oltre 30anni, lavorando in ospedale sentivo la necessità di archiviare ed elaboare le informazioni e lì mi sono innamorato di Access. Quindi non l'ho mai conosciuto a fondo perché come ho già scritto ho fatto altro nella mia vita e in più ho coperto anche gli scacchi e ho studiato anche quelli... senza mai essere un eccellente giocatore. Spesso mi sono rivolto agli amici dell'ex newsgroup di google it.comp.appl.access che non esiste più (anche Alex ha frequentato quel gruppo) e ci ho ricavato degli insegnamenti. Questo è il mio livello di conoscenza e per le piccole cose che realizzo ogni tanto mi rivolgo a chi ne sa molto più di me sperando nel buon cuore di chi mi vuole aiutare e nel frattempo dandomi altri spunti di conoscenza di Access. Grazie a tutti

    NSantini

  • Re: Mi sono impigliato nell'evento "non in elenco" di Access

    22/07/2025 - nsantini ha scritto:

    Certamente hai ragione: bisogna studiare! Ma a 70anni i neuroni non ne vogliono sapere di conoscere novità: ho lavorato come infermiere per 43 anni, ho imparato a giocare scacchi e Access l'ho sempre visto come una chimera e mi sono sempre arrabbattato. E poi sono convinto che per conoscere Access bisognerebbe frequentare corsi seri e frequentare persone che se ne intendono veramente. Non è il mio caso, non vivo in una grande città né ci abito vicino: abito in un paesino della periferia sud della Sicilia. Veniamo al mio DB
    ....
    Ancora grazie, apprezzo che un professionista dia spago a un ultra diletante come me. Ciao

    Non sono professionista tanto meno di Access, anche se posso sicuramente vantare una conoscenza ben più che confrontabile su questo strumento, mi occupo di tutt'altro nel lavoro... non abito in una grande città ma un paese di provincia, non ho fatto corsi e non sono un ragazzino, ormai siamo oltre gli anta... purtroppo o per fortuna, come vedi è questione di punti di vista... o di abitudini.

    Ho sostituito la riga che hai postato e questo è il risultato: viene fuori un popup con scritto

    Errore di run-time '2118': È necessario salvare il campo corrente prima di eseguire l'azione RieseguiQuery

    sicuramente sbaglio, ma credo a sto punto di trasferire la riga:

     Me!KEidAttore.Requery

    prima della riga 

    End Sub

    NSantini

    Secondo me hai qualche errore strutturale/concettuale nella tua Form...

    Scaricati questo esempo che trovi in questo LINK è veramente BASICO, solo la Combo e ti accorgerai che funziona perfettamente... il codice è esattamente quello suggerito... nessun errore anomalia o altro, quando inserisci un Valore NON IN LISTA ti chiede se aggiungerlo e lo aggiunge...!

    Questo ora dovrebbe servirti per capire cosa hai inserito o come hai gestito i dati nel tuo caso, rispetto alla Soluzione funzionante tanto da generare l'errore...!

    https://www.access-programmers.co.uk/forums/attachments/articulo_cinco-accdb.106334/

  • Re: Mi sono impigliato nell'evento "non in elenco" di Access

    22/07/2025 - nsantini ha scritto:

    'la stringa attore è costituita dal cognome e dal nome separati da * 'quindi si individua la pos(izione) di * e si estrae il cognome

    A me sembra una scelta molto infelice quella di separare Cognome e Nome con asterisco, molto meglio la classica virgola.
    Sebbene @Alex prova a metterci qualche pezza con

    Items=split(Replace(NewData,"'","''"),"*")

    ...mah! non saprei.
    Prova a cambiare carattere di separazione (es. virgola).

    Poi, non capisco perché gestisci NotInList con i recordset. Prova a leggere qui

    ApriMaschera superiore e Requery.docx

    il tuo caso risiede nello Scenario 2, dove:
    A = TbFilm
    B = TbAttori
    C = TbMM

  • Re: Mi sono impigliato nell'evento "non in elenco" di Access

    22/07/2025 - OsvaldoLaviosa ha scritto:

    22/07/2025 - nsantini ha scritto:

    'la stringa attore è costituita dal cognome e dal nome separati da * 'quindi si individua la pos(izione) di * e si estrae il cognome

    A me sembra una scelta molto infelice quella di separare Cognome e Nome con asterisco, molto meglio la classica virgola.
    Sebbene @Alex prova a metterci qualche pezza con

    Items=split(Replace(NewData,"'","''"),"*")

    ...mah! non saprei.
    Prova a cambiare carattere di separazione (es. virgola).

    Non credo tu abbia capito bene cosa ho fatto... per me il carattere di separazione, è ininfluente, userà lui quello che vuole... quello che ho scritto è per semplificare la separazione e per evitare il problema degli APICI nei Cognomi... che poi metta [*] o [,] o altro è solo questione di procedura di utilizzo.

    Poi, non capisco perché gestisci NotInList con i recordset. Prova a leggere qui

    ApriMaschera superiore e Requery.docx

    il tuo caso risiede nello Scenario 2, dove:
    A = TbFilm
    B = TbAttori
    C = TbMM

    Perchè non serve, con una riga di INSERT fai tutto...!

  • Re: Mi sono impigliato nell'evento "non in elenco" di Access

    A questo punto, per aiutarti, forse è più semplice che posti un file di esempio.

  • Re: Mi sono impigliato nell'evento "non in elenco" di Access

    Vogliate perdonarmi, ma mi sono incaponito su una cosa.

    Perché la rourine 

    Private Sub KEidAttore_NotInList(NewData As String, Response As Integer)
    Response = acDataErrAdded
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim ArrNomi() As String
    Set db = CurrentDb
    Set rs = db.OpenRecordset("tbAttori", dbOpenDynaset)
    rs.AddNew
    rs!cognome = NewData
    rs.Update
    rs.Close
    Set rs = Nothing
    Set db = Nothing
    End Sub

    funziona senza problemi, mentre se al posto di «rs!cognome = NewData» scompongo come di seguito non funziona?

    ArrNomi = Split(NewData, ",")
    rs!cognome = ArrNomi(0)
    rs!nome = ArrNomi(1)
    

    O meglio, funziona a metà: salva il record ma si ferma dandomi il messaggio d'errore che il testo immesso non è in elenco.

  • Re: Mi sono impigliato nell'evento "non in elenco" di Access

    Ecco perchè serve un file di esempio, per capire effetivamente che cosa stai facendo e non doverlo immaginare.

Devi accedere o registrarti per scrivere nel forum
21 risposte