Newsgroup: it.comp.lang.delphi
Titolo: Stupido problema con ADO...

Salve gente!
Dopo moltissimo tempo mi sono rimesso a smanettare con delphi ado ed 
access (lo sò...scelta discutibile,ma mi servono solo 2 tabelle padre e 
figli...niente di importante come records!!!).
Il problema sorge quando l'utente modifica qualche dato a video e scorre 
con il dbnavigator...non capisco come far comparire un messaggio di 
avviso per procedere con l'avanzamento avanti/indietro confermando o no 
la modifica fatta (idem dovrò farlo poi per la chiusura della form se ci 
sono state modifiche...ma ci penserò in seguito!).
Grazie dei consigli!

 ha scritto

Hai guardato l'evento OnBeforScroll del Componente ADOQuery o ADOTable? Lì 
potresti testare se il property "Stato" dello stesso componente e dsInsert 
oppure dsEdit. In quel caso dovresti fare la domanda al utente. Se non 
desidera di salvare i cambiamenti devi fare un Abort ...
Spero che aiuta,
Hubert 


Devi testare il Dataset.State in dsInsert dsEdit

 avviso per procedere con l'avanzamento avanti/indietro confermando o no
Se l'edinting e' su griglia Io non lo farei.
Il grosso vantaggio do quel tipo di editing e' l'immediatezza: salvo
le modifiche senza un "applica".
A.

 Grazie dei consigli!
chiedi pure.
ciao
-- 
morde
D5,D6,D7
QT 4.7.0 - MingW- QT Creator 2.1

 sono state modifiche...ma ci penserï¿œ in seguito!).
Tanto che non lavoro con ADO, ma mi sembrava di ricordare che si 
comporti come un DataSet; in tal caso, forse, ti basta un BeforePost. 
dato che prima di cambiare record se il DataSet ï¿œ in Edit, il 
DBNavigator invoca un Post.
C'ï¿œ ache, se non erro, una proprietï¿œ del DataSet che indica se vi sono 
modifiche pendenti nel record correnti, che richiedono un POST.
Si tratta della proprietï¿œ Modified, che vale true se vi sono modifiche 
da salvare (o annullare).
HTH
-- 
byez
Piero

Il 07/11/2010 18:43, Favati ha scritto:

Grazie a tutti per avermi risolto il problema :)


Me la stò ancora sbattendo...
Il metodo da te suggerito non funge poichè l'evento si scatena anche 
quando ci deve essere un post (una modifica più conferma scatena l'evento).
Non sò più dove sbattere la testa :(
Quando è in dsEdit o dsInsert e provo a "navigare" che evento si 
scatena?!?!?! (ho controllato con un breakpoint su un bottone messo 
nella form,e sono certo che quando modifico và in dsedit e quando creo 
và in dsInsert,ma cosa scatena un prior,next,etc...??)

Il 07/11/2010 18:43, Favati ha scritto:

Aggirato il problema.... :) Autoedit ad off e controllino :)


No..nemmeno così funge :( 'azzarola!

 quando ci deve essere un post (una modifica più conferma scatena l'evento).
Ahh! Tu dunque vuoi che ti avverta non quando fa il POST, ma SOLO quando 
il post lo fa a causa di una mossa del navigatore (o altro) che ti fa 
passare ad un altro record!
Se così è (sempre che abbia capito), ti dovrebbe bastare il seguente 
sistema:
1. Fattorizza la funzione di richiesta di conferma, che tra le altre 
cose richiede che vi sia una variabile impostata per chiedere o meno la 
conferma; tale variabile dovrebbe essere una variabile di classe del 
Datamodule oppure della finestra dove si trova il DataSet.
2. Tale variabile viene forzata (ad esempio a true) dai pulsanti e da 
tutti gli eventi che vuoi che NON CHIEDANO la conferma
3. Tale variabile viene COMUNQUE RESETTATA (ad esempio a false) quando 
il Post viene concluso, anche se poi il POST fallisce!
4. Quando dunque il Post scatta a causa di un movimento del DBNavigator 
o altro (diciamo un post "Implicito") la variabile non è impostata e 
viene cheista la conferma.
HTH
-- 
byez
Piero


Non c'ho capito un piffero :P

 Non c'ho capito un piffero :P
Ma almeno io ho azzeccato la tua necessità?
Perché se è così possiamo partire da qui
-- 
byez
Piero


Si si...se l'utente non conferma l'edit, voglio che venga una sorta di 
popup annullando (abort) il post e dicendo di confermare o annullare sul 
dbnavigator le modifiche.

 dbnavigator le modifiche.
Allora è abbastanza semplice.
Come ti dicevo devi innanzi tutto definire una variabile che sia 
"visibile" sia dagli eventi dei controlli che vuoi che agiscano (cioè il 
DBNAV ed eventuali altri pulsanti espliciti), ed anche dal BeforePost e 
dall'AfterPost del DataSet "incriminato".
Supponendo che i controlli stiano in una form e che il DataSet stia in 
un DataModule, dovrai fare in modo che il DataModule esponga almeno in 
Set la variabile.
=======================================================================
1. Il DataModule:
type
   TDM = class(TDataModule)
     myDS : TDataSetDescendantDiQualcheTipo;
     ... tuttoo il resto
     procedure DataModuleCreate(Sender: TObject);
     procedure myDSBeforePost(DataSet: TDataSet);
   private
     ibCanPost : Boolean;
   public
     procedure SetCanPost (abCan : Boolean);
     function GetCanPost : Boolean;
   end;
...
implementation
...
procedure TDM.SetCanPost (abCan : Boolean);
begin
   ibCanPost := abCan;
end;
function TDM.GetCanPost : Boolean;
begin
   Result := ibCanPost;
end;
procedure TDM.DataModuleCreate(Sender: TObject);
begin
   ... bla bla fai quel che devi
   ibCanPost := False;
end;
procedure TDM.myDSBeforePost(DataSet: TDataSet);
begin
   if (not ibCanPost) then begin
     ... alert, showmessage, popup, alberi di natale
     Abort;
   end;
end;
procedure TDM.myDSAfterPost(DataSet: TDataSet);
begin
   ibCanPost := False;
end;
=======================================================================
2. La Form
... esempio per un pulsante
procedure myForm.MyBtnClick(Sender : TObject);
begin
   DM.SetCanPost(True);
 
DM.myDS.Post
;
end;
=======================================================================
Ovviamente l'architettura può essere variata, ma il succo è:
1. Disabilitare la possibilità di eseguire il POST sconsiderato
2. Abilitare il Post quando serve
3. Disabilitare un nuovo post appena fatto l'attuale
Se il DataModule ha più di un DataSet su cui devi eseguire questo 
controllo dovrai forse usare variabili diverse, ma questo dipende anche 
da altri fattori (al di là della leggibilità del codice)
HTH
-- 
byez
Piero

Ti ringrazio infinitamente...dovrò studiami bene quel che hai scritto! 
(cavolo che "rispostone")
Grazie tante!
Vi terrò informati!