Dynamics 365 Business Central: แนวทางการ Refactor ใน AL Programming

ในการพัฒนา Extension ด้วยภาษา AL (Application Language) บนแพลตฟอร์ม Dynamics 365 Business Central (D365BC) นักพัฒนาจำเป็นต้องให้ความสำคัญกับคุณภาพของโค้ดในระยะยาว หนึ่งในแนวทางที่ช่วยให้โค้ดมีคุณภาพสูงคือการทำ Refactor หรือการปรับปรุงโครงสร้างของโค้ดเดิมให้ดีขึ้น

⚙️ Refactoring is essential to improving code readability, maintainability, and extensibility—without changing its output.

การ Refactor ไม่ได้หมายถึงการเปลี่ยนผลลัพธ์หรือหน้าที่การทำงานของโปรแกรม แต่เป็นการปรับโครงสร้างภายในของโค้ดให้มีความชัดเจนมากขึ้น ช่วยให้โค้ดอ่านง่าย แก้ไขได้สะดวก และพร้อมรองรับการต่อยอดในอนาคต โดยเฉพาะในภาษา AL ที่มักเกี่ยวข้องกับ Business Logic ที่ซับซ้อนและเปลี่ยนแปลงอยู่เสมอ

แนวคิดนี้มีบทบาทสำคัญต่อคุณภาพซอฟต์แวร์ ไม่ว่าจะเป็นในมุมของผู้พัฒนาใหม่ที่ต้องเข้าใจโค้ด หรือการดูแลระบบในระยะยาวโดยทีมเทคนิค

รูปแบบการใช้งาน Refactor ในภาษา AL

Refactor ใน AL มีหลายเทคนิคที่สามารถนำมาใช้ได้กับ Codeunit, Page, Report หรือแม้แต่ Enum/Interface โดยเฉพาะในโครงสร้างที่ต้องพัฒนาแบบ Extension

เทคนิคยอดนิยมที่ควรรู้

เทคนิค Refactorแนวคิดหลักเหมาะกับสถานการณ์
Extract Procedureแยกโค้ดย่อยออกมาเป็นฟังก์ชันใหม่ เพื่อเพิ่มความชัดเจนและลดขนาดโค้ดเมื่อ Procedure ยาวเกินไปหรือทำหลายหน้าที่
Rename Symbolเปลี่ยนชื่อฟังก์ชัน ตัวแปร หรือ Record ให้สื่อความหมายชัดเจนปรับปรุงความเข้าใจของทีมพัฒนา ลดข้อผิดพลาดจากการตีความผิด
Replace Magic Numberแทนค่าตัวเลข/ข้อความที่ไม่สื่อความหมาย ด้วย Constant หรือ Enumเช่น จาก if Status = 3if Status = Status::Released
Simplify Conditionalsลดความซับซ้อนของเงื่อนไข if-else ด้วยการใช้ exit, case, หรือย้ายเงื่อนไขเมื่อโค้ดมีหลายระดับของเงื่อนไขซ้อนกัน
Move Method to Codeunitแยก Business Logic ออกจาก UI เช่น Page หรือ Report ไปไว้ใน Codeunitลดภาระของ UI object และเพิ่มความสามารถในการทดสอบ
Split Large Methodแบ่งฟังก์ชันใหญ่ให้เป็นหลายส่วนย่อยที่ชัดเจนช่วยให้โค้ดอ่านง่าย และรองรับ Unit Test ได้ดีขึ้น

ตัวอย่างการ Refactor

การ Refactor ควรเริ่มจากปัญหาที่พบในโค้ดจริง ตัวอย่างนี้มาจากฟังก์ชันที่ใช้สร้างหรืออัปเดตข้อมูลในตาราง "Item Unit of Measure" ซึ่งถูกใช้กันอย่างแพร่หลายในการจัดการหน่วยสินค้าใน Business Central

โค้ดต้นฉบับ (Before Refactor)

procedure InsertItemUnitOfMeasure(pCode: Code[20]; pItemNo: Code[20]; QtyPerUOM: Decimal)
var
    ItemUOM, InsertItemUOM: Record "Item Unit of Measure";
    Item: Record Item;
    UnitofMeasure: Record "Unit of Measure";
