Ga naar inhoud

Invoerlijn Evenement

Business Portals kunnen een evenement activeren op basis van invoer in een lijn op de frontend. Deze invoer wordt naar Business Central gestuurd, waar het kan worden verwerkt door een aangepaste codeunit om waarden opnieuw te berekenen of een specifiek resultaat terug te geven.

Deze sectie biedt een voorbeeld van hoe een aangepaste codeunit kan worden geïmplementeerd die wordt geactiveerd door een evenement op basis van gebruikersinvoer.

Code Voorbeeld

In dit voorbeeld zullen we de Verkooporderlijn-tabel gebruiken in een scenario waarin de gebruiker een hoeveelheid kan invoeren voor de items die in een lijn zijn vermeld. De invoer zal de itemprijs bijwerken door de hoeveelheid te vermenigvuldigen met de eenheidsprijs.

De gebruikersinvoer activeert een evenement door de waarde naar Business Central te sturen, waar het wordt verwerkt in een Business Central codeunit.

AL
'INPUTLINE':
    begin
        LocalEventXmlElement := XmlElement.Create('EVENT');
        LocalRootXmlElement.Add(LocalEventXmlElement);
        LocalRootXmlElement.SetAttribute('EVENTTYPE', ParamRecordSIMDPSOL."Sub Function Event");
        LocalRootXmlElement.SetAttribute('EVENTVALUE', LocalEventValueText);
        LocalRootXmlElement.SetAttribute('EVENTMESSAGE', 'Alle rijen met hetzelfde aantal zijn gedeselecteerd.');
        LocalRootXmlElement.SetAttribute('EVENTMESSAGETYPE', 'default');
        LocalRootXmlElement.SetAttribute('EVENTMESSAGEMOBILE', '');
        LocalRootXmlElement.SetAttribute('EVENTMESSAGEMOBILETYPE', 'default');

        if Evaluate(LocalRecordId, LocalEventValueText, 9) then
            if LocalRecordRef.Get(LocalRecordId) then begin
                LocalLineRecordSIMDPSOL.Reset();
                LocalLineRecordSIMDPSOL.SetRange("Entry No.", ParamRecordSIMDPSOL."Entry No.");
                LocalLineRecordSIMDPSOL.SetRange("Sub Entry No.", ParamRecordSIMDPSOL."Sub Entry No.");
                LocalLineRecordSIMDPSOL.SetRange("Dataset Code", ParamRecordSIMDPSOL."Dataset Code");
                LocalLineRecordSIMDPSOL.SetRange("Dataset Table Code", ParamRecordSIMDPSOL."Dataset Table Code");
                LocalLineRecordSIMDPSOL.SetRange("Dataset Table Type", ParamRecordSIMDPSOL."Dataset Table Type"::Line);
                LocalLineRecordSIMDPSOL.SetRange("Dataset Table Record", LocalRecordId);

                // Dit zal de waarde ophalen van wat is ingevoerd in de frontend,
                if LocalLineRecordSIMDPSOL.FindSet() then
                    LocalInputText := GlobalCodeunitSIMDPSOrderFunctionLibrary.GetDPSOrderLineInputFieldByCode(LocalLineRecordSIMDPSOL, 'QUANTITY');

                // Filter op de exacte lijn die het evenement activeert, en haal de waarde van andere velden op voor berekening, en geef vervolgens de waarde terug aan de frontend. Het is slechts een voorbeeld op basis van het veld Hoeveelheid, het kan elk ander veld zijn en elke berekening op basis van de vereiste. Het wordt aanbevolen om direct de lijn op te halen die het evenement activeert en alleen de waarde voor die lijn terug te geven, en vervolgens de berekening aan de clientzijde uit te voeren, als er prestatieproblemen zijn wanneer er veel lijnen met dezelfde hoeveelheid zijn.
                LocalRecordRef.SetTable(LocalRecordSalesLine);
                Local2RecordSalesLine.SetRange("Document Type", LocalRecordSalesLine."Document Type");
                Local2RecordSalesLine.SetRange("Document No.", LocalRecordSalesLine."Document No.");
                Local2RecordSalesLine.SetRange("Line No.", LocalRecordSalesLine."Line No.");
                Local2RecordSalesLine.SetRange(Quantity, LocalRecordSalesLine.Quantity);
                if Local2RecordSalesLine.FindFirst() then begin
                    // Dit codeblok zal de invoerwaarde teruggeven aan de frontend.
                    LocalInfoXmlElement := XmlElement.Create('INFO');
                    LocalEventXmlElement.Add(LocalInfoXmlElement);
                    LocalInfoXmlElement.SetAttribute('VALUE', Format(Local2RecordSalesLine.RecordId, 0, 9));

                    LocalInputXmlElement := XmlElement.Create('INPUT');
                    LocalInfoXmlElement.Add(LocalInputXmlElement);
                    LocalInputXmlElement.SetAttribute('NAME', 'QUANTITY');
                    LocalInputXmlElement.SetAttribute('VALUE', LocalInputText);

                    // Dit codeblok zal andere veldwaarden teruggeven, op basis van de invoerwaarde, aan de frontend voor berekening. In dit voorbeeld geeft het de Eenheidsprijs terug en doet een vermenigvuldiging aan de backend, en geeft vervolgens het resultaat terug aan de frontend, maar het kan elk ander veld zijn en elke berekening op basis van de vereiste.
                    LocalInfoXmlElement := XmlElement.Create('INFO');
                    LocalEventXmlElement.Add(LocalInfoXmlElement);
                    LocalInfoXmlElement.SetAttribute('VALUE', Format(Local2RecordSalesLine.RecordId, 0, 9));

                    LocalInputXmlElement := XmlElement.Create('INPUT');
                    LocalInfoXmlElement.Add(LocalInputXmlElement);
                    Evaluate(LocalMultiplierDecimal, LocalInputText);

                    LocalSumDecimal := LocalMultiplierDecimal * Local2RecordSalesLine."Unit Price";

                    LocalInputXmlElement.SetAttribute('NAME', 'PRICE');
                    LocalInputXmlElement.SetAttribute('VALUE', Format(LocalSumDecimal, 0, 9));
                end;
            end;
    end;

