Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

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

 
Вася   (2012-04-24 13:38) [0]

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


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

афтерпост


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

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


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

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

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


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

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


 
oldman ©   (2012-04-26 12:27) [5]


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


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


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

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


 
sniknik ©   (2012-04-26 12:43) [7]

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


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

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;  


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

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


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

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


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


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


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


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

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



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.133 c
2-1333633351
Jimmy
2012-04-05 17:42
2013.03.22
Как правильно отобразить картинку с полупрозрачными пикселями?


15-1343668211
vasa777
2012-07-30 21:10
2013.03.22
дельфи устарело


2-1332577830
Pcrepair
2012-03-24 12:30
2013.03.22
TStringList и перевод символов в нижний регистр


1-1298886494
harisma
2011-02-28 12:48
2013.03.22
Упаковка массива рекордов в олевариант


15-1329149862
Alex555
2012-02-13 20:17
2013.03.22
Можно ли как-то посмотреть вот это видео