begin
    if pCode = '' then
        Error('Unit of Measure Code cannot be empty.');

    if pItemNo = '' then
        Error('Item No. cannot be empty.');

    ItemUOM.Reset();
    ItemUOM.SetRange("Item No.", pItemNo);
    ItemUOM.SetRange(Code, pCode);
    if ItemUOM.FindFirst() then begin
        ItemUOM.Validate("Qty. per Unit of Measure", QtyPerUOM);
        ItemUOM.Modify();
    end else begin
        InsertItemUOM.Init();
        InsertItemUOM.Validate("Code", pCode);
        InsertItemUOM.Validate("Item No.", pItemNo);
        InsertItemUOM.Insert(true);
        InsertItemUOM.Validate("Qty. per Unit of Measure", QtyPerUOM);
        InsertItemUOM.Modify();
    end;
end;

โค้ดที่ผ่านการ Refactor (After Refactor)

 procedure InsertItemUnitOfMeasure(pCode: Code[20]; pItemNo: Code[20]; QtyPerUOM: Decimal)
    begin
        ValidateInput(pCode, pItemNo);

        if TryUpdateExistingUOM(pCode, pItemNo, QtyPerUOM) then
            exit;

        InsertNewItemUOM(pCode, pItemNo, QtyPerUOM);
    end;

    local procedure ValidateInput(pCode: Code[20]; pItemNo: Code[20])
    var
        Item: Record Item;
        UOM: Record "Unit of Measure";
    begin
        if pCode = '' then
            Error('Unit of Measure Code cannot be empty.');

        if pItemNo = '' then
            Error('Item No. cannot be empty.');
    end;

    local procedure TryUpdateExistingUOM(pCode: Code[20]; pItemNo: Code[20]; QtyPerUOM: Decimal): Boolean
    var
        ExistingUOM: Record "Item Unit of Measure";
    begin
        ExistingUOM.SetRange("Item No.", pItemNo);
        ExistingUOM.SetRange(Code, pCode);
        if ExistingUOM.FindFirst() then begin
            ExistingUOM.Validate("Qty. per Unit of Measure", QtyPerUOM);
            ExistingUOM.Modify();
            exit(true);
        end;

        exit(false);
    end;

    local procedure InsertNewItemUOM(pCode: Code[20]; pItemNo: Code[20]; QtyPerUOM: Decimal)
    var
        NewUOM: Record "Item Unit of Measure";
    begin
        NewUOM.Init();
        NewUOM.Validate("Item No.", pItemNo);
        NewUOM.Validate(Code, pCode);
        NewUOM.Validate("Qty. per Unit of Measure", QtyPerUOM);
        NewUOM.Insert(true);
    end;

สรุป (Summary)

การทำ Refactor ในภาษา AL Programming ไม่ใช่เพียงการจัดระเบียบโค้ดให้ดูดีขึ้นเท่านั้น แต่คือกระบวนการที่มีเป้าหมายเพื่อ

  • เพิ่มความชัดเจน (Readability) ให้โค้ดอ่านง่าย เข้าใจไว
  • ลดความซับซ้อน (Maintainability) แก้ไขและดูแลในระยะยาวได้ง่ายขึ้น
  • รองรับการขยายฟีเจอร์ (Extensibility) ในอนาคตโดยไม่กระทบโค้ดเดิม
  • ช่วยในการทดสอบ (Testability) โดยแยก Logic ออกเป็นฟังก์ชันย่อยได้

เมื่อโค้ดมีโครงสร้างที่ดีจากการ Refactor แล้ว จะช่วยให้สามารถพัฒนา ปรับปรุง และตรวจสอบคุณภาพได้อย่างมีประสิทธิภาพมากยิ่งขึ้น โดยเฉพาะในระบบ Business Central ที่ต้องการความแม่นยำ เสถียร และสามารถต่อยอดได้ในทุกเวอร์ชันของ Extension.

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: 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 ได้ง่ายขึ้น โดยใช้เพียงสัญลักษณ์ @ นำหน้าข้อความแบบ '...'

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

