StartBC.comค้นหาบทเรียน

สร้าง Action และแยกตรรกะด้วย Codeunit

Action เป็นจุดให้ผู้ใช้สั่งงาน ส่วน Codeunit เก็บตรรกะที่ใช้ร่วมกัน บทนี้เชื่อมปุ่มบน Customer Card กับ CalculateAmount ที่สร้างในบท 13 เพื่อเห็นเส้นทางการเรียกโค้ดโดยไม่เปลี่ยนยอดลูกค้าหรือสร้างเอกสาร

ตรวจเอกสารอ้างอิง: 22 ตุลาคม 2569
บริบท: Business Central · ใช้กับแล็บ on-premises หรือ online Sandbox ตามบท 12 · ตัวอย่าง AL ยังไม่ได้ compile/run กับระบบจริง

เป้าหมายและพื้นฐาน

เมื่อจบ: เชื่อมปุ่มบนหน้าจอกับตรรกะที่แยกทดสอบได้

พื้นฐานที่ต้องรู้: 13–14

แบบฝึกหลัก: สร้าง Action เรียก Codeunit พร้อมตรวจกรณีผ่านและไม่ผ่าน

ภาพรวมก่อนลงมือทำ

ภาพสรุปบทเรียน · 15

ตามรอย OnAction → Codeunit

การเรียก AL ของปุ่ม Calculate training amount

  1. SBCShowTrainingAmount

    trigger OnAction() รับการกดปุ่ม

  2. Calculation: Codeunit

    ตัวแปรอ้าง "SBC Calculation"

  3. CalculateAmount(2, 150)

    ตรวจค่าติดลบ แล้ว exit(Round(..., 0.01))

  4. Message(TrainingAmountMsg, …)

    นำผล 300 มาแสดงข้อความบน Customer Card

สิ่งที่ควรจำใช้ breakpoint และ Step Into ตามรอยค่า; ปุ่มนี้ไม่อ่านยอดลูกค้าและไม่ Post

ความรับผิดชอบของแต่ละส่วน

OnAction ทำหน้าที่รับเหตุการณ์จาก UI แล้วเรียก Codeunit ตัวอย่างประกาศตัวแปร Calculation ชนิด Codeunit "SBC Calculation" จากนั้นเรียก CalculateAmount(2, 150) และใช้ Message แสดงผล Codeunit ไม่ต้องรู้ว่าถูกเรียกจากหน้าใด

Action นี้ใช้ตัวเลขคงที่และไม่อ่านวงเงินหรือยอดลูกค้า การวางบน Customer Card เป็นเพียงบริบทสำหรับฝึก ไม่ได้คำนวณยอดขายของลูกค้ารายนั้น ข้อความ Caption จึงระบุว่าเป็น training amount

ขั้นตอนเชื่อมและทดลอง Action

  1. ใช้โปรเจกต์ที่มี Codeunit, หน้าคำนวณ, Table Extension และ Page Extension จากบท 13–14 รวม Codeunit และ Table Extension ที่ Page อ้าง ตรวจ ID และ dependencies ตาม README
  2. เปิด Page Extension ตรวจ actions → addlast(Processing) → SBCShowTrainingAmount และ Caption/ToolTip
  3. อ่าน trigger OnAction ดูว่าตัวแปร codeunit ถูกประกาศใน var แล้วเรียก procedure ไม่ใช้การคัดลอกสูตรคำนวณมาเขียนซ้ำบน page
  4. ตรวจ anchor Processing ด้วย Symbols ของ Customer Card แล้ว AL: Package แก้ Problems ก่อน publish ไป Sandbox
  5. เปิดลูกค้าฝึก บน action bar หรือเมนู Actions หา Calculate training amount อาจอยู่เมนูย่อยตามหน้าจอ/เวอร์ชัน เลือกเพียงครั้งเดียว
  6. ตรวจข้อความยอด 300 ตาม locale และกลับการ์ด ยืนยันว่า Training note ไม่เปลี่ยน ไม่มี Invoice หรือ G/L Entry ใหม่จาก Action นี้
  7. กลับหน้าฝึกจากบท 13 ทดสอบค่าติดลบเพื่อพิสูจน์ว่าการตรวจข้อมูลอยู่ใน codeunit ไม่ได้มีเฉพาะปุ่มบน Customer Card

แบบฝึก: ตามรอยการเรียกหนึ่งครั้ง

เขียนลำดับ Page Action → OnAction → Codeunit.CalculateAmount → return → Message ใส่ค่าที่รับเข้าและส่งออกทุกจุด จากนั้นอธิบายว่าถ้าต้องใช้สูตรเดิมในหน้าใหม่ ควรเรียกส่วนใด

ทดสอบซ้ำสองครั้ง ผลคาดหวังคือข้อความเดียวกันและไม่มีข้อมูลธุรกิจเพิ่ม ไม่ใช้การเพิ่มปุ่ม Post จริงเป็นแบบฝึกต่อยอดโดยไม่มีการออกแบบสิทธิ์ transaction และการยืนยันกับผู้รับผิดชอบ

