Newsgroup: it.comp.lang.delphi
Titolo: Edit e post in DBGrid

Salve al NG;
Ripropongo con aggiunta codice un quesito già proposto ('eppure sono solo').
Uso D7 e stò preparando un'applicazione che usa prevalentemente date con 
archivi DBF.
Devo modificare i dati, e, quasi subito mi compare:: 'Couldn't perform the 
edit because another user changed the record'. Oppure 'Table is busy' anche 
se ho eseguito la chiusura della tabella.
Sono 8 campi date
// *************** AGGIORNAMENTO DATI ******************************
PROCEDURE TTfrmMain.Button1Click(Sender: TObject);
 VAR I:INTEGER;
     _stringa:String;
BEGIN
 Table1.Close;
 Table1.IndexName:='';
 Panel3.Caption:='Indice attivo: Sequenza originale del Data-Entry';
 Panel3.Refresh;
 Table1.Active:=FALSE;
 Table1.Exclusive:=True;
 Table1.Open;
 Table1.Active:=True;
 Table1.First;
 IF (Table1.CanModify=FALSE) THEN
  Table1.CanModify;
 WHILE NOT Table1.EOF DO
  BEGIN
   FOR I:=3 TO 10 DO
    BEGIN
     Table1.Edit;
     Table1.Fields[I].Value:=StrToDate('01/01/2000');
     Table1.Post;
     Table1.ApplyUpdates;
    END;
   Table1.Edit;
   Table1.Fields[12].Value:=''; //note
   Table1.Post;
   Table1.ApplyUpdates;
   _stringa:=('Record: 
'+IntToStr(Table1.RecNo)+'/'+IntToStr(Table1.RecordCount)+' - 
'+Table1.Fields[1].Value+' * ');
   FOR I:=13 TO 20 DO
    BEGIN
     _stringa:=_stringa+VarToStr(Table1.Fields[I].Value);
     TfrmMain.Caption := _stringa;//('Record: 
'+IntToStr(Table1.RecNo)+'/'+IntToStr(Table1.RecordCount)+' - 
'+Table1.Fields[1].Value+' * '+VarToStr(Table1.Fields[I].Value));
     Table1.Edit;
     Table1.Fields[I].Value:='x';
     Table1.Post;
     Table1.ApplyUpdates;
    END;
   Table1.Next;
  END;
  Table1.Refresh;
END;
Come vedete la procedura dovrebbe scrivere nei field i valori ('01/01/2000') 
o 'x'.
Ma al secondo ciclo For segnale l'errore.
Per quanto ho letto, ho seguito i manuali ma pare che non basta.
Grazie.
Elzeviro.

"Elzeviro" ha scritto nel messaggio
<super cut>
Il dataset va posto in stato di edit solo UNA volta, non ad ogni 
ciclo.
Consiglio: riscrivi completamente il tuo codice.
Ciao
-- 
ACSH
[D4]
Chi fa da se', fatica il doppio 

 ciclo.
per cui portando un Table1.Edit prima del ciclo for e togliendo tutti 
gli altri Table1.Edit, dovrebbe bastare per risolvere il quesito.
ora provo.
Grazie

 Consiglio: riscrivi completamente il tuo codice.
Si, dovrei seguire il consiglio, ma come; se le prove non sortiscono 
effetto.
Grazie dell'aiuto.
Elzeviro. 

>     IF Table1.State IN [dsEdit, dsInsert] THEN Table1.Post;
qui esegui il Post, e di conseguenza non sei piu' stato edit;
sposta Table1.edit , dopo il Begin , cosi' tieni impegnato il record
solo per il tempo necessario.
avevi anche posto Table1.Exclusive:=True;
prove a settarlo su false, magari qualche vantaggio lo avrai.


 effetto.
Non è impostando tutte le proprietà di un oggetto a casaccio nel
codice che si ottiene ciò che si vuole: bisogna capire anche il
senso di  quello che si scrive; esempio:
Tuo codice, miei commenti:
 Table1.Close; // chiudi la tabella
 Table1.IndexName:='';
// cancelli l'eventuale indice: e se devi fare una ricerca?
 Table1.Active:=FALSE; // RICHIUDI la tabella
 Table1.Exclusive:=True; // rendi la tabella ad accesso esclusivo
 Table1.Open; // apri la tabella
 Table1.Active:=True; // RIAPRI la tabella
 Table1.First; // ti posizioni sul primo record
 IF (Table1.CanModify=FALSE) THEN
  Table1.CanModify; // controlli una proprietà, poi non fai nulla
Attenzione: se puoi, abbandona il BDE e i file dbf e passa a database
più seri e performanti.
Ciao
(meno uno)