การสุ่มตัวเลขเป็นฟังก์ชันพื้นฐานที่สำคัญในการพัฒนาแอปพลิเคชันด้วยภาษา AL (Application Language) สำหรับ Dynamics 365 Business Central โดย Random Method เป็นคำสั่งที่ช่วยสร้างตัวเลขสุ่มได้อย่างง่ายดายและสะดวกต่อการใช้งาน บทความนี้จะอธิบายวิธีการใช้งาน Random Method พร้อมตัวอย่างเพื่อความเข้าใจที่ชัดเจน

รูปแบบคำสั่ง (Syntax)

Number := System.Random(MaxNumber: Integer);

พารามิเตอร์ (Parameters)

  • MaxNumber
    • ประเภท: Integer
    • ค่าจำนวนเต็มที่กำหนดขอบเขตสูงสุดของเลขสุ่ม โดยสุ่มตั้งแต่ 1 ถึงค่าที่กำหนด

ค่าที่ส่งกลับ (Return Value)

  • Number
    • ประเภท: Integer
    • ค่าจำนวนเต็มที่สุ่มได้ภายในช่วงที่กำหนด

หมายเหตุ (Remarks)

  1. หากกำหนดค่า MaxNumber เป็นค่าติดลบ ระบบจะเปลี่ยนเป็นค่าบวกโดยอัตโนมัติ
  2. หากกำหนดค่า MaxNumber เป็น 0 ค่าที่สุ่มได้จะเป็น 1 เสมอ
  3. การสุ่มตัวเลขจะเหมือนเดิมทุกครั้ง เว้นแต่จะใช้คำสั่ง Randomize() เพื่อสุ่มชุดใหม่

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

Example 1: สุ่มตัวเลขตั้งแต่ 1 ถึง 10

procedure GenerateRandomNumber()
var
    RandomNumber: Integer;
begin
    RandomNumber := Random(10);
    Message('Random number between 1 and 10: %1', RandomNumber);
end;

ผลลัพธ์: จะสุ่มตัวเลขระหว่าง 1 ถึง 10 และแสดงผลใน Message Box

Example 2: กำหนดค่า MaxNumber เป็นค่าติดลบ

procedure GenerateRandomNegative()
var
    RandomNumber: Integer;
begin
    RandomNumber := Random(-5);
    Message('Random number between 1 and 5: %1', RandomNumber);
end;

ผลลัพธ์: จะสุ่มตัวเลขระหว่าง 1 ถึง 5 เนื่องจากระบบจะเปลี่ยน -5 เป็น 5

Example 3: ใช้ Randomize เพื่อสุ่มชุดตัวเลขใหม่

procedure GenerateNewRandomSeries()
var
    RandomNumber: Integer;
begin
    Randomize();
    RandomNumber := Random(100);
    Message('Random number between 1 and 100: %1', RandomNumber);
end;

ผลลัพธ์: ทุกครั้งที่เรียกใช้งานจะได้ชุดตัวเลขใหม่เนื่องจากใช้คำสั่ง Randomize()

สรุป (Summary)

การใช้ Random Method ในภาษา AL เป็นวิธีที่ง่ายและรวดเร็วในการสุ่มตัวเลขภายในช่วงที่กำหนด โดยสามารถปรับปรุงความสุ่มได้ด้วยการใช้ Randomize() เพื่อสร้างชุดตัวเลขใหม่ ช่วยเพิ่มความยืดหยุ่นในการพัฒนาแอปพลิเคชันใน Dynamics 365 Business Central ได้อย่างมีประสิทธิภาพ

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

DecimalPlaces เป็น Property ใน AL Programming ที่ใช้กำหนดจำนวนตำแหน่งทศนิยมสำหรับการแสดงผลข้อมูลประเภท Decimal หรือจำนวนเงิน (Amount) ใน Page หรือ Field Properties โดยสามารถกำหนดได้ทั้งจำนวนทศนิยมขั้นต่ำ (Minimum) และสูงสุด (Maximum)

Syntax และรูปแบบการใช้งาน

รูปแบบของ DecimalPlaces มีดังนี้

DecimalPlaces = MinDecimals : MaxDecimals;

MinDecimals: จำนวนทศนิยมขั้นต่ำที่ต้องการให้แสดง

