我正在尝试填充临时表以使用临时表的记录重新加载当前页面:
pageextension 60008 "Assembly Orders PL" extends "Assembly Orders"//902
{
trigger OnOpenPage()
var
AssemblyOrders: Page "Assembly Orders";
OriginalHeader: Record "Assembly Header";
AssemblyHeaderTemp: Record "Assembly Header" temporary;
begin
if not RunOnce then begin
AssemblyHeaderTemp.Reset();
AssemblyHeaderTemp.DeleteAll();
OriginalHeader.SetRange("Document Type", Rec."Document Type"::Order);
if OriginalHeader.FindSet() then
repeat
// Check if the No. Series have extra security
if LMEnsamblado.ImplicaSeguridad(OriginalHeader."No. Series") then begin
// If the No. Series has extra security, we check if the current user has rights
if LMEnsamblado.TienePermisosLM(OriginalHeader."Item No.") then begin
AssemblyHeaderTemp.Init();
AssemblyHeaderTemp.TransferFields(OriginalHeader);
AssemblyHeaderTemp.CalcFields(Comment);
AssemblyHeaderTemp.CalcFields("Reserved Quantity");
AssemblyHeaderTemp.CalcFields("Reserved Qty. (Base)");
AssemblyHeaderTemp.CalcFields("Assemble to Order");
AssemblyHeaderTemp.CalcFields("Rolled-up Assembly Cost");
AssemblyHeaderTemp.Insert();
end;
end;
until OriginalHeader.Next() = 0;
CurrPage.Close();
AssemblyOrders.SetRecord(AssemblyHeaderTemp);
AssemblyOrders.SetTableView(AssemblyHeaderTemp);
AssemblyOrders.SetRunOnce();
AssemblyOrders.Run();
CurrPage.Update();
end;
end;
procedure SetRunOnce()
begin
RunOnce := true
end;
var
LMEnsamblado: Codeunit "LM Ensamblado";
RunOnce: Boolean;
}
该代码没有任何区别,因为我仍然收到 91 条记录,我正在调试,并且某些条目未插入表中,但仍然存在于页面列表中...
我也尝试过用
AssemblyHeaderTemp.Copy(OriginalHeader);
而不是 AssemblyHeaderTemp.TransferFields(OriginalHeader);
,但我看不出有什么区别。
如何使用临时表视图重新加载当前页面?
正如 @MakSim 在答案中指出的那样 从自身重新打开页面不是一个好主意。相反,请使用 FilterGroup 并向其中添加过滤器。 ZHU 的这篇博文让您了解了:https://yzhums.com/8427/
在下面的示例中,您可以看到它的样子。但请注意,这绝不是一个可扩展性很强或很好的示例。对于较大的数据库,您将达到 SetFilter 的限制。也许您也可以让我们了解一下用户权限检查的逻辑。然后我们可以尝试进一步优化。
trigger OnOpenPage()
begin
FilterRecords();
end;
local procedure FilterRecords()
begin
Rec.FilterGroup(2);
Rec.SetRange("Document Type", Rec."Document Type"::Order);
Rec.SetFilter("No.", GetRecordsFilter());
Rec.FilterGroup(0);
end;
local procedure GetRecordsFilter() NumbersFilter: Text
var
OriginalHeader: Record "Assembly Header";
TempHeader: Record "Assembly Header" temporary;
AssemblyOrders: Page "Assembly Orders";
FirstRecord: Boolean;
begin
FirstRecord := true;
OriginalHeader.SetRange("Document Type", Rec."Document Type"::Order);
if OriginalHeader.FindSet() then
repeat
// Check if the No. Series have extra security
if LMEnsamblado.ImplicaSeguridad(OriginalHeader."No. Series") then begin
// If the No. Series has extra security, we check if the current user has rights
if LMEnsamblado.TienePermisosLM(OriginalHeader."Item No.") then begin
if FirstRecord then begin
NumbersFilter += OriginalHeader."No.";
FirstRecord := false;
end else
NumbersFilter += '|' + OriginalHeader."No.";
end;
end;
until OriginalHeader.Next() = 0;
end;
我想提的另一件事是 PageVariable.SetRecord() 函数不使用临时记录,其目的是在打开页面列表时显示单个记录(参见:https://learn.microsoft.com/de -de/dynamics365/business-central/dev-itpro/developer/methods-auto/page/page-setrecord-method#parameters)。因此,如果您再次遇到这种情况,请务必更换
AssemblyOrders.SetRecord(AssemblyHeaderTemp);
AssemblyOrders.SetTableView(AssemblyHeaderTemp);
AssemblyOrders.Run();
由
Page.Run(Page::"Assembly Orders", AssemblyHeaderTemp);
在检查您的特定用户权限时,也许使用 SecurityFilter 可能有意义(请参阅:https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/methods-auto/record/记录安全过滤方法 和 https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/security/security-filters)