Aiuto sull'evento NotInList associato ad una combobox

di il
12 risposte

Aiuto sull'evento NotInList associato ad una combobox

Ciao a tutti,
sto cercando in internet ed in altri forum la soluzione a quanto non capisco sull'evento NOTINLIST,
che ho associato ad una combobox di una maschera.
Ho 2 tabelle:
1) una tblNomi che contiene i nomi dei giochi
2) una tblGiochi che tra i campi ha il nome del gioco (preso dalla tabella percedente tramite query che uso per avere i nomi ordinati)..questa tabella è l'origine dati della form con la combobox 'incriminata'

Ho scritto il seguente codice preso un pò qua ed un pò la...

Private Sub Nome_NotInList(NewData As String, Response As Integer)
Dim RS As Recordset
Dim IDtblNomi As Integer
Dim Controllo As Control
Dim strSQL

Set Controllo = Me!Nome
Controllo.Undo
If MsgBox("Valore non in elenco. Aggiungerlo?", vbOKCancel) = vbOK Then
'DoCmd.RunCommand acCmdUndo

'***** PARTE DI CODICE CHE HO RECUPERATO OGGI, IN SOSTITUZIONE DELL'USO DEL RECORDSET
strSQL = "INSERT INTO tblNomi([Nome]) " & _
"VALUES ('" & NewData & "');"
DoCmd.SetWarnings False
DoCmd.RunSQL strSQL
DoCmd.SetWarnings True
Response = acDataErrAdded


'***** CODICE ORIGINALE PER L'AGGIUNTA DEL NUOVO RECORD
' Set RS = CurrentDb.OpenRecordset("tblNomi")
' With RS
' .AddNew
' !Nome = NewData
' IDtblNomi = !IDtblNomi
' .Update
' End With
' If Asc(Left(NewData, 1)) < 65 Then
' CartellaAppartenenzaGioco = "#"
' Else
' CartellaAppartenenzaGioco = UCase(Left(NewData, 1))
' End If
' Response = acDataErrAdded
Else
Response = acDataErrContinue
End If

End Sub

Funziona tutto alla meraviglia, sia usando la parte 'nuova' (usando strSQL) che la parte 'vecchia' (usando il recordset ed editandolo)....quando inserisco una voce che non è in elenco questa viene aggiunta alla tabella di origine dati della combobox (tblNomi).
Nella seconda tabella (tblGiochi) compare il nuovo record che ha il nome appena inserito, oltre agli altri dati. Quindi tutto OK...
Quello che non capisco è: come mai se cancello il nuovo record dalla tblGiochi (che di fatto riceve i dati), mi sparisce anche il record del nome dalla tblNomi (che di fatto fornisce i dati)?

Proprio non capisco
Se poteste darmi qualche spiegazione vi ringrazio
Pierpaolo

