Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124

在文章中 在 Business Central AL 中實作 Lookup to another table(建立查詢選取視窗) 可以在 欄位:Name 來查詢使用者的資料,並逐筆新增。那如何用一個按鈕將所有資料都全部新增進來,並且篩選重覆就不要新增。
在新增資料前,先將作一個按鍵可以 Basic Table 裡的資料都先刪除,這部份的程式如下
action(DeleteAllRecords)
{
Caption = '刪除所有資料';
Image = Delete;
trigger OnAction()
var
RecRef: RecordRef;
begin
RecRef.Open(Database::"Basic Table");
RecRef.DeleteAll();
RecRef.Reset();
Message('已清空 Basic Table 資料');
end;
}
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;
}actions 區域:actions { area(Processing) { ... } } 區塊,這是放置主要業務邏輯 Action 的標準位置。Caption: 顯示在按鈕上的文字 (新增使用者)。Promoted = true 和 PromotedIsBig = true: 讓按鈕顯示在頁面頂部 Actions Bar 的顯眼位置。Image = User: 使用一個合適的標準圖標。OnAction 觸發器):BasicTableRec,每次遍歷一個選取的使用者時,就用該使用者的 User Name 對 Basic Table 進行過濾 (SetRange)。BasicTableRec.IsEmpty 為 true (即沒有找到重複的記錄),初始化並新增記錄。
執行後,所有資料就會新增在 Basic Table 裡,並告知新增了幾筆。
整個完整的程式碼如下
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;
}
}
}
}