Newsgroup: it.comp.appl.access
Titolo: Problema aggiornamento ID dopo cancellazione record corrente

La sottomaschera subSchedaPrimoContatto ha il pulsante 'Elimina record
corrente' con il seguente codice sull'evento Click():
------------- INIZIO CODICE ----------------
Private Sub cmdElimina_Click()
Dim rif As Variant
Dim ultimo_id As Variant
Dim res As Variant
rif = [Forms]![frmSchedaPrimoContatto]![id]
ultimo_id = DMax("idUtente", "tblUtenti")
If IsNull(rif) Then
    MsgBox "Nessun Utente selezionato!", vbCritical
    Exit Sub
  Else
    res = MsgBox("Elimino dall'archivio " &
UCase([Forms]![frmSchedaPrimoContatto]![Nome] & " " &
[Forms]![frmSchedaPrimoContatto]![Cognome]) & "?", vbQuestion +
vbYesNo)
    If res = 7 Then Exit Sub
End If
DoCmd.SetWarnings False
DoCmd.RunSQL "DELETE * FROM tblInterventi WHERE idUtente = " & rif
DoCmd.RunSQL "DELETE * FROM tblUtenti WHERE idUtente = " & rif
MsgBox "Utente eliminato.", vbInformation
If DCount("*", "tblUtenti") > 0 Then
    If rif = ultimo_id Then
        DoCmd.GoToRecord acDataForm, "frmSchedaPrimoContatto",
acPrevious
    Else
        DoCmd.GoToRecord acDataForm, "frmSchedaPrimoContatto", acNext
    End If
Else
    MsgBox "Non ci sono più utenti nel database - Clicca su OK per
aprire la maschera Aggiungi Utente", vbCritical, "ATTENZIONE - DATABASE
VUOTO"
    DoCmd.Close acForm, "frmSchedaPrimoContatto"
    DoCmd.OpenForm "frmAggiungiUtente"
End If
End Sub
--------------- FINE CODICE ----------------
Il problema è che questa routine non effettua il requery del recordset
della subSchedaPrimoContatto.
Quindi, se dopo aver eliminato il record, con il selettore dei record
ritorno al record eliminato - rappresentato da una maschera grigia -
ottengo un errore di runtime che punta al seguente codice nell'evento
Current() della subSchedaPrimoContatto:
------------- INIZIO CODICE ----------------
Private Sub Form_Current()
If DCount("*", "tblUtenti") > 0 Then
--->Me!NumeroIntervento = Nz(DMax("NumeroIntervento", "tblInterventi",
"idUtente = " & Forms!frmSchedaPrimoContatto!id))
    Me!NumeroIntervento.Requery
End If
End Sub
------------- FINE CODICE ------------------
Non ho idea di come risolvere questo problema. Non so ancora muovermi
con riferimenti ad ID da maschere diverse.
Ecco la mia analisi del codice, datomi dal mio amico di Milano (grazie
Walter, se mai leggerai ICAA!!!)
1. la riga
rif = [Forms]![frmSchedaPrimoContatto]![id]
prende il valore del controllo [id] presente sulla maschera principale
- ho visto che il mio amico ha aggiunto questo controllo invisibile in
modalità 'Visualizzazione Maschera' e lo ha associato al campo
'idUtente' della tabella 'tblUtenti' - e lo assegna alla variabile
'rif'. Ok. Ma perchè il mio amico mi avrebbe aggiunto questo controllo
nascosto ssociandolo al campo 'idUtente' della tabella 'tblUtenti'?
Se io scorro i record con il selettore dei record, il valore del
controllo 'id' contiene sempre l'idUtente dell'utente corrente? Ora che
ci penso dovrebbe essere così perchè il selettore dei record è sulla
maschera principale e non sulla sottomaschera.
La sottomaschera, essendo associata, visualizza i dati in base al
record corrente selezionato dalla sua maschera principale. Ho detto
giusto?
2. la riga
ultimo_id = DMax("idUtente", "tblUtenti")
semplicemente assegna alla variabile ultimo_id l'id più alto che c'è
nella tabella 'tblUtenti'.
3. le righe
If IsNull(rif) Then
    MsgBox "Nessun Utente selezionato!", vbCritical
    Exit Sub
  Else
    res = MsgBox("Elimino dall'archivio " &
UCase([Forms]![frmSchedaPrimoContatto]![Nome] & " " &
[Forms]![frmSchedaPrimoContatto]![Cognome]) & "?", vbQuestion +
vbYesNo)
    If res = 7 Then Exit Sub
