AXForum  
Go Back   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Forgotten Your Password?
Register Forum Rules FAQ Members List Today's Posts Search

 
 
Thread Tools Search this Thread Display Modes
Old 18.04.2013, 09:51   #1  
dech is offline
dech
Участник
dech's Avatar
Самостоятельные клиенты AX
 
650 / 352 (13) ++++++
Join Date: 25.06.2009
Location: Омск
Blog Entries: 3
Complex expressions in query range
Всем добрый день.
Так сложилось, что у нас не пользуются полем InventBatch.ExpDate, а вместо этого по каждой номенклатуре проставлено время жизни. Соответственно, необходимо узнать, у каких записей в батче истекает срок в течение следующих expDays дней. Никак не получается сделать фильтр, в котором нужно к дате из одной таблицы добавить число дней из другой. Программа работает, если сравнивать дату с датой. Но если к дате прибавить числовое значение, она преобразуется в число и условие работает неправильно.
X++:
    qbr = qbds.addRange(fieldnum(InventBatch, DataAreaId));
    s = strfmt("(%1 + %2.%3 < %4)", // (%1 < %4) - так работает
        fieldstr(InventBatch, ProdDate),
        qbdsInventTable.name(),
        fieldstr(InventTable, ShelfLife),
        queryValue(systemdateget() + expDays) // expDays = 30 дней, к примеру
    );
    qbr.value(s);
__________________
// no comments

Last edited by dech; 18.04.2013 at 10:00.
Old 18.04.2013, 11:59   #3  
dech is offline
dech
Участник
dech's Avatar
Самостоятельные клиенты AX
 
650 / 352 (13) ++++++
Join Date: 25.06.2009
Location: Омск
Blog Entries: 3
К сожалению, тема до конца не раскрыта. Топикстартер ушел в мапитераторы, избавившись от самого вычитания. Мне же позарез нужно сложить дату и число в рендже.
__________________
// no comments
Old 18.04.2013, 12:12   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,450 / 1792 (66) ++++++++
Join Date: 28.04.2007
Location: Калуга
Основная идея: вместо того чтобы складывать дату с числом и результат сравнивать со второй датой, находите разницу мужду датами и сравнивайте её с числом.
X++:
"(%4 - %1 > %2.%3)"
Old 18.04.2013, 12:45   #5  
dech is offline
dech
Участник
dech's Avatar
Самостоятельные клиенты AX
 
650 / 352 (13) ++++++
Join Date: 25.06.2009
Location: Омск
Blog Entries: 3
Да такая же фигня и происходит. Хоть сложение, хоть вычитание, условие не выполняется.
__________________
// no comments
Old 18.04.2013, 13:06   #6  
dech is offline
dech
Участник
dech's Avatar
Самостоятельные клиенты AX
 
650 / 352 (13) ++++++
Join Date: 25.06.2009
Location: Омск
Blog Entries: 3
Давайте, я приведу полный текст джобика.
Есть несколько дат, одна из них 22\3\2012, время жизни номенклатуры K206 - 60 дней. Т.е. одна запись с этой датой как раз не должна попадать в запрос, но выводится.
В дальнейшем планирую theDate превратить в systemdateget() + expDays, пока удобнее так на тестовых данных.
X++:
static void complexExpression(Args _args)
{
    Query                   query = new Query();
    QueryBuildDataSource    qbds;
    QueryBuildDataSource    qbdsInventTable;
    QueryBuildRange         qbr;
    QueryRun                qr;
    InventBatch             inventBatch;
    InventTable             inventTable;
    str                     s;
    date                    theDate = 22\3\2012 + 60;
    ;

    qbdsInventTable = query.addDataSource(tablenum(InventTable), tablestr(InventTable));
    qbdsInventTable.addSelectionField(fieldnum(InventTable, ShelfLife));
    qbdsInventTable.addRange(fieldnum(InventTable, ItemId)).value('K206');
    qbdsInventTable.addRange(fieldnum(InventTable, DataAreaId));

    qbds = qbdsInventTable.addDataSource(tablenum(InventBatch), tablestr(InventBatch));
    qbds.addSelectionField(fieldnum(InventBatch, ProdDate));
    qbds.joinMode(JoinMode::InnerJoin);
    qbds.addLink(fieldnum(InventTable, ItemId), fieldnum(InventBatch, ItemId));

    qbr = qbds.addRange(fieldnum(InventBatch, DataAreaId));
    s = strfmt('((%4 - %1) != %2.%3)',
        fieldstr(InventBatch, ProdDate),
        qbdsInventTable.name(),
        fieldstr(InventTable, ShelfLife),
        date2str(theDate, 213, 2, 4, 2, 4, 4)
    );
    info(s);
    qbr.value(s);

    qr = new QueryRun(query);
    while (qr.next())
    {
        inventBatch = qr.get(tablenum(InventBatch));
        inventTable = qr.get(tablenum(InventTable));
        info(strfmt("@SYS26868",
            queryValue(theDate - inventBatch.prodDate),
            inventTable.ShelfLife));
    }
}
__________________
// no comments