MaxDecimals: จำนวนทศนิยมสูงสุดที่อนุญาตให้แสดง

ตัวอย่าง

DecimalPlaces = 0 : 2;

ตัวอย่างนี้หมายความว่า

  • จะแสดงตำแหน่งทศนิยมขั้นต่ำคือ 0 (ไม่มีจุดทศนิยม)
  • จะแสดงตำแหน่งทศนิยมสูงสุดไม่เกิน 2 ตำแหน่ง

การใช้งานใน Field Properties

DecimalPlaces มักถูกใช้ใน Field บน Table หรือ Page เพื่อกำหนดรูปแบบการแสดงผลข้อมูล เช่น จำนวนเงิน หรือค่าคำนวณที่เกี่ยวข้องกับเลขทศนิยม

ตัวอย่างใน Table

table 50100 "Custom Table"
{
    fields
    {
        field(1; "Unit Price"; Decimal)
        {
            DecimalPlaces = 2 : 2;
        }
        field(2; "Discount Rate"; Decimal)
        {
            DecimalPlaces = 0 : 4;
        }
    }
}

Unit Price จะแสดงตำแหน่งทศนิยมที่แน่นอนคือ 2 ตำแหน่ง

Discount Rate สามารถแสดงทศนิยมได้ตั้งแต่ 0 ถึง 4 ตำแหน่ง

ตัวอย่างใน Page

page 50100 "Custom Page"
{
    SourceTable = "Custom Table";
    layout
    {
        area(content)
        {
            field("Unit Price"; rec."Unit Price")
            {
                DecimalPlaces = 2 : 2;
            }
            field("Discount Rate"; rec."Discount Rate")
            {
                DecimalPlaces = 0 : 4;
            }
        }
    }
}

ในกรณีนี้ DecimalPlaces จะควบคุมการแสดงผลข้อมูลบน Page ที่เชื่อมต่อกับ Table ข้างต้น

ข้อจำกัด

  • หากตั้ง MinDecimals และ MaxDecimals เท่ากัน ค่าใน Field จะไม่สามารถเปลี่ยนจำนวนทศนิยมได้
  • ไม่สามารถใช้กับ Data Types อื่นนอกจาก Decimal

สรุป

DecimalPlaces เป็น Property สำคัญที่ช่วยควบคุมการแสดงผลข้อมูลแบบทศนิยมใน AL Programming ไม่ว่าจะเป็นข้อมูลที่เกี่ยวกับจำนวนเงิน อัตราภาษี หรือเปอร์เซ็นต์ การใช้งาน DecimalPlaces อย่างเหมาะสมจะช่วยเพิ่มความแม่นยำและความชัดเจนในระบบ Dynamics 365 Business Central

Dynamics 365 Business Central: การใช้งานฟังก์ชัน GetEnvironmentName ใน AL Programming

การเขียนโปรแกรมด้วยภาษา AL สำหรับ Dynamics 365 Business Central มีหลายฟังก์ชันที่ช่วยให้เราสามารถเข้าถึงข้อมูลของระบบที่กำลังทำงานอยู่ หนึ่งในฟังก์ชันที่มีประโยชน์มากคือ GetEnvironmentName() ซึ่งเป็นฟังก์ชันที่ใช้สำหรับดึงชื่อของ Environment ที่เรากำลังทำงานอยู่ เช่น Production, Sandbox หรือ Development Environment

คำอธิบายของฟังก์ชัน GetEnvironmentName()

ฟังก์ชัน GetEnvironmentName() เป็นส่วนหนึ่งของ Codeunit 457 "Environment Information" ที่ Microsoft ให้มาในระบบ Dynamics 365 Business Central ฟังก์ชันนี้จะทำการคืนค่าชื่อของ Environment ที่ระบบกำลังทำงานอยู่

procedure GetEnvironmentName(): Text

ผลลัพธ์: ฟังก์ชันนี้จะคืนค่าเป็น Text ซึ่งแสดงชื่อ Environment เช่น “Production”, “Sandbox” หรือชื่อที่กำหนดเอง

ประเภทข้อมูลที่คืนค่า: Text

ตัวอย่างการใช้งานฟังก์ชัน GetEnvironmentName()

