Notifications
Announcements
No record found.
FieldId fieldId = fieldNum(MyTable, MyField); ds.addRange(fieldId).value(queryValue(value1)); ds.addRange(fieldId).value(queryValue(value2));
In Dynamics 365 Finance and Operations, when working with query ranges and needing to supply multiple values (e.g., for a RecId field), the query framework requires specific handling since direct assignment of multiple values isn't straightforward. Below are several approaches to achieve this:
RecId
strFmt
The most common way to supply multiple values in a query range is to use an OR condition by formatting the values into a single string. Here's how you can do it:
Prepare the Query Range: Use the strFmt function to build a single query range string with an "OR" condition for each value.
Copy code
QueryBuildRange queryRange; RecId recId1 = 5637144576; // Example RecId RecId recId2 = 5637144577; // Another RecId RecId recId3 = 5637144578; // Additional RecId // Assuming you are working with a QueryBuildDataSource object queryRange = queryBuildDataSource.addRange(fieldNum(MyTable, RecId)); // Set the range with OR conditions queryRange.value(strFmt('(%1,%2,%3)', recId1, recId2, recId3));
This approach builds a query like: (RecId = 5637144576 OR RecId = 5637144577 OR RecId = 5637144578)
(RecId = 5637144576 OR RecId = 5637144577 OR RecId = 5637144578)
When Working With More Values:
QueryBuildRange queryRange; RecId recId; MyTable myTableBuffer; List values = new List(Types::Integer); str rangeString = ''; boolean firstValue = true; while select RecId from myTableBuffer where myTableBuffer.SomeCondition { recId = myTableBuffer.RecId; if (!firstValue) { rangeString += ','; } rangeString += int2str(recId); firstValue = false; } queryRange = queryBuildDataSource.addRange(fieldNum(MyTable, RecId)); queryRange.value(strFmt('(%1)', rangeString));
Query::ValueIn
When dealing with multiple values for a single field, you can use the Query::ValueIn method to build an "IN" clause for the query range.
Example Using ValueIn:
ValueIn
QueryBuildRange queryRange; RecId recIdArray[3] = [5637144576, 5637144577, 5637144578]; queryRange = queryBuildDataSource.addRange(fieldNum(MyTable, RecId)); queryRange.value(Query::ValueIn(recIdArray));
(RecId IN (5637144576, 5637144577, 5637144578))
When Values Come from Another Table: If you want to retrieve values dynamically from another table, build an array or container first and then pass it to Query::ValueIn.
QueryBuildRange queryRange; MyTable myTableBuffer; List recIdList = new List(Types::Int64); RecId recId; while select RecId from myTableBuffer where myTableBuffer.SomeCondition { recIdList.addEnd(myTableBuffer.RecId); } queryRange = queryBuildDataSource.addRange(fieldNum(MyTable, RecId)); queryRange.value(Query::ValueIn(recIdList.toContainer()));
ExistsJoin
If your goal is to filter records based on RecIds that come from another table, using an ExistsJoin can be a cleaner solution instead of manually building a range.
Example with ExistsJoin:
Query query = new Query(); QueryBuildDataSource qbdsMain = query.addDataSource(tableNum(MyTable)); QueryBuildDataSource qbdsRelated = qbdsMain.addDataSource(tableNum(RelatedTable)); qbdsRelated.joinMode(JoinMode::ExistsJoin); qbdsRelated.addRange(fieldNum(RelatedTable, RecId)).value('!0'); // Filter non-zero RecIds QueryRun queryRun = new QueryRun(query); while (queryRun.next()) { MyTable myTableBuffer = queryRun.get(tableNum(MyTable)); info(myTableBuffer.RecId); }
MyTable
RelatedTable
If the list of RecId values is large, or the source data comes from multiple tables, a temporary table can simplify the process.
Insert Values into a Temporary Table:
TmpMyTable tmpTable; MyTable myTableBuffer; while select RecId from myTableBuffer where myTableBuffer.SomeCondition { tmpTable.clear(); tmpTable.RecId = myTableBuffer.RecId; tmpTable.insert(); }
Join with the Temporary Table in Your Query:
Query query = new Query(); QueryBuildDataSource qbdsMain = query.addDataSource(tableNum(MyTable)); QueryBuildDataSource qbdsTmp = qbdsMain.addDataSource(tableNum(TmpMyTable)); qbdsTmp.joinMode(JoinMode::InnerJoin); qbdsTmp.relations(true); QueryRun queryRun = new QueryRun(query); while (queryRun.next()) { MyTable myTableBuffer = queryRun.get(tableNum(MyTable)); info(myTableBuffer.RecId); }
ds.addRange(fieldId).value(queryValue(value1));
while (enumerator.moveNext()) { qbds.addRange(fieldNum(EcoResTextValue, RecId)) .value(queryValue(enumerator.current())); }
Under review
Thank you for your reply! To ensure a great experience for everyone, your content is awaiting approval by our Community Managers. Please check back later.
As AI tools become more common, we’re introducing a Responsible AI Use…
We are honored to recognize Neeraj Kumar as our Community Spotlight honoree for…
These are the community rock stars!
Stay up to date on forum activity by subscribing.
André Arnaud de Cal... 490 Super User 2025 Season 2
Martin Dráb 429 Most Valuable Professional
BillurSamdancioglu 241 Most Valuable Professional