Dynamics 365 Business Central 用 SQL Server Report Builder 設計報表

將以使用 AL 語言 撰寫一個適用於 Microsoft Dynamics 365 Business Central 的報表 (Report) 程式。

這個報表將假設有一個自定義的 Table 來儲存這些在製品盤點數據。

前提假設 (Assumptions)

  1. 有一個名為 InProcessInventoryTable 來儲存這些盤點資料。
  2. 報表將以 InProcessInventory Table 為 SourceTable
  3. 報表只會顯示清單中的欄位。

AL Language 報表程式碼 (Report Code)

以下是 AL 報表程式碼,檔名可以命名為 Report50100_InProcessInventory.al

C
report 50100 "In Process Inventory Report"
{
    // 設定報表的類別和用途
    Caption = '在製品盤點清單';
    ApplicationArea = All;
    UsageCategory = ReportsAndAnalysis;

    // 報表的主要資料來源
    // 請將 'InProcessInventory' 替換為您實際的 Table ID 或 Name
    DefaultLayout = RDLC;
    RDLCLayout = 'InProcessInventory.rdlc'; // 需要自行設計此 RDLC 檔案

    dataset
    {
        // 這是報表的主資料項 (Data Item)
        dataitem(InProcInventory; "InProcessInventory") // 假設您使用此 Table Name
        {
            // 設定篩選條件 (如果需要,可以在這裡加入過濾器)
            RequestFilterFields = "Work Center Name", "Item No.", "Operation Status";
            // 排序設定
            DataItemTableView = sorting("Work Center Name" , "Item No.");        

            // 定義要在報表中顯示的欄位
            column(WorkCenterName; "Work Center Name")
            {
                Caption = '工作中心名稱';
            }
            column(ItemNo; "Item No.")
            {
                Caption = '品號';
            }
            column(InventoryQty; "Inventory Qty.")
            {
                Caption = '盤點數量';
            }
            column(ActualinventoryCount; '')
            {
                Caption = '實際盤點數量';
            }
            column(Memo; '')
            {
                Caption = '備註';
            }

            trigger OnPreDataItem()
            begin
                // 設定篩選條件:排除 "Operation Status" 是空字串的記錄
                // '<>''' 表示「不等於空字串」。在 AL 語言中,空字串是兩個單引號 '',
                // 為了在 SetFilter 字串中表示它,需要使用額外的引號來逸出,所以寫成 '<>''''
                // 但更現代且常用的寫法是使用 SetFilter 的格式化功能。

                // 更清晰和推薦的寫法 (使用 %1 替換參數)
                // 篩選條件是:不等於空值 (Not Equal to Blank)
                WorkInProcessInventory.SetFilter("Operation Status", '<>%1', '');
            end;

            // 計算總筆數的觸發器-處理每一筆資料行時進行計數
            trigger OnAfterGetRecord()
            begin
                // 這裡可以加入任何在取得每筆記錄後需要執行的邏輯
                RecordCount += 1; // 每讀取一筆記錄,計數器加 1
            end;
            // 在資料項處理完畢後的觸發器
            trigger OnPostDataItem()
            begin
                // 在資料項處理完畢後,可以在這裡進行總結或其他操作
                // 例如,將計數結果存儲到變數中,以便在報表的其他部分使用
                Message('報表產出總筆數: %1 筆', RecordCount); // 顯示總筆數的訊息
            end;
        }
        }
    }

    // --- 新增一個不需要 SourceTable 的 Data Item 來輸出總數 ---
    // 這是一個「虛擬」資料項,用於在報表最後輸出計算結果
    dataitem(TotalData; Integer)
    {
            DataItemTableView = sorting(Number);
            MaxIteration = 1; // 確保這個資料項只執行一次

            column(TotalRecordCount; RecordCount)
            {
            }
            column(TotalText; TotalText)
            {
            }
        }
    }
    // 報表的變數區域
    var
        RecordCount: Integer; // 儲存總筆數的變數
        TotalText: Label '報表產出總筆數:'; // 顯示在報表上的文字標籤
}

需要的 Table 定義 (Table Definition)

為了讓上面的報表能編譯和運行,您需要在 Business Central 中定義一個包含這些欄位的 Table。以下是假設的 Table 程式碼:

C
table 50100 "InProcessInventory"
{
    Caption = '在製品盤點行';
    DataClassification = CustomerContent;

    fields
    {
        field(1; "Work Center Name"; Text[100])
        {
            Caption = '工作中心名稱';
        }
        field(2; "Item No."; Code[20])
        {
            Caption = '品號';
        }
        field(3; "Inventory Qty."; Decimal)
        {
            Caption = '盤點數量';
        }
        field(4; "Scrap Qty."; Decimal)
        {
            Caption = '報廢數量';
        }
        // ... 其他必要的欄位 (如 Primary Key 等)
    }

    keys
    {
        key(PK; "Work Center Name", "Item No.")
        {
            Clustered = true;
        }
    }
}

產生和設計 RDLC Layout 報表布局

RDLC (Report Definition Language Client-side) Layout 是一種 XML 格式的文件,用來定義 Business Central 報表的視覺外觀。它決定了資料集中的欄位如何排列、字體、表格結構、顏色等。

產生和設計 RDLC Layout 是一個開發者或進階使用者需要執行的步驟,主要流程如下:

所需工具 (Required Tools)

設計 RDLC Layout 需要使用外部的報表設計工具:

  1. SQL Server Report Builder (推薦)
    • SQL Server Report Builder 這是一個免費的獨立應用程式,專門用於建立和編輯 RDL/RDLC 報表。
    • 如果您使用 Business Central On-Premises 版本,它通常會隨伺服器安裝。
    • 如果您使用 Online 版本,需要單獨下載安裝。
  2. Microsoft Visual Studio 搭配 RDLC Report Designer 擴充功能
    • 如果您已經是 Visual Studio 的使用者,可以透過安裝擴充功能來設計 RDLC。

步驟一:從 AL 程式碼產生 .rdl 檔案

當您在 VS Code 中編寫 AL 報表程式碼並進行編譯 (Build) 時,AL Language 伺服器會根據您在 dataset 區塊中定義的欄位,自動產生一個包含報表資料結構的 .rdl 檔案

1. 定義 AL 報表物件:

確保您的 AL 程式碼中有以下設定:

C
report 50100 "In Process Inventory Report"
{
    DefaultLayout = RDLC;
    RDLCLayout = 'InProcessInventoryList.rdlc'; // 您的檔案名稱
    // ... dataset 區塊 (包含所有要顯示的 column)
}

2. 編譯專案:

在 VS Code 中,執行 Ctrl + Shift + B (Build) 或 F5 (Publish) 來編譯您的 AL 專案。

3. 找到 .rdl 檔案:

編譯成功後,一個與 RDLCLayout 屬性中定義的檔案名稱相同,但副檔名為 .rdl 的檔案會自動產生在您的專案根目錄或 src 資料夾中(例如:InProcessInventory.rdl

步驟二:使用 Report Builder 設計 Layout

產生 .rdl 檔案後,您需要使用 Report Builder 或 Visual Studio 來開啟和編輯它,將資料欄位拖曳成表格形式,並使其看起來像您圖片中的樣子。

  1. 開啟 Report Builder:
    • 在您的電腦上啟動 SQL Server Report Builder
  2. 開啟 .rdl 檔案:
    • 在 Report Builder 中,選擇 File > Open,然後導航到您 AL 專案中產生的 .rdl 檔案 (InProcessInventory.rdl) 並開啟它。
  3. 設計報表:
    • Data Explorer (資料集): 您會看到您的報表資料集 (Dataset) 和所有在 AL 程式碼 dataset 中定義的欄位。
    • 建立表格: 在設計畫布上,插入一個 Table (表格) 物件。
    • 拖曳欄位: 將要顯示的欄位(例如:Status, Department, InvtQty 等)從 Data Explorer 拖曳到表格的列中。
    • 格式設定:
      • 設定表頭 (Header) 的文字、字體和背景色。
      • 調整欄寬,以確保所有數據都能正確顯示。
      • 將欄位標題改為中文,使其符合您的圖片所示(如:狀態部門盤點數量)。
      • 添加總計或頁首/頁尾(如果需要)。
  4. 儲存為 .rdlc
    • 設計完成後,在 Report Builder 中儲存檔案,請確認檔案儲存為 .rdl 格式,並將其放在 AL 專案中 RDLCLayout 屬性所指定的路徑。
image 15

步驟三:將 Layout 加入專案並發佈

確保設計好的 .rdl 檔案與您的 AL 專案一起發佈。

  1. 將設計好的 InProcessInventory.rdl 檔案放在 AL 專案中適當的路徑下(通常是與 .al 檔案相同的資料夾)。
  2. 重新編譯和發佈 Business Central 擴充套件。

現在,當在 Business Central 中執行該報表時,它就會套用設計的 RDLC Layout 來呈現資料。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *


內容索引