Newsgroup: it.comp.appl.access
Titolo: Aggiungere valore in casella combinata se ID non è contatore?

Buongiorno a tutti!
Mi dichiaro da subito totalmente newbie ^_^
Da qualche mese sto lavorando ad un db che mi permetta di catalogare
la mia collezione di cd e dvd. So che ci sono programmi apposta, ma
non ne ho trovato nessuno che mi piacesse... insomma, mi sono messa a
studiare e ho creato il mio database seguendo anche il consiglio di
alcuni amici. Tenete conto che ho aperto access 6 mesi fa per la prima
volta, quindi ancora faccio molta fatica ad interpretare il codice!
Adesso mi trovo di fronte ad un problema per me insormontabile...
aggiungere dei records alla tabella che è origine riga di una casella
combinata. In questo caso si tratta della tabella in cui memorizzo i
nomi dei vari cantanti, ma non è l'unico, per cui vorrei risolvere al
meglio il problema.
All'inizio un amico molto più esperto di me mi aveva consigliato di
non usare un contatore come chiave primaria, ma un numero intero. E di
limitare la scelta dei cantanti a quelli già inseriti in tabella, per
evitare voci duplicate etc etc... Io mi sono fidata, ma adesso ho
parecchi problemi.
Ora come ora, per aggiornare la tabella e aggiungere nuovi cantanti,
chiudo la maschera di inserimento dati, poi vado ad inserire
manualmente il nome del cantante ed il numerale (chiave primaria)
Inutile dire che mi sono stufata! Mi sono messa a cercare sul sito
comune e ho trovato qualcosa che farebbe al caso mio:
http://www.sitocomune.com/forms/forms039.htm
Ho scaricato l'esempio e l'ho modificato in questo modo:
=====================================
Private Sub Form_Current()
Me!Cantante.SetFocus
End Sub
Private Sub Cantante_NotInList(NewData As String, Response As Integer)
Dim IntNuovo As Integer, strTitolo As String
Dim IntFinestraMsg As Integer, strMsg As String
strTitolo = "Cantante digitato non in elenco"
strMsg = "Vuoi aggiungere" & Chr(13) & Chr(10) & NewData & Chr(13) &
Chr(10) & "in elenco?"
IntFinestraMsg = vbYesNo + vbQuestion
IntNuovo = MsgBox(strMsg, IntFinestraMsg, strTitolo)
If IntNuovo = vbYes Then
    Dim miorst As Recordset
    Set miorst = CurrentDb.OpenRecordset("Album_Tracks_Cantante")
    miorst.AddNew
    miorst!Des_Cantante = NewData
    Me![Cantante] = miorst![Cod_Cantante]
    miorst.Update
    miorst.Close
    Set miorst = Nothing
    strTitolo = "Inserimento nuovo Cantante in elenco"
    strMsg = "Inserimento in elenco di" & Chr(13) & Chr(10) & NewData
& Chr(13) & Chr(10) & "con successo"
    IntFinestraMsg = vbOKOnly + vbExclamation
    IntNuovo = MsgBox(strMsg, IntFinestraMsg, strTitolo)
    Response = acDataErrAdded
    Me![Cantante].Requery
Else
    strTitolo = "Nome del Cantante errato"
    strMsg = NewData & " non è in elenco." & Chr(13) & Chr(10) &
"Seleziona un Cantante dall'elenco"
    IntFinestraMsg = vbOKOnly + vbExclamation
    IntNuovo = MsgBox(strMsg, IntFinestraMsg, strTitolo)
    Response = acDataErrContinue
    Me![Cantante].Undo
End If
End Sub
=================================================
In parte funziona, ma in realtà il nome del cantante NON viene
memorizzato e mi esce la finestra di errore.
Io, nella mia assoluta ignoranza, credo di avere capito che il
problema sia nel fatto che la mia chiave è un numero e non un
contatore e quindi l'operazione non esce in automatico.
Solo che a questo punto non so come procedere.
Cosa devo fare per fare funzionare il tutto?
Avevo pensato di creare una nuova tabella cantanti con una chiave
contatore, ma ci sono già 300 records e non voglio riscrivere tutto!
La tabella ha questa struttura
CODICE / CANTANTE
0
1	/ ROSSO
2	/ VERDE
3	/ GIALLO
Credo anche che esista un modo per "dire ad access" di inserire un
numero intero che incrementi di 1 l'ultima chiave da me inserita. Solo
che non sono capace!!
Qualche anima pia mi potrebbe dare una dritta, per favore???!!!
Grazie
Erika
-- 
Per rispondermi... Togli "nospam"


[CUT]
Scusa se ho tarpato il messaggio, ma hai evidenziato diverse problematiche,
e forse è il caso di metterne a FUOCO una per volta.
1)Il campo contatore nel tuo caso era la cosa più comoda
   non essendo legato a nulla di particolare...., ma il consiglio
   che ti hanno dato è altrettando valido, vediamo come realizzarlo:
    Nella tua Tabella hai il Campo ID che è Numerico Intero Lungo,
    per fare in modo che AUTOMATICAMENTE all'inserzione di un nuovo RECORD
    questo si incrementi devi usare un trucchetto, vale a dire inserire una
