Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.25;
Скачать: CL | DM;

Вниз

Или DBGridEh, или код, или еще чего, но глючит прикольно:   Найти похожие ветки 

 
Miwa ©   (2004-03-23 17:43) [0]

При щелчке на гриде вызывается перерисовка PaintBox-a.

procedure TfrmMain.dbgStatsCellClick(Column: TColumnEh);
begin
 pntExtInfoPaint(self);
end;


А собственно перерисовка делается так:

procedure TfrmMain.pntExtInfoPaint(Sender: TObject);
var arr: array [1..10] of TDateTime;
   c:integer;
   total:integer;
   ttim:integer;
begin
 try
   pntExtInfo.Canvas.FillRect(pntExtInfo.ClientRect);
   total:=0;
   with dtmData.idsExtInfo do
   while not Eof do begin
     //37987 = 01.01.2004
     //id=0,client=1,start=2,time=3,file=4
     c:=trunc((Fields[2].AsDateTime - 37987)/(now - 37987)*10)+1;
     arr[c]:=arr[c]+Fields[3].AsDateTime;
     Next;
     inc(total);
   end;
   for c:=1 to 10 do
     pntExtInfo.Canvas.TextOut(10, c*20, FormatDateTime("h:nn:ss",arr[c]));
   ttim:=dbgStats.Fields[2].AsInteger;
   pntExtInfo.Canvas.TextOut(10,220,Format("Всього звернень: %d.", [total]));
   pntExtInfo.Canvas.TextOut(10,240,FormatDateTime("Загальна тривалість: h:nn:ss",inttotime(ttim)));
 except
   showmessage(format("c = %d  db = %f",[c,dtmData.idsExtInfo.Fields[3].AsDateTime])+#13#10+
   SysErrorMessage(GetLastError));
 end;
end;


Веселье состоит в том, что except выдает примерно такое:
с = 4 db = 0.00
Операция виполнена успешно

И выдает до тех пор, пока в самом гриде не щелкнуть дважды по какой-либо клетке (перевести ее в режим редактирования).

Вообще-то, по большему счету надо просто с таблицы
VIEW_ID: integer (PK)
VIEW_CLIENT: integer (FK)
VIEW_START: TimeStamp
VIEW_TIME: Time
VIEW_FILE: integer (FK)
получить сумму по полю VIEW_TIME за некоторые отрезки времени (в коде - это arr: array [1..10] of TDateTime; реально, конечно, может быть больше или меньше, чем 10).
Вот.


 
Johnmen ©   (2004-03-23 17:56) [1]

Не доведет до добра смешивание в кучу процедур отображения и навигации...


 
miwa ©   (2004-03-23 18:07) [2]

2 Johnmen ©   (23.03.04 17:56) [1]:
Да я в курсе, только говорю - это я пытають получить cумму по полю VIEW_TIME за некоторые отрезки времени (в коде - это arr: array [1..10] of TDateTime; реально, конечно, может быть больше или меньше, чем 10).


 
Johnmen ©   (2004-03-23 18:15) [3]

>miwa ©   (23.03.04 18:07) [2]

>cумму по полю VIEW_TIME

Просто SUM(VIEW_TIME )

>за некоторые отрезки времени

Не понял, где начала и концы отрезков ?


 
miwa ©   (2004-03-23 18:30) [4]

А нету их, концов. Динамически, тоесть, формируются. Как правило - за неделю, но может быть и иначе.
А по time сума не заканает:

select sum(view_time) from views

data type not supported for arithmetic.


 
Johnmen ©   (2004-03-23 18:46) [5]

Да, с суммированием немного прогнал...
Надо так
sum(view_time-cast("00:00:00" as time))
получим количество секунд.
Т.е. арифметические действия справедливы для интервалов.


 
miwa ©   (2004-03-23 20:06) [6]

Хорошо, спасибо, сумма есть. Остальное должно бы приложиться. Правда, есть ли вариант лучше, чим придуманный с ходу

where view_start between :T1 and :T2

для каждого временного отрезка? Это ведь будет n запросов вместо одного...


 
Johnmen ©   (2004-03-24 10:11) [7]

Ты опять говоришь про временные отрезки, но не говоришь однозначно где они и как определены.


 
Miwa ©   (2004-03-24 15:36) [8]

Временные отрезки пока не определены. В приведенном коде есть только общее начало (37987, тоесть 1 января 2004 года) и конец (now). Этот интервал разделен на 10 равных частей. А в реальной работе эти величины будут определятся пользователем.

Да, и еще. Вопросс о странном поведении грида остается актуальным.


 
Miwa ©   (2004-03-25 00:23) [9]

