การพัฒนาโปรแกรมใน AL (Application Language) สำหรับ Dynamics 365 Business Central มีฟังก์ชันและเครื่องมือที่ช่วยให้โค้ดมีความยืดหยุ่นและสามารถจัดการกับข้อมูลหลายประเภทได้ หนึ่งในเทคนิคที่ช่วยให้การเขียนโปรแกรมใน AL มีความยืดหยุ่นมากขึ้นคือ Procedure Overload ซึ่งช่วยให้คุณสามารถสร้างฟังก์ชันที่มีชื่อเดียวกันแต่รองรับพารามิเตอร์ที่แตกต่างกันได้ ในบทความนี้ เราจะอธิบายถึง Procedure Overload แบบละเอียด พร้อมตัวอย่างการใช้งาน ทั้งก่อนและหลังการนำไปใช้ รวมถึงรูปแบบการใช้งานต่างๆ
1. What is Procedure Overload? – Procedure Overload คืออะไร?
Procedure Overload คือการสร้างฟังก์ชัน (functions) หลายๆ ฟังก์ชันที่มีชื่อเดียวกัน (same name) แต่มีจำนวนพารามิเตอร์ (number of parameters) หรือประเภทของพารามิเตอร์ (type of parameters) ที่แตกต่างกัน ฟังก์ชันเหล่านี้จะถูก Overload ซึ่งหมายความว่าระบบจะเลือกใช้ฟังก์ชันที่เหมาะสมตามพารามิเตอร์ที่ถูกส่งมา
2. Why Use Procedure Overload? – ทำไมต้องใช้ Procedure Overload?
- Flexibility: ช่วยให้คุณสามารถใช้ฟังก์ชันเดียวกันในหลายสถานการณ์ โดยไม่ต้องสร้างฟังก์ชันใหม่ที่มีชื่อแตกต่างกันStrong
- Typing: ทำให้โค้ดใช้ประเภทข้อมูลที่ชัดเจน (strongly-typed) และสามารถตรวจสอบความถูกต้องได้ในขั้นตอนการคอมไพล์ (compile-time)
- Error Reduction: ลดข้อผิดพลาดที่อาจเกิดขึ้นในขั้นตอนการรัน (runtime errors) ด้วยการตรวจสอบตั้งแต่การคอมไพล์
3. Examples of Procedure Overload – ตัวอย่างการใช้งาน Procedure Overload
3.1. Before Using Procedure Overload – ก่อนการใช้ Procedure Overload
สมมติว่าคุณต้องการสร้างฟังก์ชัน CalculateTotal ที่คำนวณราคาสุทธิหลังหักส่วนลด โดยอาจคำนวณจากเปอร์เซ็นต์ (%) หรือจากจำนวนเงินคงที่ (Fixed Amount) รวมถึงการคำนวณราคาโดยไม่หักส่วนลด คุณอาจต้องสร้างฟังก์ชันแยกตามประเภทการคำนวณ:
codeunit 50100 TotalCalculator
{
local procedure CalculateTotalWithPercent(Price: Decimal; DiscountPercent: Decimal): Decimal
begin
Exit(Price - (Price * DiscountPercent / 100));
end;
local procedure CalculateTotalWithAmount(Price: Decimal; DiscountAmount: Decimal): Decimal
begin
Exit(Price - DiscountAmount);
end;
local procedure CalculateTotalWithoutDiscount(Price: Decimal): Decimal
begin
Exit(Price);
end;
}
ปัญหา: ฟังก์ชันแต่ละตัวมีชื่อแตกต่างกัน แต่พารามิเตอร์มี data type ซ้ำกันในบางกรณี ซึ่งทำให้โค้ดดูยุ่งยากและซับซ้อนปัญหา: ฟังก์ชันแต่ละตัวมีชื่อแตกต่างกัน เนื่องจากพารามิเตอร์ที่ใช้มีประเภทข้อมูลที่แตกต่างกัน ซึ่งทำให้โค้ดดูยุ่งยากและซับซ้อนเมื่อมีหลายกรณีที่ต้องรองรับ
3.2. After Using Procedure Overload – หลังการใช้ Procedure Overload
เพื่อให้สามารถใช้ Procedure Overload ได้อย่างถูกต้อง เราจะปรับให้ฟังก์ชัน CalculateTotal มีจำนวนพารามิเตอร์ที่แตกต่างกัน:
codeunit 50101 TotalCalculatorWithOverloads
{
procedure CalculateTotal(Price: Decimal; DiscountPercent: Decimal): Decimal
begin
Exit(Price - (Price * DiscountPercent / 100));
end;
procedure CalculateTotal(Price: Decimal; DiscountAmount: Decimal; IsAmount: Boolean): Decimal
begin
Exit(Price - DiscountAmount);
end;
procedure CalculateTotal(Price: Decimal): Decimal
begin
Exit(Price);
end;
}
ข้อดี: ด้วยการใช้ Procedure Overload ที่มีจำนวนพารามิเตอร์แตกต่างกัน คุณสามารถใช้ฟังก์ชัน CalculateTotal เดียวกันในการคำนวณราคาสุทธิสำหรับหลายกรณี โดยไม่ต้องสร้างฟังก์ชันใหม่ ทำให้โค้ดดูสะอาดและจัดการได้ง่ายขึ้น
4.Usage Patterns of Procedure Overload – รูปแบบการใช้งาน Procedure Overload
- Same Function Name, Different Parameters: ฟังก์ชันที่ถูก Overload ต้องมีชื่อเดียวกัน แต่พารามิเตอร์ต้องมีประเภทหรือจำนวนที่แตกต่างกัน
- Compile-time Resolution: การเลือกฟังก์ชันที่ถูกต้องจะเกิดขึ้นในขั้นตอนการคอมไพล์ หากพารามิเตอร์ไม่ตรงกับฟังก์ชันใด ระบบจะตรวจพบข้อผิดพลาดทันที
- Avoiding Ambiguity: หลีกเลี่ยงการ Overload ที่มีพารามิเตอร์ใกล้เคียงกันเกินไป เพราะอาจทำให้ระบบไม่สามารถเลือกฟังก์ชันที่ถูกต้องได้
- Best Practices: ใช้ Procedure Overload เมื่อจำเป็นต้องรองรับพารามิเตอร์ที่แตกต่างกันจริงๆ และตรวจสอบความถูกต้องด้วยการคอมไพล์
ตัวอย่างการเรียกใช้ฟังก์ชัน Procedure Overload:
procedure TestCalculateTotal()
var
Total1: Decimal;
Total2: Decimal;
Total3: Decimal;
begin
// เรียกใช้ฟังก์ชัน CalculateTotal ที่ใช้ DiscountPercent
Total1 := CalculateTotal(1000.00, 10.0);
// Total1 จะมีค่าเป็น 900.00 (1000 - 10%)
// เรียกใช้ฟังก์ชัน CalculateTotal ที่ใช้ DiscountAmount
Total2 := CalculateTotal(1000.00, 100.00, true);
// Total2 จะมีค่าเป็น 900.00 (1000 - 100)
// เรียกใช้ฟังก์ชัน CalculateTotal ที่ไม่ใช้ส่วนลดใดๆ
Total3 := CalculateTotal(1000.00);
// Total3 จะมีค่าเป็น 1000.00 (ไม่มีส่วนลด)
end;
คำอธิบาย:
Total3: ในการเรียกใช้ครั้งที่สาม เราใช้ฟังก์ชัน CalculateTotal(Price: Decimal) ซึ่งจะคืนค่าราคาสินค้าเต็มจำนวนโดยไม่มีส่วนลดใดๆ
Total1: ในการเรียกใช้ครั้งแรก เราใช้ฟังก์ชัน CalculateTotal(Price: Decimal; DiscountPercent: Decimal) ซึ่งจะคำนวณราคาหลังหักส่วนลดตามเปอร์เซ็นต์ (10%) ของราคา
Total2: ในการเรียกใช้ครั้งที่สอง เราใช้ฟังก์ชัน CalculateTotal(Price: Decimal; DiscountAmount: Decimal; IsAmount: Boolean) ซึ่งจะคำนวณราคาหลังหักจำนวนเงินที่เป็นส่วนลด (100 บาท)
5. Conclusion – สรุป
Procedure Overload เป็นเทคนิคที่ช่วยให้การเขียนโปรแกรมใน AL มีความยืดหยุ่นมากขึ้น คุณสามารถใช้ฟังก์ชันเดียวกันในหลากหลายสถานการณ์ได้โดยไม่ต้องสร้างฟังก์ชันใหม่หลายๆ ตัว นอกจากนี้ยังช่วยให้โค้ดดูเรียบร้อยและจัดการได้ง่ายขึ้น อย่างไรก็ตาม ควรใช้ Procedure Overload อย่างระมัดระวัง เพื่อป้องกันความสับสนที่อาจเกิดขึ้นจากการ Overload ฟังก์ชันหลายตัว




