Code Voorbeeld 2

Met een vergelijkbaar scenario als het eerste Code Voorbeeld, zal dit codevoorbeeld laten zien hoe alle lijnen kunnen worden bijgewerkt in plaats van alleen de geselecteerde lijn.

AL
 'INPUTLINE':
    begin
        LocalEventXmlElement := XmlElement.Create('EVENT');
        LocalRootXmlElement.Add(LocalEventXmlElement);
        LocalRootXmlElement.SetAttribute('EVENTTYPE', ParamRecordSIMDPSOL."Sub Function Event");
        LocalRootXmlElement.SetAttribute('EVENTVALUE', LocalEventValueText);
        LocalRootXmlElement.SetAttribute('EVENTMESSAGE', 'Alle Zeilen met dezelfde hoeveelheid zijn afgevinkt.');
        LocalRootXmlElement.SetAttribute('EVENTMESSAGETYPE', 'default');
        LocalRootXmlElement.SetAttribute('EVENTMESSAGEMOBILE', '');
        LocalRootXmlElement.SetAttribute('EVENTMESSAGEMOBILETYPE', 'default');

        if Evaluate(LocalRecordId, LocalEventValueText, 9) then
            if LocalRecordRef.Get(LocalRecordId) then begin
                LocalLineRecordSIMDPSOL.Reset();
                LocalLineRecordSIMDPSOL.SetRange("Entry No.", ParamRecordSIMDPSOL."Entry No.");
                LocalLineRecordSIMDPSOL.SetRange("Sub Entry No.", ParamRecordSIMDPSOL."Sub Entry No.");
                LocalLineRecordSIMDPSOL.SetRange("Dataset Code", ParamRecordSIMDPSOL."Dataset Code");
                LocalLineRecordSIMDPSOL.SetRange("Dataset Table Code", ParamRecordSIMDPSOL."Dataset Table Code");
                LocalLineRecordSIMDPSOL.SetRange("Dataset Table Type", ParamRecordSIMDPSOL."Dataset Table Type"::Line);
                LocalLineRecordSIMDPSOL.SetRange("Dataset Table Record", LocalRecordId);

                // Dit zal de waarde ophalen van wat is ingevoerd in de frontend,
                if LocalLineRecordSIMDPSOL.FindSet() then
                    LocalInputText := GlobalCodeunitSIMDPSOrderFunctionLibrary.GetDPSOrderLineInputFieldByCode(LocalLineRecordSIMDPSOL, 'QUANTITY');

                // Om door alle lijnen met dezelfde hoeveelheid te lopen, kan de code er als volgt uitzien, maar het kan prestatieproblemen hebben wanneer er veel lijnen zijn, dus het is beter om direct de lijn op te halen die het evenement activeert en alleen de waarde voor die lijn terug te geven, en vervolgens de berekening aan de clientzijde uit te voeren.

                LocalRecordRef.SetTable(LocalRecordSalesLine);
                Local2RecordSalesLine.SetRange("Document Type", LocalRecordSalesLine."Document Type");
                Local2RecordSalesLine.SetRange("Document No.", LocalRecordSalesLine."Document No.");
                Local2RecordSalesLine.SetRange(Quantity, LocalRecordSalesLine.Quantity);
                if Local2RecordSalesLine.FindSet() then
                    repeat
                        LocalInfoXmlElement := XmlElement.Create('INFO');
                        LocalEventXmlElement.Add(LocalInfoXmlElement);
                        LocalInfoXmlElement.SetAttribute('VALUE', Format(Local2RecordSalesLine.RecordId, 0, 9));

                        LocalInputXmlElement := XmlElement.Create('INPUT');
                        LocalInfoXmlElement.Add(LocalInputXmlElement);
                        LocalInputXmlElement.SetAttribute('NAME', 'QUANTITY');
                        LocalInputXmlElement.SetAttribute('VALUE', LocalInputText);

                        LocalInputXmlElement := XmlElement.Create('INPUT');
                        LocalInfoXmlElement.Add(LocalInputXmlElement);
                        Evaluate(LocalMultiplierDecimal, LocalInputText);

                        LocalSumDecimal := LocalMultiplierDecimal * Local2RecordSalesLine."Unit Price";

                        LocalInputXmlElement.SetAttribute('NAME', 'PRICE');
                        LocalInputXmlElement.SetAttribute('VALUE', Format(LocalSumDecimal, 0, 9));

                    until Local2RecordSalesLine.Next() = 0;
            end
    end;

