Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > показать преобразованные данные


Автор: Albinos_x 4.12.2005, 22:47
задача заключается в следующем:
есть поле парадокс БД типа DateTime, но отображать пользователю содержимое необходимо в часах.
Вопрос : как это можно реализовать?

Заранее спасибо! smile

Автор: <Spawn> 5.12.2005, 07:45
При выборке данных использовать метод AsTime

Автор: Albinos_x 5.12.2005, 09:07
а можно по подробнее?

Автор: bas 5.12.2005, 17:55
Цитата(Albinos_x @ 4.12.2005, 22:47)
но отображать пользователю содержимое необходимо в часах.

Где отображать?

Автор: Albinos_x 5.12.2005, 18:44
в таблице типа DBGrid...

Автор: offline 5.12.2005, 19:16
Так тебе нужно от времени часы отделить?

Автор: Albinos_x 5.12.2005, 20:41
отделить не проблема...
вопрос как отобразить....например пользователь задал '224:20:45' в формате Tdatetime:Double будет ~ 9,354...(целое дни начиная от 31.12.1899, дробная часы от 0:0:0 до 24:00:00), т.е. отображаться в этом поле цифра будет '8.1.1900 8:20:45',в том и вопрос как сделать так чтобы поле отображала '240:20:45', т.е. подменить отображаемые данные на переведённые в удобочитаемый вид.

Автор: offline 5.12.2005, 22:50
Честно говоря, я выпил маловато, что бы с этим разобраться smile

Но насколько я понял, ты хочешь вместо 224:20:45 вывести 240:20:45?
Если так, то используй вычисляемые поля, в которых будет твой алгоритм чудесно превращающий 224:20:45 в 240:20:45

Автор: Albinos_x 5.12.2005, 23:42
Цитата(kirilllius @ 5.12.2005, 22:50)
Но насколько я понял, ты хочешь вместо 224:20:45 вывести 240:20:45?

нет...попробую объяснить сначала.... у меня есть поле типа DateTime, но туда записывается не дата и время, а промежуток времени. Пользователь задаёт этот промежуток в формате [HH]:MM:SS, т.е. часы:минуты:секунды, количество часов может превышать 24 часа(т.е. больше суток). Для записи в БД я соответственно это привожу к типу TDateTime. Формат этого типа жанных в делфи подразумевает, как я выше писал: целое дни начиная от 31.12.1899 (при целой части равной 0), дробная часы от 0:0:0:0 до 24:00:00:00. следовательно в поле БД запишется вместо 224:20:45 приблизительно 9,354... Но тип поля стоит DateTime, поэтому если посмотреть содержимое поля, то мы увидим: 8.1.1900 8:20:45. что не является удобочитаемым (долго придётся пользователю объяснять как расшифровать эту запись smile ). До этого применял DBGrid, для отображения данных, через Table. Но он отображает, так как есть в БД. Что мне соответственно не подходит. Вопрос заключается в том, как можно сделать через тот же или другие компаненты работы с БД отображение этого промежутка времени в удобочитаемом виде (типа 224:20:45). Реорганизацию БД не предлагать, т.к. программа основной функционал выполняет безотказно.

Автор: YurikGL 6.12.2005, 00:07
Цитата
Albinos_x (Online)


Если я не ошибаюсь, тип TTime принципиально не позволит отобразить 222 часов т.к. у него ограничение в 24 часа. Самый простой способ, ИМХО, хранить отдельно три целых поля для часов, минут и секунд.

Автор: offline 6.12.2005, 00:09
я понял smile т.е. когда ты вводишь 224:20:45 то база у тебя ругается, что такого времени нет или сама переводит в 8.1.1900 8:20:45, а тебе нужно в 224:20:45 оставить, так или я опять не понял smile
если я не понял, то напиши, что ты хочешь ввести и что нужно отобразить.
если я правильно понял, то сделай это поле просто текстовым или если не хочешь переделывать, то создай вычисляемое поле, которое будет по 8.1.1900 8:20:45 собирать его обратно в 224:20:45 (вычисляемое поле на структуру БД не влияет, т.ч. ни какой реорганизации)

Автор: YurikGL 6.12.2005, 00:17
Цитата
Реорганизацию БД не предлагать, т.к. программа основной функционал выполняет безотказно.

Ой... не увидел.... smile

Ну это.... DateTime, насколько я помню, является Double.... не помню сколько там байт, но можно извратиться и первый байт (или два) пользовать для хранения количества часов, второй для минут, третий для секунд...
В сущности, там сделано аналогичным образом, только напиханы еще и дни и месяцы и годы...вот и нужно все, что пользуется под часы, дни, месяцы и годы использовать для хранения только часов.
Итог: считываем как double разбираем по байтам и выводим на экран....

P.S. Неужели так тяжело реорганизовать базу?

Автор: Albinos_x 6.12.2005, 00:28
Цитата(YurikGL @ 6.12.2005, 00:07)
Если я не ошибаюсь, тип TTime

не ошибаешься, он не может быть больше 1.
Цитата(kirilllius @ 6.12.2005, 00:09)
я понял  т.е. когда ты вводишь 224:20:45 то база у тебя ругается, что такого времени нет или сама переводит в 8.1.1900 8:20:45, а тебе нужно в 224:20:45 оставить

угадал...
если применять StrToDateTime('224:20:45'), то такую строку он и не переведёт... будет сильно ругаться и выдавать ошибки, поэтому перевод заключается в применении EncodeTime(1,0,0,0)*240+... и так далее... вот и получается 9,354...., что заносится в БД как 8.1.1900 8:20:45, да и в дальнейшем в программе я работаю именно с числом 9,354...., а не со строкой, но в программе предусмотрено редактирование(добавление, удаление, редактирование записей) БД и соответственно я отображаю содержимое БД через DBGrid. В режиме редактирования и удаления текущая запись отображается в отдельном компаненте, но перед тем как туда записать, я соответственно пересчитываю в удобочитаемый формат. А вот как сделать чтоб DBGrid (или подобном компаненте) отображалось в удобочитаемом формате... здесь возникла загвоздка... Пока предпологаю сделать дополнительное текстовое поле с записью в удобочитаемом формате. Но решил зайти сюда спросить, может как лучше сделать...

Автор: offline 6.12.2005, 00:35
ну так создай вычисляемое поле и делов то. вычисляемое поле на структуру БД не влияет, т.ч. ни какой реорганизации

Автор: Albinos_x 6.12.2005, 01:41
спасибо за совет... сделаю наверно отдельное текстовое поле, так наверно проще будет...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)