Главная страница
    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.47 MB
Время: 0.061 c
15-1340972066
Омлет
2012-06-29 16:14
2013.03.22
Почему в русском при отрицании [всё] = [ничего]?


2-1328775163
Scott Storch
2012-02-09 12:12
2013.03.22
xml, utf8


2-1342449803
solovei
2012-07-16 18:43
2013.03.22
дождаться завершения установки


15-1335990605
Юрий
2012-05-03 00:30
2013.03.22
С днем рождения ! 3 мая 2012 четверг


15-1353921552
NailMan
2012-11-26 13:19
2013.03.22
Полетал в штиль на подмосковных прыщах





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский