Dynamics 365 Business Central: การใช้ HtmlEncode, HtmlDecode, UrlEncode, และ UrlDecode ใน AL Programming

ใน AL Programming เราสามารถใช้ Type Helper Codeunit เพื่อจัดการกับการเข้ารหัสและถอดรหัสข้อมูล HTML และ URL ได้โดยใช้ฟังก์ชัน HtmlEncode, HtmlDecode, UrlEncode และ UrlDecode ซึ่งสำคัญในการป้องกันข้อมูลไม่ให้เกิดปัญหากับการแสดงผลใน HTML หรือการส่งข้อมูลผ่าน URL ที่มีอักขระพิเศษ

1. HtmlEncode และ HtmlDecode

  • HtmlEncode: ใช้ในการเข้ารหัสข้อมูลเพื่อให้แน่ใจว่าตัวอักษรพิเศษ เช่น <, >, &, และเครื่องหมายคำพูด (") ที่อาจเป็นสัญลักษณ์ใน HTML จะถูกแทนที่ด้วยโค้ดที่ถูกต้องเพื่อไม่ให้เกิดปัญหาหรือความขัดแย้งเมื่อแสดงผลในหน้าเว็บ เช่น:
    • < จะถูกเข้ารหัสเป็น &lt;
    • > จะถูกเข้ารหัสเป็น &gt;
  • HtmlDecode: ทำงานตรงกันข้ามกับ HtmlEncode คือถอดรหัสอักขระพิเศษที่ถูกเข้ารหัสกลับไปเป็นอักขระปกติ เพื่อให้สามารถแสดงข้อมูลที่แท้จริงได้

ตัวอย่างการใช้งาน HtmlEncode และ HtmlDecode ใน AL

procedure HtmlEncodeExample()
var
    InputText: Text;
    EncodedText: Text;
    DecodedText: Text;
begin
    // ข้อมูลที่มีอักขระพิเศษ
    InputText := '<div>สวัสดี & ยินดีต้อนรับ!</div>';
    
    // เข้ารหัส HTML
    EncodedText := TypeHelper.HtmlEncode(InputText);
    Message('Encoded HTML: %1', EncodedText); // จะแสดง: &lt;div&gt;สวัสดี &amp; ยินดีต้อนรับ!&lt;/div&gt;
    
    // ถอดรหัส HTML
    DecodedText := TypeHelper.HtmlDecode(EncodedText);
    Message('Decoded HTML: %1', DecodedText); // จะแสดง: <div>สวัสดี & ยินดีต้อนรับ!</div>
end;

2. UrlEncode และ UrlDecode

  • UrlEncode: ใช้สำหรับเข้ารหัส URL ซึ่งอักขระพิเศษที่ไม่สามารถใช้ใน URL ได้ เช่น ช่องว่าง ( ), เครื่องหมาย &, หรือ ? จะถูกแทนที่ด้วยโค้ดเฉพาะเช่น %20 สำหรับช่องว่าง เพื่อให้มั่นใจว่า URL จะไม่เกิดข้อผิดพลาดเมื่อส่งข้อมูลผ่านโปรโตคอล HTTP
  • UrlDecode: ทำงานตรงกันข้ามกับ UrlEncode โดยจะถอดรหัส URL กลับไปเป็นรูปแบบที่สามารถอ่านได้ เช่น:
    • %20 จะถูกถอดรหัสเป็นช่องว่าง ( )

ตัวอย่างการใช้งาน UrlEncode และ UrlDecode ใน AL

procedure UrlEncodeExample()
var
    InputUrl: Text;
    EncodedUrl: Text;
    DecodedUrl: Text;
begin
    // ข้อมูล URL ที่มีอักขระพิเศษ
    InputUrl := 'https://www.example.com?name=Thanapope & age=30';
    
    // เข้ารหัส URL
    EncodedUrl := TypeHelper.UrlEncode(InputUrl);
    Message('Encoded URL: %1', EncodedUrl); // จะแสดง: https%3A%2F%2Fwww.example.com%3Fname%3DThanapope%20%26%20age%3D30
    
    // ถอดรหัส URL
    DecodedUrl := TypeHelper.UrlDecode(EncodedUrl);
    Message('Decoded URL: %1', DecodedUrl); // จะแสดง: https://www.example.com?name=Thanapope & age=30
end;

สรุป

ฟังก์ชัน HtmlEncode และ HtmlDecode ใช้ในการจัดการกับอักขระพิเศษใน HTML เพื่อการแสดงผลที่ปลอดภัยและถูกต้อง ขณะที่ UrlEncode และ UrlDecode ใช้สำหรับการเข้ารหัสและถอดรหัสข้อมูลใน URL ซึ่งเป็นการป้องกันปัญหาจากอักขระที่ไม่สามารถใช้งานได้ใน URL

Dynamics 365 Business Central: การใช้งาน Base64 Convert Codeunit ใน AL Programming

Base64 Convert Codeunit เป็นหนึ่งในฟังก์ชันที่สำคัญใน AL programming ซึ่งใช้สำหรับการเข้ารหัส (encode) และถอดรหัส (decode) ข้อมูลในรูปแบบ Base64 โดย Base64 เป็นรูปแบบการเข้ารหัสข้อมูลที่นิยมใช้ในการส่งข้อมูลในโปรโตคอลต่างๆ เช่น HTTP หรือในการจัดเก็บข้อมูลที่ต้องการให้เป็นรูปแบบข้อความ

ฟังก์ชันหลักใน Base64 Convert Codeunit

  1. ToBase64
    • ใช้ในการเข้ารหัสข้อความหรือข้อมูลจาก InStream เป็น Base64
    • รองรับตัวเลือกในการแทรก Line Breaks ทุก ๆ 76 ตัวอักษรและระบุ TextEncoding เช่น UTF-8, MsDos, หรือ Windows
  2. FromBase64
    • ใช้ในการถอดรหัสข้อมูลจาก Base64 กลับเป็นข้อความปกติ
    • รองรับการระบุ TextEncoding และการถอดรหัสข้อมูลจาก Base64 ลงใน OutStream

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

1. การเข้ารหัสข้อความธรรมดาเป็น Base64

procedure EncodeTextToBase64(InputText: Text): Text
var
    Base64: Codeunit "Base64 Convert";
begin
    exit(Base64.ToBase64(InputText)); // คืนค่าข้อความที่ถูกเข้ารหัสเป็น Base64
end;

การใช้งาน

var
    EncodedText: Text;
begin
    EncodedText := EncodeTextToBase64('Hello World!');
    Message('Encoded Base64: %1', EncodedText);
end;

อธิบาย: ในตัวอย่างนี้ ข้อความ Hello World! จะถูกเข้ารหัสเป็น Base64 ซึ่งสามารถนำไปใช้งานในระบบต่าง ๆ ได้ เช่น การส่งข้อมูลผ่าน API

2. การเข้ารหัสพร้อมแทรก Line Breaks

procedure EncodeTextWithLineBreaks(InputText: Text): Text
var
    Base64: Codeunit "Base64 Convert";
begin
    exit(Base64.ToBase64(InputText, true)); // คืนค่าข้อความที่ถูกเข้ารหัสพร้อมแทรก line breaks ทุก ๆ 76 ตัวอักษร
end;

การใช้งาน

var
    EncodedTextWithBreaks: Text;
begin
    EncodedTextWithBreaks := EncodeTextWithLineBreaks('This is a very long string that we are using to demonstrate how Base64 encoding works when we have more than seventy-six characters in the input text.');
    Message('Encoded Text with Line Breaks: %1', EncodedTextWithBreaks);
end;

อธิบาย: การเข้ารหัสพร้อม InsertLineBreaks จะทำให้ข้อความ Base64 ถูกแบ่งบรรทัดทุก ๆ 76 ตัวอักษร ซึ่งมีประโยชน์ในบางกรณีที่ต้องการความอ่านง่ายหรือการจำกัดความยาวบรรทัด

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

1. การถอดรหัสข้อความ Base64 กลับเป็นข้อความปกติ

procedure DecodeBase64ToText(Base64String: Text): Text
var
    Base64: Codeunit "Base64 Convert";
begin
    exit(Base64.FromBase64(Base64String)); // คืนค่าข้อความที่ถอดรหัสจาก Base64
end;

การใช้งาน

var
    DecodedText: Text;
begin
    DecodedText := DecodeBase64ToText('SGVsbG8gV29ybGQh');
    Message('Decoded Text: %1', DecodedText);
end;

อธิบาย: ข้อความ SGVsbG8gV29ybGQh ซึ่งเป็นข้อความที่เข้ารหัสใน Base64 จะถูกถอดรหัสกลับมาเป็น Hello World!

2. การถอดรหัสข้อมูลจาก Stream

procedure DecodeStreamFromBase64(Base64String: Text; var OutStream: OutStream)
var
    Base64: Codeunit "Base64 Convert";
begin
    Base64.FromBase64(Base64String, OutStream); // ถอดรหัสข้อมูลจาก Base64 แล้วนำไปเก็บใน OutStream
end;

การใช้งาน

var
    OutStream: OutStream;
begin
    DecodeStreamFromBase64('SGVsbG8gV29ybGQh', OutStream);
    // ทำงานกับ OutStream ต่อไป
end;

อธิบาย: ในตัวอย่างนี้ ข้อมูลจะถูกถอดรหัสจาก Base64 แล้วถูกเก็บไว้ใน OutStream ซึ่งสามารถนำไปใช้งานในรูปแบบข้อมูล Stream อื่น ๆ ได้

สรุป

Base64 Convert Codeunit เป็นเครื่องมือที่มีประโยชน์ในการจัดการข้อมูล Base64 ไม่ว่าจะเป็นการเข้ารหัสหรือถอดรหัส โดยมีฟังก์ชันที่ยืดหยุ่นและรองรับการทำงานทั้งในรูปแบบข้อความปกติและ Stream ทำให้สามารถนำไปประยุกต์ใช้ในโปรเจ็กต์ต่างๆ ในระบบ Dynamics 365 Business Central ได้อย่างมีประสิทธิภาพ

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

ใน AL Programming การใช้งาน Control Statements เป็นสิ่งที่จำเป็นสำหรับการควบคุมการทำงานของโปรแกรม AL คำสั่งเหล่านี้ช่วยให้โปรแกรมเมอร์สามารถเขียนโค้ดที่ตอบสนองตามเงื่อนไขต่างๆ ดำเนินการคำสั่งที่หลากหลาย หรือทำซ้ำการทำงานตามจำนวนครั้งที่กำหนดได้ Control Statements แบ่งออกเป็นสามประเภทหลักๆ ดังนี้: Compound Statements, Conditional Statements, และ Repetitive Statements

1. AL Compound Statements

AL Compound Statements คือการรวมคำสั่งหลายๆ คำสั่งไว้ในกลุ่มเดียวกัน หรือบล็อกคำสั่ง โดยใช้ begin และ end คำสั่งเหล่านี้จะถูกดำเนินการตามลำดับ

ตัวอย่าง

procedure UpdateCustomerInfo(CustomerNo: Code[20])
var
    Customer: Record Customer;
begin
    if Customer.Get(CustomerNo) then begin
        Customer.Name := 'New Customer Name';
        Customer.Address := '123 New Street';
        Customer.City := 'Bangkok';
        Customer.Modify(true);
    end else
        Error('Customer not found.');
end;

อธิบาย: ในตัวอย่างนี้ begin และ end ถูกใช้เพื่อรวมหลายคำสั่งไว้ในบล็อกเดียว ซึ่งช่วยให้สามารถทำงานหลายคำสั่ง เช่น การเปลี่ยนชื่อ ที่อยู่ และเมืองของลูกค้า ภายในขั้นตอนเดียว

2. AL Conditional Statements

AL Conditional Statements ใช้ในการตัดสินใจว่าคำสั่งใดจะถูกดำเนินการโดยอ้างอิงจากเงื่อนไขที่กำหนดไว้ Conditional Statements ใน AL ประกอบด้วย If-Then-Else และ Case.

2.1 If-Then-Else Statement

If-Then-Else ใช้ในการตรวจสอบเงื่อนไขและดำเนินการคำสั่งตามเงื่อนไขนั้น ถ้าเงื่อนไขเป็นจริงจะดำเนินการคำสั่งในส่วน Then แต่ถ้าไม่เป็นจริงจะดำเนินการในส่วน Else (ถ้ามี)

ตัวอย่าง

procedure CalculateShippingFee(Weight: Decimal): Decimal
var
    ShippingFee: Decimal;
begin
    if Weight <= 5 then
        ShippingFee := 50.00
    else if Weight <= 10 then
        ShippingFee := 100.00
    else
        ShippingFee := 150.00;

    exit(ShippingFee);
end;

อธิบาย: ในตัวอย่างนี้ ค่าธรรมเนียมการขนส่งจะถูกคำนวณตามน้ำหนักของพัสดุ โดยใช้ If-Then-Else statement ถ้าน้ำหนักน้อยกว่า 5 กิโลกรัม ค่าธรรมเนียมจะเป็น 50 บาท ถ้าอยู่ระหว่าง 5-10 กิโลกรัม จะเป็น 100 บาท และถ้ามากกว่า 10 กิโลกรัมจะเป็น 150 บาท

2.2 Case Statement

Case ใช้ในการเลือกคำสั่งที่เหมาะสมจากหลายๆ ตัวเลือก โดยอ้างอิงจากค่าของ Expression ที่กำหนดไว้

ตัวอย่าง

procedure GetCustomerCategory(CustomerPoints: Integer): Text
var
    Category: Text;
begin
    case CustomerPoints of
        0..100:
            Category := 'Bronze';
        101..500:
            Category := 'Silver';
        501..1000:
            Category := 'Gold';
        else
            Category := 'Platinum';
    end;

    exit(Category);
end;

อธิบาย: ในตัวอย่างนี้ Case statement ถูกใช้เพื่อกำหนดประเภทของลูกค้าตามคะแนนที่ลูกค้าได้สะสมไว้ ถ้าคะแนนอยู่ระหว่าง 0-100 จะถูกจัดเป็น Bronze, 101-500 จะเป็น Silver, 501-1000 จะเป็น Gold และมากกว่า 1000 จะเป็น Platinum

3. AL Repetitive Statements

AL Repetitive Statements หรือที่เรียกว่าการทำซ้ำ ใช้ในการทำงานซ้ำๆ จนกว่าจะถึงเงื่อนไขที่กำหนดไว้ ประกอบด้วย For, While, และ Repeat-Until.

3.1 For Loop

For Loop ใช้ในการทำซ้ำคำสั่งตามจำนวนครั้งที่กำหนด โดยใช้ตัวแปรควบคุมการนับ

ตัวอย่าง

procedure CalculateTotalItems(NumItems: Integer): Integer
var
    i: Integer;
    Total: Integer;
begin
    Total := 0;
    for i := 1 to NumItems do
        Total := Total + 1;

    exit(Total);
end;

อธิบาย: ในตัวอย่างนี้ For Loop ถูกใช้ในการนับจำนวนรายการทั้งหมด โดยลูปจะทำซ้ำจาก 1 จนถึงค่าที่กำหนด (NumItems) และเพิ่มค่า Total ทีละ 1 ในแต่ละรอบลูป

3.2 While Loop

While Loop ใช้ในการทำซ้ำคำสั่งตราบใดที่เงื่อนไขยังคงเป็นจริง โดยตรวจสอบเงื่อนไขก่อนการทำงาน

ตัวอย่าง

procedure CalculateInventory(AvailableQty: Decimal): Decimal
var
    NeededQty: Decimal;
begin
    NeededQty := 100;
    while AvailableQty < NeededQty do begin
        AvailableQty := AvailableQty + 10;
    end;

    exit(AvailableQty);
end;

อธิบาย: ในตัวอย่างนี้ While Loop จะทำการเพิ่มจำนวนสินค้าคงเหลือ (AvailableQty) ทีละ 10 จนกว่าจะเพียงพอต่อความต้องการ (NeededQty)

3.3 Repeat-Until Loop

Repeat-Until Loop คล้ายกับ While Loop แต่จะตรวจสอบเงื่อนไขหลังจากที่ทำงานไปแล้วอย่างน้อยหนึ่งครั้ง

ตัวอย่าง

procedure CalculateTotalOutstandingBalance(var CustLedgerEntries: Record "Cust. Ledger Entry"): Decimal
var
    TotalBalance: Decimal;
begin
    TotalBalance := 0;
    if CustLedgerEntries.FindSet() then begin
        repeat
            TotalBalance := TotalBalance + CustLedgerEntries.Amount;
        until CustLedgerEntries.Next() = 0;
    end;
    
    exit(TotalBalance);
end;

อธิบาย: ในตัวอย่างนี้ เราใช้ Repeat-Until Loop เพื่อวนซ้ำใน Record Cust. Ledger Entry เพื่อคำนวณยอดรวมคงเหลือ (TotalBalance) โดยจะทำการบวกยอดในแต่ละบรรทัดของ CustLedgerEntries.Amount จนกว่าจะสิ้นสุด Record (Next() = 0)

สรุป

การใช้ AL Control Statements ไม่ว่าจะเป็น Compound, Conditional, หรือ Repetitive Statements เป็นเครื่องมือสำคัญในการควบคุมการทำงานของโปรแกรม ช่วยให้โปรแกรมเมอร์สามารถสร้างโค้ดที่มีความยืดหยุ่นและตอบสนองต่อสถานการณ์ต่างๆ ได้อย่างมีประสิทธิภาพ

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

EventSubscriber เป็นเครื่องมือที่มีประสิทธิภาพใน AL programming ซึ่งช่วยให้นักพัฒนาสามารถเชื่อมต่อโค้ดของตัวเองเข้ากับ event ที่มีอยู่ใน Dynamics 365 Business Central โดยไม่ต้องแก้ไขโค้ดต้นฉบับ (base code) การใช้งาน EventSubscriber จะช่วยให้เราสามารถขยายฟังก์ชันการทำงานของระบบได้อย่างง่ายดาย ปลอดภัย และไม่มีผลกระทบต่อการอัปเดตของระบบ ทำให้เหมาะสำหรับการพัฒนาระบบที่ต้องการความยืดหยุ่นในการบำรุงรักษาในอนาคต

โครงสร้างพื้นฐานของ EventSubscriber

การใช้งาน EventSubscriber ใน AL ต้องเริ่มต้นด้วยการกำหนดฟังก์ชันที่เราต้องการให้ทำงานเมื่อเหตุการณ์ที่ต้องการเกิดขึ้น โดยใช้ Attribute [EventSubscriber] เพื่อกำหนดลักษณะของการทำงาน

[EventSubscriber(ObjectType::ObjectType, ObjectId: Integer, EventName: Text, ElementName: Text, SkipOnMissingLicense: Boolean, SkipOnMissingPermission: Boolean)]
procedure MyEventSubscriber(Rec: Record <TableName>)
begin
    // การทำงานที่ต้องการเมื่อเกิด Event
end;

รายละเอียดพารามิเตอร์

  • ObjectType: ระบุประเภทของ Object ที่สร้างเหตุการณ์ เช่น Table, Codeunit, Page
  • ObjectId: ระบุ ID ของ Object หรือชื่อ Object ที่ต้องการติดตาม
  • EventName: ระบุชื่อของเหตุการณ์ที่ต้องการติดตาม เช่น OnAfterInsertEvent
  • ElementName: ใช้กับเหตุการณ์ที่เกี่ยวกับฟิลด์ในตาราง (เช่น OnAfterValidateEvent)
  • SkipOnMissingLicense: ระบุว่าจะข้ามการเรียก EventSubscriber หาก License ไม่มีสิทธิ์การเข้าถึง
  • SkipOnMissingPermission: ระบุว่าจะข้ามการเรียก EventSubscriber หากผู้ใช้ไม่มีสิทธิ์การเข้าถึง

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

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

[EventSubscriber(ObjectType::Table, Database::Customer, 'OnAfterModifyEvent', '', false, false)]
local procedure CheckImportantFieldsAfterModify(Rec: Record Customer; xRec: Record Customer)
begin
    if Rec.Name <> xRec.Name then
        Message('Customer Name has been changed from %1 to %2', xRec.Name, Rec.Name);
end;

ในตัวอย่างนี้

  • ObjectType คือ Table แสดงว่ากำลังติดตามเหตุการณ์ในระดับตาราง
  • ObjectId คือ Database::Customer ซึ่งเป็นตารางลูกค้าที่เราต้องการติดตาม
  • EventName คือ OnAfterInsertEvent เหตุการณ์ที่เกิดขึ้นหลังจากเพิ่มลูกค้าใหม่
  • ElementName เป็นค่าว่าง เนื่องจากเราไม่ได้ติดตามการ Validate ฟิลด์เฉพาะเจาะจง
  • SkipOnMissingLicense และ SkipOnMissingPermission กำหนดเป็น false เพื่อให้ฟังก์ชันทำงานในทุกสถานการณ์ที่ผู้ใช้มีสิทธิ์และ License เพียงพอ

การใช้งาน EventSubscriber ในสถานการณ์ต่าง ๆ

  1. การตรวจสอบข้อมูลก่อนการบันทึก: EventSubscriber สามารถใช้ตรวจสอบความถูกต้องของข้อมูลก่อนที่จะถูกบันทึกลงฐานข้อมูล เช่น การตรวจสอบว่าชื่อลูกค้าไม่ควรเป็นค่าว่าง
  2. การเพิ่มฟังก์ชันการทำงาน: สามารถเพิ่มฟังก์ชันใหม่ที่ทำงานเมื่อเกิดเหตุการณ์เฉพาะ เช่น การคำนวณหรืออัปเดตฟิลด์เมื่อมีการเปลี่ยนแปลงข้อมูล
  3. การจัดการการทำงานในระดับ Page: EventSubscriber สามารถใช้ในการติดตามเหตุการณ์ที่เกิดขึ้นในหน้าจอต่างๆ เช่น การกดปุ่ม หรือการเลือกค่าใน Drop-down

สรุป

การใช้งาน EventSubscriber ใน AL Programming ช่วยให้เราสามารถสร้างฟังก์ชันการทำงานเพิ่มเติมเพื่อให้ระบบมีความสามารถในการตอบสนองต่อเหตุการณ์ต่าง ๆ ได้อย่างยืดหยุ่นและปลอดภัย โดยไม่ต้องแก้ไขโค้ดของ object เดิม ช่วยเพิ่มความเสถียรและความยืดหยุ่นในการพัฒนาระบบได้มากยิ่งขึ้น

Dynamics 365 Business Central: การแสดงข้อมูลจากตาราง (Viewing Table Data)

การแสดงข้อมูลจากตารางใน Dynamics 365 Business Central เป็นกระบวนการที่สำคัญสำหรับนักพัฒนาและผู้ดูแลระบบ ในการตรวจสอบและดีบักข้อมูลในระบบ ข้อมูลจากตารางสามารถแสดงได้ผ่าน Web Client หรือ Visual Studio Code ซึ่งมีข้อจำกัดและวิธีการใช้งานที่ต้องทราบดังนี้

การแสดงข้อมูลผ่าน Web Client

คุณสามารถดูข้อมูลในตารางได้ง่าย ๆ โดยการเพิ่มพารามิเตอร์ ?table=<TableID> ลงใน URL ของ Business Central เช่น

https://businesscentral.dynamics.com/?table=18

ตัวอย่างนี้จะเปิดตาราง Customer (Table ID: 18) ซึ่งแสดงข้อมูลทั้งหมดในตาราง

นอกจากนี้ หากต้องการดูข้อมูลในบริษัทที่เจาะจง เช่น “CRONUS Inc.” คุณสามารถใช้ URL ดังนี้

https://businesscentral.dynamics.com/?company=CRONUS%20Inc.&table=18

URL นี้จะแสดงข้อมูลของตาราง Customer ในบริษัท “CRONUS Inc.”

การแสดงข้อมูลผ่าน AL Project ใน Visual Studio Code

ในสภาพแวดล้อมการพัฒนา นักพัฒนาสามารถตั้งค่าไฟล์ launch.json เพื่อแสดงข้อมูลตารางโดยอัตโนมัติเมื่อทำการ Publish หรือ Debug โครงการ AL โดยใช้ค่า startupObjectType และ startupObjectId ดังนี้:

{
    "startupObjectType": "table",
    "startupObjectId": 18
}

การตั้งค่านี้จะทำให้ตาราง Customer ปรากฏขึ้นเมื่อทำการรันหรือดีบักโปรเจกต์ใน Visual Studio Code

ข้อจำกัด (Constraints)

การแสดงข้อมูลจากตารางใน Business Central มีข้อจำกัดหลายประการที่ต้องทราบ ได้แก่

  1. โหมด Read-Only: ตารางจะแสดงในโหมดอ่านอย่างเดียว ผู้ใช้ไม่สามารถแก้ไข เพิ่ม หรือลบข้อมูลได้โดยตรงจาก Web Client
  2. สิทธิ์การเข้าถึง: ผู้ใช้ต้องมีสิทธิ์ Read บนตารางที่ต้องการดูข้อมูล และสิทธิ์ Execution บน System Object 1350 (Run table)
  3. ไม่สามารถแสดงตารางเสมือน (Virtual Tables) หรือตารางระบบบางรายการ

ตัวอย่างตารางที่ไม่สามารถแสดงได้

IDName
2000000170Configuration Package File
2000000173Data Sensitivity
2000000100Debugger Breakpoint
2000000103Debugger Watch
2000000130Device
2000000114Document Service
2000000190Entitlement Set
2000000191Entitlement
2000000180MediaSet
2000000181Media
2000000195Membership Entitlement
2000000162Nav App Capabilities
2000000152Nav App Data Archive
2000000161Application Dependency (*Nav App Dependencies)
2000000150Application Object Metadata (*Nav App Object Metadata)
2000000163Nav App Object Prerequisites
2000000142Application Resource (*Nav App Resource)
2000000151Installed Application (*Nav App TenantApp)
2000000160Published Application (*Nav App)
2000000071Object Metadata
2000000079Object Tracking
2000000001Object
2000000198Page Documentation
2000000186Profile Page Metadata
2000000082Report Layout
2000000065Send To Program
2000000112Server Instance
2000000066Style Sheet
2000000197Token Cache
2000000081Upgrade Blob Storage
2000000121User Property
2000000076Web Service
2000000194Webhook Notification
2000000199Webhook Subscription

ตารางเหล่านี้ไม่สามารถแสดงข้อมูลได้ผ่านทาง Web Client หรือ Visual Studio Code

สรุป

การแสดงข้อมูลจากตารางใน Dynamics 365 Business Central เป็นกระบวนการที่สำคัญในการตรวจสอบและดีบักข้อมูล โดยต้องทราบถึงข้อจำกัดและสิทธิ์การเข้าถึงเพื่อให้สามารถใช้งานได้อย่างถูกต้องและมีประสิทธิภาพ.

Dynamics 365 Business Central: Single-line vs Multi-line Comments ใน AL Programming

การใส่ความคิดเห็น (Comments) ในโค้ดเป็นส่วนสำคัญของการเขียนโปรแกรมที่ดี โดยช่วยให้โปรแกรมเมอร์สามารถอธิบายการทำงานของโค้ดหรือเตือนความจำเกี่ยวกับสิ่งที่ต้องทำในอนาคต ในภาษา AL (AL Language) ของ Dynamics 365 Business Central การใส่ความคิดเห็นสามารถทำได้สองแบบคือ การใส่ความคิดเห็นในบรรทัดเดียว (Single-line comments) และการใส่ความคิดเห็นในหลายบรรทัด (Multi-line comments)

1. Single-line Comments (ความคิดเห็นในบรรทัดเดียว)

Single-line comments ใช้สำหรับการใส่ความคิดเห็นในโค้ดที่สั้น ๆ และต้องการบรรยายเพียงบรรทัดเดียว โดยใช้สัญลักษณ์ // ตามด้วยข้อความที่ต้องการใส่ความคิดเห็น

ตัวอย่างการใช้งาน Single-line comments

ในตัวอย่างนี้, การใส่ความคิดเห็นแต่ละบรรทัดช่วยอธิบายว่าฟังก์ชันทำงานอย่างไรในแต่ละส่วน

2. Multi-line Comments (ความคิดเห็นในหลายบรรทัด)

Multi-line comments ใช้สำหรับการใส่ความคิดเห็นที่มีข้อความยาว ๆ หรืออธิบายหลายบรรทัด โดยใช้สัญลักษณ์ /* เพื่อเริ่มต้นความคิดเห็น และ */ เพื่อปิดความคิดเห็น

ตัวอย่างการใช้งาน Multi-line comments

ในตัวอย่างนี้, การใส่ความคิดเห็นแบบหลายบรรทัดถูกใช้เพื่ออธิบายการทำงานของฟังก์ชันทั้งหมด

3. Best Practices (แนวทางปฏิบัติที่ดีในการใส่ความคิดเห็น)

  • ใส่ความคิดเห็นที่จำเป็น: ไม่ควรใส่ความคิดเห็นในทุกบรรทัด แต่ควรใส่ในส่วนที่ต้องการคำอธิบายจริง ๆ
  • ทำให้ความคิดเห็นเป็นปัจจุบัน: เมื่อมีการเปลี่ยนแปลงในโค้ด ควรอัปเดตความคิดเห็นให้ตรงกับการทำงานของโค้ด
  • หลีกเลี่ยงความคิดเห็นที่ชัดเจนเกินไป: การใส่ความคิดเห็นที่อธิบายสิ่งที่โค้ดทำอย่างชัดเจนอยู่แล้ว เช่น // Add two numbers ควรหลีกเลี่ยง เพราะอาจไม่จำเป็น

สรุป

การใส่ความคิดเห็นในโค้ด AL ช่วยให้โปรแกรมเมอร์และผู้ที่ดูแลโค้ดเข้าใจการทำงานของโค้ดได้ดีขึ้น โดย Single-line comments เหมาะสำหรับการอธิบายสั้น ๆ ในบรรทัดเดียว ในขณะที่ Multi-line comments เหมาะสำหรับการอธิบายยาว ๆ หรือข้อความหลายบรรทัด การปฏิบัติตามแนวทางที่ดีในการใส่ความคิดเห็นจะช่วยให้โค้ดอ่านง่ายและพร้อมสำหรับการบำรุงรักษาในอนาคต

Dynamics 365 Business Central: การใช้งาน Default Item Quantity ในหน้า Sales & Receivables Setup

ในการใช้งาน Dynamics 365 Business Central ฟังก์ชัน Default Item Quantity ในหน้า Sales & Receivables Setup เป็นเครื่องมือสำคัญที่ช่วยในการจัดการจำนวนสินค้าที่ถูกเติมโดยอัตโนมัติเมื่อผู้ใช้ระบุหมายเลขสินค้า (Item No.) ในเอกสารการขาย เช่น ใบสั่งขาย (Sales Order) ฟังก์ชันนี้สามารถช่วยลดขั้นตอนการทำงานและป้องกันข้อผิดพลาดในการบันทึกข้อมูลสินค้าได้เป็นอย่างดี

ขั้นตอนก่อนและหลังการตั้งค่า Default Item Quantity ในหน้า Sales & Receivables Setup ใน Dynamics 365 Business Central

ก่อนการตั้งค่า Default Item Quantity

  1. สร้างใบสั่งขาย (Sales Order)
    • ไปที่หน้า Sales Orders โดยใช้ไอคอนค้นหา (Tell Me) และเลือก Sales Orders
    • คลิกที่ + New เพื่อสร้างใบสั่งขายใหม่
    • กรอกข้อมูลลูกค้าในฟิลด์ Customer Name
    • เลือกสินค้าโดยระบุ Item No. ในส่วน Lines
  2. สังเกตฟิลด์ Quantity
    • หลังจากเลือก Item No. สังเกตฟิลด์ Quantity ซึ่งอาจยังไม่มีค่าที่กำหนดไว้ล่วงหน้า ผู้ใช้จำเป็นต้องกรอกจำนวนสินค้าเองทุกครั้ง

การตั้งค่า Default Item Quantity

1. ไปที่หน้า Sales & Receivables Setup

  • จากหน้าแรกของ Business Central คลิกที่ไอคอนค้นหา (Tell Me) และพิมพ์ “Sales & Receivables Setup” แล้วเลือกที่เมนูดังกล่าว

2. เปิดใช้งานฟังก์ชัน Default Item Quantity

  • ในหน้าต่าง Sales & Receivables Setup ให้เลื่อนลงจนพบฟิลด์ Default Item Quantity
  • โดยค่าเริ่มต้นจะถูกตั้งค่าไว้เป็น 1 ซึ่งหมายความว่าเมื่อใดก็ตามที่มีการใส่หมายเลขสินค้าในเอกสารการขาย เช่น Sales Order จำนวนสินค้าจะถูกตั้งค่าเป็น 1 โดยอัตโนมัติ

หลังการตั้งค่า Default Item Quantity

  1. สร้างใบสั่งขาย (Sales Order) ใหม่
    • กลับไปที่หน้า Sales Orders และคลิกที่ + New เพื่อสร้างใบสั่งขายใหม่
    • กรอกข้อมูลลูกค้าในฟิลด์ Customer Name
    • เลือกสินค้าโดยระบุ Item No. ในส่วน Lines
  2. ตรวจสอบฟิลด์ Quantity
    • หลังจากเลือก Item No. ฟิลด์ Quantity จะถูกเติมค่าอัตโนมัติเป็น 1 หรือค่าที่คุณตั้งไว้ใน Default Item Quantity ไม่จำเป็นต้องกรอกจำนวนสินค้าเองในทุกครั้ง ซึ่งช่วยลดขั้นตอนการทำงานและลดโอกาสเกิดข้อผิดพลาดในการบันทึกข้อมูล
  3. แก้ไขจำนวนสินค้า (ถ้าจำเป็น)
    • หากต้องการเปลี่ยนแปลงจำนวนสินค้า สามารถแก้ไขค่าในฟิลด์ Quantity ได้ตามต้องการ

สรุป

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

Dynamics 365 Business Central: การใช้งาน Dictionary Data Type ใน AL Programming

Dictionary ใน AL Programming เป็นชนิดข้อมูลที่ใช้สำหรับเก็บและจัดการข้อมูลที่มีความสัมพันธ์กันระหว่างตัวระบุ (Key) และข้อมูลที่เกี่ยวข้อง (Value) โดยที่ตัวระบุ (Key) จะต้องไม่ซ้ำกันภายใน Dictionary ซึ่งช่วยให้สามารถค้นหาและเข้าถึงข้อมูลได้อย่างรวดเร็วและมีประสิทธิภาพ การใช้งาน Dictionary เหมาะสำหรับสถานการณ์ที่ต้องการจัดการข้อมูลจำนวนมากที่สามารถอ้างอิงได้โดยใช้ตัวระบุเฉพาะ ทำให้การเพิ่ม, ลบ, แก้ไข, และดึงข้อมูลเป็นไปได้อย่างสะดวกและยืดหยุ่น Dictionary เป็นเครื่องมือที่ทรงพลังใน AL Programming ที่ช่วยให้นักพัฒนาสามารถสร้างระบบที่มีการจัดการข้อมูลอย่างมีประสิทธิภาพและมีความยืดหยุ่นสูง

รายละเอียดของแต่ละ Method พร้อมตัวอย่าง และการใช้งาน

1. Add(TKey, TValue)

คำอธิบาย: Method นี้ใช้ในการเพิ่มข้อมูลเข้าไปใน Dictionary โดยข้อมูลนี้จะถูกเก็บในรูปแบบที่มีตัวระบุ (Key) และค่าที่เกี่ยวข้อง (Value) หากตัวระบุตัวนี้มีอยู่แล้วใน Dictionary จะเกิดข้อผิดพลาด

ตัวอย่าง

การใช้งาน

ในตัวอย่างนี้ AddToDictionary จะเพิ่มข้อมูลใหม่ 1: 'Apple' และ 2: 'Banana' ลงใน Dictionary

2. ContainsKey(TKey)

คำอธิบาย: Method นี้ใช้ในการตรวจสอบว่าตัวระบุ (Key) ที่กำหนดมีอยู่ใน Dictionary หรือไม่ ถ้ามีจะคืนค่าเป็น true ถ้าไม่มีจะคืนค่าเป็น false

ตัวอย่าง

การใช้งาน

ในตัวอย่างนี้ CheckKeyExists จะตรวจสอบว่ามีตัวระบุ 1 และ 3 อยู่ใน Dictionary หรือไม่

3. Count()

คำอธิบาย: Method นี้ใช้ในการนับจำนวนรายการข้อมูลทั้งหมดใน Dictionary

ตัวอย่าง

การใช้งาน

ในตัวอย่างนี้ GetDictionaryCount จะคืนค่าจำนวนรายการข้อมูลใน Dictionary

4. Get(TKey, var TValue)

คำอธิบาย: Method นี้ใช้ในการดึงข้อมูลออกจาก Dictionary โดยใช้ตัวระบุ (Key) ที่กำหนด หากตัวระบุตัวนี้มีอยู่ ข้อมูลที่เกี่ยวข้อง (Value) จะถูกดึงออกมา และคืนค่าเป็น true มิฉะนั้นจะคืนค่าเป็น false

ตัวอย่าง

การใช้งาน

ในตัวอย่างนี้ GetValueFromDictionary จะดึงค่า Apple ออกมาเมื่อระบุคีย์ 1

5. Get(TKey)

คำอธิบาย: Method นี้คล้ายกับ Get(TKey, var TValue) แต่จะคืนค่าที่ตรงกับตัวระบุ (Key) ที่กำหนดโดยตรง โดยไม่ต้องใช้ตัวแปรส่งออก

ตัวอย่าง

การใช้งาน

ในตัวอย่างนี้ GetValueDirectFromDictionary จะดึงค่า Apple ออกมาเมื่อระบุคีย์ 1 และคืนค่ากลับมาโดยตรง

6. Keys()

คำอธิบาย: Method นี้ใช้ในการดึงรายการตัวระบุ (Key) ทั้งหมดที่มีอยู่ใน Dictionary

ตัวอย่าง

การใช้งาน

ในตัวอย่างนี้ GetAllKeys จะดึงรายการตัวระบุทั้งหมดใน Dictionary และแสดงผลคีย์แต่ละตัว

7. Remove(TKey)

คำอธิบาย: Method นี้ใช้ในการลบข้อมูลที่ตรงกับตัวระบุ (Key) ที่กำหนดออกจาก Dictionary

ตัวอย่าง

การใช้งาน

ในตัวอย่างนี้ RemoveFromDictionary จะลบข้อมูล 1: 'Apple' ออกจาก Dictionary

8. Set(TKey, TValue)

คำอธิบาย: Method นี้ใช้ในการเปลี่ยนหรือเพิ่มข้อมูลใน Dictionary โดยใช้ตัวระบุ (Key) ที่กำหนด หากตัวระบุ (Key) มีอยู่แล้ว ข้อมูลที่เกี่ยวข้อง (Value) จะถูกแทนที่ด้วยค่าที่ใหม่

ตัวอย่าง

การใช้งาน

ในตัวอย่างนี้ SetDictionaryValue จะเปลี่ยนค่าที่คีย์ 1 จาก Apple เป็น Orange

9. Set(TKey, TValue, var TValue)

คำอธิบาย: Method นี้ใช้ในการเปลี่ยนหรือเพิ่มข้อมูลใน Dictionary โดยใช้ตัวระบุ (Key) ที่กำหนด และยังคืนค่าข้อมูลเก่าที่ถูกแทนที่กลับมา

ตัวอย่าง

การใช้งาน

ในตัวอย่างนี้ SetDictionaryValueWithOld จะเปลี่ยนค่าที่คีย์ 1 จาก Apple เป็น Orange และคืนค่าเดิม Apple กลับมา

10. Values()

คำอธิบาย: Method นี้ใช้ในการดึงค่าข้อมูลทั้งหมดที่มีอยู่ใน Dictionary

ตัวอย่าง

การใช้งาน

ในตัวอย่างนี้ GetAllValues จะดึงค่าข้อมูลทั้งหมดใน Dictionary และแสดงผลค่าแต่ละตัว

ตัวอย่างเพิ่มเติม

คำอธิบาย

  • VendorLedgerEntry.SetRange(“Open”, true);: กำหนดให้เลือกเฉพาะรายการที่ยังไม่ถูกปิด (Open Entries)
  • VendorOutstandingDict.ContainsKey(VendorNo): ตรวจสอบว่ามี Vendor No. อยู่ใน Dictionary แล้วหรือไม่
  • VendorOutstandingDict.Set(VendorNo, OutstandingAmount);: อัปเดตยอดค้างชำระรวมสำหรับผู้ขายที่มีอยู่ใน Dictionary
  • VendorOutstandingDict.Add(VendorNo, VendorLedgerEntry.Amount);: เพิ่มผู้ขายใหม่พร้อมยอดค้างชำระเข้าไปใน Dictionary

สรุป

การใช้งาน Dictionary ใน AL Programming ช่วยให้คุณสามารถจัดการข้อมูลที่ต้องการเข้าถึงอย่างรวดเร็วและมีประสิทธิภาพ การใช้ Method ต่าง ๆ ที่มีใน Dictionary ช่วยให้สามารถเพิ่ม, ลบ, อัปเดต, และดึงข้อมูลได้อย่างสะดวกและมีประสิทธิภาพ ซึ่งทำให้การพัฒนาแอปพลิเคชันที่มีการจัดการข้อมูลจำนวนมากเป็นไปได้อย่างมีประสิทธิภาพและยืดหยุ่น

Dynamics 365 Business Central: การใช้ Progress Windows, Message, Error, และ Confirm Methods ใน AL Programming

ในบทความนี้ เราจะมาทำความเข้าใจเกี่ยวกับการใช้งาน Progress Windows, Message, Error, และ Confirm Methods ในการเขียนโปรแกรมด้วยภาษา AL ซึ่งเป็นภาษาหลักที่ใช้ใน Dynamics 365 Business Central แต่ละ method มีบทบาทที่แตกต่างกันไปในการโต้ตอบกับผู้ใช้ โดยเฉพาะในสถานการณ์ที่ต้องการแสดงข้อมูล, แจ้งเตือนข้อผิดพลาด, หรือขอการยืนยันจากผู้ใช้ เราจะมาเจาะลึกถึงรายละเอียดพร้อมตัวอย่างการใช้งานแต่ละ method อย่างละเอียด

1. Progress Windows

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

รูปแบบการใช้งาน:

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

ในตัวอย่างข้างต้น เราได้สร้างหน้าต่าง Progress ที่จะบอกผู้ใช้ว่าอยู่ที่ขั้นตอนใดของการประมวลผล และใช้ Progress.UPDATE(); เพื่ออัพเดตข้อมูลในหน้าต่าง

2. Message Method

Message Method ใช้ในการแสดงข้อความให้ผู้ใช้ทราบ ซึ่งข้อความนี้จะเป็นเพียงข้อมูล ไม่ใช่การแจ้งเตือนหรือข้อผิดพลาด

รูปแบบการใช้งาน:

ตัวอย่าง:

ในตัวอย่างนี้ เมธอด Message จะทำการแสดงกล่องข้อความที่มีข้อความว่า “Hello, Thanapope!”

3. Error Method

Error Method ใช้ในการแจ้งข้อผิดพลาดและหยุดการทำงานของโปรแกรม หากเกิดข้อผิดพลาดขึ้น

รูปแบบการใช้งาน:

ตัวอย่าง:

ในตัวอย่างนี้ หากค่า SomeValue เป็นลบ จะมีการแสดงข้อผิดพลาดและหยุดการทำงานด้วยข้อความ “The value cannot be negative

4. Confirm Method

Confirm Method ใช้ในการสอบถามผู้ใช้เพื่อขอการยืนยันก่อนที่จะทำการดำเนินการใด ๆ

รูปแบบการใช้งาน:

if Confirm('Are you sure you want to continue?') then begin
       // Code to execute if user confirms
end;

ตัวอย่าง:

ตัวอย่างกด Yes

ตัวอย่างกด No

ในตัวอย่างนี้ โปรแกรมจะถามผู้ใช้ว่าต้องการลบข้อมูลหรือไม่ หากผู้ใช้กดยืนยัน โปรแกรมจะลบข้อมูลและแสดงข้อความว่า “Record deleted successfully.”

สรุป

การใช้งานเมธอด Progress Windows, Message, Error, และ Confirm ใน AL Programming เป็นสิ่งสำคัญในการสร้างประสบการณ์การใช้งานที่ดีให้กับผู้ใช้ โดยช่วยในการแสดงความคืบหน้า แจ้งเตือนข้อผิดพลาด แสดงข้อมูล และขอการยืนยันจากผู้ใช้ในสถานการณ์ต่าง ๆ การเข้าใจและใช้เมธอดเหล่านี้อย่างถูกต้องจะช่วยให้โปรแกรมมีประสิทธิภาพและใช้งานได้ง่ายขึ้น

Dynamics 365 Business Central: การใช้ Protected Variables เพื่อสร้างความยืดหยุ่นและปลอดภัยใน AL Programming

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

อะไรคือตัวแปร Protected?

ตัวแปร Protected ในภาษา AL คือ ตัวแปรที่สามารถเข้าถึงได้เฉพาะในออบเจ็กต์ที่ประกาศตัวแปรนั้น และในออบเจ็กต์ที่สืบทอดมาจากออบเจ็กต์นั้น ๆ เท่านั้น (Only accessible within the object where it’s declared and in its subclasses) นั่นหมายความว่าโค้ดที่อยู่นอกออบเจ็กต์ที่ไม่ได้สืบทอดจากออบเจ็กต์นั้นจะไม่สามารถเข้าถึงตัวแปรนี้ได้

การประกาศและใช้งานตัวแปร Protected

ในการประกาศตัวแปร Protected ในภาษา AL คุณสามารถทำได้โดยการเพิ่มคีย์เวิร์ด protected ก่อนการประกาศตัวแปร ตัวอย่างเช่น:

ในตัวอย่างนี้ ตัวแปร ShowSensitiveData สามารถถูกเข้าถึงได้เฉพาะในออบเจ็กต์ที่ประกาศตัวแปรนี้ รวมถึงออบเจ็กต์ที่สืบทอดมาจากออบเจ็กต์นี้เท่านั้น

ตัวอย่างการใช้งาน Protected Variables ในภาษา AL

สมมุติว่าเราต้องการสร้างฟีเจอร์ใหม่สำหรับการแสดงข้อมูลที่สำคัญในระบบ ซึ่งข้อมูลนี้จะถูกแสดงเฉพาะในบางสถานการณ์เท่านั้น

สร้าง Table ใหม่

ในตัวอย่างนี้ เราได้สร้างตารางใหม่ชื่อว่า Sensitive Data เพื่อเก็บข้อมูลที่สำคัญ เช่น Sensitive Info ที่เกี่ยวข้องกับลูกค้า

สร้าง Page ใหม่

ในเพจ Sensitive Data List เราได้ใช้ตัวแปร Protected ชื่อว่า ShowSensitiveData เพื่อควบคุมการแสดงผลของฟิลด์ Sensitive Info ข้อมูลนี้จะถูกซ่อนโดยค่าเริ่มต้น และจะถูกแสดงเมื่อผู้ใช้กดปุ่ม Toggle Sensitive Info

สร้าง Page Extension เพื่อขยายฟังก์ชัน

ใน Page Extension นี้ เราได้เพิ่มปุ่ม Reset Sensitive Info Visibility ซึ่งจะทำการซ่อนข้อมูล Sensitive Info ทุกครั้งที่ผู้ใช้กดปุ่มนี้

ตัวอย่างผลลัพธ์

ข้อดีของการใช้ Protected Variables ในภาษา AL

  1. การควบคุมการเข้าถึง (Access Control):
    • ตัวแปร Protected ช่วยให้คุณสามารถกำหนดได้ว่าตัวแปรจะถูกเข้าถึงได้จากที่ไหนบ้าง เฉพาะภายในตัวโค้ดหรือจากออบเจ็กต์ที่สืบทอด (Inheritance) มาเท่านั้น ข้อมูลสำคัญจึงไม่ถูกแก้ไขโดยไม่จำเป็น
  2. การสืบทอด (Inheritance):
    • ออบเจ็กต์ย่อยสามารถใช้ตัวแปร Protected จากออบเจ็กต์หลักได้อย่างอิสระ ช่วยให้สามารถเพิ่มฟังก์ชันการทำงานใหม่ ๆ โดยใช้ข้อมูลที่ถูกปกป้องในออบเจ็กต์หลักได้อย่างมีประสิทธิภาพ
  3. การออกแบบโค้ดที่ยืดหยุ่น (Flexible Code Design):
    • ตัวแปร Protected ทำให้คุณสามารถสร้างโค้ดที่ยืดหยุ่น โดยการเก็บข้อมูลและฟังก์ชันการทำงานในออบเจ็กต์หลัก แล้วสืบทอดและใช้งานในออบเจ็กต์ย่อย ซึ่งช่วยลดการทำซ้ำโค้ด (Code Duplication)
  4. ลดข้อผิดพลาด (Reduced Errors):
    • เนื่องจากตัวแปร Protected จะไม่สามารถเข้าถึงได้จากภายนอกออบเจ็กต์หรือออบเจ็กต์ที่ไม่ได้สืบทอด การลดการเข้าถึงตัวแปรที่ไม่จำเป็นจะช่วยลดโอกาสในการเกิดข้อผิดพลาดในโค้ด

ข้อเสียของการใช้ Protected Variables ในภาษา AL

  1. ความซับซ้อนในการจัดการ (Complex Management):
    • การใช้ตัวแปร Protected อาจทำให้โค้ดซับซ้อนขึ้น โดยเฉพาะเมื่อมีออบเจ็กต์ย่อยหลายออบเจ็กต์สืบทอดจากออบเจ็กต์หลัก ผู้พัฒนาต้องเข้าใจโครงสร้างการเข้าถึงข้อมูลทั้งหมด ทำให้การบำรุงรักษาโค้ดยากขึ้น
  2. การพึ่งพาคลาสหลัก (Base Class Dependency):
    • เมื่อออบเจ็กต์ย่อยพึ่งพาตัวแปร Protected จากออบเจ็กต์หลัก หากออบเจ็กต์หลักมีการเปลี่ยนแปลง จะต้องมีการปรับปรุงโค้ดในออบเจ็กต์ย่อยให้สอดคล้องกัน ซึ่งอาจเพิ่มงานในการบำรุงรักษา
  3. การใช้ที่ไม่จำเป็น (Unnecessary Usage):
    • หากมีการใช้ Protected โดยไม่จำเป็น เช่น ประกาศตัวแปร Protected ที่ไม่ต้องการความปกป้อง อาจทำให้โค้ดยุ่งยากโดยไม่จำเป็น ซึ่งควรใช้ Protected เฉพาะในกรณีที่จำเป็นจริง ๆ เท่านั้น
  4. ความยุ่งยากในการขยาย (Complicated Extensions):
    • เมื่อมีการสืบทอดตัวแปร Protected หลายชั้น อาจทำให้โค้ดยุ่งยากในการเข้าใจและขยายฟังก์ชันใหม่ ๆ เนื่องจากต้องติดตามว่าแต่ละออบเจ็กต์ใช้ตัวแปรเหล่านี้อย่างไร

สรุป

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