Я пытаюсь заполнить временную таблицу, чтобы перезагрузить текущую страницу записями временной таблицы:
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);, но не вижу никакой разницы.
Как я могу перезагрузить текущую страницу с временным представлением таблицы?
Повторное открытие страницы самой по себе — не лучшая идея. Если вы хотите скрыть некоторые записи, добавьте в группу фильтров фильтр, который пользователь не может очистить. Также рассмотрите возможность использования SetAutoCalcfields(), это более производительно.
Привет @MakSim, спасибо, как мне скрыть некоторые записи? Добавление фильтра, если пользователь не может его очистить, допустимо. Не могли бы вы опубликовать это как ответ с небольшим примером, чтобы я тоже мог проголосовать и хотя бы дать некоторую оценку в ответ? :) еще раз спасибо :)





Как отметил @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";
}
Это самый простой метод, который я нашел :)
Это сработает. Я думаю, что это простой метод, но не оптимальный с точки зрения производительности.
Все, что после
CurrPage.Close();, в любом случае не должно выполняться.