เป้าหมายและพื้นฐาน
เมื่อจบ: ขยายข้อมูลและหน้าจอโดยใช้ Extension
พื้นฐานที่ต้องรู้: 12–13
แบบฝึกหลัก: เพิ่มฟิลด์ฝึกบน Customer Card และทดสอบบันทึก
ภาพรวมก่อนลงมือทำ
เชื่อม field จากฐานข้อมูลถึงหน้าจอ
ใช้ชื่อจริงจากไฟล์ AL ของบทนี้
- tableextension 50100
extends Customer → เพิ่ม "SBC Training Note"
- pageextension 50100
extends "Customer Card" → addlast(General)
- Rec."SBC Training Note"
ผูก control บน Page กับ field ที่เพิ่ม
- ทดสอบบันทึก
กรอก SBC-TEST-01 แล้วเปิด Customer เดิมใหม่
สิ่งที่ควรจำTable Extension เพิ่ม schema; Page Extension แสดง field โดยไม่สร้าง schema ซ้ำ
จาก object ใหม่สู่การขยายระบบมาตรฐาน
บท 13 สร้าง Table และ Page ของเราเอง บทนี้ใช้ extends Customer และ extends "Customer Card" เพื่อเพิ่มความสามารถให้ระบบเดิม โดยอ้าง field จาก table ผ่าน Rec."SBC Training Note"
addlast(General) คือจุดวาง control ใน layout ส่วน ApplicationArea และ ToolTip เป็น properties ของหน้าจอ ไม่ได้สร้าง column ในฐานข้อมูล การเพิ่มฟิลด์ที่เก็บข้อมูลจึงต้องทำใน Table Extension ด้วย
Record และ validation: ใน AL การกำหนดค่า field ด้วย := ต่างจาก Record.Validate(...) ซึ่งเรียก validation ของ field; การแก้ค่าบน record variable ก็ยังต้องคำนึงถึงการบันทึกด้วย ห้ามเขียนตรงลงตาราง ledger เพื่อเลียนแบบการ Post ให้ใช้กระบวนการมาตรฐานและจุดขยายที่ระบบรองรับ
ออกแบบฟิลด์ฝึก
ฟิลด์ SBC Training Note เป็น Text[100] มี Caption และ DataClassification = CustomerContent ตัวอย่างไม่เก็บข้อมูลลับ จุดประสงค์คือเรียนการเพิ่มฟิลด์และทดสอบว่าบันทึกได้ ไม่ใช่แทนระบบ note ขององค์กร
ฟิลด์ table ใช้ ID 50100 ในตัวอย่าง และ object IDs ใช้ช่วงที่ README ระบุ ต้องตรวจความว่างและสิทธิ์ใช้ช่วงก่อน การแสดง field บน page ไม่ได้สร้างที่เก็บข้อมูลให้เอง จึงต้องมีทั้ง tableextension และ pageextension
ขั้นตอนเพิ่มและแสดงฟิลด์
- เตรียมโปรเจกต์/Symbols ตามบท 12–13 เปิดคลังโค้ด อ่าน README และดาวน์โหลดทั้งชุดเพื่อให้ dependency ครบ
- เปิด StartBCCustomer.TableExt.al ตรวจ extends Customer และ field ที่เพิ่ม อ่าน Caption, ชนิดข้อมูล และ DataClassification
- เปิด StartBCCustomerCard.PageExt.al ดู layout → addlast(General) และ field ที่อ้าง Rec."SBC Training Note" ApplicationArea ทำให้การแสดงผลตรงกลุ่มที่ระบุ
- หากฝึกเฉพาะฟิลด์ ให้ใช้ source ทั้งชุดพร้อม codeunit ที่ Action อ้าง หรือแยก actions/Label ตาม README อย่าคอมไพล์ไฟล์ที่อ้าง object ซึ่งยังไม่มี
- ใช้ Go to Definition/Symbols ตรวจว่า General เป็น anchor ของ Customer Card ในเวอร์ชันเป้าหมาย จากนั้น AL: Package ตรวจ Problems
- เมื่อ compile ผ่านจึง publish ไป Sandbox เปิด Customer Card ของลูกค้าฝึก ไม่ใช่ Customers list
- ใน General หา Training note ใส่ SBC-TEST-01 ออกจากการ์ด แล้วกลับลูกค้ารหัสเดิมเพื่อตรวจค่า เปลี่ยนเป็น SBC-TEST-02 และตรวจซ้ำ
แบบฝึกและเกณฑ์ผ่าน
จด Customer No., ข้อความก่อน/หลัง และผลหลังออก/เปิดหน้าใหม่ เกณฑ์ผ่านคือฟิลด์ปรากฏในตำแหน่งที่เพิ่ม ค่าอยู่กับลูกค้ารายนั้น และลูกค้าฝึกอีกรายไม่แสดงค่าของรายแรก
ลองเปลี่ยนเฉพาะ Caption ในโปรเจกต์ฝึก Package/publish version ใหม่ แล้วอธิบายความต่างระหว่างชื่อ field ภายในกับ Caption ที่ผู้ใช้เห็น ไม่เปลี่ยน ID หรือชนิดข้อมูลเพื่อทดสอบกับข้อมูลที่ต้องเก็บ
ผลที่คาดหวังและข้อจำกัด
เมื่อทดลองสำเร็จใน tenant ของคุณ ค่า Text จะถูกเก็บในส่วนขยายของ Customer และแสดงบน Customer Card การลบ/ถอน Extension อาจกระทบข้อมูลที่ฟิลด์เพิ่มไว้ ต้องให้ผู้ดูแลกำหนดวิธีจัดการข้อมูลฝึกก่อน ไม่ถอนในบริษัทจริง
StartBC ยังไม่ได้รันชุดนี้กับ Symbols ของ tenant เป้าหมาย จึงต้องยืนยัน anchors, compatibility และสิทธิ์จาก compiler/ระบบจริง
Source AL ที่ใช้ในบทนี้
tableextension 50100 "SBC Customer" extends Customer
{
fields
{
field(50100; "SBC Training Note"; Text[100])
{
Caption = 'Training note';
DataClassification = CustomerContent;
}
}
}
ดาวน์โหลด StartBCCustomer.TableExt.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';
}
ปัญหาพบบ่อย
- ฟิลด์ไม่แสดง
- ตรวจหน้า Customer Card, บริษัท, เวอร์ชันแอปที่ติดตั้ง สิทธิ์ และการปรับแต่งหน้าของผู้ใช้
- หา anchor General ไม่พบ
- ดู definition ของ page จาก Symbols ที่ดาวน์โหลดแล้วเลือก anchor ที่เหมาะกับเวอร์ชันนั้น ไม่ลบ layout ทิ้งเพื่อให้ Package ผ่าน
- field ID หรือชื่อชน
- ปรับช่วง ID/ชื่อ prefix ที่ทีมจัดสรร และจุดอ้างใน Page ให้ตรงกันก่อนมีข้อมูลจริง ไม่ rename schema เดิมโดยไม่มีแผน upgrade
เอกสารอ้างอิงทางการ
อ่านประกอบและตรวจชื่อเมนู/ข้อจำกัดของเวอร์ชันที่คุณใช้ เอกสารเดิมตรวจ 22 ตุลาคม 2569; เอกสารติดตั้งและพื้นฐาน Developer ที่เพิ่มตรวจ 4 พฤศจิกายน 2569