ผลที่คาดหวังและการส่งมอบชุดฝึก

ผู้เรียนเห็น Action ในตำแหน่งที่กำหนดและอ่านความสัมพันธ์กับ Codeunit ได้ เมื่อทดลองในระบบสำเร็จ ให้ส่ง source พร้อม README, เวอร์ชันทดสอบ, ผลแต่ละ test case และข้อจำกัด ห้ามส่งไฟล์ config ที่มี secret

คลัง StartBC มี source ให้คัดลอกและดาวน์โหลด แต่ไม่ได้สร้างไฟล์ .app หรืออ้างผล compile/run การตรวจใช้งานจริงต้องทำใน Sandbox ที่ทีมจัดให้

ปัญหาพบบ่อย

Action ไม่เห็นบนแถบหลัก
ตรวจเมนูย่อย Actions และ anchor, ApplicationArea, เวอร์ชันแอป รวมทั้ง Personalization การไม่ promote ไม่ได้แปลว่า Action ไม่มี
Procedure ไม่พบ
ตรวจชื่อ object/method และว่าเป็น local หรือไม่ ในตัวอย่างต้องเรียกข้าม object ได้
ต้องให้สิทธิ์เพิ่มหรือไม่
ขึ้นกับนโยบายผู้ใช้และ object ใหม่ ให้ผู้ดูแลกำหนด permission set ที่จำเป็น ไม่เพิ่มสิทธิ์กว้างทั้งหมดเพื่อให้ตัวอย่างทำงาน

Source AL ที่ใช้ในบทนี้

StartBCCustomerCard.PageExt.al
pageextension 50100 "SBC Customer Card" extends "Customer Card"
{
    layout
    {
        addlast(General)
        {
            field(SBCTrainingNote; Rec."SBC Training Note")
            {
                ApplicationArea = All;
                ToolTip = 'Specifies a note used only for the StartBC training exercise.';
            }
        }
    }
    actions
    {
        addlast(Processing)
        {
            action(SBCShowTrainingAmount)
            {
                Caption = 'Calculate training amount';
                ApplicationArea = All;
                Image = Calculate;
                ToolTip = 'Calculates a training amount without posting a document.';
                trigger OnAction()
                var
                    Calculation: Codeunit "SBC Calculation";
                begin
                    Message(TrainingAmountMsg, Calculation.CalculateAmount(2, 150));
                end;
            }
        }
    }
    var
        TrainingAmountMsg: Label 'Training amount: %1';
}

ดาวน์โหลด StartBCCustomerCard.PageExt.al

StartBCCalculation.Codeunit.al
codeunit 50100 "SBC Calculation"
{
    procedure CalculateAmount(Quantity: Decimal; UnitPrice: Decimal): Decimal
    begin
        if Quantity < 0 then
            Error(NegativeQuantityErr);
        if UnitPrice < 0 then
            Error(NegativePriceErr);
        exit(Round(Quantity * UnitPrice, 0.01));
    end;

    var
        NegativeQuantityErr: Label 'Quantity must be zero or greater.';
        NegativePriceErr: Label 'Unit price must be zero or greater.';
}

ดาวน์โหลด StartBCCalculation.Codeunit.al

ดูชุดโค้ดและ README ทั้งหมด

Debug การเรียก AL ทีละบรรทัด

  1. วาง breakpoint ที่คำสั่งเรียก Calculation.CalculateAmount(2, 150) ใน OnAction ของ Page Extension
  2. ตรวจ launch configuration ให้เป็นแล็บ แล้วใช้ Start Debugging (F5) เปิด Customer Card และกด Calculate training amount
  3. เมื่อหยุดที่ breakpoint ตรวจ Call Stack แล้วใช้ Step Into เข้า CalculateAmount ดู Quantity และ UnitPrice ใน Variables/Watch
  4. Step Over เงื่อนไขและคำสั่งคืนผล แล้วตรวจข้อความที่หน้าจอ
  5. ทดลอง -1 จากหน้าคำนวณในบท 13 เพื่อดูเส้นทาง Error และบันทึกผลเทียบกรณีปกติ

แนวคิดต่อยอด: หากต้องทำงานตอบสนองเหตุการณ์ของ Base Application ให้ศึกษาจุด event publisher ที่ระบบเปิดให้และสร้าง subscriber ใน Codeunit ไม่แก้ source มาตรฐานหรือสร้าง object ชื่อ codeunitextension ซึ่งไม่มีอยู่ในชุด object พื้นฐานนี้

จบแบบฝึกเมื่อส่งมอบ source, README, BC/AL version, ขั้นตอนติดตั้ง และผลทดสอบจริงครบ ยังไม่ถือว่าพร้อม production เพียงเพราะ Package ผ่าน

เอกสารอ้างอิงทางการ

อ่านประกอบและตรวจชื่อเมนู/ข้อจำกัดของเวอร์ชันที่คุณใช้ เอกสารเดิมตรวจ 22 ตุลาคม 2569; เอกสารติดตั้งและพื้นฐาน Developer ที่เพิ่มตรวจ 4 พฤศจิกายน 2569