AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.02.2012, 13:16   #1  
CHESER85 is offline
CHESER85
Участник
 
93 / 11 (1) +
Регистрация: 04.08.2011
Адрес: Ufa
Записей в блоге: 1
Angry Не могу вытащить поле из таблицы FireBird
Не знаю как поступить! Имеется важная база в формате GDB о входе/выходе людей через проходную. Информация о времени хранится в поле определенной таблицы в формате TIMESTAMP, т.е. там содержится дата+время, например '26.09.2007 14:54:12'. Мне очень нужно знать не только дату но и время!
У меня стоит Axapta 4.0. Итак, подключаюсь я к базе данных по ODBC, делаю запрос, и пытаюсь прочитать поле:
...
System.DateTime dt;
...
command.commandText("select * from EVENTS where ...");
rs = command.execute();
while (!rs.eof())
{
dt = rs.fields().itemName("DateTime").value();

info(dt.ToLongDateString() + ' ' + dt.ToLongTimeString());
rs.moveNext();
}
cn.close();
...
но, к сожалению, дату считывает нормально, а вот время - постоянно 0:00.
Я перерыл весь интернет и так и не понял как же считать это поле дата+время!

Последний раз редактировалось CHESER85; 09.02.2012 в 13:18.
Старый 09.02.2012, 13:48   #2  
CHESER85 is offline
CHESER85
Участник
 
93 / 11 (1) +
Регистрация: 04.08.2011
Адрес: Ufa
Записей в блоге: 1
люди, неужели никто не занимался чтением данных из других баз данных?
Старый 09.02.2012, 14:22   #3  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Для Ax4.0 время - это количество секунд, прошедших с полуночи. Т.е. целое число. Соответственно, Вам нужно использовать функцию FireBird, которая может из поля типа DateTime выделить это самое целое число. Что это за функция - я не знаю, поскольку с FireBird не работал.

В этом случае код будет примерно такой

X++:
TransDate transDate;
int  intTime;

command.commandText("select Время(...) as intTime, * from EVENTS where ...");
rs = command.execute();
while (!rs.eof())
{
    transDate = rs.fields().itemName("DateTime").value();
    intTime = rs.fields().itemName("intTime").value();

    info(strFmt("%1 %2", transDate, time2str(intTime,1,1)));
    rs.moveNext();
}
cn.close();
Здесь "Время()" - это как раз та самая функция FireBird которая должна выделить количество секунд, прошедших с полуночи.

PS: Использование System.DateTime - бессмысленно, поскольку "потеря" части со временем происходит в момент считывания значения из RecordSet.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: CHESER85 (1).
Старый 09.02.2012, 15:20   #4  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Вообще-то, есть еще один вариант, но он потребует доработки Axapta.

Дело в том, что на самом деле, значение поля, которое возвращает RecordSet - это объект типа ComVariant. Преобразование его значения в значение "понятное" для Axapta выполняется в методе класса CCADOField.value(). Если посмотреть, что там происходит для даты, то

X++:
// Класс CCADOField
anytype value()
{
    COMVariant  value;

    value = field.value();
    switch (value.variantType())
    {
(...) 
       case COMVariantType::VT_DATE:
            return value.date();
            break;
(...) 
    }
}
Чтобы получить фрагмент со временем надо еще добавить value.time(). Ну, т.е. добавить для метода CCADOField.value() какой-нибудь входной параметр по которому добавлять к дате кусок со временем. Формировать символьную строку.

X++:
// Класс CCADOField
anytype value(Boolean _dateWithTime = false)
{
    COMVariant  value;

    value = field.value();
    switch (value.variantType())
    {
(...) 
       case COMVariantType::VT_DATE:
            if (_dateWithTime)
            {
                return strFmt("%1 %2",value.date(),time2str(value.time(),1,1));
            }
            else
            {
                return value.date();
            }
            break;
(...) 
    }
}
Соответственно, вызов из кода данного метода будет выглядеть так

X++:
str   dateWithTime;

command.commandText("select * from EVENTS where ...");
rs = command.execute();
while (!rs.eof())
{
    dateWithTime = rs.fields().itemName("DateTime").value(true);
    info(dateWithTime);
    rs.moveNext();
}
cn.close();
Впрочем, сам я это не пробовал. Предполагаю только теоретически, что подобное должно работать.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...

Последний раз редактировалось Владимир Максимов; 09.02.2012 в 15:28.
За это сообщение автора поблагодарили: Bega (5), IvanS (1).
Старый 10.02.2012, 06:20   #5  
CHESER85 is offline
CHESER85
Участник
 
93 / 11 (1) +
Регистрация: 04.08.2011
Адрес: Ufa
Записей в блоге: 1
Огромное спасибо вам, Владимир, оба предложенных вами варианта работают))) Остановился на последнем:
anytype value(boolean DateOrTime = true)
...
case COMVariantType::VT_DATE:
if (DateOrTime) return value.date(); else return value.time();
...

И в программе вызываю:
d = rs.fields().itemName("DateTime").value();
t = rs.fields().itemName("DateTime").value(false);
info(date2strusr(d) + ' ' + time2str(t,0,0));

Всё отлично работает! Проблема решена.
Теги
ado, ax4.0, date, datetime, time

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Не могу спрятать поле! andriy_s DAX: Программирование 4 18.03.2010 15:38
Пересоздание таблицы при синхронизации Serg16 DAX: Администрирование 1 26.08.2009 13:55
Advanced query range value expressions: поле таблицы - имя вcтроенной функции year(). ATimTim DAX: Программирование 12 27.03.2009 18:16
Не могу полчить данные из таблицы velk DAX: Программирование 2 04.04.2006 16:05
Поле-ссылки на разные таблицы Хилари DAX: Программирование 2 19.04.2004 17:17

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 05:39.