![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
По какому событию пересчитывать рекордсет?
Вася © (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]афтерпост