Больше даты в Axapta 2009 X

#axapta #x #dynamics-ax-2009

#axapta #x #динамика-ax-2009

Вопрос:

Я хочу написать запрос, который будет выбирать все заказы на продажу, превышающие определенную дату в X . Это было бы частью работы, которую я пишу.

Что-то вроде этого:

 SalesTable.createdDateTime > '2016-09-01'
  

Я считаю, что мне нужно использовать DateTimeUtil::newDateTime для этого. Я видел такие примеры, как:

 where salesLine.createdDateTime == DateTimeUtil::newDateTime(systemdateget(), 0)
  

Как мне ввести туда фактическую дату? Или я должен использовать другой метод? QueryBuilder возможно?

Большое спасибо,

Анна

Комментарии:

1. Привет, Анна, чтобы получить фактическую дату, вы можете использовать методы DateTimeUtil::getSystemDateTime() или DateTimeUtil::utcNow() или today() метод, если вы хотите только дату.

2. Спасибо, Джонатан, но как мне использовать эту фактическую дату в коде? Я видел различные примеры с сегодняшней датой — 30 (для заказов на продажу за прошлый месяц), но то, что я хотел бы сделать, это выбрать все записи после 15 сентября (и не менять эту дату в зависимости от сегодняшней даты).

3. Попробуйте использовать mkdate ( msdn.microsoft.com/en-us/library/aa871977.aspx )

Ответ №1:

Использование синтаксиса запроса AX или использование объекта запроса зависит от вашего использования. Указание даты / времени полезно и для того, и для другого.

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

Вы можете создать date объект или utcDateTime , что, скорее всего, вам нужно будет сделать.

 static void DateTimeExample(Args _args)
{
    utcDateTime         myDateTime;
    date                myDate;
    TimeOfDay           myTimeOfDay;

    // Set your date
    myDate          = mkDate(1,10, year(today())); // Ex. October 1, 2016

    // Set time of day or just use 0
    myTimeOfDay     = DateTimeUtil::time(DateTimeUtil::utcNow());

    // Build your utcObject
    myDateTime  = DateTimeUtil::newDateTime(myDate, myTimeOfDay);

    // Apply timezone offset
    myDateTime  = DateTimeUtil::applyTimeZoneOffset(myDateTime, DateTimeUtil::getCompanyTimeZone());

    info(strFmt("utcDateTime: %1", myDateTime));
}
  

Ответ №2:

По вашему комментарию (но как мне использовать эту фактическую дату в коде?) чтобы использовать это в запросе, вы можете использовать этот код:

 Query                q;
QueryRun             qr;
QueryBuildDataSource qbd;
QueryBuildRange      qbr;
utcDateTime          mutcDateTime;
date                 mDate;

;

mDate        = str2Date("15/09/2016", 123); //15h September   
mutcDateTime = DateTimeUtil::newDateTime(mDate,0);

q   = new Query();
qbd = q.addDataSource(TableNum(SalesTable));
qbr = qbd.addRange(FieldNum(SalesTable, CreatedDateTime));
qbr.value(strFmt('>%1', mutcDateTime));
qr  = new QueryRun(q);    
  

Чтобы выполнить этот запрос с помощью кода и получить SalesTable :

 while(qr.next()){
    salesTable = qr.get(tablenum(SalesTable));
}        
  

Комментарии:

1. Спасибо Прадипу, Алексу и Джонатану за ваши комментарии. Мне определенно есть чему поучиться!

2. Последний новый вопрос, могу ли я обновить эти выбранные записи внутри цикла while?

3. Да, конечно. Прежде чем qr = new QueryRun(q); добавить эту строку qbd.update(true); и внутри цикла while в начале, ttsBegin; в конце ttsCommit; , конечно, вам нужно SalesTable.update() , если вы хотите, вы можете пометить этот ответ как правильный 🙂

4. Спасибо, Джонатан, я ценю помощь!

5. Привет, Джонатан, куда мне поместить ttsBegin и ttsCommit? Я помещаю их оба в цикл, но когда я запускаю код, я получаю эту ошибку: не удается отредактировать запись в заказах на продажу (SalesTable). Операция не может быть завершена, поскольку запись не была выбрана для обновления. Помните TTSBEGIN/ TTSCOMMIT, а также предложение FORUPDATE.