如何在 Business Central 中使用临时表视图重新加载当前页面?

问题描述 投票:0回答:1

我正在尝试填充临时表以使用临时表的记录重新加载当前页面:

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);
,但我看不出有什么区别。

如何使用临时表视图重新加载当前页面?

microsoft-dynamics dynamics-365 dynamics-nav dynamics-business-central businesscentral
1个回答
0
投票

正如 @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)

© www.soinside.com 2019 - 2024. All rights reserved.