Événement de ligne d'entrée
Les portails d'entreprise peuvent déclencher un événement basé sur l'entrée dans une ligne sur le frontend. Cette entrée est envoyée à Business Central, où elle peut être traitée par un codeunit personnalisé pour recalculer des valeurs ou retourner un résultat spécifique.
Cette section fournit un exemple de la façon d'implémenter un codeunit personnalisé qui est déclenché par un événement basé sur l'entrée de l'utilisateur.
Exemple de code
Dans cet exemple, nous utiliserons la table des lignes de commande de vente dans un scénario où l'utilisateur peut saisir une quantité pour les articles listés dans une ligne. L'entrée mettra à jour le prix de l'article en multipliant la quantité par le prix unitaire.
L'entrée de l'utilisateur déclenche un événement en envoyant la valeur à Business Central, où elle est traitée dans un codeunit de Business Central.
'INPUTLINE':
begin
LocalEventXmlElement := XmlElement.Create('EVENT');
LocalRootXmlElement.Add(LocalEventXmlElement);
LocalRootXmlElement.SetAttribute('EVENTTYPE', ParamRecordSIMDPSOL."Sub Function Event");
LocalRootXmlElement.SetAttribute('EVENTVALUE', LocalEventValueText);
LocalRootXmlElement.SetAttribute('EVENTMESSAGE', 'Toutes les lignes comportant le même nombre ont été désélectionnées.');
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);
// Cela obtiendra la valeur de ce qui est saisi dans le frontend,
if LocalLineRecordSIMDPSOL.FindSet() then
LocalInputText := GlobalCodeunitSIMDPSOrderFunctionLibrary.GetDPSOrderLineInputFieldByCode(LocalLineRecordSIMDPSOL, 'QUANTITY');
// Filtrer à la ligne exacte qui déclenche l'événement, et obtenir la valeur d'autres champs pour le calcul, puis retourner la valeur au frontend. C'est juste un exemple basé sur le champ Quantité, cela peut être n'importe quel autre champ et tout calcul basé sur les exigences. Il est recommandé d'obtenir directement la ligne qui déclenche l'événement et de retourner la valeur pour cette ligne uniquement, puis de faire le calcul côté client, s'il y a des préoccupations de performance lorsqu'il y a beaucoup de lignes avec la même quantité.
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
// Ce bloc de code retournera la valeur d'entrée au 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);
// Ce bloc de code retournera d'autres valeurs de champ, basées sur la valeur d'entrée, au frontend pour le calcul. Dans cet exemple, il retourne le prix unitaire et effectue une multiplication en backend, puis retourne le résultat au frontend, mais cela peut être n'importe quel autre champ et tout calcul basé sur les exigences.
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;
Exemple de code 2
Avec un scénario similaire au premier Exemple de code, cet exemple de code montrera comment mettre à jour toutes les lignes plutôt que seulement la ligne sélectionnée.
'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);
// Cela obtiendra la valeur de ce qui est saisi dans le frontend,
if LocalLineRecordSIMDPSOL.FindSet() then
LocalInputText := GlobalCodeunitSIMDPSOrderFunctionLibrary.GetDPSOrderLineInputFieldByCode(LocalLineRecordSIMDPSOL, 'QUANTITY');
// Pour parcourir toutes les lignes avec la même quantité, le code peut être comme ci-dessous, mais cela peut avoir des problèmes de performance lorsqu'il y a beaucoup de lignes, donc il est préférable d'obtenir directement la ligne qui déclenche l'événement et de retourner la valeur pour cette ligne uniquement, puis de faire le calcul côté client.
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;