Как перезагрузить текущую страницу с временным представлением таблицы в Business Central?

Я пытаюсь заполнить временную таблицу, чтобы перезагрузить текущую страницу записями временной таблицы:

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);, но не вижу никакой разницы.

Как я могу перезагрузить текущую страницу с временным представлением таблицы?

Все, что после CurrPage.Close(); , в любом случае не должно выполняться.

Mak Sim 08.05.2024 08:23

Повторное открытие страницы самой по себе — не лучшая идея. Если вы хотите скрыть некоторые записи, добавьте в группу фильтров фильтр, который пользователь не может очистить. Также рассмотрите возможность использования SetAutoCalcfields(), это более производительно.

Mak Sim 08.05.2024 08:26

Привет @MakSim, спасибо, как мне скрыть некоторые записи? Добавление фильтра, если пользователь не может его очистить, допустимо. Не могли бы вы опубликовать это как ответ с небольшим примером, чтобы я тоже мог проголосовать и хотя бы дать некоторую оценку в ответ? :) еще раз спасибо :)

kuhi 08.05.2024 10:53
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
290
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Как отметил @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";
    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() не использует временные записи и предназначена для отображения одной записи при открытии списка страниц (см.: Метод Page.SetRecord(var Record) | Параметры ). Поэтому, если вы снова столкнетесь с этим сценарием, обязательно замените

AssemblyOrders.SetRecord(AssemblyHeaderTemp);
AssemblyOrders.SetTableView(AssemblyHeaderTemp);
AssemblyOrders.Run();

к

Page.Run(Page::"Assembly Orders", AssemblyHeaderTemp);

Возможно, использование SecurityFilter может иметь смысл при проверке ваших конкретных прав пользователя (см.: Метод Record.SecurityFiltering([SecurityFilter]) и Использование фильтров безопасности).

Ответ принят как подходящий

Решено с помощью Mark(true) и MarkedOnly(true):

pageextension 60008 "Assembly Orders PL" extends "Assembly Orders"//902
{
    trigger OnOpenPage()
    begin
        Rec.SetRange("Document Type", Rec."Document Type"::Order);
        if Rec.FindSet() then
            repeat                                    
                if LMEnsamblado.ImplicaSeguridad(Rec."No. Series") then begin
                    if LMEnsamblado.TienePermisosLM(Rec."Item No.") then begin
                        Rec.Mark(true);
                    end;
                end else
                    Rec.Mark(true);
            until Rec.Next() = 0;
        Rec.MarkedOnly(true);
    end;

    var
        LMEnsamblado: Codeunit "LM Ensamblado";
}

Это самый простой метод, который я нашел :)

Это сработает. Я думаю, что это простой метод, но не оптимальный с точки зрения производительности.

Mak Sim 14.05.2024 09:21

Другие вопросы по теме