Dynamics 365 Business Central: การใช้งาน SetLoadFields ใน AL Programming

ในการพัฒนาโปรแกรมด้วยภาษา AL (AL Programming Language) บน Dynamics 365 Business Central ประสิทธิภาพในการดึงข้อมูลจาก Table เป็นสิ่งที่สำคัญอย่างมาก โดยเฉพาะเมื่อทำงานกับข้อมูลจำนวนมาก SetLoadFields เป็น Method ที่ช่วยให้เราสามารถควบคุมได้ว่าจะโหลดเฉพาะ Field ที่จำเป็นเท่านั้น ส่งผลให้ระบบทำงานได้รวดเร็วขึ้นและใช้ทรัพยากรน้อยลง

การใช้ SetLoadFields() ช่วยลดการโหลด Field ที่ไม่เกี่ยวข้องออกไป เหมาะอย่างยิ่งในกรณีที่เราต้องการใช้งานเฉพาะบาง Field โดยไม่จำเป็นต้องโหลด Field อื่นที่ไม่ได้ใช้งาน ช่วยเพิ่มประสิทธิภาพของระบบทั้งในด้านความเร็วและการประมวลผล

รูปแบบการใช้งาน (Syntax)

Record.SetLoadFields(Field1 [, Field2, Field3, ...]);

Parameters

  • Record: ชนิดข้อมูล Record เช่น Customer, Item
  • Field1, Field2, ...: ระบุชื่อ Field ที่ต้องการ

หมายเหตุ

  • SetLoadFields จะต้องถูกเรียกก่อน FindSet, FindFirst, FindLast, Find, หรือ Get
  • หากคุณไม่ได้ใช้ SetLoadFields, ระบบจะโหลด Field ทั้งหมดโดยอัตโนมัติ

ตัวอย่างวิธีการทดสอบการใช้งาน SetLoadFields

เพื่อทดสอบว่า SetLoadFields ช่วยให้ระบบโหลดข้อมูลเร็วขึ้นจริงหรือไม่ เราสามารถใช้ Time และ Duration ในการจับเวลาการโหลดข้อมูลจาก Table ขนาดใหญ่ เช่น Item Ledger Entry ได้

ตัวอย่างแบบไม่ใช้ SetLoadFields

    procedure TestWithoutSetLoadFields(): Duration
    var
        ItemLedgEntry: Record "Item Ledger Entry";
        StartTime: Time;
        EndTime: Time;
        RemainingQty: Decimal;
        InvoicedQty: Decimal;
        Quantity: Decimal;
    begin
        StartTime := Time;
        ItemLedgEntry.Reset();
        if ItemLedgEntry.FindSet() then
            repeat
                RemainingQty += ItemLedgEntry."Remaining Quantity";
                InvoicedQty += ItemLedgEntry."Invoiced Quantity";
                Quantity += ItemLedgEntry.Quantity;
            until ItemLedgEntry.Next() = 0;

        EndTime := Time;
        exit(EndTime - StartTime);
    end;

ตัวอย่างแบบใช้ SetLoadFields

    procedure TestWithSetLoadFields(): Duration
    var
        ItemLedgEntry: Record "Item Ledger Entry";
        StartTime: Time;
        EndTime: Time;
        RemainingQty: Decimal;
        InvoicedQty: Decimal;
        Quantity: Decimal;
    begin
        StartTime := Time;
        ItemLedgEntry.Reset();
        ItemLedgEntry.SetLoadFields("Remaining Quantity", "Invoiced Quantity", Quantity);
        if ItemLedgEntry.FindSet() then
            repeat
                RemainingQty += ItemLedgEntry."Remaining Quantity";
                InvoicedQty += ItemLedgEntry."Invoiced Quantity";
                Quantity += ItemLedgEntry.Quantity;
            until ItemLedgEntry.Next() = 0;

        EndTime := Time;
        exit(EndTime - StartTime);
    end;

สรุป (Summary)

SetLoadFields เป็นเทคนิคง่าย ๆ สำหรับการเพิ่มประสิทธิภาพการโหลดข้อมูล ช่วยให้เราดึงเฉพาะ Field ที่จำเป็นเข้ามาใช้งาน ไม่ต้องโหลดข้อมูลทั้งหมดของ Record ซึ่งช่วยลดภาระของระบบ ทำให้โค้ดทำงานได้เร็วขึ้น และใช้ได้ดีเมื่อเราทำงานกับข้อมูลจำนวนมากใน Table ที่มีข้อมูลจำนวนมาก

