UNPKG

bc-code-intelligence-mcp

Version:

BC Code Intelligence MCP Server - Complete Specialist Bundle with AI-driven expert consultation, seamless handoffs, and context-preserving workflows

149 lines (129 loc) 5.82 kB
# SetLoadFields Filter Field Exclusion - AL Code Samples ## Basic Filter Field Exclusion ```al codeunit 50200 "Filter Field Exclusion Examples" { procedure ExcludeFilterFieldsBasic() var Customer: Record Customer; begin // Exclude filter fields from loading - they're used for filtering only Customer.SetLoadFields("Name", "Credit Limit (LCY)", "Phone No."); // Filter fields (No., Customer Posting Group) not loaded - filtering uses cached values Customer.SetRange("No.", '10000', '20000'); Customer.SetRange("Customer Posting Group", 'DOMESTIC'); Customer.SetRange("Blocked", Customer.Blocked::" "); if Customer.FindSet() then repeat // Only non-filter fields loaded, improving performance ProcessCustomerData(Customer.Name, Customer."Credit Limit (LCY)", Customer."Phone No."); until Customer.Next() = 0; end; procedure ComplexFilterExclusion() var Item: Record Item; begin // Complex filtering scenario - exclude all filter fields from loading Item.SetLoadFields("Description", "Unit Price", "Inventory"); // Multiple filter fields - all excluded from SetLoadFields Item.SetRange("No.", '1000', '9999'); Item.SetFilter("Item Category Code", 'CHAIR|TABLE|DESK'); Item.SetRange("Blocked", false); Item.SetFilter("Unit Price", '>%1', 100); Item.SetRange("Type", Item.Type::Inventory); if Item.FindSet() then repeat // Filter fields available for validation but not loaded from database if ShouldProcessItem(Item."No.", Item."Item Category Code") then ProcessItemData(Item.Description, Item."Unit Price", Item.Inventory); until Item.Next() = 0; end; procedure ConditionalFilterExclusion(IncludeFilterFields: Boolean) var SalesLine: Record "Sales Line"; begin if IncludeFilterFields then // When filter fields needed for processing, include them SalesLine.SetLoadFields("Document No.", "Line No.", "Type", "No.", "Quantity", "Unit Price") else // When filter fields not needed for processing, exclude them SalesLine.SetLoadFields("Quantity", "Unit Price"); SalesLine.SetRange("Document Type", SalesLine."Document Type"::Order); SalesLine.SetRange("Document No.", 'SO001'); SalesLine.SetRange("Type", SalesLine.Type::Item); if SalesLine.FindSet() then repeat if IncludeFilterFields then ProcessWithFilterData(SalesLine."Document No.", SalesLine."No.", SalesLine.Quantity) else ProcessWithoutFilterData(SalesLine.Quantity, SalesLine."Unit Price"); until SalesLine.Next() = 0; end; local procedure ProcessCustomerData(Name: Text[100]; CreditLimit: Decimal; PhoneNo: Text[30]) begin // Process loaded customer data end; local procedure ShouldProcessItem(ItemNo: Code[20]; CategoryCode: Code[20]): Boolean begin exit((ItemNo <> '') and (CategoryCode <> '')); end; local procedure ProcessItemData(Description: Text[100]; UnitPrice: Decimal; Inventory: Decimal) begin // Process non-filter item data end; local procedure ProcessWithFilterData(DocumentNo: Code[20]; ItemNo: Code[20]; Quantity: Decimal) begin // Process including filter field data end; local procedure ProcessWithoutFilterData(Quantity: Decimal; UnitPrice: Decimal) begin // Process excluding filter field data end; } ``` ## Performance Impact Examples ```al codeunit 50201 "Filter Exclusion Performance" { procedure DemonstratePerformanceImpact() var Customer: Record Customer; StartTime: DateTime; EndTime: DateTime; begin // Scenario 1: Including filter fields unnecessarily StartTime := CurrentDateTime(); Customer.SetLoadFields(); // Loads all fields including filters Customer.SetRange("No.", '10000', '50000'); Customer.SetRange("Customer Posting Group", 'DOMESTIC'); if Customer.FindSet() then repeat // Only using non-filter fields but all were loaded ProcessCustomerSales(Customer.Name, Customer."Credit Limit (LCY)"); until Customer.Next() = 0; EndTime := CurrentDateTime(); LogPerformance('With filter fields loaded', EndTime - StartTime); // Scenario 2: Excluding filter fields appropriately StartTime := CurrentDateTime(); Customer.Reset(); Customer.SetLoadFields("Name", "Credit Limit (LCY)"); // Exclude filter fields Customer.SetRange("No.", '10000', '50000'); Customer.SetRange("Customer Posting Group", 'DOMESTIC'); if Customer.FindSet() then repeat // Only non-filter fields loaded, better performance ProcessCustomerSales(Customer.Name, Customer."Credit Limit (LCY)"); until Customer.Next() = 0; EndTime := CurrentDateTime(); LogPerformance('With filter fields excluded', EndTime - StartTime); end; local procedure ProcessCustomerSales(Name: Text[100]; CreditLimit: Decimal) begin // Process customer sales data end; local procedure LogPerformance(Scenario: Text; Duration: Duration) begin Message('%1: %2 ms', Scenario, Duration); end; } ```