End I
si assicurano che vi sia almeno un utente selezionato controllando il
valore della variabile 'rif' associata al controllo 'id'. Ma questo mi
sembra un controllo inutile però. Nel senso che, essendo il pulsante
'Elimina record corrente' presente nella stessa videata in cui è
presente l'utente corrente, è ovvio che 'rif' non sarà mai Null,
perchè se non ci fosse nemmeno un utente la scheda PrimoContatto e
quindi la sottomaschera non sarebbero visibili. Dal momento che sono
visibili esiste sempre almeno un utente visualizzato
in quel momento, quindi 'rif' non sarà mai Null? Sbaglio nel
ragionamento?
4. le righe
DoCmd.SetWarnings False
DoCmd.RunSQL "DELETE * FROM tblInterventi WHERE idUtente = " & rif
DoCmd.RunSQL "DELETE * FROM tblUtenti WHERE idUtente = " & rif
MsgBox "Utente eliminato.", vbInformation
eliminano il record corrente, e visualizzano un messaggio di conferma.
In particolare:
a. DoCmd.SetWarnings False - disabilita i messaggi di avviso
predefiniti di Access
b. DoCmd.RunSQL "DELETE * FROM tblInterventi WHERE idUtente = " & rif -
elimina dalla tabella 'tblInterventi' tutti i record in cui idUtente è
uguale a 'rif' che rappresenta l'id dell'utente in quel momento
visualizzato.
c. DoCmd.RunSQL "DELETE * FROM tblUtenti WHERE idUtente = " & rif -
elimina dalla tabella 'tblUtenti l'utente con id = rif, dove rif
rappresenta l'id in quel momento visualizzato sullo schermo.
5. le righe
If DCount("*", "tblUtenti") > 0 Then
    If rif = ultimo_id Then
        DoCmd.GoToRecord acDataForm, "frmSchedaPrimoContatto",
acPrevious
    Else
        DoCmd.GoToRecord acDataForm, "frmSchedaPrimoContatto", acNext
    End If
Else
    MsgBox "Non ci sono più utenti nel database - Clicca su OK per
aprire la maschera Aggiungi Utente", vbCritical, "ATTENZIONE - DATABASE
VUOTO"
    DoCmd.Close acForm, "frmSchedaPrimoContatto"
    DoCmd.OpenForm "frmAggiungiUtente"
End If
spostano il puntatore del record corrente sul record o immediatamente
successivo a quello eliminato o, nel caso quello eliminato fosse
l'ultimo progressivo del recordset, a quello immediatamente precedente.
Per far questo prima viene controllato che il record eliminato non
fosse l'ultimo rimasto nel recordset.
Nel caso il record eliminato fosse l'ultimo, l'espressione:
DCount("*", "tblUtenti")>0
restituisce False, e viene eseguito il codice subito dopo l'Else
relativo:
MsgBox "Non ci sono più utenti nel database - Clicca su OK per aprire
la maschera Aggiungi Utente", vbCritical, "ATTENZIONE - DATABASE VUOTO"
    DoCmd.Close acForm, "frmSchedaPrimoContatto"
    DoCmd.OpenForm "frmAggiungiUtente"
codice che visualizza una finestra con un messaggio, poi apre la
maschera frmAggiungiUtente e chiude la maschera corrente
frmSchedaPrimoContatto.
Nel caso il record eliminato non fosse l'ultimo rimasto nel recordset,
l'espressione:
DCount("*", "tblUtenti")>0
restituisce True, e viene eseguito il seg. codice:
a. se il record eliminato era l'ultimo progressivo, vai al record
immediatamente precedente a quello
If rif = ultimo_id Then
        DoCmd.GoToRecord acDataForm, "frmSchedaPrimoContatto",
acPrevious
b. altrimenti, se non era l'ultimo progressivo, vai a quello
immediatamenrte successivo
    Else
        DoCmd.GoToRecord acDataForm, "frmSchedaPrimoContatto", acNext
    End If
Il problema come ho detto è che questo codice non aggiorna il
recordset della scheda subSchedaPrimoContatto e quindi quando mi muovo
con il selettore dei record mi rimane un buco grigio. Inoltre ho
l'errore di runtime che vi ho riportato, perchè credo quella riga cui
fa riferimento il debug cerchi un id che non c'è più.
Accetto consigli :))))
Grazie :)

Grazie :)
Ciao Giulio,
accetti davvero consigli? Posso dartene senza alcun "risentimento" giacchè è 
quello che farei al tuo posto e penso che con te si possa "interagire"?
Sono "pienamente" d'accordo con Alex quando ti consiglia di capire bene e 
focalizzare gli obiettivi da raggiungere...secondo me stai spingendo più del 
dovuto nel senso che ti ritrovi a leggere e/o scrivere codice e poi ad 
analizzaarlo invece dovresti fare il contrario-> hai preso l'auto e stai 
girovagando cercando di capire dove vuoi andare...
1) Prova un pò ad "armarti" di "calma"...non hai scadenza e la "fretta" è 
cattiva consigliera -> "credimi sulla parola" ;-)
(vedi l'ultima  "cazzata" per es. ...quella del setfocus...tu ed io entrambi 
"rintronati" - come 2 ubriachi che passeggiano e chiacchierano fra loro - 
abbiamo messo su una conversazione senza fondamenta)
2) Dopo esserti "armato" di calma e "riposato un pò" fai un pò di mente 
locale ed armati di carta e penna 
(
http://programmazione.html.it/base/programmazione_base_05.htm
)
3) Dopodichè armati di codice...
Se continui nella maniera seguente non ti seguirà nessuno sul NG (non come 
vorresti tu...) e cmq non otterai di certo l'aiuto desiderato.
Quando ti passano codice (che ben venga da parte del tuo amico...) fattelo 
commentare o spiegare...non siamo a scuola dove ti fai passare il compitino 
da "copiare"
Spero che prenderai il mio consiglio nel verso "giusto"..."mi ripeto" -> "è 
quello che farei io al tuo posto nè + nè -"...
Per il resto mi trovi sempre disponibile :-)...
Buona serata
Gaspare

