เป้าหมายและพื้นฐาน
เมื่อจบ: เชื่อมปุ่มบนหน้าจอกับตรรกะที่แยกทดสอบได้
พื้นฐานที่ต้องรู้: 13–14
แบบฝึกหลัก: สร้าง Action เรียก Codeunit พร้อมตรวจกรณีผ่านและไม่ผ่าน
ภาพรวมก่อนลงมือทำ
ตามรอย OnAction → Codeunit
การเรียก AL ของปุ่ม Calculate training amount
- SBCShowTrainingAmount
trigger OnAction() รับการกดปุ่ม
- Calculation: Codeunit
ตัวแปรอ้าง "SBC Calculation"
- CalculateAmount(2, 150)
ตรวจค่าติดลบ แล้ว exit(Round(..., 0.01))
- 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
- ใช้โปรเจกต์ที่มี Codeunit, หน้าคำนวณ, Table Extension และ Page Extension จากบท 13–14 รวม Codeunit และ Table Extension ที่ Page อ้าง ตรวจ ID และ dependencies ตาม README
- เปิด Page Extension ตรวจ actions → addlast(Processing) → SBCShowTrainingAmount และ Caption/ToolTip
- อ่าน trigger OnAction ดูว่าตัวแปร codeunit ถูกประกาศใน var แล้วเรียก procedure ไม่ใช้การคัดลอกสูตรคำนวณมาเขียนซ้ำบน page
- ตรวจ anchor Processing ด้วย Symbols ของ Customer Card แล้ว AL: Package แก้ Problems ก่อน publish ไป Sandbox
- เปิดลูกค้าฝึก บน action bar หรือเมนู Actions หา Calculate training amount อาจอยู่เมนูย่อยตามหน้าจอ/เวอร์ชัน เลือกเพียงครั้งเดียว
- ตรวจข้อความยอด 300 ตาม locale และกลับการ์ด ยืนยันว่า Training note ไม่เปลี่ยน ไม่มี Invoice หรือ G/L Entry ใหม่จาก Action นี้
- กลับหน้าฝึกจากบท 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 ที่ใช้ในบทนี้
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
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.';
}
Debug การเรียก AL ทีละบรรทัด
- วาง breakpoint ที่คำสั่งเรียก
Calculation.CalculateAmount(2, 150)ใน OnAction ของ Page Extension - ตรวจ launch configuration ให้เป็นแล็บ แล้วใช้ Start Debugging (F5) เปิด Customer Card และกด Calculate training amount
- เมื่อหยุดที่ breakpoint ตรวจ Call Stack แล้วใช้ Step Into เข้า CalculateAmount ดู Quantity และ UnitPrice ใน Variables/Watch
- Step Over เงื่อนไขและคำสั่งคืนผล แล้วตรวจข้อความที่หน้าจอ
- ทดลอง -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