เพื่อให้เข้าใจมากขึ้น เรามาดูตัวอย่างการใช้งาน GetEnvironmentName() ในการเขียนโค้ด AL

ตัวอย่างที่ 1: การแสดงชื่อ Environment

procedure ShowEnvironmentName()
var
    EnvInfo: Codeunit "Environment Information";
    EnvName: Text;
begin
    // ดึงชื่อ Environment
    EnvName := EnvInfo.GetEnvironmentName();
    // แสดงผลชื่อ Environment ในรูปแบบ Message Box
    Message('Current Environment: %1', EnvName);
end;

คำอธิบาย
ในตัวอย่างนี้ เราสร้างฟังก์ชัน ShowEnvironmentName() เพื่อดึงชื่อของ Environment ปัจจุบัน แล้วแสดงผลผ่าน Message โดยใช้ Codeunit "Environment Information" ในการเรียกใช้ฟังก์ชัน GetEnvironmentName()

ผลลัพธ์

  • หากระบบทำงานบน Production Environment จะขึ้นข้อความ:
    "Current Environment: Production"
  • หากเป็น Sandbox Environment จะขึ้นข้อความ:
    "Current Environment: Sandbox"

ตัวอย่างที่ 2: การตรวจสอบ Environment ก่อนการดำเนินการ

สมมติว่าเรามีฟังก์ชันที่ต้องการให้ทำงานเฉพาะใน Sandbox เท่านั้น เราสามารถใช้ GetEnvironmentName() เพื่อตรวจสอบ Environment ได้ดังนี้

procedure ValidateSandboxEnvironment()
var
    EnvInfo: Codeunit "Environment Information";
    EnvName: Text;
begin
    // ตรวจสอบชื่อ Environment
    EnvName := EnvInfo.GetEnvironmentName();
    if EnvName <> 'Sandbox' then
        Error('This feature is only available in Sandbox environment.');
    
    // ดำเนินการเฉพาะใน Sandbox เท่านั้น
    Message('Feature enabled for Sandbox.');
end;

คำอธิบาย
ในฟังก์ชัน ValidateSandboxEnvironment() เราตรวจสอบชื่อ Environment หากไม่ใช่ Sandbox จะขึ้นข้อความ Error เพื่อแจ้งเตือนผู้ใช้ หากเป็น Sandbox จะดำเนินการต่อไป

สรุป

การใช้ฟังก์ชัน GetEnvironmentName() ใน AL Programming ช่วยให้เราสามารถเขียนโค้ดที่ยืดหยุ่นและสามารถปรับการทำงานได้ตาม Environment ที่ใช้งานอยู่ ซึ่งเป็นประโยชน์อย่างมากสำหรับการพัฒนา Extension ที่ต้องการรองรับทั้ง Production และ Sandbox

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

หากคุณเป็นนักพัฒนาที่ทำงานกับ Microsoft Dynamics 365 Business Central คุณคงคุ้นเคยกับภาษา AL ซึ่งเป็นภาษาที่ใช้ในการพัฒนาและปรับแต่งระบบนี้ ในการเขียนโปรแกรม บางครั้งเราจำเป็นต้องทำงานกับค่าสัมบูรณ์ของตัวเลข เพื่อใช้ในการคำนวณต่าง ๆ ฟังก์ชัน Abs เป็นเครื่องมือสำคัญที่ช่วยให้เราหาค่าสัมบูรณ์ของตัวเลขได้อย่างง่ายดาย

Abs คืออะไร?

Abs ย่อมาจาก Absolute ซึ่งใช้ในการคืนค่า “ค่าสัมบูรณ์” ของตัวเลข กล่าวคือ ไม่ว่าตัวเลขนั้นจะเป็นบวกหรือลบ ผลลัพธ์ที่ได้จะเป็นตัวเลขบวกเสมอ

Abs(Number: Decimal): Decimal

Number: ตัวเลขที่ต้องการหาค่าสัมบูรณ์

Return Value: ค่าสัมบูรณ์ของตัวเลขที่ใส่เข้าไป

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

เรามาดูตัวอย่างการสร้าง Procedure ที่ใช้ Abs กัน

ตัวอย่างที่ 1: หาค่า Abs ของจำนวนเต็ม

