Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

По какому событию пересчитывать рекордсет?


Вася ©   (2012-04-24 13:38:00) 

Есть рекордсет, отображен в дбгриде, после правки записи, нужно программно пересчитать последующие строки. По какому событию это лучше делать? Пробовал recordset.afteredit - при переводе рекордсета в режим редактирования - бесконечный цикл.
(lazarus+MSSQL)


Вася   (2012-04-26 13:46:00) [1]

Ок, всем спасибо,  REcNo - учту. )


Сергей М.   (2012-04-26 13:35:00) [2]


> вот где грабли


эти грабли сами по себе , а RecNo-грабли - это другие грабли, которые рано или поздно выстрелят)


Вася   (2012-04-26 13:17:00) [3]

sqlkards.First;- вот где грабли, а я на него и не обращал внимания


Сергей М.   (2012-04-26 13:12:00) [4]

Используя RecNo ты сам себе готовишь грабли


Вася   (2012-04-26 13:05:00) [5]

procedure TForm1.SQLkardsPerescet(); //пересчитіваем всю карточку
var
 id_rec:integer; //номер строки до пересчета
 spid_kon:integer; //конечные показания спидометра
 ost_kon:double;//остаток на конец дня

begin
id_rec:=sqlkards.RecNo;
spid_kon:=0;
ost_kon:=0.00;
sqlkards.First;
while not sqlkards.EOF do
begin
 //готовим данные
 sqlkards.Edit;

 //*****************если не замена и не первая запись
if (sqlkards.FieldByName('chainge').asinteger=0) and (sqlkards.recno>1) then
   begin
    sqlkards.FieldByName('spid1').asinteger:=spid_kon;     //переносим конечные данные спидоматре на начало
    sqlkards.FieldByName('ostat').asfloat:=ost_kon;      //остатки бензина
   end
else
begin   //остатки в случае смены спидометра
//********************если замена
if  (sqlkards.FieldByName('chainge').asinteger=1) and (sqlkards.recno>1)
then
   begin
    sqlkards.FieldByName('ostat').asfloat:=ost_kon;
    end;
 end;
//***************если первая запись
 if  (sqlkards.recno>1)
then
   begin
   end;

 sqlkards.FieldByName('ostkon').asfloat:=sqlkards.FieldByName('liters').asinteger +sqlkards.FieldByName('ostat').asfloat-sqlkards.FieldByName('fakt').asinteger;

//запоминаем конечные данные
 spid_kon:=sqlkards.FieldByName('spid2').asinteger;
 ost_kon:=sqlkards.FieldByName('ostkon').asinteger;

 sqlkards.Next;
 end;
end;  


sniknik   (2012-04-26 12:43:00) [6]

> в этом случае бесконечный цикл при вызове recordset.post
во первых считать нужно только если изменилось значение поля. во вторых пересчитывать только для одной следующей записи, и только если не конец рекордсета.
бесконечного цикла не будет.


Вася   (2012-04-26 12:37:00) [7]

это не кошерно, проще уж как сейчас - отдельно кнопка для пересчета


oldman   (2012-04-26 12:27:00) [8]


> после правки записи, нужно программно пересчитать последующие
> строки


запретить правку в дбгриде, вызывать окно редактирования.
по кнопке ОК в окне редактирования производить телодвижения


Вася   (2012-04-26 12:19:00) [9]

Нет, не пойдет. Вобще отлично работает событие DBGridEditingDone? Но здесь возникают проблемы при нажатии клавиши энтер или таб при окончании редактировния - прога вылетает. Если мышей или стрелками переходить на другую ячейку - проблем нет


icWasya   (2012-04-24 17:10:00) [10]

Для ухода от такой рекурсии
Заводим у формы поле
 FInRecalc:boolean;
внутри процедуры обработки

begin
 if FInRecalc then Exit;
try
  пересчитываем
finally
 FInRecalc:=false;
end;
end;


Вася   (2012-04-24 14:07:00) [11]

в этом случае бесконечный цикл при вызове recordset.post


Сергей М.   (2012-04-24 13:45:00) [12]

афтерпост


Наверх

Титульная страница Поиск, карта сайта Написать письмо