18.03.2003, 11:39 | #1 |
----------------
|
Дата в QBE
Есть такой код (написан для примера - глубокого смысла не имеет)
PHP код:
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting datetime from character string. Так как Аксапта формирует запрос с параметрами: ((MODIFIEDDATE>={ts '2124-16-21 00:00:00.000'}) OR (CREATEDDATE>={ts '2124-16-21 00:00:00.000'})) Почему так странно отрабатывает интерпретатор? Что делать? (извечный вопрос) |
|
18.03.2003, 12:53 | #2 |
Lean Six Sigma
|
например:
qbDS.addRange(fieldNum(InventTable, modifiedDate)).value( '"18.09.2000".."19.09.2000"'; |
|
18.03.2003, 14:13 | #3 |
сибиряк
|
...
или примерно так ...value(SysQuery::range('"18.09.2000","19.09.2000")); что в принципе одно и то же, но гарантирует совместимость версий
__________________
С уважением, Вячеслав. |
|
18.03.2003, 14:20 | #4 |
----------------
|
Ned, slava, спасибо за внимание
Но вопрос не в том как задать дату (диапазон дат), а в том как это сделать с условием ИЛИ. Например, как выбрать все записи измененные после 13.45 2 марта, или то что в первом постинге было - выбрать все записи измененные ИЛИ добавленные после 17.09.2000 |
|
18.03.2003, 14:27 | #5 |
сибиряк
|
Цитата:
Изначально опубликовано Wamr
Ned, slava, спасибо за внимание Но вопрос не в том как задать дату (диапазон дат), а в том как это сделать с условием ИЛИ. Например, как выбрать все записи измененные после 13.45 2 марта, или то что в первом постинге было - выбрать все записи измененные ИЛИ добавленные после 17.09.2000
__________________
С уважением, Вячеслав. |
|
18.03.2003, 15:14 | #6 |
сибиряк
|
про первый постинг:
кажется при создании записи автоматически заполняется поле modifiedDate равным createdDate. так что может быть достаточно наложить range на поле modifiedDate?
__________________
С уважением, Вячеслав. |
|
18.03.2003, 15:53 | #8 |
Участник
|
вдогонку, если кто-то еще не зарегистрировался на technet
http://technet.navision.com/usered/B...rogramming.htm Смотрите в пример. qbr3.addRange(fieldNum(ProjValEmplCategorySetUp,categoryId)).value( strFmt('(%1 == %4.%3) && (((%1 == %5.%1) && (%1)) || ((%2 == %5.%2) && (%2)))' |
|
18.03.2003, 16:00 | #9 |
Участник
|
Да... совсем забыл.
Даты в Аксапте можно записывать литеральными константами. Вот так. ((modifiedDate >= 18\09\2000) || (createdDate >= 18\09\2000)) |
|
18.03.2003, 16:18 | #10 |
----------------
|
to slava
Действительно, хорошая мысль, но, напомню, что это был всего-лишь пример, а условие реально требует наличия ИЛИ ... даже это уже не важно, хочется понять КАК можно построить сложное условие (OR, AND , NOT, "()" и т.п.), где есть хотя бы 1 дата. to Mazzy Сергей, обрати, пожалуйста, внимание на первый постинг 1. Он называется "Дата в QBE" 2. И условие бралось, именно, из той статьи. Похоже, что дату надо как-то загадочно форматировать, чтобы она нормальна отпарсилась и интерпретировалась. |
|
18.03.2003, 16:40 | #11 |
Участник
|
Вах. Зарапортовался. Виноват.
В исходном топике указаны целые константы. Эти целые числа были автоматически конвертированы в даты. Надо указывать литерал 18\09\2000 |
|
18.03.2003, 16:41 | #12 |
Administrator
|
Может я тоже чего-то не понимаю. Я написал Job и он работает. Причем работает так как нужно. Сразу замечу, что в стандартной InventTable поля modifiedDate и createdDate не заполняются. В Job я использовал CustTable. Вот код:
<pre>static void Job1(Args _args) { Query q; QueryRun qr; QueryBuildDataSource qbds; QueryBuildRange range; Range val; CustTable cust; q = new Query(); qbds = q.addDataSource(tableNum(CustTable)); range = qbds.addRange(fieldNum(CustTable, modifiedDate)); val = "((modifiedDate >= 07\\11\\1999) || (createdDate >= 07\\11\\1999))"; range.value(val); //info(qbds.toString()); qr = new QueryRun(q); while (qr.next()) { cust = qr.getNo(1); info(cust.Name); } }</pre> Могу предположить, что проблема либо в том, что у тебя не хватает слэшей (обрати внимание на пример на TechNet'е. Кроме того, могут быть какие-нить проблемы с настройкой национальных параметров у сервера БД или приложений. Если мой Job не отработает у тебя - пиши. Будем сверять параметры.
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
18.03.2003, 16:45 | #13 |
Administrator
|
О. Я понял, кажется. Все дело в зловещих слэшах. Их режут просто все кому не лень.
В моем предыдущем постинге val присваивается строка, в которой все слэши удвоенные. Форум мне их порезал. Думаю, что у тебя слэши режет X++. Они все-таки должны быть удвоенными. Обрати внимание на то, что тебе печатает info(qbds.toString()). В запрос должны быть слэши.
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
18.03.2003, 16:52 | #14 |
----------------
|
Мне, почему-то не удалось сделать постинг со слэшами в Х++ коде (на первом же сообщение обрезалось). А так как сообщение об ошибке с ними и без них не менялось, то запостил как есть
Максим, не работает... кстати, запрос до сервера не доходит (в профайлере не видно) |
|
18.03.2003, 16:57 | #15 |
----------------
|
Цитата:
Думаю, что у тебя слэши режет X++. Они все-таки должны быть удвоенными.
----------------- Вывод: надо читать документацию ВНИМАТЕЛЬНО, а не только примеры. А там написано - используте функцию date2StrXpp() для преобразования даты в корректную Х++ строку |
|
18.03.2003, 17:01 | #16 |
Administrator
|
Цитата:
Изначально опубликовано Wamr
Максим, не работает... кстати, запрос до сервера не доходит (в профайлере не видно) Что у тебя возвращает info(qbds.toString()); ? У меня: <pre>SELECT * FROM CustTable WHERE ((((modifiedDate >= 07\11\1999) || (createdDate >= 07\11\1999))))</pre> Потом, все-таки не уверен (в общем-то, надеюсь), что проблема не в слэшах. Поэтому отправляю тебе XPO с Job. P.S.: Исправил пост с кодом. Вместо тега для кода X++ использовал <pre> </pre>
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
18.03.2003, 17:42 | #17 |
----------------
|
Еще раз спасибо всем участникам.
Добавлю, напоследок, еще немного бесполезной, но интересной инфы PHP код:
|
|
18.03.2003, 17:56 | #18 |
Участник
|
Так, вроде только на MS SQL работает.
Вот выдержка из BookOnline Цитата:
datetime constants
datetime constants are represented using character date values in specific formats, enclosed in single quotation marks. For more information about the formats for datetime constants, see Using Date and Time Data. Examples of date constants are: 'April 15, 1998' '15 April, 1998' '980415' '04/15/98' Не уверен, что такая конструкция будет работать на Оракле. |
|
18.03.2003, 18:08 | #19 |
----------------
|
Mazzy, не торопись
num2char преобразует код символа в символ. В результате строка не будет иметь ничего общего с приведенными примерами, однако, запрос на сервак пойдет нормальный. |
|
19.03.2003, 15:38 | #20 |
Участник
|
На сервак пойдет строка. Так?
Строка вида '980415' MS SQL умеет воспринимать такие строки в запросе и интерпретировать их как даты. А Oracle умеет принимать такое? Надо будет почитать. |
|
|
Похожие темы | ||||
Тема | Ответов | |||
Складская дата | 8 | |||
как узнать системное дата и время??? | 2 | |||
Дата отгрузки заказа типа Контракт | 1 | |||
Закупка. Дата получения документа. | 5 | |||
Дата физ. проводки | 4 |
Опции темы | Поиск в этой теме |
Опции просмотра | |
|