[英]How to make X++ query with where clause and OR conditions
我嘗試在X++中重現一個非常簡單的 SQL 查詢:
我想要 SQL 中的以下翻譯結果:
SELECT * FROM TABLE1 tab1
LEFT JOIN TABLE2 tab2 on tab2.x = tab1.x
LEFT JOIN TABLE3 tab3 on tab3.x = tab1.x
WHERE (tab1.a LIKE '%F1%' OR tab1.aa LIKE '%F1%' OR tab2.b LIKE '%F1%' or tab3.c LIKE '%F1%')
其他例子:
select dpt.PARTITION, dpt.recid, * from dirpartytable dpt
INNER JOIN DIRPARTYLOCATION dpl on dpl.RECID = dpt.RECID
INNER JOIN LOGISTICSLOCATION ll on ll.RECID = dpl.LOCATION
where (dpt.HOBBIES LIKE '%F21%' OR dpl.POSTALADDRESSROLES LIKE '%F21%'
OR ll.DESCRIPTION LIKE '%F21%'
其他互聯網示例:
FieldId itemIdField = fieldNum(InventTable, ItemId);
FieldId itemTypeField = fieldNum(InventTable, ItemType);
Query query1 = new Query();
QueryBuildDataSource ds1 = query1.addDataSource(tableNum(InventTable));
ds1.addRange(itemIdField).value('Item01');
ds1.addRange(itemIdField).value('Item02');
ds1.addRange(itemIdField).value('(ItemId > "Item04")');
ds1.addRange(itemTypeField).value(queryValue(ItemType::Item));
ds1.addRange(itemTypeField).value(queryValue(ItemType::Service));
query1.addQueryFilter(ds1, itemIdField).value('Item02');
query1.addQueryFilter(ds1, itemIdField).value('Item03');
query1.addQueryFilter(ds1, itemIdField).value('(ItemId < "Item01")');
query1.addQueryFilter(ds1, itemTypeField).value(queryValue(ItemType::Service));
給這個:
SELECT *
FROM INVENTTABLE T1
WHERE PARTITION=68719480489
AND DATAAREAID='dat'
AND (ITEMID='Item01' OR ITEMID='Item02' OR ITEMID>'Item04')
AND (ITEMTYPE=0 OR ITEMTYPE=2)
AND (ITEMID='Item02' OR ITEMID='Item03' OR ITEMID<'Item01')
AND (ITEMTYPE=2)
ORDER BY T1.ITEMTYPE, T1.ITEMID
我所期望的幾乎相同,但具有基於其他表中多個字段的“或”條件。
我嘗試了 addRange 和 addQueryFilter 但結果並不好。
QueryBuildDataSource tab1;
QueryBuildDataSource tab2;
QueryBuildDataSource tab3;
tab1 = query.dataSourceTable(tableNum(TABLE1));
tab2 = query.dataSourceTable(tableNum(TABLE2));
tab3 = query.dataSourceTable(tableNum(TABLE3));
**// 1 - ADDQUERYFILTER**
query.addQueryFilter(tab1, fieldStr(TABLE1, a)).value('F1');
query.addQueryFilter(tab1, fieldStr(TABLE1,aa)).value('F1');
query.addQueryFilter(tab2, fieldStr(TABLE2,b)).value('F1');
query.addQueryFilter(tab3, fieldStr(TABLE3, c)).value('F1')
**// 2 - ADDRANGE**
QueryBuildRange qbr;
qbr = tab1.addRange(fieldNum(TABLE1, a));
qbr = tab1.addRange(fieldNum(TABLE1, aa));
qbr = tab2.addRange(fieldNum(TABLE2, b));
qbr = tab3.addRange(fieldNum(TABLE3, c));
qbr.value(strFmt('((%2 LIKE \'%%1%\') || (%3 LIKE \'%%1%\') || (%4 LIKE \'%%1%\') || (%5 LIKE \'%%1\'))', 'F1', fieldStr(TABLE1, a), fieldStr(TABLE1, aa) fieldStr(TABLE2, b), fieldStr(TABLE3, c) ));
我迷路了,如何在 X++ 中做到這一點?
謝謝。
X++ 使用while select
語句(更多語法在這里):
Table1 tab1;
Table2 tab2;
Table3 tab3;
while select tab1
outer join tab2
where tab2.x == tab1.x
outer join tab3
where tab3.x == tab1.x && (
tab1.a like '*F1*' ||
tab1.aa like '*F1*' ||
tab2.b like '*F1*' ||
tab3.c like '*F1*')
{
info(strFmt('%1 %2', tab1.x, tab1.a));
}
更新:括號很重要。
《JavaかC#kaらX++(Dynamics 365 Finance & Operations)へ簡單スイッチ》 https://www.amazon.co.jp/dp/B0C5PKYP92日本初のX++勉強用テキenter code here
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.