ข้อมูลเพิ่มเติมได้ที่นี่

🔗 Record.SetLoadFields Method – Microsoft Learn

Dynamics 365 Business Central: การใช้งาน ChanageCompany ใน AL Programming

ในระบบ ERP อย่าง Dynamics 365 Business Central (D365BC) เราสามารถมีหลายบริษัทอยู่ในระบบเดียวกันได้ เช่น บริษัทแม่-บริษัทลูก หรือหลายสาขาในเครือเดียวกัน เมื่อต้องการเขียนโปรแกรมด้วยภาษา AL เพื่อดึงหรือจัดการข้อมูลจากอีกบริษัทหนึ่ง เราจะไม่สามารถเข้าถึงข้อมูลนั้นได้โดยตรงจากตัวแปร Record ปกติ เพราะแต่ละตัวแปรจะทำงานกับบริษัทปัจจุบันเท่านั้น

เพื่อให้สามารถเข้าถึงข้อมูลของบริษัทอื่นได้ จะต้องใช้คำสั่ง ChangeCompany() ซึ่งใช้สำหรับเปลี่ยน context ของตัวแปร Record หรือ RecordRef ไปยังบริษัทปลายทาง ทำให้เราสามารถอ่าน แก้ไข หรือเพิ่มข้อมูลข้ามบริษัทได้อย่างสะดวกและปลอดภัย

ChangeCompany คืออะไร?

ChangeCompany เป็นคำสั่งในภาษา AL ที่ใช้เพื่อ เปลี่ยนบริษัทที่ตัวแปร Record หรือ RecordRef ทำงานอยู่ ไปยังบริษัทอื่นภายในฐานข้อมูลเดียวกัน

รูปแบบการใช้งาน (Syntax)

[Ok := ] Record.ChangeCompany([CompanyName: Text])

คำอธิบาย

องค์ประกอบคำอธิบาย
Recordตัวแปร Record หรือ RecordRef ที่จะเปลี่ยนบริษัท
CompanyNameชื่อบริษัทปลายทาง (Text), Optional
Ok :=ค่าผลลัพธ์แบบ Boolean เพื่อเช็คความสำเร็จ

ตัวอย่างการใช้งาน

ตัวอย่าง 1: อ่านข้อมูลจากบริษัทอื่น

procedure ShowVendorFromAnotherCompany()
var
    Vendor: Record Vendor;
begin
    Vendor.ChangeCompany('บริษัท B'); // เปลี่ยนไปที่บริษัท B
    if Vendor.Get('10000') then
        Message('Vendor Name in บริษัท B: %1', Vendor.Name);
end;

ตัวอย่าง 2: คัดลอกข้อมูล Vendor ข้ามบริษัท

    procedure SyncVendorToOtherCompany(var SourceVendor: Record Vendor; TargetCompanyName: Text)
    var
        TargetVendor: Record Vendor;
    begin
        TargetVendor.ChangeCompany(TargetCompanyName);
        if not TargetVendor.Get(SourceVendor."No.") then begin
            TargetVendor.Init();
            TargetVendor.TransferFields(SourceVendor);
            TargetVendor.Insert(true);
        end;
    end;

สรุป (Summary)

ChangeCompany เป็นฟีเจอร์สำคัญของภาษา AL ที่ช่วยให้เราสามารถเขียนโปรแกรมเพื่อเข้าถึง จัดการ และซิงก์ข้อมูลข้ามบริษัท (Multi-Company) ในระบบ Business Central ได้อย่างมีประสิทธิภาพ โดยเฉพาะในระบบที่มีหลายบริษัทอยู่ในฐานข้อมูลเดียวกัน ไม่ว่าจะเป็นการอ่านข้อมูลจากบริษัทอื่น การ Insert ข้อมูลใหม่ หรือการเปรียบเทียบข้อมูลระหว่างบริษัท

ข้อมูลเพิ่มเติมได้ที่นี่

🔗 Record.ChangeCompany([Text]) Method – Business Central

