在 Business Central 用 AL 實作按鍵來新增所有資料

在文章中 在 Business Central AL 中實作 Lookup to another table(建立查詢選取視窗) 可以在 欄位:Name 來查詢使用者的資料,並逐筆新增。那如何用一個按鈕將所有資料都全部新增進來,並且篩選重覆就不要新增。

刪除全部資料

在新增資料前,先將作一個按鍵可以 Basic Table 裡的資料都先刪除,這部份的程式如下

C
action(DeleteAllRecords)
{
	Caption = '刪除所有資料';
	Image = Delete;
	trigger OnAction()
	var
		RecRef: RecordRef;
	begin
		RecRef.Open(Database::"Basic Table");
		RecRef.DeleteAll();
		RecRef.Reset();
		Message('已清空 Basic Table 資料');
	end;
}
image 10

新增全部的資料

C
action(AddUsers)
{
	Caption = '新增使用者';
	ToolTip = '從使用者列表選擇多筆資料,並新增到基本資料表中,會自動略過重複項目。';
	ApplicationArea = All;
	Promoted = true;
	PromotedIsBig = true;
	Image = User;

	trigger OnAction()
	var
		UserRec: Record User;
		BasicTableRec: Record "Basic Table";
		SelectionCount: Integer;
		Result: Action;
	begin
		// 開啟標準的使用者清單頁面 (Page 9800 是 Users, type:list)
		Result := PAGE.RunModal(PAGE::Users, UserRec);

		if Result = Action::LookupOK then begin
			// 檢查每一筆使用者資料是否已存在
			if UserRec.FindSet() then
				repeat
					BasicTableRec.Reset();
					// 1. 檢查重複
					BasicTableRec.SetRange(Name, UserRec."User Name");					
					if BasicTableRec.IsEmpty then begin
					  // 2. 新增記錄
						BasicTableRec.Init();
						Clear(BasicTableRec); // 清乾淨,避免沿用舊 ID
						// *** 關鍵修正:對於 AutoIncrement 欄位,手動將其設置為 0 (或不設置/賦值) 是必須的 ***
						// 雖然 Init() 已經將其設為預設值,但明確設置可以避免潛在的衝突。
						// 由於 ID 是 AutoIncrement,我們應該讓它保持預設值,但為了確保 Init() 沒有被其他邏輯覆蓋,
						// 這裡明確寫上讓其為 0,確保 Insert(true) 時能觸發自動編號。
						//BasicTableRec.ID := 0;
						BasicTableRec.Name := UserRec."User Name";
						BasicTableRec.Description := UserRec."Full Name";
						BasicTableRec.Insert(true); // 自動產生新 ID
						SelectionCount += 1;
					end;
				until UserRec.Next() = 0;

			if SelectionCount > 0 then begin
				Message('成功新增 %1 筆使用者資料到 Basic Table 中。', SelectionCount);
				CurrPage.Update(false);
			end else
				Message('沒有新的使用者資料被新增。');
		end else
			Message('使用者取消了新增操作。');
	end;
}

程式說明

  1. 新增 actions 區域:
    • 在頁面物件中新增 actions { area(Processing) { ... } } 區塊,這是放置主要業務邏輯 Action 的標準位置。
  2. Action 屬性設定:
    • Caption: 顯示在按鈕上的文字 (新增使用者)。
    • Promoted = truePromotedIsBig = true: 讓按鈕顯示在頁面頂部 Actions Bar 的顯眼位置。
    • Image = User: 使用一個合適的標準圖標。
  3. Action 邏輯 (OnAction 觸發器):
    • 引入了一個新的記錄變數 BasicTableRec,每次遍歷一個選取的使用者時,就用該使用者的 User NameBasic Table 進行過濾 (SetRange)。
    • 如果 BasicTableRec.IsEmpty 為 true (即沒有找到重複的記錄),初始化並新增記錄。
image 11

執行後,所有資料就會新增在 Basic Table 裡,並告知新增了幾筆。

完整程式

整個完整的程式碼如下

C
page 60102 "Basic Table ActionBar Page"
{
    PageType = List;
    ApplicationArea = All;
    SourceTable = "Basic Table";
    UsageCategory = Lists;

    layout
    {
        area(content)
        {
            repeater(Group)
            {
                field(ID; Rec."ID")
                {
                    ApplicationArea = All;
                    Editable = false;
                }

                field(Name; Rec."Name")
                {
                    ApplicationArea = All;
                }

                field(Description; Rec."Description")
                {
                    ApplicationArea = All;
                }
            }
        }
    }

    actions
    {
        area(Processing)
        {
            action(AddUsers)
            {
                Caption = '新增使用者';
                ToolTip = '從使用者列表選擇多筆資料,並新增到基本資料表中,會自動略過重複項目。';
                ApplicationArea = All;
                Promoted = true;
                PromotedIsBig = true;
                Image = User;

                trigger OnAction()
                var
                    UserRec: Record User;
                    BasicTableRec: Record "Basic Table";
                    //UserListPage: Page Users; // <--- 9800 是 Users, type:list 列表頁 ID 
                    SelectionCount: Integer;
                    Result: Action;
                begin
                    // 開啟標準的使用者清單頁面 (Page 9800 是 Users, type:list)
                    Result := PAGE.RunModal(PAGE::Users, UserRec);

                    if Result = Action::LookupOK then begin
                        // 檢查每一筆使用者資料是否已存在
                        if UserRec.FindSet() then
                            repeat
                                BasicTableRec.Reset();
                                BasicTableRec.SetRange(Name, UserRec."User Name");
                                if BasicTableRec.IsEmpty then begin
                                    BasicTableRec.Init();
                                    Clear(BasicTableRec); // 清乾淨,避免沿用舊 ID
                                    BasicTableRec.Name := UserRec."User Name";
                                    BasicTableRec.Description := UserRec."Full Name";
                                    BasicTableRec.Insert(true); // 自動產生新 ID
                                    SelectionCount += 1;
                                end;
                            until UserRec.Next() = 0;

                        if SelectionCount > 0 then begin
                            Message('成功新增 %1 筆使用者資料到 Basic Table 中。', SelectionCount);
                            CurrPage.Update(false);
                        end else
                            Message('沒有新的使用者資料被新增。');
                    end else
                        Message('使用者取消了新增操作。');
                end;
            }
            action(DeleteAllRecords)
            {
                Caption = '刪除所有資料';
                Image = Delete;
                trigger OnAction()
                var
                    RecRef: RecordRef;
                begin
                    RecRef.Open(Database::"Basic Table");
                    RecRef.DeleteAll();
                    RecRef.Reset();
                    Message('已清空 Basic Table 資料');
                end;
            }
        }
    }
}

發佈留言

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


內容索引