Last edited by dech; 18.04.2013 at 13:09.
Old 18.04.2013, 13:48   #7  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,450 / 1792 (66) ++++++++
Join Date: 28.04.2007
Location: Калуга
date2str(theDate, 213, 2, 4, 2, 4, 4) равносильно date2StrXpp(theDate)?
Old 18.04.2013, 14:05   #8  
dech is offline
dech
Участник
dech's Avatar
Самостоятельные клиенты AX
 
650 / 352 (13) ++++++
Join Date: 25.06.2009
Location: Омск
Blog Entries: 3
Quote:
Originally Posted by S.Kuskov View Post
date2str(theDate, 213, 2, 4, 2, 4, 4) равносильно date2StrXpp(theDate)?
Почти да Дело в том, что на забугорных серверах формат даты именно Месяц, День, Год. Также используются прямые слеши вместо обратных.
__________________
// no comments

Last edited by dech; 18.04.2013 at 14:07.
Old 18.04.2013, 16:13   #9  
abv2703 is offline
abv2703
Участник
 
93 / 22 (1) +++
Join Date: 05.12.2003
Location: Санкт-Петербург, улица Бухарестсткая
Кхе, и шо показывает info(qbdsInventTable.toString())? Можно увидеть?
Old 19.04.2013, 07:54   #10  
dech is offline
dech
Участник
dech's Avatar
Самостоятельные клиенты AX
 
650 / 352 (13) ++++++
Join Date: 25.06.2009
Location: Омск
Blog Entries: 3
Quote:
Originally Posted by abv2703 View Post
Кхе, и шо показывает info(qbdsInventTable.toString())? Можно увидеть?
5 баксов
X++:
SELECT ShelfLife FROM InventTable
WHERE ((ItemId = N'K206'))
JOIN prodDate FROM InventBatch
WHERE InventTable.ItemId = InventBatch.itemId
AND ((((05/21/2012 - ProdDate) != InventTable.ShelfLife)))
__________________
// no comments
Old 19.04.2013, 08:25   #11  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,450 / 1792 (66) ++++++++
Join Date: 28.04.2007
Location: Калуга
А на SQL сервер что уходит? Посмотрите через трассировку запросов

Может быть для надёжности добавить имя таблицы к полю ProdDate в условии WHERE?
This post has been rated by: dech (2).
Old 19.04.2013, 08:46   #12  
abv2703 is offline
abv2703
Участник
 
93 / 22 (1) +++
Join Date: 05.12.2003
Location: Санкт-Петербург, улица Бухарестсткая
Аха, теперь совсем просто: заглянуть в таблицу inventBatch
Old 19.04.2013, 12:13   #13  
dech is offline
dech
Участник
dech's Avatar
Самостоятельные клиенты AX
 
650 / 352 (13) ++++++
Join Date: 25.06.2009
Location: Омск
Blog Entries: 3
Спасибо S.Kuskov
Разобрался в чем дело. Проблема была в дате theDate, которую я уже молотком забивал в query range. Надо было сразу использовать date2strxpp().
А в SQL Trace было ((05/21)/2012)
__________________
// no comments
Old 20.06.2013, 12:36   #14  
dech is offline
dech
Участник
dech's Avatar
Самостоятельные клиенты AX
 