Dynamics 365 Business Central: Deleted Objects ใน Business Central 2025 Release Wave 1 (v26)

Microsoft ได้เริ่มกระบวนการ housekeeping ภายใน Business Central โดยเฉพาะใน เวอร์ชัน 2025 Release Wave 1 (v26) ซึ่งมีการลบ table และ field จำนวนมากที่เคยถูก mark ว่า Obsolete::Removed มาแล้วตั้งแต่เวอร์ชันก่อนหน้า

การลบในครั้งนี้ไม่ได้เป็นแค่การลดขนาด database แต่เป็นส่วนหนึ่งของ วิสัยทัศน์ระยะยาว ที่มุ่งเน้นความเป็นระเบียบ ยืดหยุ่น และง่ายต่อการดูแลรักษาระบบ

รายการที่ถูกลบ (What’s deleted?)

  • ลบ มากกว่า 150 tables และ fields
  • มีผลกับ Base Application (W1 + Localized Apps) และ first-party apps ของ Microsoft
  • ข้อมูลที่ถูกลบอยู่ในสถานะ Obsolete::Removed มานานกว่าหนึ่ง major release

📌 หมายเหตุจาก Microsoft

หากพบว่า File ID = 0 และ Field Name = * หมายถึงลบ ทุก field ภายใน table หรือ table extension และลบไฟล์ออกจาก repository ด้วย

เป้าหมายของการ clean-up

การลบครั้งนี้มีเป้าหมายที่ชัดเจน เพื่อสนับสนุน 3 แนวทางสำคัญของ roadmap Business Central

เป้าหมายรายละเอียด
⚡ Performanceลบ schema ที่ไม่ใช้งาน เพิ่มความเร็วในการ query และประมวลผล
🌍 Unified Base Appรวมฐานโค้ดของหลายประเทศ เช่น SE, DK, CZ, IN, IS ให้ใช้ Base Application เดียวกัน
🧼 Streamlined Codebaseโค้ดสะอาด ลดบั๊ก ลดความซับซ้อนในการดูแลระยะยาว

Clean-up Cycle

Microsoft ประกาศใช้ clean-up cycle ทุก ๆ 5 major releases
ซึ่งหมายความว่า object ที่อยู่ในสถานะ Obsolete::Removed เกิน 1 major version จะมีสิทธิ์ถูกลบใน release รอบถัดไป

ดูรายการทั้งหมดได้ที่นี่
👉 Deleted objects in BC 2025 Release Wave 1 (v26)

Dynamics 365 Business Central: การใช้งาน Continue ใน AL Programming

ในการเขียนลูปในภาษา AL เช่น for, while หรือ repeat-until บางครั้งเราอาจต้องการ ข้ามการทำงานของรอบนั้นทันที แล้วไปทำงานในรอบถัดไป โดยไม่ต้องหยุดลูปทั้งหมด ก่อนหน้านี้ ภาษา AL มีเพียง break ที่ใช้หยุดลูปทั้งหมด ซึ่งไม่ตอบโจทย์เมื่อต้องการเพียงแค่ข้ามรอบใดรอบหนึ่งเท่านั้น ใน Business Central 2025 Release Wave 1 ได้เพิ่มความสามารถให้สามารถใช้ continue เพื่อข้ามรอบปัจจุบันของลูป แล้วไปทำงานรอบถัดไปได้ทันที

รูปแบบการใช้งาน (Syntax)

for i := 1 to 10 do begin
    if i = 5 then
        continue;
    Message('รอบที่ %1', i);
end;

Output: แสดงเลข 1 ถึง 10 ยกเว้นเลข 5 ซึ่งจะถูกข้าม

ตัวอย่างการใช้งาน

ตัวอย่างที่ 1: แสดงเฉพาะเลขคี่

procedure ShowOddNumbers()
var
    i: Integer;
begin
    for i := 1 to 10 do begin
        if i mod 2 = 0 then
            continue;
        Message('เลขคี่: %1', i);
    end;
end;

ข้ามเลขคู่ และแสดงเฉพาะเลขคี่ (1, 3, 5, 7, 9)

ตัวอย่างที่ 2: continue กับ repeat-until

procedure SkipCertainValue()
var
    i: Integer;