Codevoorbeeld 3

Met een vergelijkbaar scenario als het eerste Codevoorbeeld, laat dit voorbeeld zien hoe de regels van de geselecteerde regel kunnen worden bijgewerkt met extra velden, evenals hoe een update kan worden geblokkeerd wanneer een specifiek veld wordt gewijzigd.

In dit voorbeeld worden twee extra velden toegevoegd, namelijk BRUTTO en NETTO. Deze velden gebruiken een statisch fictief getal, omdat de standaard Sales Order Line-tabel deze waarden/velden niet in de database bevat. Deze velden kunnen door iets anders worden vervangen.

AL
 'INPUTLINE':
    begin
    LocalEventXmlElement := XmlElement.Create('EVENT');
    LocalRootXmlElement.Add(LocalEventXmlElement);
    LocalRootXmlElement.SetAttribute('EVENTTYPE', ParamRecordSIMDPSOL."Sub Function Event");
    LocalRootXmlElement.SetAttribute('EVENTVALUE', LocalEventValueText);
    LocalRootXmlElement.SetAttribute('EVENTMESSAGE', 'Alle Zeilen mit der gleichen Anzahl wurden abgewählt.');
    LocalRootXmlElement.SetAttribute('EVENTMESSAGETYPE', 'default');
    LocalRootXmlElement.SetAttribute('EVENTMESSAGEMOBILE', '');
    LocalRootXmlElement.SetAttribute('EVENTMESSAGEMOBILETYPE', 'default');

    if Evaluate(LocalRecordId, LocalEventValueText, 9) then
        if LocalRecordRef.Get(LocalRecordId) then begin
            LocalLineRecordSIMDPSOL.Reset();
            LocalLineRecordSIMDPSOL.SetRange("Entry No.", ParamRecordSIMDPSOL."Entry No.");
            LocalLineRecordSIMDPSOL.SetRange("Sub Entry No.", ParamRecordSIMDPSOL."Sub Entry No.");
            LocalLineRecordSIMDPSOL.SetRange("Dataset Code", ParamRecordSIMDPSOL."Dataset Code");
            LocalLineRecordSIMDPSOL.SetRange("Dataset Table Code", ParamRecordSIMDPSOL."Dataset Table Code");
            LocalLineRecordSIMDPSOL.SetRange("Dataset Table Type", ParamRecordSIMDPSOL."Dataset Table Type"::Line);
            LocalLineRecordSIMDPSOL.SetRange("Dataset Table Record", LocalRecordId);

            // Dit haalt de waarde op die in de frontend is ingevoerd
            if LocalLineRecordSIMDPSOL.FindSet() then
                LocalQuantityInputText := GlobalCodeunitSIMDPSOrderFunctionLibrary.GetDPSOrderLineInputFieldByCode(LocalLineRecordSIMDPSOL, 'QUANTITY');
            if LocalLineRecordSIMDPSOL.FindSet() then
                LocalBruttoInputText := GlobalCodeunitSIMDPSOrderFunctionLibrary.GetDPSOrderLineInputFieldByCode(LocalLineRecordSIMDPSOL, 'BRUTTO');
            if LocalLineRecordSIMDPSOL.FindSet() then
                LocalNettoInputText := GlobalCodeunitSIMDPSOrderFunctionLibrary.GetDPSOrderLineInputFieldByCode(LocalLineRecordSIMDPSOL, 'NETTO');
            if LocalLineRecordSIMDPSOL.FindSet() then
                LocalPriceInputText := GlobalCodeunitSIMDPSOrderFunctionLibrary.GetDPSOrderLineInputFieldByCode(LocalLineRecordSIMDPSOL, 'PRICE');

            // Beveiliging voor lege invoer: als de invoer leeg is, wordt deze in berekeningen als 0 behandeld. Dit geldt voor numerieke invoer; voor tekst kan het als een lege string worden behandeld en hoeft het niet naar 0 te worden geconverteerd.
            if LocalQuantityInputText = '' then
                LocalQuantityInputText := '0';
            if LocalBruttoInputText = '' then
                LocalBruttoInputText := '0';
            if LocalNettoInputText = '' then
                LocalNettoInputText := '0';
            if LocalPriceInputText = '' then
                LocalPriceInputText := '0';

            // Filtert exact de regel die het event triggert en haalt de waarden van andere velden op voor berekening, en retourneert daarna de waarde naar de frontend. Dit is slechts een voorbeeld gebaseerd op het veld Quantity; het kan elk ander veld en elke berekening zijn afhankelijk van de vereisten. Het wordt aanbevolen om direct de regel die het event triggert op te halen en alleen die waarde terug te sturen, en de berekening aan de clientzijde te doen als er prestatieproblemen zijn bij veel regels met dezelfde hoeveelheid.
            LocalRecordRef.SetTable(LocalRecordSalesLine);
            Local2RecordSalesLine.SetRange("Document Type", LocalRecordSalesLine."Document Type");
            Local2RecordSalesLine.SetRange("Document No.", LocalRecordSalesLine."Document No.");
            Local2RecordSalesLine.SetRange("Line No.", LocalRecordSalesLine."Line No.");
            Local2RecordSalesLine.SetRange(Quantity, LocalRecordSalesLine.Quantity);
            if Local2RecordSalesLine.FindFirst() then begin
                // Dit codeblok retourneert de ingevoerde waarde naar de frontend
                LocalInfoXmlElement := XmlElement.Create('INFO');
                LocalEventXmlElement.Add(LocalInfoXmlElement);
                LocalInfoXmlElement.SetAttribute('VALUE', Format(Local2RecordSalesLine.RecordId, 0, 9));

                LocalInputXmlElement := XmlElement.Create('INPUT');
                LocalInfoXmlElement.Add(LocalInputXmlElement);
                LocalInputXmlElement.SetAttribute('NAME', 'QUANTITY');
                LocalInputXmlElement.SetAttribute('VALUE', LocalQuantityInputText);

                // Evalueert de invoerwaarde en zet deze over naar lokale variabelen
                Evaluate(LocalMultiplierDecimal, LocalQuantityInputText);
                Evaluate(LocalBruttoDecimal, LocalBruttoInputText);
                Evaluate(LocalNettoDecimal, LocalNettoInputText);
                Evaluate(LocalPriceDecimal, LocalPriceInputText);

                //PRICE
                // Dit codeblok retourneert andere veldwaarden, gebaseerd op de invoer, naar de frontend voor berekening. In dit voorbeeld wordt Unit Price gebruikt en een vermenigvuldiging in de backend gedaan, waarna het resultaat naar de frontend wordt gestuurd, maar het kan elk veld en elke berekening zijn afhankelijk van de vereisten.
                LocalInfoXmlElement := XmlElement.Create('INFO');
                LocalEventXmlElement.Add(LocalInfoXmlElement);
                LocalInfoXmlElement.SetAttribute('VALUE', Format(Local2RecordSalesLine.RecordId, 0, 9));

                LocalInputXmlElement := XmlElement.Create('INPUT');
                LocalInfoXmlElement.Add(LocalInputXmlElement);

                LocalSumDecimal := LocalMultiplierDecimal * Local2RecordSalesLine."Unit Price";

                if LocalPriceDecimal <> LocalSumDecimal then
                    LocalQuantityChangeBoolean := true;

                LocalInputXmlElement.SetAttribute('NAME', 'PRICE');
                LocalInputXmlElement.SetAttribute('VALUE', Format(LocalSumDecimal, 0, 9));

                // Controleer of het veld QUANTITY is gewijzigd of andere velden niet zijn geïnitialiseerd; retourneer dan de berekende BRUTTO- en NETTO-waarden naar de frontend, anders alleen de ingevoerde waarden zonder berekening
                if LocalQuantityChangeBoolean or (LocalBruttoDecimal = 0) or (LocalNettoDecimal = 0) then begin
                    //BRUTTO
                    // Dit codeblok retourneert de ingevoerde waarde naar de frontend
                    LocalInfoXmlElement := XmlElement.Create('INFO');
                    LocalEventXmlElement.Add(LocalInfoXmlElement);
                    LocalInfoXmlElement.SetAttribute('VALUE', Format(Local2RecordSalesLine.RecordId, 0, 9));

                    LocalInputXmlElement := XmlElement.Create('INPUT');
                    LocalInfoXmlElement.Add(LocalInputXmlElement);

                    // De berekeningslogica is slechts een voorbeeld en kan worden aangepast op basis van de vereisten
                    // Berekent de vermenigvuldigingsfactor op basis van de ingevoerde QUANTITY en vermenigvuldigt deze met een waarde (10 in dit voorbeeld) om de BRUTTO-waarde te krijgen; als QUANTITY is gewijzigd of BRUTTO niet is geïnitialiseerd, wordt deze waarde gebruikt, anders wordt de ingevoerde waarde zonder berekening teruggestuurd
                    LocalSumDecimal := LocalMultiplierDecimal * 10;
                    if not LocalQuantityChangeBoolean then
                        if (LocalBruttoDecimal <> LocalSumDecimal) and (LocalBruttoDecimal <> 0) then
                            LocalSumDecimal := LocalBruttoDecimal;

                    LocalInputXmlElement.SetAttribute('NAME', 'BRUTTO');
                    LocalInputXmlElement.SetAttribute('VALUE', Format(LocalSumDecimal, 0, 9));

                    //NETTO
                    // Dit codeblok retourneert de ingevoerde waarde naar de frontend
                    LocalInfoXmlElement := XmlElement.Create('INFO');
                    LocalEventXmlElement.Add(LocalInfoXmlElement);
                    LocalInfoXmlElement.SetAttribute('VALUE', Format(Local2RecordSalesLine.RecordId, 0, 9));

                    LocalInputXmlElement := XmlElement.Create('INPUT');
                    LocalInfoXmlElement.Add(LocalInputXmlElement);

                    // De berekeningslogica is slechts een voorbeeld en kan worden aangepast op basis van de vereisten
                    // Berekent de vermenigvuldigingsfactor op basis van de ingevoerde QUANTITY en vermenigvuldigt deze met een waarde (5 in dit voorbeeld) om de NETTO-waarde te krijgen; als QUANTITY is gewijzigd of NETTO niet is geïnitialiseerd, wordt deze waarde gebruikt, anders wordt de ingevoerde waarde zonder berekening teruggestuurd
                    LocalSumDecimal := LocalMultiplierDecimal * 5;

                    if not LocalQuantityChangeBoolean then
                        if (LocalNettoDecimal <> LocalSumDecimal) and (LocalNettoDecimal <> 0) then
                            LocalSumDecimal := LocalNettoDecimal;

                    LocalInputXmlElement.SetAttribute('NAME', 'NETTO');
                    LocalInputXmlElement.SetAttribute('VALUE', Format(LocalSumDecimal, 0, 9));
                end;
            end;
        end;
    end;