TextBox
    associata al Campo ID e sfruttare la Proprietà Valore Predefinito.
    Inserisci in questo campo della Maschera Proprietà del controllo il
seguente codice
    adattandolo ai nomi specifici del tuo DB:
    =1+Nz(DMAX("[NomeCampoID]";"NomeTabella"))
Per la ComboBox invece potrebbe essere più gestibile realizzare una Bella
Maschera di Ricerca dedicata che filtra tramite una QRY  i Cantanti che
rispondono ai
criteri immessi.....!
In questo caso ovviamente si che la ComboBox deve estrarre solo quelli
presenti per non
dover controllare poi se c'è o meno....!
In questo modo nella FormPrincipale non serve più avere la Combo, da
aggiornare....!!!
Questo però è solo un modo per risolvere la cosa ce ne sono molti altri....!
Per ora ciao.
@Alex.

criteri immessi.....!
Nel mio caso non e' tanto una questione di ricerca, piuttosto di
inserimento. Cioe' quando vado ad inserire i dati di un nuovo cd non
vorrei dovermi fermare ogni volta che ho un cantante nuovo (o una casa
discografica o quant'altro sia collegato ad una tabella uguale a
quella dei cantanti). 
In pratica la prima routine che non mi funziona mi andrebbe benissimo
se funzionasse in questo modo:
1) se il record non e' ancora in tabella
2) mi esce il messaggio "Vuoi inserire"
3) Io clicco si' (è a questo punto mi viene fuori l'errore adesso!)
4) il numerico in ID aumenta di uno automaticamente (e questo non
capisco/so come farlo)
5) la mia tabella cantante è aggiornata e io posso continuare a
inserire i dati
Ho paura di non riuscire a spiegarmi bene. Mi rendo conto di essere
una vera foca, sto cercando di imparare, ma è veramente difficile!
Grazie ancora per l'aiuto!
Ami



[CUT]
Rieseguo un taglio.
Non si tratta di +/- professionale, ma come hai detto tu essendo quello che
sapevi è già un'ottima partenza.
C'è da dire però che forse prima di proseguire conviene capire meglio come
si può lavorare con Access.
Il fatto che tu abbia ben strutturato il Database è un'ottimo punto di
partenza, ma
Access, oltre essere un Database è un'ottimo strumento per realizzare
Potentissime
interfacce utente, le MASCHERE, quelle che ti permettono di iserire i dati
nel modo
giusto eseguire controlli, segnalarti o meno la presenza di doppioni,
rendere
molto gradevole anche l'aspetto del'interfaccia stessa... e così via.
Puoi provare a studiarti un pò gli esempi dell'autocomposizione, uno a caso
per capire meglio come muoverti tra Tabelle, Maschere e Report ecc....!!!
Non spaventarti gli esempi che ti consigliavo sono molto semplici, ma
estremamente efficaci per
capire la strutturazione.
Ciao.
@Alex.

capire la strutturazione.
Tranquillo, le procedure guidate le uso, poi vado a modificare in base
ai miei gusti/esigenze ^_^
Grazie!!!
Erika



Ciao Alex
fortuna che MA, Sergio e tutti gli altri sono in ferie........
Proprio vero l'aria di Natale fa miracoli .......
Ciao Daniele

Erika
Ciao
--
Alberto
No alle guerre

 Erika
Una soluzione potrebbe essere quella di inserire un nuovo campo contatore
nella tua tabella dei cantanti. A questo punto, ogni cantante avrebbe un suo
codice progressivo.
Come secondo passaggio dovresti (nel caso al campo IDCantante fosse
collegata qualche altra tabella) rimuovere la relazione tra la tabella
cantanti e l'eventuale tabella/e collegata/e ed eseguire una query di
aggiornamento sulla tabella collegata. Con questa query devi sostituire al
posto dell'IDCantante il valore preso dal campo contatore. Dopodichè,
elimini il campo di tipo numerico sulla tabella dei cantanti e usi il campo
contatore come chiave primaria (eventualmente rinominandolo col nome del
campo eliminato, per non aver problemi con query, maschere, report ecc.).
Spero di essere stato chiaro..
Ciao
Salvatore

Erika una piccola 'scappatoia' per superare il suo impasse
Grazie a tutti per l'aiuto!!!
Ho inserito il nuovo codice, ho controllato i nomi di tabella..., ma
ancora non funge fino in fondo solo a meta' ^_^;; ... 
...mi chiede se voglio inserire il nome, dico di si', mi fa scrivere
il nome e poi mi dice che il testo da me immesso non è in lista e di
scegliere dalla lista...
Boh... adesso cerchero' di capire dove sia l'errore.
Grazie a tutti intanto!!


 No alle guerre
Ciao Alessandro.

Spero di essere stato chiaro..
Si', ho capito perfettamente ^_^
Adesso ci provo!
Grazie
Erika
PS: stamattina mi sono procurata altri due libri di access... vediamo
se con l'impegno riesco a migliorare :)))


 ha scritto nel messaggio