650 / 352 (13) ++++++
Join Date: 25.06.2009
Location: Омск
Blog Entries: 3
Снова такая же проблема возникла. Теперь же не могу понять в чем дело... Получается, будто условие в принципе не срабатывает и всегда возвращает TRUE.
X++:
    Query                   q = new Query();
    QueryRun                qr;
    QueryBuildDataSource    qbds;
    QueryBuildRange         qbr;
    int                     expDays = 30;
    int                     division = Dimensions::code2ArrayIdx(SysDimension::Division);

    InventTable                 it;
    InventSerialProperties   isp;
    date                        expDate;
    ;

    qbds = q.addDataSource(tablenum(InventTable), tablestr(InventTable));
    qbds.addRange(fieldid2ext(fieldnum(InventTable, Dimension), division)).value('FSM');

    qbds = qbds.addDataSource(tablenum(InventSum));
    qbds.addLink(fieldnum(InventTable, ItemId), fieldnum(InventSum, ItemId));
    qbds.addRange(fieldnum(InventSum, PhysicalInvent)).value(">0");
    qbds.addRange(fieldnum(InventSum, ItemId)).value("C250");

    qbds = qbds.addDataSource(tablenum(InventDim));
    qbds.addLink(fieldnum(InventSum, InventDimId), fieldnum(InventDim, InventDimId));

    qbds = qbds.addDataSource(tablenum(InventSerial));
    qbds.addLink(fieldnum(InventDim, InventSerialId), fieldnum(InventSerial, InventSerialId));

    qbds = qbds.addDataSource(tablenum(InventSerialProperties), tablestr(InventSerialProperties));
    qbds.addLink(fieldnum(InventSerial, InventSerialId), fieldnum(InventSerialProperties, InventSerialId));
    qbr = qbds.addRange(fieldnum(InventSerialProperties, DataAreaId));
    // Задаем такое условие: InventSerialProperties.StretchDate + InventTable.ShelfLife <= now() + expDays
    qbr.value(strfmt("(%1.%2 + %3.%4 <= %5)", // здесь условие срабатывает в любом случае
        tablestr(InventSerialProperties), 
        fieldstr(InventSerialProperties, StretchDate),
        tablestr(InventTable), 
        fieldstr(InventTable, ShelfLife),
        date2strxpp(systemdateget() + expDays)
    ));

    // Pulling data

    qr = new QueryRun(q);
    while (qr.next())
    {
        it = qr.get(tablenum(InventTable));
        isp = qr.get(tablenum(InventSerialProperties));
        expDate = isp.StretchDate + it.ShelfLife;
        info(date2strxpp(expDate) + " <= " + date2strxpp(systemdateget() + expDays));
    }
То же самое на SQL. Здесь, конечно все работает:
X++:
DECLARE @ExpDays INT

SET @ExpDays = 1

SELECT 
    ISum.ItemId
  , ISum.PhysicalInvent
  , InvD.ConfigId
  , InvD.InventColorId
  , InvD.WMSLocationId
  , InvD.InventBatchId
  , InvD.InventLocationId
  , InvD.WMSPalletId
  , InvD.AFCInventContainerId
  , InvD.InventSerialId
  , ISP.StretchDate
  , DATEADD(DD, InvT.SHELFLIFE, ISP.StretchDate) AS ExpirationDate

FROM InventTable InvT
INNER JOIN InventSum ISum
   ON ISum.DataAreaId = InvT.DataAreaId
  AND ISum.ItemId = InvT.ItemId
INNER JOIN InventDim InvD
   ON InvD.DataAreaId = ISum.DataAreaId
  AND InvD.InventDimId = ISum.InventDimId
INNER JOIN InventSerial ISer
   ON ISer.DataAreaId = InvD.DataAreaId
  AND ISer.InventSerialId = InvD.InventSerialId
INNER JOIN InventSerialProperties ISP
   ON ISP.DataAreaId = ISer.DataAreaId
  AND ISP.InventSerialId = ISer.InventSerialId
  
WHERE InvT.DataAreaId = 'dat'
  AND InvT.Dimension3_ = 'FSM'
  AND ISum.ItemId = 'C250'
  AND ISum.PhysicalInvent > 0
  AND ISP.StretchDate + InvT.ShelfLife <= GETDATE() + @ExpDays
__________________
// no comments

Last edited by dech; 20.06.2013 at 13:16.
 

Similar Threads
Thread Thread Starter Forum Replies Last Post
ax-erp: How to Set the Query Range on a SSRS Report Blog bot DAX Blogs 0 18.10.2012 19:11
sumitax: AX Queries – Passing query range as parameter Blog bot DAX Blogs 0 29.06.2011 13:11
Advanced query range value expressions: поле таблицы - имя вcтроенной функции year(). ATimTim DAX: Программирование 12 27.03.2009 18:16
axaptafreak: Label for Query Range cannot be modified (still) Blog bot DAX Blogs 2 25.07.2007 10:09
Advanced query range value expressions dn DAX: Программирование 2 07.10.2003 15:38

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Рейтинг@Mail.ru
All times are GMT +3. The time now is 01:49.
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Contacts E-mail, Advertising.