Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
3-1080720517
Samovar inc.
2004-03-31 12:08
2004.04.25
Fast


1-1081187071
3APA3A
2004-04-05 21:44
2004.04.25
Сколько времени прошло с момента создания файла...


1-1081415231
Vovas
2004-04-08 13:07
2004.04.25
Как привести форму-предок к типу формы-потомка?


3-1080573122
vantage10
2004-03-29 19:12
2004.04.25
Как получить список таблиц


7-1077960096
DuhcmanSoft
2004-02-28 12:21
2004.04.25
StayOnTop для компонентов требуется помощь.





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