簡體   English   中英

如何使用 where 子句和 OR 條件進行 X++ 查詢

[英]How to make X++ query with where clause and OR conditions

我嘗試在X++中重現一個非常簡單的 SQL 查詢:

  • 3張桌子
  • where子句
  • 手術條件
  • 喜歡

我想要 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM