Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

DBGrid и unixtime [D7, MySQL]


Jungle Forever! ©   (2005-04-25 20:01:00) 

Посоветуйте пожалуйста

есть типа такого запроса SELECT *,  FROM_UNIXTIME(date1, '%H:%i:%s') as gmt_date FROM senders

Поле date1 типа varchar(11). Cодержит либо время в unixtime либо NULL.
Если значение поля date1 не пустое, то время вернет нормально, но если значение NULL, то в gmt_date будет 00:00:00, что вполне логично, но мне нужно чтобы при выводе в DBGrid, если date1=NULL, была пустая строка, а не нули. Это возможно сделать только с помощью mysql? Если нет, то какие решения существуют? date1 используется в куче всяких статистик, поэтому  хранить время в обычном формате нельзя. А выводить результат sql-запроса в StringGrid очень не хочется


Jungle Forever!   (2005-04-26 12:14:00) [1]

Всё, получилось. Всем огромное спасибо :)


Johnmen   (2005-04-26 12:13:00) [2]

Вот-вот. Не существует поля-то :)


sniknik   (2005-04-26 12:07:00) [3]

> Ошибка возникает на определении обработчика события OnGetText, а не в самом обработчике.
именно про это я и думал, на присвоении -> BGrid4.Fields[4].OnGetText:=OnGetText;
почему уже обьясняли.
только я не обратил внимание куда ты это присваиваеш (показалось, логично полю), а у тебя через грид, тогда кроме того что говорилось надо еше и открытие таблици добавить до этого к полм через грид доступа не будет (если они конечно в десигне не описаны).
т.е. + к onShow, после открытия таблици привязаной к этому гриду.  

а то чтоне мог найти, так искал не там, оно находится в данных а не компоненте эти данные отображающие...


Jungle Forever!   (2005-04-26 11:56:00) [4]

>Anatoly Podgoretsky

я не смог найти :(
у DBGrid.Сolumns вобще нет ни одного event'а.
Процедуру обработки определил в type TMain = class(TForm)


Anatoly Podgoretsky   (2005-04-26 11:49:00) [5]

Определение создается просто, двойным щелчком по событию OnGetText, соответствующего поля, в инспекторе объектов.


Jungle Forever!   (2005-04-26 11:32:00) [6]

>sniknik

Ошибка возникает на определении обработчика события OnGetText, а не в самом обработчике.
ставить на TMain.onShow пробовал - тоже самое. Компоненты DBExpress изначально на датамодуле размещались и сам датамодуль создается раньше формы TMain.


Anatoly Podgoretsky   (2005-04-26 11:20:00) [7]

Johnmen ©   (26.04.05 09:42) [3]
Почему не поможет, не зная ее синтаксиса приведу общее стандартное решение
IFNULL(date1=NULL; NULL; FROM_UNIXTIME(date1, '%H:%i:%s'))


sniknik   (2005-04-26 10:46:00) [8]

проверь
procedure TMain.OnGetText(Sender: TField; var Text: String; DisplayText: Boolean);
begin
 DisplayText:= not Sender.isNull;
end;
(возможно функция отрабатывает как раз нормально, а преобразование уже на момент отображения...)

но к AV это вряд ли имеет отношение, сдесь дело в чемто другом. например в procedure TMain.Form Create(Sender: TObject); ??? переставь это присвоение на onShow, или базовые компоненты  помести в датамодуль а его создание поставь раньше главной формы.
но только не вали на DBExpress и т.д., запомни главный глюк в компьютере это ты!!! ;о))) пока не разобрался как это работает...


Johnmen   (2005-04-26 10:32:00) [9]

Видимо на момент определения обработчика геттекст для поля №4 самого поля не существует.


Jungle Forever!   (2005-04-26 10:18:00) [10]

Пробовал еще изменять обработчик DataSet'а - тоже самое, AccessViolation

SimpleDataSet10.FindField('gmt_date').OnGetText := OnGetText;


Jungle Forever!   (2005-04-26 09:57:00) [11]

>Johnmen ©

Да, OnGetText похоже то, что нужно, но есть какя-то проблема. Сделал так:

procedure TMain.FormCreate(Sender: TObject);
begin
 DBGrid4.Fields[4].OnGetText:=OnGetText;
end;

procedure TMain.OnGetText(Sender: TField; var Text: String; DisplayText: Boolean);
begin
if (Text = '00:00:00') then Text := '';
end;

Delphi вылетает с ошибкой  EAccessViolation
Я использую для доступа DBExpress - может с ним что-то связано?


Johnmen   (2005-04-26 09:42:00) [12]

>Anatoly Podgoretsky ©   (26.04.05 09:05) [2]

Да, там есть ф-ия IFNULL, но ни она, ни ей подобные здесь не помогут.


Anatoly Podgoretsky   (2005-04-26 09:05:00) [13]

Это FROM_UNIXTIME видимо какая то встроеная или самописная функция, которая или неправильно работает или работает не так как ожидается тобой. Может в MySQL есть какая ни будь условная функция типа IIF/CASE, то используй ее для определения NULL и выдачи уже нужного значения или обрабатывай date1 на клиенте или ищи функцию, которая соответствует твоим ожиданиям.


Johnmen   (2005-04-25 21:57:00) [14]

OnGetText


Наверх

Титульная страница Поиск, карта сайта Написать письмо