Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизПо какому событию пересчитывать рекордсет? Найти похожие ветки
← →
Вася (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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.057 c