Ciao Gaspare, provo a spiegarti in che situazione mi trovo.
Benchè io viva gran parte del mio tempo nel mio caro mondo artistico,
devo pur mangiare e aiutare i miei che sono in cattive acque
economicamente.
Quindi cosa succede? Succede che ho trovato questo lavoro come
consulente informatico per una società di Roma. Gli ho fatto un
cd-rom, gli ho curato un pò l'hardware ed il software e via dicendo.
Con contratto che, da Novembre 2004, mi viene rinnovato di 3 mesi in 3
mesi.
PROBLEMA: questa società, che è un Ente finanziato dalla Regione,
dalla Provincia e dall'Unione Europea, è in PESSIME acque e una fonte
a me vicina e ben vicina anche ai CAPOCCIA che gestiscono l'ente cosa
mi ha detto tre settimane fa?
Non è detto che dopo il 30 Giugno ti rinnoviamo il contratto. Perchè
QUELLI hanno intenzione di VENDERE l'Ente e di NON rinnovare il
contratto ad alcun consulente come te (siamo circa 7). L'unico modo, mi
ha detto questa fonte che fidatevi sa quello che dice è di realizzare
questo database che oltre all'ente stesso dovranno utilizzare anche due
uffici fuori sede. Se farai bene questo lavoro, io farò in modo che i
CAPOCCIA ti ritengano indispensabile e forse potrò salvarti il
contratto altrimenti non potrò fare nulla e tu insieme agli altri
andrete tutti a casa.
Ora io dei 7 sono l'unico con una certa praticità e un certo skill in
informatica ed è per questo che sono diventato il punto di riferimento
per tutto quello che riguarda l'hlpdesk tecnico sia hardware che
software che di rete.
Mam io Access l'ho studiato - per conto mio e senza alcun motivo - ben
cinque anni fa, e il VB versione 5 nel lontano 1997 perciò non mi
ricordo proprio niente.
Io per salvare - forse - il mio posto di lavoro devo terminare questo
DB entro il 30 Giugno, sennò me ne andrò a casa. E mia madre sta
chiudendo il negozio perchè è andato male, e mio padre è in rotta
con mia madre ed io STO NELLA MERDA FINO AL COLLO!!! perchè già
faccio fatica ora ad aiutare casa pensa senza lavoro che fine
faranno!!!
Perciò io non ho tempo per FERMARMI e STUDIARE. IO DEVO STUDIARE IN
CORSA. AFFRONTARE DA SUBITO CODICE COMPLESSO, scrivere qui sperando nel
TUO aiuto e in quello di Ale. e in quello di MA e in quello di Roberto
e in quello di tutti gli altri. Perchè NON HO TEMPO :(
La mia unica speranza è che il 20 Giugno l'incontro che ho uno
scrittore della Feltrinelli vada a buon fine e che gli piaccia ciò che
ho da fargli leggere.
In caso contrario, Gaspare, non so nemmeno se avrò ancora i soldi per
pagare 2€ un'ora qui in un internet point.
Scusa lo sfogo, ma questa notte ho fatto quasi le 2 per aggiustare il
codice sul pulsante Esci della maschera frmAggiungiUtente e per fortuna
funziona bene.
A presto.

Scusami ma cmq non volevo aggredirti :)
E' che sto vivendo una situazione difficile.
Devo fare questo db.
Devo studiare il VB.
Devo scrivere e preparare gli appuntamenti.
E scrivere, la cosa che più amo e che faccio da ancora prima di
nascere, è la mia unica ancora di salvezza.
Ma per salvare il mio posto di lavoro lo sto mettendo in secondo piano.
Perdona quindi lo sfogo di poc'anzi.
Non ce l'avevo con te.
Anzi!!!!! :)

[CUT]
Ok...scusami allora per quello che ti ho detto...non avevo queste 
"informazioni", pensavo che fosse solo un qualcosa che stavi mettendo sù 
solo ed esclusivamente per contribuire al NG !
Prova un pò a mandarmi il db "zippato" che cerco di aiutarti come posso 
:-)...considera che non sono "un'arca di scienza" -> mi piace access e lo 
uso...
Buona serata e "non preoccuparti"...c'è gente "disponibile" nel NG su cui si 
può contare :-)
Buona serata e "cerca in qualche modo di rilassarti un pò" ;-)
Gaspare

[CUT]
No problem...ho "capito" perfettamente e per quello che posso cercherò di 
darti una mano...vai "tranquillo" ;-)

Ti ringrazio.
Il darlo poi al NG è come un ringraziamento per l'aiuto che mi sta
dando.
A me piace condividere la conoscenza per questo oggi ho scritto quella
breve analisi di codice per newbie :)
E scusami ancora :)

[CUT]
Stop! Ti ho capito ;-)