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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 18.03.2003, 11:39   #1  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Дата в QBE
Есть такой код (написан для примера - глубокого смысла не имеет)
PHP код:
    qbDS q.addDataSource(tableNum(InventTable));
    
range qbDS.addRange(fieldNum(InventTablemodifiedDate));

    
val "((modifiedDate >= 18092000) || (createdDate >= 18092000))"// пример с technet
//    info(val);
    
range.value(val);
    
info(qbDS.toString());

    
qr = new QueryRun(q);
    
qr.literals(1);
    
qr.next(); 
В результате получается ошибка:
[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  
Ned is offline
Ned
Lean Six Sigma
 
680 / 99 (5) ++++
Регистрация: 29.12.2002
Адрес: самолёт
например:
qbDS.addRange(fieldNum(InventTable, modifiedDate)).value(
'"18.09.2000".."19.09.2000"';
Старый 18.03.2003, 14:13   #3  
slava is offline
slava
сибиряк
Самостоятельные клиенты AX
 
468 / 23 (1) +++
Регистрация: 28.12.2001
Адрес: Москва
...
или примерно так ...value(SysQuery::range('"18.09.2000","19.09.2000"));
что в принципе одно и то же, но гарантирует совместимость версий
__________________
С уважением, Вячеслав.
Старый 18.03.2003, 14:20   #4  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Ned, slava, спасибо за внимание
Но вопрос не в том как задать дату (диапазон дат), а в том как это сделать с условием ИЛИ.

Например, как выбрать все записи измененные после 13.45 2 марта, или то что в первом постинге было - выбрать все записи измененные ИЛИ добавленные после 17.09.2000
Старый 18.03.2003, 14:27   #5  
slava is offline
slava
сибиряк
Самостоятельные клиенты AX
 
468 / 23 (1) +++
Регистрация: 28.12.2001
Адрес: Москва
Цитата:
Изначально опубликовано Wamr
Ned, slava, спасибо за внимание
Но вопрос не в том как задать дату (диапазон дат), а в том как это сделать с условием ИЛИ.

Например, как выбрать все записи измененные после 13.45 2 марта, или то что в первом постинге было - выбрать все записи измененные ИЛИ добавленные после 17.09.2000
извиняюсь. действительно невнимательно прочел первый пост.
__________________
С уважением, Вячеслав.
Старый 18.03.2003, 15:14   #6  
slava is offline
slava
сибиряк
Самостоятельные клиенты AX
 
468 / 23 (1) +++
Регистрация: 28.12.2001
Адрес: Москва
про первый постинг:
кажется при создании записи автоматически заполняется поле modifiedDate равным createdDate. так что может быть достаточно наложить range на поле modifiedDate?
__________________
С уважением, Вячеслав.
Старый 18.03.2003, 15:53   #8  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
вдогонку, если кто-то еще не зарегистрировался на 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  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Да... совсем забыл.
Даты в Аксапте можно записывать литеральными константами. Вот так.

((modifiedDate >= 18\09\2000) || (createdDate >= 18\09\2000))
Старый 18.03.2003, 16:18   #10  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
to slava
Действительно, хорошая мысль, но, напомню, что это был всего-лишь пример, а условие реально требует наличия ИЛИ ... даже это уже не важно, хочется понять КАК можно построить сложное условие (OR, AND , NOT, "()" и т.п.), где есть хотя бы 1 дата.

to Mazzy
Сергей, обрати, пожалуйста, внимание на первый постинг
1. Он называется "Дата в QBE"
2. И условие бралось, именно, из той статьи.

Похоже, что дату надо как-то загадочно форматировать, чтобы она нормальна отпарсилась и интерпретировалась.
Старый 18.03.2003, 16:40   #11  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Вах. Зарапортовался. Виноват.

В исходном топике указаны целые константы.
Эти целые числа были автоматически конвертированы в даты.
Надо указывать литерал 18\09\2000
Старый 18.03.2003, 16:41   #12  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Может я тоже чего-то не понимаю. Я написал 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  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
О. Я понял, кажется. Все дело в зловещих слэшах. Их режут просто все кому не лень.

В моем предыдущем постинге 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  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Мне, почему-то не удалось сделать постинг со слэшами в Х++ коде (на первом же сообщение обрезалось). А так как сообщение об ошибке с ними и без них не менялось, то запостил как есть

Максим, не работает... кстати, запрос до сервера не доходит (в профайлере не видно)
Старый 18.03.2003, 16:57   #15  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Цитата:
Думаю, что у тебя слэши режет X++. Они все-таки должны быть удвоенными.
Гениально! Спасибо
-----------------
Вывод: надо читать документацию ВНИМАТЕЛЬНО, а не только примеры. А там написано - используте функцию date2StrXpp() для преобразования даты в корректную Х++ строку
Старый 18.03.2003, 17:01   #16  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Цитата:
Изначально опубликовано Wamr
Максим, не работает... кстати, запрос до сервера не доходит (в профайлере не видно)
OK. Давай по порядку...
Что у тебя возвращает info(qbds.toString()); ?

У меня:
<pre>SELECT * FROM CustTable WHERE ((((modifiedDate >= 07\11\1999) || (createdDate >= 07\11\1999))))</pre>

Потом, все-таки не уверен (в общем-то, надеюсь), что проблема не в слэшах. Поэтому отправляю тебе XPO с Job.

P.S.: Исправил пост с кодом. Вместо тега для кода X++ использовал &lt;pre&gt; &lt;/pre&gt;
Вложения
Тип файла: xpo job1.xpo (1.0 Кб, 199 просмотров)
__________________
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  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Еще раз спасибо всем участникам.

Добавлю, напоследок, еще немного бесполезной, но интересной инфы
PHP код:
    val '(StartDate > "' num2char(year(today())-1900)
                           + 
num2char(mthofyr(today())-1)
                           + 
num2char(dayofmth(today())-1) + 
          
'") ''|| ((StartDate = "' 
                           
num2char(year(today())-1900)
                           + 
num2char(mthofyr(today())-1)
                           + 
num2char(dayofmth(today())-1) + 
          
'") && (StartTime >= 'int2str(timenow()) + '))'
оказывается, можно вот так упаковать дату
Старый 18.03.2003, 17:56   #18  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Так, вроде только на 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  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Mazzy, не торопись

num2char преобразует код символа в символ. В результате строка не будет иметь ничего общего с приведенными примерами, однако, запрос на сервак пойдет нормальный.
Старый 19.03.2003, 15:38   #20  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
На сервак пойдет строка. Так?
Строка вида '980415'

MS SQL умеет воспринимать такие строки в запросе и интерпретировать их как даты.
А Oracle умеет принимать такое?
Надо будет почитать.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Складская дата longson DAX: Функционал 8 05.05.2008 02:29
как узнать системное дата и время??? Daido DAX: Программирование 2 01.08.2007 17:33
Дата отгрузки заказа типа Контракт AlexeyBP DAX: Функционал 1 17.10.2006 13:53
Закупка. Дата получения документа. AlexeyBP DAX: Функционал 5 15.12.2005 16:53
Дата физ. проводки Yprit DAX: Функционал 4 17.12.2004 15:29

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

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

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