NAV24 Logo
  • Strona główna
PL | EN
Pokaż / Ukryj Spis Treści

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.

  1. Table Extension Należy utworzyć Tabel Extension rozszerzający tabele N24I 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;
        }
    }
}
  1. Codeunit Zawiera Event 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;
}
  1. Page Extension Należ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;
}
Na tej stronie
Masz pytania? 👉 Napisz do nas: produkty@nav24.pl ↑ Do góry