Форум: "Базы";
Текущий архив: 2004.04.25;
Скачать: [xml.tar.bz2];
ВнизИли 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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.032 c