Monday, July 5, 2010

Complex Query Ranges in Dynamics AX

In this article, we will learn how to apply simple and complex ranges in Dynamics AX queries.

We will play with a query having a single datasource in it. Following is the code for adding a query with a datasource.

query = new Query();
dsInventTable = query.addDataSource(tableNum(InventTable));
// Add our range
queryBuildRange = dsInventTable.addRange(fieldNum(InventTable, DataAreaId));
 
Simple criteria

Lets find the record where the value of ItemId field is B-R14. Take note of the single quotes and parenthesis surrounding the entire expression.
queryBuildRange.value(strFmt('(ItemId == "%1")', queryValue("B-R14")));

Find records where the ItemType is Service. Note the use of any2int().
queryBuildRange.value(strFmt('(ItemType == %1)', any2int(ItemType::Service)));
 
Find records where the ItemType is Service or the ItemId is B-R14. Note the nesting of the parenthesis in this example.
queryBuildRange.value(strFmt('((ItemType == %1) || (ItemId == "%2"))', any2int(ItemType::Service), queryValue("B-R14")));
 
Find records where the modified date is after 1st January 2000. Note the use of Date2StrXpp() to format the date correctly.
queryBuildRange.value(strFmt('(ModifiedDate > %1)', Date2StrXpp(01012000)));

Complex criteria with combined AND and OR clauses
We need to find those records where the ItemType is Service, or both the ItemType is Item and the ProjCategoryId is Spares. This is not possible to achieve using the standard range syntax.
Note also that in this example, we are using the fieldStr() method to specify our actual field names and again, that we have nested our parenthesis for each sub-expression.

queryBuildRange.value(strFmt('((%1 == %2) || ((%1 == %3) && (%4 == "%5")))',
fieldStr(InventTable, ItemType),
any2int(ItemType::Service),
any2int(ItemType::Item),
fieldStr(InventTable, ProjCategoryId),
queryValue("Spares")));

4 comments:

  1. I have been working with this use of queryBuildRange.value, but I have been having a problem with an expression that contains negative numbers. For example:

    '(Address.AddrRecId == 32157902)'

    works fine, but:

    '(Address.AddrRecId == -1519752193)'

    Does not return any results, though both AddrRecId's exist (as RefRecId int64).

    I created a static query that does return the negative value and I also tested with smaller numbers like 150 and -151. In al cases positive numbers work and the negative numbers don't.

    Do you have any suggestions or experience with this?

    ReplyDelete
    Replies
    1. Did you try to use QueryValue function to pass the value ? If you were able to solve it, post it here so that others can also get help from it :)

      Delete

  2. خرید بلیط لحظه آخری کیش


    Your posts are worth visiting your blog every week

    ReplyDelete