#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.