09.02.2012, 13:16 | #1 |
Участник
|
Не могу вытащить поле из таблицы 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 |
Участник
|
люди, неужели никто не занимался чтением данных из других баз данных?
|
|
09.02.2012, 14:22 | #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(); PS: Использование System.DateTime - бессмысленно, поскольку "потеря" части со временем происходит в момент считывания значения из RecordSet.
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
|
За это сообщение автора поблагодарили: CHESER85 (1). |
09.02.2012, 15:20 | #4 |
Участник
|
Вообще-то, есть еще один вариант, но он потребует доработки 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; (...) } } 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 |
Участник
|
Огромное спасибо вам, Владимир, оба предложенных вами варианта работают))) Остановился на последнем:
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)); Всё отлично работает! Проблема решена. |
|