news:jp13vvophb1ms9dev...@4ax.com...

Saggia decisione, non te ne pentirai e migliorerai senz'altro.
Ciao
Salvatore

Erika
Ciao,
ho fatto una prova sulla base delle informazioni del tuo primo post:
ho creato una tabella 'Album_Tracks_Cantante', con i campi:
CODICE (numerico, intero lungo, chiave primaria)
CANTANTE (testo)
ho creato una tabella 'Album' con un campo 'cod_album', un campo
'titolo' e un campo 'cod_cantante'; con origine record su questa
tabella ho creato una maschera con una casella di testo associata a
'cod_album', una casella di testo associata a 'titolo' ed una casella
combinata (che ho chiamato 'cantante') associata a 'cod_cantante', con
origine riga sulla tabella 'Album_Tracks_Cantante'
---
In pratica credo di aver ricostruito, piů o meno, la tua situazione.
A fronte dell'evento 'su non in elenco' della casella combinata
'cantante' ho messo questo codice
-
Private Sub Cantante_NotInList(NewData As String, Response As Integer)
Dim IntNuovo As Integer, strTitolo As String
Dim IntFinestraMsg As Integer, strMsg As String
    strTitolo = "Cantante digitato non in elenco"
    strMsg = "Vuoi aggiungere" & Chr(13) & Chr(10) & NewData _
        & Chr(13) & Chr(10) & "in elenco?"
    IntFinestraMsg = vbYesNo + vbQuestion
    IntNuovo = MsgBox(strMsg, IntFinestraMsg, strTitolo)
    If IntNuovo = vbYes Then
        Dim miorst As DAO.Recordset
        Set miorst = CurrentDb.OpenRecordset("Album_Tracks_Cantante")
        miorst.AddNew
        miorst!CANTANTE = NewData
        miorst!CODICE = 1 + Nz(DMax("CODICE", _
            "Album_Tracks_Cantante"), 0)
        Me![CANTANTE] = miorst![CODICE]
        miorst.Update
        miorst.Close
        Set miorst = Nothing
        strTitolo = "Inserimento nuovo Cantante in elenco"
        strMsg = "Inserimento in elenco di" & Chr(13) & Chr(10) _
            & NewData & Chr(13) & Chr(10) & "con successo"
        IntFinestraMsg = vbOKOnly + vbExclamation
        IntNuovo = MsgBox(strMsg, IntFinestraMsg, strTitolo)
        Response = acDataErrAdded
        Me![CANTANTE].Requery
    Else
        strTitolo = "Nome del Cantante errato"
        strMsg = NewData & " non č in elenco." & Chr(13) & Chr(10) _
            & "Seleziona un Cantante dall'elenco"
        IntFinestraMsg = vbOKOnly + vbExclamation
        IntNuovo = MsgBox(strMsg, IntFinestraMsg, strTitolo)
        Response = acDataErrContinue
        Me![CANTANTE].Undo
    End If
End Sub
-
e a me inserisce correttamente i nuovi cantanti. Forse il problema era
che alcuni nomi di campi non erano riportati correttamente nella
routine.
Prova ed, eventualmente, facci sapere.
Ciao, auguri.


        Set miorst = CurrentDb.OpenRecordset("Album_Tracks_Cantante")
Si blocca qui... e da' errore "Tipo non corrispondente". Boh. Ho
riprovato anche io a creare le tabelle e la maschera. Ma continua a
darmi questo errore. Probabilmente sbaglio qualcosa a monte, non e' un
problema del codice, ma delle mie impostazioni. 
Grazie comunque


problema del codice, ma delle mie impostazioni.
Altrimenti prova a fare questi due controlli
1)
Dall'editor di visual basic (cioč da dove si vede il codice)clicca sul
menu 'strumenti' e poi su 'riferimenti'. Ora accertati che tra i
riferimenti sia spuntato 'Microsoft DAO ...'. Se non lo č cercalo
facendo scorrere la lista dei riferimenti e spuntalo. Accerati inoltre
di aver scritto correttamente questa riga di codice
- Dim miorst As DAO.Recordset
2)
Se hai copiato tale quale il mio codice accertati che nella tabella
'Album_Tracks_Cantante' ci sia un campo 'CODICE' e un campo 'CANTANTE'
e che la casella combinata della maschera si chiami 'Cantante'. Se
invece lo hai adattato al tuo database accertati che i nomi dei campi
e dei controlli richiamati dal codice corrispondano a quelli della
tabella e della maschera.
Tra l'altro, nel codice che hai postato la prima volta c'erano due
righe *strane*
   miorst!Des_Cantante = NewData
   Me![Cantante] = miorst![Cod_Cantante]
Da quanto avevi detto, nella tabella 'Album_Tracks_Cantante' non c'era
nessun campo chiamato 'Des_Cantante'.
Se non riesci ad andarci in fondo fatti sentire, vediamo se a qualcuno
viene qualche altra idea.
Ciao
