วิธีสร้าง Report โดยใช้ Query เป็นตารางข้อมูล

Spread the love

สวัสดีครับ ในบทความนี้เราจะมาดูการสร้าง Report บน Business Central ซึ่งการสร้าง Report นี้จะใช้ Query มาเป็นตารางข้อมูล และมีการใช้ Integer เป็น DataItem แทนการใช้ Table ปกติทั่วไปกันครับ

how-to-create-report-using-query-business-central
Photo by Lum3n from Pexels

บทความนี้ประกอบไปด้วย

ทำไมต้องใช้ Query ในการทำ Report

โดยปกติแล้วเราก็จะใช้ Table มาเป็นตารางข้อมูลในการทำ Report ให้กับ Business Central กันใช่ไหมละครับ ซึ่งบางครั้งเราอาจจะต้องทำการ Join Table เพื่อเตรียมข้อมูลให้ครบถ้วนสมบูรณ์ก่อนจะทำไปสร้างเป็น Layout ผ่านโปรแกรม Visual Studio หรือ Report Builder เพื่อให้ข้อมูลแสดงออกมาให้รูปแบบที่ Friendly กับผู้ใช้งาน

แล้วควรใช้ Query ในการทำ Report ตอนไหน

แต่บางครั้งก็มักจะเกิดปัญหาเครื่อง Performance ของตัว Report ที่ใช้เวลาในการ Process ที่นาน ไม่ว่าจะเป็นการ Join กันของ Table ที่มีโครงสร้างซับซ้อน หรือมีข้อมูลมาก ๆ และอาจะมีการเขียน code ที่ทำให้ต้องใช้ resource ที่มากจนทำให้เกิดอาการ Report อืด

ดังนั้นเราก็มีวิธีการทำ Optimize Report โดยการใช้ Query สำหรับเตรียมข้อมูลแทนการ Join DataItem ใน Report อย่างเดียวครับ ซึ่งจะช่วยให้ Report ของเราทำงานได้รวดเร็วขึ้นอย่างแน่นอน

แต่ถ้าหาก Report ที่เราสร้างนั้นไม่ได้มีความซับซ้อน หรือใช้งาน Resource อะไรมากมาย ก็ยังแนะนำให้ใช้ข้อมูลจาก table ปกติ จะดีกว่าครับ เนื่องจาก maintenance code ง่ายกว่าครับ และ readable code มากกว่าครับ

บทความที่คุณอาจสนใจ

ขั้นตอนการติดตั้ง AL Language บน Visual Studio Code สำหรับ Microsoft Dynamics 365 Business Central
Visual Studio Community สำหรับแก้ไข Report Layout บน Business Central

การสร้าง Report โดยใช้ Query

อันดับแรกก็ให้สร้าง AL Extension ขึ้นมาก่อนนะครับ ทำการ connect กับ server และ download symbol ให้เรียบร้อย จากนั้นเราจะสร้าง object ประกอบด้วย Query ที่เอาไว้เป็นตารางข้อมูล และ Report ที่ใช้ Integer มาเป็น DataItem ครับ

ขอทำเป็น Report ธรรมดาเพื่อให้ทำความเข้าใจได้ไม่ยากนะครับ โดย Report ที่เราจะทำนั้นก็เป็นรายงานที่แสดงยอดสินค้าคงเหลือในระบบ โดยเรียงจากจำนวนคงเหลือมาก ไป น้อย

Query

how-to-create-report-using-query-business-central-1

เราจะสร้าง object ที่เป็น Query ตาม code ตัวอย่างด้านบนเลยครับ โดยใช้ DataItem จาก Item และดึงฟิลด์มาใช้ทั้งหมด 3 ฟิลด์ ประกอบด้วย No., Description, และ Inventory โดยที่จะเพิ่ม Order By ที่ Property ด้านบนครับ เป็นการให้เรียงข้อมูลตามฟิลด์ Inventory จากมาก ไป น้อย

Report

how-to-create-report-using-query-business-central-2

ในส่วนของ Report นั้น ในส่วนของ Report Property ก็จะกำหนดเหมือน Report ทั่ว ๆ ไป ครับ แต่ตรงที่เป็น DataItem เราจะใช้ Integer มาเป็น Table และ Column ทั้ง 3 จะเป็นการใช้ตัวแปรมาเป็น column ตามรูปด้านล่างครับ

how-to-create-report-using-query-business-central-3

จะมีตัวแปรอีก 2 ตัวนั้นก็คือ ItemInventory เป็น Query ที่เราเพิ่งสร้างมาเมื่อกี้ และ TopOfRow โดยจะนำไปเป็น Filter ให้กรอกว่าต้องการให้แสดงข้อมูลเป็นจำนวนกี่บรรทัด

how-to-create-report-using-query-business-central-4

ตรงนี้เป็นส่วนของ RequestPage โดยใช้ตัวแปร TopOfRow มารับค่า Input เพื่อเอาไปทำ Filter ต่อครับ

how-to-create-report-using-query-business-central-5

จากนั้นก็จะมี Trigger สองตัวภายใต้ Integer ซึ่งก็ตือ OnPreDataItem และ OnAfterGetRecord

how-to-create-report-using-query-business-central-6

ในส่วนของ PreDataItem เราจะเขียน code ด้วยคำสั่ง SetRange เพื่อ Filter ให้ Fetch จำนวน Record ถึงแค่ค่าที่เรา Input เข้ามา (ตัวแปร TopOfRow)

