撰寫 AL Codeunit 讓其他頁面、報表或 Codeunit 呼叫重複使用

在 Business Central 用 AL 實作按鍵來新增所有資料 的客製程式中,有一個按鍵 DeleteAllRecords 是用來 刪除 Basic Table 裡所有資料。

C
action(DeleteAllRecords)
{
	Caption = '刪除所有資料';
	Image = Delete;
	trigger OnAction()
	var
		RecRef: RecordRef;
		ConfirmDeleteAll: Boolean;
	begin
		ConfirmDeleteAll := Dialog.Confirm(
			'是否刪除所有的資料?',
			false
		);
		if ConfirmDeleteAll then begin
			RecRef.Open(Database::"Basic Table");
			RecRef.DeleteAll();
			RecRef.Reset();
			Message('已清空 Basic Table 資料');
		end;
	end;
}

為了讓 action(DeleteAllRecords) 邏輯可以重複使用,我們將其程式碼移到一個 Codeunit 中。這樣,這個功能就可以被其他頁面、報表或 Codeunit 呼叫。

新增 Codeunit 檔案: BasicTableTools.al 檔案

C
codeunit 60100 "Basic Table Tools"
{
    // 讓此 Codeunit 可以在不需要執行環境的情況下呼叫 (例如從 Web Service)
    // 但在這個簡單的案例中,可以省略此屬性。
    // CodeunitType = Normal; 

    // 此函數負責清空 "Basic Table" 的所有記錄
    procedure DeleteAllBasicTableRecords()
    var
        RecRef: RecordRef;
        ConfirmDeleteAll: Boolean;
    begin
        ConfirmDeleteAll := Dialog.Confirm(
            '是否刪除所有的資料?',
            false
        );
        if ConfirmDeleteAll then begin
            // 開啟目標 Table (Basic Table)
            RecRef.Open(Database::"Basic Table");

            // 刪除 Table 中的所有記錄
            RecRef.DeleteAll();

            // 重設 RecordRef,釋放資源 (雖然非必須,但保持良好習慣)
            RecRef.Reset();

            // 顯示成功訊息
            Message('已清空 Basic Table 資料');
        end;
    end;
}

修改頁面程式 (BasicTablePage.al)

接下來,我們需要修改 page 60100 "Basic Table Page" 中的 action(DeleteAllRecords),讓它呼叫新的 Codeunit 函數。

C
//程式碼片段
area(Processing)
{
	action(DeleteAllRecords)
	{
		Caption = '刪除所有資料';
		Image = Delete;
		trigger OnAction()
		var
			BasicTableTools: Codeunit "Basic Table Tools"; // 宣告新的 Codeunit 變數
		begin
			BasicTableTools.DeleteAllBasicTableRecords();
		end;
	}
}

這樣子就可以只維護 BasicTableTools.DeleteAllBasicTableRecords(); 裡的程式,不需要每支程式去修改了。

發佈留言

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


內容索引