Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.046 c
2-1338983806
iMain
2012-06-06 15:56
2013.03.22
Client WebService


15-1334662086
xayam
2012-04-17 15:28
2013.03.22
Преобразование RGB в оттенки серого (схема)


2-1333499708
Dron55555555555
2012-04-04 04:35
2013.03.22
Дробные числа 2


2-1334063803
AndreyPl
2012-04-10 17:16
2013.03.22
комбинация клавиш для установки TabOrder


2-1347507525
turbo
2012-09-13 07:38
2013.03.22
Как перевести дату в нормальный формат?




   Наверх