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.
Congratulations to our 2026 Super Stars!
Thanks to all of our 2025 Community Spotlight stars!
These are the community rock stars!
Stay up to date on forum activity by subscribing.
Giorgio Bonacorsi 659
André Arnaud de Cal... 465 Super User 2026 Season 1
Syed Haris Shah 304 Super User 2026 Season 1