Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124

在 Business Central 的 AL 語言中,如果您想要將 Record.SETRANGE 用於篩選包含多個不連續值(像是 SQL 語法中的 WHERE Field IN ('值A', '值B', '值C')),這是不適用的。
SETRANGE 的設計是用來篩選 連續的區間 或 單一精確的值。
Record.SETRANGE 的用途與限制SETRANGE 的基本語法如下:
Record.SETRANGE(Field, [Value1], [Value2])| 參數 | 說明 |
Field | 您想要設定篩選條件的欄位名稱。 |
Value1 | 篩選區間的起始值(包含)。如果只填寫這個參數,即為篩選單一精確值。 |
Value2 | 篩選區間的結束值(包含)。 |
如果您只提供第一個值 (Value1),它會篩選欄位值精確等於該值的記錄。
| 範例程式碼 | 篩選效果 |
Customer.SETRANGE("No.", '10000'); | 篩選客戶編號剛好是 ‘10000’ 的記錄。 |
ItemLedgEntry.SETRANGE("Entry Type", ItemLedgEntry."Entry Type"::Sale); | 篩選所有分錄類型為 “Sale” (銷貨) 的記錄。 |
如果您提供 Value1 和 Value2,它會篩選欄位值介於 Value1 和 Value2 之間(包含邊界值) 的記錄。
| 範例程式碼 | 篩選效果 |
ItemLedgEntry.SETRANGE("Posting Date", 20250101D, 20250131D); | 篩選過帳日期在 2025 年 1 月 1 日到 2025 年 1 月 31 日 之間的記錄。 |
Customer.SETRANGE("No.", '10000', '20000'); | 篩選客戶編號從 ‘10000’ 到 ‘20000’ 的記錄。 |
當您需要篩選一個欄位包含多個不連續的值時(例如:料號必須是 ‘A001’ 或 ‘A005’ 或 ‘A010’),您必須使用 Record.SETFILTER。
SETFILTER 允許您使用更靈活的篩選表達式,包括 AL 中的通配符(Wildcards)。
Record.SETFILTER(推薦用於不連續值集合)在 AL 中,使用 豎線符號 | 來表示 OR (或) 邏輯,這就是模擬 IN 集合的方法。
Record.SETFILTER(Field, String, [Variable1], [Variable2], ...)範例:篩選多個不連續的 Item No.
var
ItemLedgEntry: Record "Item Ledger Entry";
begin
// 篩選 Item No. 等於 A001 或 A005 或 A010 的記錄
// 使用 | 符號連接多個 OR 條件
ItemLedgEntry.SETFILTER("Item No.", 'A001|A005|A010');
// ... 然後使用 FINDSET() 進行處理
end;範例:篩選多個不連續的值,並結合變數
var
ItemLedgEntry: Record "Item Ledger Entry";
ItemFilter1: Code[20];
ItemFilter2: Code[20];
begin
ItemFilter1 := 'B001';
ItemFilter2 := 'B002';
// 使用 %1 和 %2 作為變數的佔位符
ItemLedgEntry.SETFILTER("Item No.", '%1|%2', ItemFilter1, ItemFilter2);
// ... 這樣就會篩選出 Item No. 等於 'B001' 或 'B002' 的記錄。
end;// 在用戶設置的篩檢程式基礎上,強制只處理 "Entry Type" 為 "Purchase" 的記錄
Rec.SETRANGE("Entry Type", Rec."Entry Type"::Purchase);
if Rec.FINDSET() then // ... 繼續您的處理邏輯 ...