ใช้คำสั่ง TopNumberOfRows เพื่อให้ Query แสดงจำนวน Row ถึงแค่ที่เรา Input เข้ามา

และใช้คำสั่ง Open เสมอเพื่อเป็นการสั่งให้ Query เริ่มทำการ Fetch Row ขึ้นมา

how-to-create-report-using-query-business-central-7

ในส่วนของ OnAfterGetRecord จะเป็นการ Assign ค่าจาก Query Column ลงมาในตัวแปรทั้ง 3 ตัวที่เราสร้างขึ้นมาเพื่อไปเป็น Column ให้กับ Report

และจะทำการหยุดการ GetRecord ด้วยคำสั่ง CurrReport.Break() เมื่อ Query ของเราถูก Read จนหมดแล้ว

Report Layout

how-to-create-report-using-query-business-central-8

ในส่วนของ Report Layout ก็ไม่มีอะไรครับ แค่สร้าง Tablix ง่าย ๆ เพื่อมาแสดงข้อมูลจาก Report เฉย ๆ

เพียงเท่านี้ก็เสร็จแล้ว เมื่อ Compile และ Publish ขึ้น Server แล้ว ต่อไปเราจะทำการ Test เปิดตัว Report กันดูครับ

บทความที่คุณอาจสนใจ

เริ่มต้นสร้าง Extension แรกบน MS Dynamics 365 BC ตอนที่ 1 – New Table
5 Tips ที่ช่วยให้การจัด Report Layout บน Business Central ทำง่ายขึ้น

Testing

how-to-create-report-using-query-business-central-9

เมื่อเข้ามาในตัว Business Central แล้วก็กดที่รูปแว่นขยายที่มุมขวาบนเพื่อทำการ Search หา Report ที่เราต้องการเปิด ซึ่งมีชื่อว่า Top Inventory Item ตามที่เราตั้งตอนสร้าง Report ได้เลยครับ

how-to-create-report-using-query-business-central-10

จากนั้นจะมีหน้า Request Page ขึ้นมา ในตัวอย่างนี้ผมจะกรอกเลข 10 ลงไปที่ช่อง Top of Row ครับ เพื่อให้ Report แสดง Top 10 ของ Item ที่มี Inventory มากที่สุดขึ้นมา จากนั้นก็ให้กดที่ปุ่ม Preview

how-to-create-report-using-query-business-central-11

และรูปด้านบนก็จะเป็น List รายชื่อ Item ที่มี Inventory มากที่สุด 10 รายการครับ

Conclusion

จากตัวอย่างด้านบนจริง ๆ แล้วเราไม่จำเป็นต้องใช้ Query มาเป็นตารางข้อมูลก็ได้ แต่เพื่อให้เข้าใจได้ง่ายเลยยกตัวอย่างการทำ Report ที่ไม่ได้มีความซับซ้อนอะไรครับ ซึ่งอย่างที่กล่าวไปแล้วตอนต้นว่า เราจะใช้ Query เมื่อเราต้องการ Report ที่มี Performance ที่มากขึ้นครับ

หากมีข้อสงสัยตรงไหนสามารถ comment ถามที่ด้านล่างไว้ได้เลย แล้วเจอกันใหม่ในบทความหน้า สวัสดีครับ

Source Code

Query

query 60100 "Item Inventory"
{
    QueryType = Normal;
    OrderBy = descending(Inventory);

    elements
    {
        dataitem(Item; Item)
        {
            column(No_; "No.")
            {

            }
            column(Description; Description)
            {

            }
            column(Inventory; Inventory)
            {

            }
        }
    }
}

Report

report 60100 "Top Inventory Item"
{
    UsageCategory = ReportsAndAnalysis;
    ApplicationArea = All;
    DefaultLayout = RDLC;
    RDLCLayout = '.\src\reportlayout\60100.TopItemInventory.rdlc';

    dataset
    {
        dataitem(Integer; Integer)
        {
            column(ItemNo; ItemNo)
            {

            }
            column(ItemName; ItemName)
            {

            }
            column(Inventory; Inventory)
            {

            }

            trigger OnPreDataItem()
            begin
                SetRange(Number, 1, TopOfRow);
                ItemInventory.TopNumberOfRows(TopOfRow);
                ItemInventory.Open();
            end;

            trigger OnAfterGetRecord()
            begin
                if ItemInventory.Read() then begin
                    ItemNo := ItemInventory.No_;
                    ItemName := ItemInventory.Description;
                    Inventory := ItemInventory.Inventory;
                end else
                    CurrReport.Break();
            end;
        }
    }

    requestpage
    {
        layout
        {
            area(Content)
            {
                group(GroupName)
                {
                    field(TopOfRow; TopOfRow)
                    {
                        ApplicationArea = All;
                        Caption = 'Top of Row';
                    }
                }
            }
        }
    }

    var
        ItemInventory: Query "Item Inventory";
        ItemNo: Text;
        ItemName: Text;
        Inventory: Decimal;
        TopOfRow: Integer;
}

ERP Consultant ที่อยากแชร์ความรู้เกี่ยวกับการพัฒนาโปรแกรม Microsoft Dynamics NAV / 365 Business Central ทั้งทางด้าน Business และ Technical ให้กับเหล่านักศึกษา, ผู้ที่เริ่มต้นอาชีพนี้ หรือต้องการที่จะเพิ่มเติมความรู้ด้าน ERP ในรูปแบบ blog ที่เป็นภาษาไทย Contact: amaddev90@gmail.com

Leave a Reply

Your email address will not be published. Required fields are marked *