12 Risposte

  • Re: Aiuto sull'evento NotInList associato ad una combobox

    Io non so usare il VBA, ma fiuto di poter risolvere il problema diversamente (macro). In verità non ho capito perchè tu hai 2 tabelle Nomi (che sono i nomi dei Giochi) e Giochi...sembra che parlino lo stesso linguaggio. Potresti elencare esattamente tutti i campi di entrambe le tabelle, loro relazione e perchè c'è la relazione?
  • Re: Aiuto sull'evento NotInList associato ad una combobox

    Chiedo scusa, forse la spiegazione è stata un poco farraginosa...
    ho 2 tabelle
    1) tblNomi: con i campi: IDtblNomi, Nome
    2) tblGiochi: con i campi: IDtblGiochi, NomeGioco (campo ricerca con origine una query basata su tblNomi: la qquery mi serve solo per avere i nomi ordinati), Anno, SoftwareHouse, Lingua ... ed altri campi ininfluenti
    Tra le due tabelle non ci sono relazioni, nel senso che la schermata delle relazioni del database è vuota.

    Ho un form che ha origine dati la tblGiochi. In questo form ho una combobox per la selezione del nome del gioco da associare al record della tblGiochi (la combo ha origine dati il campo nomeGioco della tblGiochi).
    Associato a questa combobox c'è il codice vba che ho indicato nel messaggio precedente.

    Scusate ma sono un emerito dilettante e magari non mi rendo pienamente conto di come devo esporre la questione.

    Grazie
    Pierpaolo
  • Re: Aiuto sull'evento NotInList associato ad una combobox

    Io continuo a non capire perchè hai 2 tabelle. La mia testa ragiona così: tabella Giochi con i seguenti campi:
    IDGioco
    NomeGioco
    Anno
    SoftwerHouse
    Lingua

    1|Tartarughe ninja|2000|Nintendo|italiano|
    2|Cars|2003|Disney|english|
    3|Tennis revolution|2008|Nintendo|italiano|

    Che cosa deve andare a pescare, con casella combinata, la tabella Giochi da Nomi? Perchè lo fa se non ce n'è bisogno?
  • Re: Aiuto sull'evento NotInList associato ad una combobox

    Tra i campi di tblGiochi ci sono 6 campi per eventuali altri nomi con cui è conosciuto il gioco, quindi per popolarli pesco sempre dalla tblNomi
  • Re: Aiuto sull'evento NotInList associato ad una combobox

    thetmd ha scritto:


    Tra i campi di tblGiochi ci sono 6 campi per eventuali altri nomi con cui è conosciuto il gioco, quindi per popolarli pesco sempre dalla tblNomi
    Capisco, conosco molto bene questo problema, ma non va gestito così. I tuoi 6 campi potrebbero non bastare e, comunque sia, sei di fronte un problema di molti-a-molti.
    Potresti prevedere una tabella NomiMultipli con i seguenti campi:
    IDNomeMultiplo
    IDNome1
    IDNome2
    relazionare 2 volte la tabella Nomi con NomiMultipli e, per ogni Nome dalla tabella Nomi, associ i molti altri Nomi collegati.
    Es. il gioco della Campana si chiama anche Mondo...invento altri nomi io adesso: Saltarello numerato, Tira e salta, Numeri per terrra.
    Dalla tabella Nomi al nome Campana, dovrai associare i record nella tabella NomiMultipli così:
    IDNomeMultiplo | Nome1 | Nome2 |
    1 | Campana | Mondo
    2 | Campana | Saltarello numerato
    3 | Campana | Tira e salta
    4 | Campana | Numeri per terra

    Dovresti poi fare la stessa cosa per tutti gli altri nomi equivalenti. Penso che questa sia la strada ortodossa da perseguire.

    Io ne avrei inventata un'altra, leggermente più sbrigativa, usando sempre la tabella NomiMultipli.
    Di fronte a molti Nomi equivalenti, ne scelgo uno che considero il più famoso, il più usato, altrimenti lo scelgo io arbitrariamente che funge da NomePrincipale. Tutti gli altri sono Nomi Secondari. Bisogna avere cura di compilare sempre, anche quando i Nomi Multipli non sussistono, la tabella NomiMultipli con lo stesso Nome in Nome1 e Nome2. Poi, se per esempio Campana è il Titolo Principale, compilo solo Nome1=Campana e i restanti su Nome2.
    Opportune query dovranno saper gestire il tutto per sapere notizie l'uno dell'altro con i restanti campi delle tabelle madri...ecc...il discorso è un po' lungo e ingarbugliato...mi fermerei qui.
  • Re: Aiuto sull'evento NotInList associato ad una combobox

    OsvaldoLaviosa ha scritto:


    Capisco, conosco molto bene questo problema, ma non va gestito così. I tuoi 6 campi potrebbero non bastare e, comunque sia, sei di fronte un problema di molti-a-molti.
    Potresti prevedere una tabella NomiMultipli con i seguenti campi:
    IDNomeMultiplo
    IDNome1
    IDNome2
    relazionare 2 volte la tabella Nomi con NomiMultipli e, per ogni Nome dalla tabella Nomi, associ i molti altri Nomi collegati.
    Es. il gioco della Campana si chiama anche Mondo...invento altri nomi io adesso: Saltarello numerato, Tira e salta, Numeri per terrra.
    Dalla tabella Nomi al nome Campana, dovrai associare i record nella tabella NomiMultipli così:
    IDNomeMultiplo | Nome1 | Nome2 |
    1 | Campana | Mondo
    2 | Campana | Saltarello numerato
    3 | Campana | Tira e salta
    4 | Campana | Numeri per terra
    La soluzione della tabella NomiMultipli la prendo in considerazione, è una soluzione più ortodossa della mia attuale e mi aiuta a capire come impostare meglio il database (anche se devo dire che non conto di compilare tutti e sei i campi che al momento ho a disposizione...la maggior parte dei giochi in lista è catalogato con il suo nome inglese) considerato che sto tirandolo su per imparare a crearmi database che potrebbero tornarmi utili a lavoro

    Ma senza voler sembrare ingrato per l'aiuto che mi stai dando come si collega questo con la mia domanda iniziale?

    Grazie
    Pierpaolo
  • Re: Aiuto sull'evento NotInList associato ad una combobox

    thetmd ha scritto:


    Quello che non capisco è: come mai se cancello il nuovo record dalla tblGiochi (che di fatto riceve i dati), mi sparisce anche il record del nome dalla tblNomi (che di fatto fornisce i dati)?
    Come avresti costruito la relazione o le relazioni fra le tabelle Nomi e Giochi?

    thetmd ha scritto:


    Tra le due tabelle non ci sono relazioni, nel senso che la schermata delle relazioni del database è vuota.
    Sarebbe importantissimo se le due tabelle Nomi e Giochi fossero correlate.

    Il discorso ha preso tutta un'altra piega perchè, se non c'è una struttura coerente alla base, si possono avere effetti indesiderati. Per quanto hai cercato di descrivere al meglio il tuo scenario, almeno io che sono duro di comprendonio, se non vedo la lista completa di tutti i campi di tutte le tabelle con le relazioni, non riesco a venirne a capo. Ti consiglio, oltre tutto, a fornire alcuni record di esempio, così inquadriamo anche lo spirito logico che ti ha spinto a costruire il tutto nella tua maniera.
  • Re: Aiuto sull'evento NotInList associato ad una combobox

    Ti ringrazio davvero molto Osvaldo per il tempo che mi stai dedicando...
    'credo' di iniziare a capire dove sto sbagliando...e mi accorgo adesso che le tue risposte hanno lo scopo di portarmi a creare un database che sia corretto dalle fondamenta (cosa che al momento avviamente non è)

    Di seguito riporto alcuni records delle tabelle
    (non riesco ad allegare alcun tipo di file (txt, rar o estensione inventata... )

    Tabella TBLNOMI
    IDtblNomi | Nome
    3884 | Galilei 2 The Adventure Island
    3885 | Galilei 2 Seikkailujen saari
    3886 | Galilei 1 ja kadonneet lelut
    3887 | Galilei 1 and the Lost Toys

    Tabella TBLGIOCHI
    IDtblGiochi | Nome | AKA1 | AKA2 | AKA3 | AKA4 | SWHouse | Anno | ITA | ENG | DEU | FRA | ESP | JAP | RUS | ALTRO | Note
    5793 | Galilei 1 ja kadonneet lelut | Galilei 1 and the Lost Toys | | | | Mediayhtio Sansibar Oy | 1997 | Falso | Falso | Falso | Falso | Falso | Falso | Falso | Vero | -
    5792 | Galilei 2 Seikkailujen saari | Galilei 2 The Adventure Island | | | | Mediayhtio Sansibar Oy | 2000 | Falso | Falso | Falso | Falso | Falso | Falso | Falso | Vero | -

    Nella TBLGIOCHI compaiono i nomi dei giochi ma di fatto sono associati gli ID di TBLNOMI

    Da quel che ho capito una volta create le tabelle avrei dovuto relazionarle per evitare questo problema
    (in attesa di una tua cortese risposta provo a fare dei test con le relazioni)

    Grazie
    Pierpaolo
  • Re: Aiuto sull'evento NotInList associato ad una combobox

    thetmd ha scritto:


    Tabella TBLNOMI
    IDtblNomi | Nome
    3884 | Galilei 2 The Adventure Island
    3885 | Galilei 2 Seikkailujen saari
    3886 | Galilei 1 ja kadonneet lelut
    3887 | Galilei 1 and the Lost Toys

    Tabella TBLGIOCHI
    IDtblGiochi | Nome | AKA1 | AKA2 | AKA3 | AKA4 | SWHouse | Anno | ITA | ENG | DEU | FRA | ESP | JAP | RUS | ALTRO | Note
    5793 | Galilei 1 ja kadonneet lelut | Galilei 1 and the Lost Toys | | | | Mediayhtio Sansibar Oy | 1997 | Falso | Falso | Falso | Falso | Falso | Falso | Falso | Vero | -
    5792 | Galilei 2 Seikkailujen saari | Galilei 2 The Adventure Island | | | | Mediayhtio Sansibar Oy | 2000 | Falso | Falso | Falso | Falso | Falso | Falso | Falso | Vero | -

    Nella TBLGIOCHI compaiono i nomi dei giochi ma di fatto sono associati gli ID di TBLNOMI
    Questa descrizione chiarisce tutto.
    Io direi di rivedere un po' tutta la stuttura. Queste sono le tabelle, come le vedrei io:

    Nomi
    IDNome (contatore, chiave primaria)
    Nome
    Note (memo)

    Giochi
    IDGioco (contatore, chiave primaria)
    IDNome1 (numerico)
    IDNome2 (numerico)
    SWHouse (testo)
    Anno
    Lingua (testo)
    Note

    SWHouses
    SWHouse (testo, chiave primaria)

    Lingue
    Lingua (testo, chiave primaria)

    Relazioni:
    Nomi.IDNome uno-a-molti con Giochi.IDNome1
    Nomi.IDNome uno-a-molti con Giochi.IDNome2 (quando la imposti, Access ti pone una domanda alla quale devi rispondere che vuoi impostare una NUOVA relazione, mi pare devi rispondere No)
    SWHouses.SWHouse uno-a-molti con Giochi.SWHouse
    Lingue.Lingua uno-a-molti con Giochi.Lingua

    Osservazioni:
    1. Ti suggerisco di dare un nome plurale a nome tabella, mentre un nome singolare a ogni nome campo.
    2. Spero che tu comprenda bene l'utilità della tabella SWHouses e la relativa relazione con Giochi.
    3. Non ha senso avere tanti campi con le varie lingue, ne basta uno e indicare la Lingua corrispondente.
    4. Come al punto 3. non serve avere tutti quegli AKA. Questa questione si può risolvere così:
    Diamo innanzitutto il giusto significato ai campi IDNome1 e IDNome2 (li ho definiti così per brevità). Il loro significato è più profondo, significherebbero IDNomePrincipale e IDNomeSecondario, o meglio IDNomeRelativo perchè relativo al resto dei campi. Di fronte a Nomi Multipli, devi imporre che uno sia più importante degli altri (NomePrincipale), visto che tratti le varie lingue potresti scegliere l'Italiano se preferisci essere partigiano, oppure l'Inglese se preferisci essere più internazionale. Entrambi i campi IDNome1 e IDNome2 devono essere obbligatoriamente compilati, anche quando non sussiste la multiplicità del Nome. In tale caso, devi accuratamente compilare lo stesso valore in entrambi i campi.
    5. Ti consiglio di aggiungere un campo Note (memo) alla tabella Nomi, dove dentro potresti scriverci importanti annotazioni proprio su come dichiarare la relativa importanza di un Nome rispetto ad altri, magari indicando dei rinvii (un po' come si usa per il dizionario) a tutti i Nomi corrispondenti.
  • Re: Aiuto sull'evento NotInList associato ad una combobox

    Scusa ma ho alcuni dubbi su quanto hai scritto nell'ultimo messaggio

    1) la tabella NomiMultipli di cui mi hai parlato in precedenza corrisponderebbe alla tabella Giochi (dell'ultimo messaggio)?
    2) La tabella giochi così impostata dovrebbe avere, se capisco bene, 3 record per il gioco Beppe se questo è conosciuto con almeno altri 2 nomi (tipo Gino e Franco)...dovrei compilare i campi SWHouse ed anno in maniera identica per le coppie Beppe-Beppe, Beppe-Gino e Beppe-Franco mentre il campo lingua sarebbe differente per ogni coppia (visto che a nomi differenti corrisponde, di norma, lingua differente)...Attualmente ho 6 campi boolean per le lingue proprio per poter settare più lingue in contemporanea per lo stesso record/gioco (senza contare che alcuni giochi potrebbero avere stesso titolo ma più lingue....) (al momento il campo lingua 'altro' mi permette di indicare un lingua che non è tra le principali ITA | ENG | DEU | FRA | ESP | JAP | RUS)

    adesso i mea culpa (perchè sembra che ti voglia far pedere tempo)
    avendo avuto problemi con l'allegato del mio precedente messaggio mi son fatto prendere dalla fretta ed ho inserito l'esempio dei record delle tabelle nomi e giochi senza ricordare che mi avevi chiesto le indicazioni di TUTTE le tabelle

    La tabella tblSWHouses esiste già con i campi
    IDtblSWHouses (contatore, chiave primaria)
    SWHouse (testo)

    c'è anche la tblAnno
    IDtblAnno (contatore, chiave primaria)
    Anno (numero)

    Ho riguardato la schermata delle relazioni ed ho avuto un flash: ad inizio progetto avevo creato le relazioni, ma poi avevo cancellato tutto (ovvero avevo cancellato le tabelle dalla schermata) credendo di aver cancellato anche le relazioni. Inserendo le tabelle ho visto che le relazioni sono rimaste

    tblNomi.IDtblNomi uno-a-uno tblGiochi.Nome
    tblSWHouses.IDtblSWHouses relazionato con tblGiochi.SWHouse
    (nessuna integrità referenziale: c'è un errore che devo correggere: non so bene come ma nella tblGiochi ci devono essere swhouse non presenti nella tblSWHouses)
    tblAnno.Anno uno-a-molti tblGiochi.Anno

    Scusa per tutte le inesattezze
    Grazie
    Pierpaolo
  • Re: Aiuto sull'evento NotInList associato ad una combobox

    thetmd ha scritto:


    1) la tabella NomiMultipli di cui mi hai parlato in precedenza corrisponderebbe alla tabella Giochi (dell'ultimo messaggio)?
    Esatto

    thetmd ha scritto:


    2) La tabella giochi così impostata dovrebbe avere, se capisco bene, 3 record per il gioco Beppe se questo è conosciuto con almeno altri 2 nomi (tipo Gino e Franco)...dovrei compilare i campi SWHouse ed anno in maniera identica per le coppie Beppe-Beppe, Beppe-Gino e Beppe-Franco mentre il campo lingua sarebbe differente per ogni coppia (visto che a nomi differenti corrisponde, di norma, lingua differente)
    OK

    thetmd ha scritto:


    alcuni giochi potrebbero avere stesso titolo ma più lingue....ITA | ENG | DEU | FRA | ESP | JAP | RUS
    Se ritieni che un caso come questo accade spesso e volentieri, tieniti pure i campi boolean. Se accade raramente io opterei per la soluzione da me suggerita. Scegli tu.

    thetmd ha scritto:


    La tabella tblSWHouses esiste già con i campi
    IDtblSWHouses (contatore, chiave primaria)
    SWHouse (testo)

    c'è anche la tblAnno
    IDtblAnno (contatore, chiave primaria)
    Anno (numero)
    OK. Io avevo scritto tutta la struttura per riuscire a venire a capo dell'intero scenario. Secondo me è esagerato avere una tabella Anni relazionato uno-a-molti con Giochi. Se trovi comodo così, va bene lo stesso.

    thetmd ha scritto:


    tblNomi.IDtblNomi uno-a-uno tblGiochi.Nome
    Questa ormai non ha più senso, rileggi bene la mia struttura.

    thetmd ha scritto:


    Scusa per tutte le inesattezze
    Tranquillo. Sono contento che comunque hai compreso il senso del discorso che non era affatto semplice.

    Rileggendo un po' tutto il thread, volendo andare per il sottile, chiamerei il database Giochi.mdb (o Giochi.accdb non so quale versione di Access hai). La tabella Giochi ha assunto un nuovo significato e la chiamerei Edizioni in quanto tale tabella rappresenta l'esplicitazione editoriale di un Gioco che ha già un suo Nome a monte. Questa osservazione vuole essere solo di carattere logico/estetica senza nulla togliere ai dati che vi sono dentro.
  • Re: Aiuto sull'evento NotInList associato ad una combobox

    Ciao
    momentaneamente ho dovuto mettere da parte il database per questioni di lavoro...ancora qualche giorno e mi rifaccio sentire per portarlo avanti

    Grazie
    Pierpaolo
Devi accedere o registrarti per scrivere nel forum
12 risposte