begin
    i := 0;
    repeat
        i += 1;
        if i = 5 then
            continue;
        Message('ค่าปัจจุบัน: %1', i);
    until i = 10;
end;

ค่าที่เป็น 5 จะถูกข้าม ไม่แสดงผล

สรุป (Summary)

continue เป็นฟีเจอร์ใหม่ในภาษา AL ที่ช่วยให้การเขียนลูปมีความยืดหยุ่นและอ่านง่ายมากขึ้น
สามารถข้ามรอบที่ไม่ต้องการ และไปทำงานในรอบถัดไปทันที เหมาะกับกรณีที่มีเงื่อนไขเฉพาะ เช่น ข้ามค่าว่าง, ข้ามค่าที่ไม่ผ่านการตรวจสอบ ฯลฯ

Dynamics 365 Business Central: การใช้งาน Multiline Strings ในภาษา AL Programming

ในโลกของการพัฒนาแอปพลิเคชันด้วยภาษา AL (Application Language) สำหรับระบบ Microsoft Dynamics 365 Business Central ข้อความ (String) เป็นสิ่งที่หลีกเลี่ยงไม่ได้ ไม่ว่าจะใช้เพื่อการแสดงผล การสร้างข้อความแจ้งเตือน การจัดโครงสร้างข้อมูล JSON/XML หรือแม้กระทั่งการสร้างไฟล์ข้อความส่งออก

ก่อนหน้านี้ การใช้งานข้อความที่มีหลายบรรทัดใน AL ถือเป็นเรื่องยุ่งยาก เนื่องจากต้องเขียนในรูปแบบบรรทัดเดียว หรือใช้เครื่องหมาย + เพื่อเชื่อมต่อหลาย ๆ บรรทัด ซึ่งทั้งอ่านยากและดูไม่เป็นระเบียบ

ใน Release 2025 wave 1 Microsoft ได้เพิ่มความสามารถใหม่ที่ชื่อว่า Multiline Strings ซึ่งช่วยให้นักพัฒนาสามารถเขียนข้อความหลายบรรทัดได้อย่างชัดเจน อ่านง่าย และจัดรูปแบบได้เหมือนที่เราต้องการ

รูปแบบการใช้งาน (Syntax)

Multiline Strings ใน AL ใช้สัญลักษณ์ @ (at sign) เพื่อเริ่มต้นข้อความหลายบรรทัด โดยครอบข้อความไว้ด้วยเครื่องหมาย single quote '...'

MyText := @'
Line 1
Line 2
Line 3';

ผลลัพธ์ของ MyText จะเป็น string เดียว ที่มีการขึ้นบรรทัดใหม่ภายในข้อความตามที่เขียนไว้

ข้อควรระวัง (Important Note)

เว้นวรรค (Whitespace) = ข้อมูลจริง

ช่องว่าง (spaces) ที่เราใส่เพื่อ indent จะถูกนับเป็นส่วนหนึ่งของข้อความจริง

ตัวอย่าง

IndentedText := @'
    Hello
        World!';

ผลลัพธ์

    Hello
        World!

แนะนำให้เขียนชิดซ้ายที่สุดถ้าต้องการข้อความที่ไม่มีช่องว่างเกิน

ตัวอย่างการใช้งานจริง (Example)

ตัวอย่าง 1: สร้าง JSON สำหรับส่ง API

procedure GetJsonTemplate(): Text
var
    JsonText: Text;
begin
    JsonText := @'
{
  "customerId": "CUST-001",
  "name": "Contoso Ltd.",
  "status": "Active",
  "contacts": [
    {
      "name": "John Doe",
      "email": "john@contoso.com"
    }
  ]
}';
    exit(JsonText);
end;

ตัวอย่าง 2: ใช้ร่วมกับ Message()

procedure ShowWelcomeMessage()
begin
    Message(@'
Welcome to BC-ALife!
This solution is powered by Dynamics 365 Business Central.
Happy Coding!');
end;

สรุป (Summary)

Multiline Strings ที่เปิดตัวใน Business Central 2025 Release Wave 1 ช่วยให้นักพัฒนาสามารถเขียนข้อความหลายบรรทัดในภาษา AL ได้ง่ายขึ้น โดยใช้เพียงสัญลักษณ์ @ นำหน้าข้อความแบบ '...'