procedure GetAbsoluteValue(Number: Integer): Integer
var
    AbsoluteValue: Integer;
begin
    AbsoluteValue := Abs(Number);
    exit(AbsoluteValue);
end;

การใช้งาน

var
    Result: Integer;
begin
    Result := GetAbsoluteValue(-10);
    Message('The absolute value is %1', Result); // Output: The absolute value is 10
end;

ตัวอย่างที่ 2: หาค่า Abs ของจำนวนทศนิยม

procedure GetAbsoluteDecimal(Number: Decimal): Decimal
var
    AbsoluteValue: Decimal;
begin
    AbsoluteValue := Abs(Number);
    exit(AbsoluteValue);
end;

การใช้งาน

var
    Result: Decimal;
begin
    Result := GetAbsoluteDecimal(-15.75);
    Message('The absolute decimal value is %1', Result); // Output: The absolute decimal value is 15.75
end;

การนำไปประยุกต์ใช้

Abs มีประโยชน์อย่างมากในการคำนวณที่ต้องการค่าสัมบูรณ์ เช่น

  • การคำนวณระยะห่างระหว่างสองจุด
  • การหาความแตกต่างระหว่างตัวเลขสองตัวโดยไม่สนใจเครื่องหมาย
  • การประมวลผลข้อมูลที่ต้องการค่าเป็นบวกเสมอ

ตัวอย่างการประยุกต์ใช้

procedure CalculateDistance(PointA: Decimal; PointB: Decimal): Decimal
var
    Distance: Decimal;
begin
    Distance := Abs(PointA - PointB);
    exit(Distance);
end;

การใช้งาน

var
    DistanceResult: Decimal;
begin
    DistanceResult := CalculateDistance(20.5, 10.25);
    Message('The distance is %1', DistanceResult); // Output: The distance is 10.25
end;

สรุป

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

Dynamics 365 Business Central: การใช้งาน Hide Payment Method Code ในหน้า General Ledger Setup

ใน Dynamics 365 Business Central, การตั้งค่า General Ledger Setup เป็นขั้นตอนสำคัญสำหรับการกำหนดค่าบัญชีแยกประเภททั่วไปขององค์กรของคุณ. บางครั้งองค์กรอาจต้องการซ่อนฟิลด์ Payment Method Code เพื่อป้องกันไม่ให้ผู้ใช้บางคนเห็นหรือแก้ไขข้อมูลนี้ บทความนี้จะอธิบายวิธีการซ่อน Payment Method Code อย่างละเอียด พร้อมยกตัวอย่างการใช้งาน.

  • ไปที่ไอคอน ค้นหา (รูปแว่นขยาย) ที่มุมบนขวา
  • พิมพ์ “General Ledger Setup” และเลือกจากผลการค้นหา

ตั้งค่าฟิลด์ “Hide Payment Method Code”

ในหน้า General Ledger Setup ค้นหาฟิลด์ “Hide Payment Method Code”

ตั้งค่าเป็น False หรือ No เพื่อแสดงฟิลด์ “Payment Method Code” ตามปกติ

ตัวอย่างเอกสาร Sales Order

ตัวอย่างเอกสาร Purchase Order

ตั้งค่าเป็น True หรือ Yes เพื่อซ่อนฟิลด์ “Payment Method Code” จากหน้าเพจและเอกสารต่าง ๆ

ตัวอย่างเอกสาร Sales Order

ตัวอย่างการทำงาน Source Code หน้า Sales Order

ตัวอย่างเอกสาร Purchase Order

ตัวอย่างการทำงาน Source Code หน้า Purchase Order

สรุป

ฟิลด์ “Hide Payment Method Code” ในหน้า General Ledger Setup ถูกใช้เพื่อควบคุมการแสดงผลของฟิลด์ “Payment Method Code” ภายในระบบ การตั้งค่านี้ช่วยให้คุณสามารถปรับแต่งการทำงานของระบบให้เหมาะสมกับความต้องการขององค์กร ลดความซับซ้อน และป้องกันข้อผิดพลาดที่อาจเกิดขึ้นจากการป้อนข้อมูลที่ไม่ถูกต้อง