Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.067 c
3-1287641897
dmitry1208197320
2010-10-21 10:18
2013.03.22
Правильность ввода поля при переходе к другой записи


3-1276604494
Eugene1501
2010-06-15 16:21
2013.03.22
Как блокировать таблицу при помощи ADO


2-1329733532
Drowsy
2012-02-20 14:25
2013.03.22
программа для обновления страницы браузера


2-1329295758
toropoff
2012-02-15 12:49
2013.03.22
Antialiasing


15-1343498887
stas
2012-07-28 22:08
2013.03.22
отправить факс через VentaFax (из моей программы)





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский