Dodawanie własnych pól do wyników wyszukiwania na stronie "Znajdź Zapas"
Wymagane obiekty
Codeunit będzie zawierał Event Subscriber,
TableExtension rozszerzający tabelę N24I Find Item Result,
PageExtension rozszerzający stronę N24I Find Item.
Table Extension - wymagane pola
- Zwykłe pole typu Decimal. Będzie one wyświetlane dla użytkownika.
- Pole FlowField typu Decimal. Służy do wyliczania zwykłego pola. CalcFormula będzie zawierać sumę wszystkich zapasów dla danego dokumentu. Filtry będą zależne od typu dokumentu.
Przykład - liczenie zapasów na dok. produkcyjnych
Poniżej znajduje się przykład dodawania własnego pola oraz implementacja wyliczania zapasów dla własnego typu dokumentu, oraz ogólnej dostępności zapasu. Przedstawiony zostanie również przykład jak dodać podgląd dokumentów dla niestandardowego pola, gdy użytkownik na nie kliknie.
Wyliczanie niestandardowego pola
By dodać swoje pole do Znajdź Zapas, należy je dodać do tabeli i strony. By móc dokonywać obliczeń do własnego typu dokumentu, musimy utworzyć Table Extension.
Table ExtensionNależy utworzyćTabel Extensionrozszerzający tabeleN24I Find Item Result. Dodać dwa nowe pola zgodnie z tym co jest pokazane poniżej. Pierwsze, zwykłe pole typu Decimal, bedzie widoczne dla użytkownika.
Drugie pole o typie FlowField, będzie ukryte dla użytkownika. Aby działało poprawnie, należy utworzyć poprawną CalcFormula, różną dla każdego typu dokumentu. Variant Code znajdujący się w CalcFormula jest specyficzny. Wykorzystuje FlowFilter z tabeli bazowej, która jest rozszerzana. Gdy użytkownik nie chce używać kodów wariantów pozostanie on pusty. W przeciwnym razie będzie przechowywał wartość bieżącego Variant Code.
Poniżej znajduje sie gotowy Table Extension, który dodaje pożądaną funkcjonalność.
tableextension 51111 "MyTableExtension" extends "N24I Find Item Result"
{
fields
{
field(51111; "Qty. on Prod Order"; Decimal) //Zwykłe pole, wyświetlane u użytkownika
{
Caption = 'Qty. on Prod Order';
DataClassification = CustomerContent;
DecimalPlaces = 0 : 5;
}
field(51112; "FlowField_Qty.onProdOrder"; Decimal) //Ukryte pole wyliczające ilość dla danego typu dokumentu
{
FieldClass = FlowField;
CalcFormula = sum("Prod. Order Line"."Remaining Qty. (Base)" where( //Bazujemy na tabeli Prod. Order Line
Status = filter(Planned .. Released), //Filtrujemy po odpowiednim statusie dokumentu produkcyjnego
"Item No." = field("Item No."), //Szukamy tylko aktywnego zapasu
"Location Code" = field("Location Code"), //Dla aktywnej lokalizacji
"Variant Code" = field(FlowFilter_VariantCode))); //Z odpowiednim kodem wariantu, jeżeli istnieje
Editable = false;
DecimalPlaces = 0 : 5;
}
}
}
CodeunitZawieraEvent Subscriber, który uruchamia się przed wstawieniem każdego wyszukanego elementu do tabeli.
Pozwala on zmodyfikować wartości dodanych niestandardowych pól. Subskrybująca procedura otrzymuje rekord z zapasem, który zostanie dodany do tabeli po naszych modyfikacjach.
CalcFields wylicza pole FlowField, które zostało dodane w poprzednim kroku.
Validate przypisuje wartość z wyliczonego FlowFielda do pola, które zobaczy użytkownik.
Następnie dodajemy wartość naszego pola do Qty. Available, które przechowuje rzeczywistą dostępność zapasu.
Uwaga
Do pola Qty. Available możemy dodać lub odjąć wartość w zależności od przeznaczenia danego dokumentu. W tym przypadku dodajemy wartość, gdyż po wyprodukowaniu danego zapasu, jego ilość się zwiększy.
codeunit 51111 "MyCodeunit"
{
[EventSubscriber(ObjectType::Codeunit, Codeunit::"N24I Item Inventory", 'OnBeforeInventorySearchResultInsertEvent', '', false, false)]
local procedure MyProcedure(var SearchResult: Record "N24I Find Item Result")
begin
SearchResult.CalcFields("FlowField_Qty.onProdOrder");
SearchResult.Validate("Qty. on Prod Order", SearchResult."FlowField_Qty.onProdOrder");
SearchResult."Qty. Available" += SearchResult."Qty. on Prod Order";
end;
}
Page ExtensionNależy również dodać nasze pole na stronę, którą zobaczy użytkownik. W tym celu rozszerzamy stronę, którą zobaczy użytkownik.
pageextension 51111 "MyPageExtension" extends "N24I Find Item"
{
layout
{
addlast(SearchResults)
{
field("Qty. on Prod Order"; Rec."Qty. on Prod Order")
{
ApplicationArea = All;
}
}
}
}
Po tych zmianach, nowe pole będzie wyświetlane dla użytkownika, będzie one wyliczane dla każdego zapasu, który zostanie dodany do tabeli. Wpłyniemy tym sposobem również na wartość dostępności zapewniając użytkownikowi prawdziwe dane dla wyszukanych zapasów..
Dodawanie podglądu dokumentów dla niestandardowego pola
W poprzednim kroku zostały dodane pola, które są wyliczane. By zapewnić użytkownikowi pełną funkcjonalność, należy jeszcze dodać podgląd (lookup). By to zrobić, musimy wrócić do naszego Page Extension, które zostało utworzone w poprzednim kroku.
Do wstawionego wcześniej pola dodajemy trigger OnDrillDown, który się uruchamia po kliknięciu przez użytkownika w nasze pole. Najpierw filtrujemy tabelę, na której bazuje nasze nowe pole, by pokazać użytkownikowi tylko to, co wpłynęło na to, że wyliczona dostępność jest taka, jaka jest.
Następnie wykonujemy jedną procedurę, której przezujemy nasz rekord. Po tej czynności nasze pole uzyskało funkcjonalność otwierania podglądu dla wybranego zapasu na stronie Znajdź Zapas.
pageextension 51111 "MyPageExtension" extends "N24I Find Item"
{
layout
{
addlast(SearchResults)
{
field("Qty. on Prod Order"; Rec."Qty. on Prod Order")
{
ApplicationArea = All;
trigger OnDrillDown()
var
ProdOrderLine: Record "Prod. Order Line";
begin
//Najpierw filtrujemy rekordy z tabeli Prod. Order Line
ProdOrderLine.SetRange(Status, Enum::"Production Order Status"::Planned, Enum::"Production Order Status"::Released);
ProdOrderLine.SetFilter("Item No.", Rec."Item No.");
ProdOrderLine.SetFilter("Location Code", Rec."Location Code");
if (Rec."Variant Code" <> '') then //Filtrujemy po Wariancie tylko, jezeli zawiera jakąś wartość
ProdOrderLine.SetFilter("Variant Code", Rec."Variant Code");
// Uruchamiamy stronę typu Lookup dla przefiltrowanego rekordu
RunDefaultLookupPageForRec(ProdOrderLine);
end;
}
}
}
}
Cały kod
tableextension 51111 "MyTableExtension" extends "N24I Find Item Result"
{
fields
{
field(51111; "Qty. on Prod Order"; Decimal) //Zwykłe pole, wyświetlane u użytkownika
{
Caption = 'Qty. on Prod Order';
DataClassification = CustomerContent;
DecimalPlaces = 0 : 5;
}
field(51112; "FlowField_Qty.onProdOrder"; Decimal) //Ukryte pole wyliczające ilość dla danego typu dokumentu
{
FieldClass = FlowField;
CalcFormula = sum("Prod. Order Line"."Remaining Qty. (Base)" where( //Bazujemy na tabeli Prod. Order Line
Status = filter(Planned .. Released), //Filtrujemy po odpowiednim statusie dokumentu produkcyjnego
"Item No." = field("Item No."), //Szukamy tylko aktywnego zapasu
"Location Code" = field("Location Code"), //Dla aktywnej lokalizacji
"Variant Code" = field(FlowFilter_VariantCode))); //Z odpowiednim kodem wariantu, jeżeli istnieje
Editable = false;
DecimalPlaces = 0 : 5;
}
}
}
pageextension 51111 "MyPageExtension" extends "N24I Find Item"
{
layout
{
addlast(SearchResults)
{
field("Qty. on Prod Order"; Rec."Qty. on Prod Order")
{
ApplicationArea = All;
trigger OnDrillDown()
var
ProdOrderLine: Record "Prod. Order Line";
begin
//Najpierw filtrujemy rekordy z tabeli Prod. Order Line
ProdOrderLine.SetRange(Status, Enum::"Production Order Status"::Planned, Enum::"Production Order Status"::Released);
ProdOrderLine.SetFilter("Item No.", Rec."Item No.");
ProdOrderLine.SetFilter("Location Code", Rec."Location Code");
if (Rec."Variant Code" <> '') then //Filtrujemy po Wariancie tylko, jezeli zawiera jakąś wartość
ProdOrderLine.SetFilter("Variant Code", Rec."Variant Code");
// Uruchamiamy stronę typu Lookup dla przefiltrowanego rekordu
RunDefaultLookupPageForRec(ProdOrderLine);
end;
}
}
}
}
codeunit 51111 "MyCodeunit"
{
[EventSubscriber(ObjectType::Codeunit, Codeunit::"N24I Item Inventory", 'OnBeforeInventorySearchResultInsertEvent', '', false, false)]
local procedure MyProcedure(var SearchResult: Record "N24I Find Item Result")
begin
SearchResult.CalcFields("FlowField_Qty.onProdOrder");
SearchResult.Validate("Qty. on Prod Order", SearchResult."FlowField_Qty.onProdOrder");
SearchResult."Qty. Available" += SearchResult."Qty. on Prod Order";
end;
}