Господа, вопросс о гриде все еще актуален и я все еще веселюсь :о((.


 
ЮЮ ©   (2004-03-25 02:52) [10]

>c:=trunc((Fields[2].AsDateTime - 37987)/(now - 37987)*10)+1;
>arr[c]:=arr[c]+Fields[3].AsDateTime;

Откуда уверенность, что с в первом операторе обязательно окажется в диапазоне 1..10 ?


 
miwa ©   (2004-03-25 03:17) [11]

Расчет. Плюс тестовый цикл.
Для того, чтобы узнать отношение части к целому, надо поделить первое на второе. Если результат умножить на n, отбросить дробную часть и к полученному числу добавить единицу, то получится целое число в диапазоне 1..n. Так на математике говорили :о)).
А я все еще веселюсь...


 
ЮЮ ©   (2004-03-25 06:35) [12]

А откуда уверенность, что (Fields[2].AsDateTime - 37987) это часть (now - 37987) ?

На сегодня now - 37987 = 84.
Если Fields[2].AsDateTime на 90 дней раньше сегодня, то
Fields[2].AsDateTime - 37987 = -6
trunc((-6) / 84 *10 ) + 1 и рядом не лежало с диапазоном 1..10

>Так на математике говорили :о)).
А на программировании не учили контролировать индексы? :-)


 
Miwa ©   (2004-03-25 08:38) [13]

Вы полностью правы, да только...
Только что подумал. Данные-то с логов берутся, которые начались вести с 1 января, но никто никому не мешал на машине дату сменить и...
Неа, на программировании не учили - я программированию все больше сам учусь, да вот "Мастера Дельфи" помагают :о)).
Лезу посмотреть, щас скажу, правы ли Вы.


 
miwa ©   (2004-03-25 08:43) [14]

К моему большому сожалению - нет. Тоесть, в общем случае Вы правы - индексы надо проверять. Но в данном. Индекс все же правильный, да и в формулировке вопросса я привел вывод процедуры ShowMessage, которая срабатывает в блоке "except":

с = 4 db = 0.00
Операция виполнена успешно

Я вот что думаю: раз "Операция выполнена успешно", значит это ошибка Файрбэрда, а не ОС, да? Но какая? Это я все о том же странном поведении грида.


 
Johnmen ©   (2004-03-25 08:58) [15]

Какое отношение к.-л.грид имеет к ФБ ?
А объяснение странностей начинается с поиска ошибки в программе...


 
ЮЮ ©   (2004-03-26 03:17) [16]

А в IDE перед showmessage какой Exception вылетает?


 
Miwa ©   (2004-03-27 22:24) [17]

>Какое отношение к.-л.грид имеет к ФБ ?
Наверное, никакого, но я и не связывал их, наксолько я помню.
>А объяснение странностей начинается с поиска ошибки в программе.
Ищу, не получается.
>А в IDE перед showmessage какой Exception вылетает?
Когда код немножко переработал:

except
on err: Exception do ShowMessage(err.Message)
</CODE
Получаю "Invalid floating point operation".


 
ЮЮ ©   (2004-03-29 03:28) [18]

>Ищу, не получается.
А BreakPoint на ShowMessage поставить не судьба?
А дальше смотри, где могди свалиться.
Если dtmData.Eof, значит в цикле по i: или в каком-нибудь из arr[j] мусор лежит, или inttotime для этого ttim валится,
если нет, то вылетели в цикле считывания данных


 
Miwa ©   (2004-03-29 16:16) [19]

>А BreakPoint на ShowMessage поставить не судьба?
Да все я ставил, все судьба. Проблема оказалась до безобразия тупой: Я НЕ ИНИЦИАЛИЗИРОВАЛ МАССИВ ARR!!!!!
Когда я это понял, то от моего мата проснулись все домашние ;о))).
Всем спасибо за внимание.
З.Ы. Кстати, приведенного кода достаточно для того, чобы понять мою ошибку, в следствии чего риторический вопросс: что это было, что никто не заметил столь вопиющего безобразия? ;о))



Страницы: 1 вся ветка

Текущий архив: 2004.04.25;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.031 c
1-1081705250
Klopan
2004-04-11 21:40
2004.04.25
Как в MessageBox вставить свою иконку ?


3-1080285883
Jungle
2004-03-26 10:24
2004.04.25
MS SQL + ADO + DateTime


1-1081345696
LD
2004-04-07 17:48
2004.04.25
move для string


1-1081138205
_sulent
2004-04-05 08:10
2004.04.25
Tray...


6-1077657222
Android
2004-02-25 00:13
2004.04.25
Port