Newsgroup: it.comp.appl.access
Titolo: Intercettare da VBA evento "manca record correlato"

Ciao a tutti
Avrei necessità di intercettare l'evento " Impossibile aggiornare il
record. Nella tabella x manca il record correlato "
che occorre, e giustamente,  quando si tenta di inserire un dato nella
tabella B che non trova relazione nella tabella A.
Vorrei intercettarlo, evitare che appaia l'avviso di sistema,  e dire
all'utente con un msgbox cosa deve fare...in modo più simpatico ed
utile per lui :-)
Al momento l'utente lo scopre quando cerca di salvare il record, ma io
vorrei dirglielo subito su afterupdate del campo appena digitato.
Qualcuno mi sa dire cosa devo fare su txtbox_afterupdate?
In pratica non so come stabilire da VBA se un record è nella tabella
MOLTI ma non nella tabella UNO.
Grazie moltissime.
Eddie


if Dcount(tuocampo;tuatabella;Tuofiltro) >0 then
-- 
-- 
MAssimiliano Amendola
www.accessgroup.it
Cisa - Conferenza Italiana Sviluppatori Access

 ha scritto nel messaggio 
news:0ae3e4e4-cc22-42ca...@e39g2000hsf.googlegroups.com...
Ciao a tutti




Grazie moltissime.
Eddie
Vediamo se ho capito...
Primo penso che tu debba intercettare l'errore prima di fare l'update, 
quindi al più sarà BeforeUpdate....
Poi potresti usare il metodo .RecorsetClone oppure fare un controllo 
sull'idcontatore della tabella master.
In ogni caso se ho visto giusto questo ti succede perchè tenti di inserire 
ad es. un dettaglio quando ancora l'id della tabella master non è 
registrata...male...evita questo.
Se non puoi farlo, prima dell'inserimento fai registrare l'id nella tabella 
master nell'evento BeforeUpdate.
O meglio, ora non so come è strutturata la tua maschera, comunque 
all'apertura mandi nel campo correlato della tabella B l'id della tabella A.
Spero di essermi spiegato
Ciao
-- 
Roberto da Parma

 ha scritto nel messaggionews:0ae3e4e4-cc22-42ca...@e39g2000hsf.googlegroups.com...

Ciao Roberto,
sono costretto a farlo ed il motivo è questo.
Ci sono degli operatori che inseriscono dei dati che esplicano azioni
e valori in una tabella  ..chiamiamola Actions.
E diciamo che il loro lavoro parte da li.
Alle volte accade che questi " si dimentichino " che stanno inserendo
dati di un cliente nuovo e non vanno ad aggiornare prima
la tabella clienti.
Quindi ho la necessità di dirglielo appena hanno digitato nel record
nuovo "pippo" ..."ops, questo cliente non è nella tabella clienti, vai
ad
aggiornare il dbClienti" , su ok della msgbox gli apro la forms
Clienti"....
Che ne dici?
Grazie
Eddie


Scusa, perchè DCount? Non lo si usa per contare valori su criteri?
Ed

 ha scritto nel messaggio 
news:55e20fe5-4506-44cd...@59g2000hsb.googlegroups.com...




Che ne dici?
Grazie
Eddie
Dico che devi dirglielo prima, o perlomeno impedirgli di inserire il record 
se non è presente prima il cliente.
Sarebbe meglio quindi che da una combo tu adassi a prelevare i clienti 
presenti in dbClienti per inserire poi il record, nel caso il cliente non 
fosse presente nella combo puoi comunque tramite l'evento not in list 
farglielo fare sul momento e quindi continuare l'inserimento diversamente 
impedirgli l'inserimento se non prima aver inserito/specificato il cliente.
Con il metodo che utilizzi rischi di perdere i dati fino a quel momento 
inseriti o far perdere comunque tempo all'operatore che deve interrompere 
l'inserimento per inserire il nuovo cliente e poi dover riprendere l'azione 
precedente.
Tu inizieresti ad inserire il dettaglio di una fattura per poi assegnargli 
il numero oppure prima gli assegneresti il numero e poi compili la 
fattura?Nel primo caso ti potresti imbattere in un errore di record 
duplicato e veder andar perse tutte le righe di fattura.
Ora comunque non avendo presente il campo in cui stai operando ti conviene 
sempre prima assicurarti il posto per il record per poi inserire i dati, 
rischi diversamente di vedere andar perso quello che stavi facendo.
Il concetto non è vero in tutti gli ambiti ma non credo sia il tuo caso.


 Roberto da Parma
Ciao Roberto
ps.  ma tu sei il roberto ( roberto da casa, roberto dalla campagna,
roberto dal portatile) che già mi insegnava tante cose tanti anni fa?
      Se si , complimenti, per la tua costanza e per la tua capacità
di essere un punto di riferimento di questo ng ( me compreso ) .
Come puoi constatare ho imparato poco , ma a mia discolpa oppongo il
fatto che ho interrotto , per mile motivi e per problemi familiari,
l'approfondimento
della materia :-)
Hai centrato il problema; devo impedire che inseriscano il dettaglio
di una fattura prima di creare il numero fattura, ma.....
l'azienda concentra la su attività sulla operatività giornaliera
( cliente che si contatta, che telefona di sua sponte, etc etc) e
l'operatore ,
man mano che svolge questa attività, inserisce i dati.
Premesso che come dici tu , la txtbox, diventerà comunque una combobox
( dalla quale selezionare il cliente) , il problema sorge proprio
quando
il cliente non esiste.
La relazione non permette di aggiornare un record che contiene un
cliente che "non esiste ancora" , ma d'altro canto devo dire
all'operatore che quel cliente ( non esiste, è nuovo, )
e fargli aggiornare la tabella principale.
Mi chiedi come sia strutturato il db.Semplicissimo nella struttura:
tblClienti.[nomecliente].[Dati].[Dati].[Dati].[Venduto]
tblVenduto.[nomecliente].[Cosa].[Dove].[Come].[Quando]
Relazione: Uno ( tblClienti) a Molti ( tblVenduto)
Ora, se l'operatore non trova il cliente nella lista della combobox
( che corrisponde , come fase situazionale, all'avviso che ti dice
"manca nella tabella x il record correlato")
cosa gli faccio fare?
Ha digitato un nome; questo nome non è nella "lista" (quindi non
esiste), quindi
' if me.cmbqualcosa.NotInList then
docmd.openForms, "Clienti"
end if '
O sbaglio ancora?
Regards
Eddie

 
Oh Errori 2 su 2!!!
;-)
-- 
-- 
MAssimiliano Amendola
www.accessgroup.it


 ha scritto nel messaggio 
news:8cf20bfa-72e7-4d8c...@34g2000hsf.googlegroups.com...






O sbaglio ancora?
Regards
Eddie
Ciao Eddie, non sono lo stesso Roberto dalla Campagna, ...
come puoi vedere dalla firma....sono Roberto da Parma, lui anche per me 
rimane un'entità che non ho ancora avuto piacere di conoscere e spero un 
giorno di avere....
Per quanto riguarda il tuo problema nella combo da cui ricavi l'elenco dei 
clienti è presto detto.
Nel caso l'operatore inserisca il nome di un cliente che non è presente in 
tabella, sull'evento not in list della combo (non è necessario l'IF che mi 
accennavi, c'è un evento apposta) inserisci questo codice
Dim IntNuovo As Integer, strTitolo As String
Dim IntFinestraMsg As Integer, strMsg As String
strTitolo = "Cliente 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("tblClienti")
    miorst.AddNew
    miorst!campotblClienti= NewData
    Me![tuocampomaschera] = miorst![campotblClienti]
    miorst.Update
    miorst.Close
    Set miorst = Nothing
    strTitolo = "Inserimento nuovo cliente 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
Else
    strTitolo = "Nome dell'oggetto errato"
    strMsg = NewData & " non è in elenco." & Chr(13) & Chr(10) & "Seleziona 
cliente dall'elenco"
    IntFinestraMsg = vbOKOnly + vbExclamation
    IntNuovo = MsgBox(strMsg, IntFinestraMsg, strTitolo)
    Response = acDataErrContinue
    Me.Undo
End If
Attento a sostituire bene i nomi dei campi della tabella e maschera 
relative...
Con questo metodo c'è un paio di contro:
- se l'operatore scrive male il nome rischi di avere campi/clienti duplicati 
(es. Rossi Claudio, Rossi Cludio  <--- inserimento non corretto) e di 
conseguenza associazioni sbagliate.
- se hai bisogno di inserire altri dati per il cliente dovrai accere 
direttamente alla maschera clienti poichè viene solamente aggiunto il valore 
del campo della combo, quindi nella maschera clienti otterrai un record che 
avrà solo ID e nome compilati, i rimanenti campi che tu potresti avere 
rimangono vuoti.
Ma questo è risolvibile inserendo un evento su doppio click che ti apre la 
maschera clienti filtrando l'ID dalla combo.
In alternativa a tutto questo impedisci proprio di inserire il record fino a 
quando o l'operatore non inserisce un dei nominativi a sua disposizione 
oppure si inserisce prima il nome cliente nella relativa maschera e poi 
continua l'inserimento.
Questo lo puoi fare mettendo una condizione sulla combo che non può essere 
nulla.
L'evento anzi gli eventi che dovrai inserire saranno uno sulla maschera 
principale [SuCorrente] e nella combo  [DopoAggiornamento]
Il codice disabiliterà i controlli nella maschera fino a quando non verrà 
immesso il valore nella combo.
es. if IsNull(miacombo ) then
        'Qui o fai un ciclo con i tag oppure ti elenchi tutti i controlli
        me.tuocampo.enabled = false
    else
        me.tuocampo.enabled = true
    end if
questo codice lo inserisci in entrambi gli eventi.
Spero tu possa risolvere così il tuo problema.
Non vuol dire che non ci possano poi essere diversi tipi di approccio, qui 
io ti ho illustrato bene o male quelli che sfrutto io in certe circostanze.



;-) ...quale dei due è il più grave?


rileggendo meglio
l'errore è aver confuso Roberto da casa con Roberto da Parma,
il resto lo sottoscrivo
-- 
-- 
MAssimiliano Amendola
www.accessgroup.it


 ha scritto nel messaggio 
news:cda2e6a8-cf0c-40d4...@w7g2000hsa.googlegroups.com...
Scusa, perchè DCount? Non lo si usa per contare valori su criteri?
Ed
[risposta]
-- tratto dall'help in linea (F1) ---
È possibile utilizzare la funzione DCount per stabilire il numero di record 
contenuti in un determinato set di record
Ciao.
-- 
Sergio MAZZA 

 Sergio MAZZA
Difatti. L'ho detto in modo un po' barocco ma intendevo proprio
quello.
Lo utilizzo moltissimo su WHERE perchè ho spesso bisogno di conoscere
quante actions sono state fatte
di un determinato tipo.
Per quello chiedevo a MA come mai mi ha suggerito questo codice,
dovendo io intercettare l'evento " guarda che nella tabella A
non c'è nessuno che si chiama come il nome che hai scritto nella
tabella B " ..:-)
if Dcount(tuocampo;tuatabella;Tuofiltro) >0 then
Se questo codice dice: se il conteggio su campo-tabella-filtro è
superiore a 0 then
non capisco come si lega al primo
Pura curiosità di capire meglio..
Ciao
Eddie

 ha scritto nel messaggionews:8cf20bfa-72e7-4d8c...@34g2000hsf.googlegroups.com...

Ciao Roberto.
Ti ringrazio moltissimo dei tuoi suggerimenti. Adesso li proverò
entrambi e ti faccio sapere.
Buona giornata
Eddie

 ha scritto nel messaggio 
news:370de794-ecf9-451a...@56g2000hsm.googlegroups.com...
Difatti. L'ho detto in modo un po' barocco ma intendevo proprio
quello.
Lo utilizzo moltissimo su WHERE perchè ho spesso bisogno di conoscere
quante actions sono state fatte
di un determinato tipo.
Per quello chiedevo a MA come mai mi ha suggerito questo codice,
dovendo io intercettare l'evento " guarda che nella tabella A
non c'è nessuno che si chiama come il nome che hai scritto nella
tabella B " ..:-)
if Dcount(tuocampo;tuatabella;Tuofiltro) >0 then
Se questo codice dice: se il conteggio su campo-tabella-filtro è
superiore a 0 then
non capisco come si lega al primo
Pura curiosità di capire meglio..
Ciao
Eddie
[risposta]
Non devi intercettare quell'evento, devi prevenirlo contando i record con la 
DCount...
Ciao.
-- 
Sergio MAZZA 

 Ciao.
-- 
-- 
MAssimiliano Amendola


 ha scritto nel messaggio 
news:g69c8c$o2a$1...@tdi.cu.mi.it...
Eddie wrote:



Ssssshhhh, che qui col fatto che mi confondono tutti mi sto facendo una 
posizione di rilievo!!! :-)))
-- 
Roberto da Ovunque 

 ha scritto nel messaggio 
news:g69o5a$5au$1...@tdi.cu.mi.it...


Sai quanti punti ci sono prima di me!!!
Comunque ci si prova...sempre...mai mollare!
Grazie dei complimenti.......ora vado a dare delle mazzate in giro...magari 
qualcuno scrive ancora prima del quoting.... ;-)
Non posso smentire Ciroteo ... :-))
-- 
Roberto da Parma

 Roberto da Parma
Ps. Per onor di cronaca ( e per dare a Cesare quel che è di Cesare)
Sergio Mazza non era da meno di
Roberto-da-tutti-i-posti :-)))   nel dispensare aiuti.
Magari un po' meno discorsivo di Roberto e un po' più caustico, ma
altrettanto efficace.
Ciao
Eddie

 ha scritto nel messaggio 
news:77c1124f-708d-47a5...@v13g2000pro.googlegroups.com...
Ps. Per onor di cronaca ( e per dare a Cesare quel che č di Cesare)
Sergio Mazza non era da meno di
Roberto-da-tutti-i-posti :-)))   nel dispensare aiuti.
Magari un po' meno discorsivo di Roberto e un po' piů caustico, ma
altrettanto efficace.
Ciao
Eddie
[risposta]
Solo caustico?! Sto invecchiando...
Ciao.
-- 
Sergio MAZZA