Extensibilité
Cette section s'adresse aux développeurs qui souhaitent étendre la personnalisation des états et plus particulièrement la partie dédiée à la personnalisation des colonnes.
Comment fournir davantage de champs de substitution dans les documents ?
Abonnez-vous à l'événement OnBeforeGetCustomFields
.
Ajoutez les variables de substitution supplémentaires dans le dictionnaire fournit.
[EventSubscriber(ObjectType::Codeunit, Codeunit::"Print Document Helper RCCAP", 'OnBeforeGetCustomFields', '', false, false)]
local procedure OnBeforeGetCustomFields(Rec: Variant; ReportCustomization: Record "Report Customization RCCAP"; CustomReplacementFields: Dictionary of [Text, Text]; var CustomFields: Dictionary of [Text, Text])
begin
CustomReplacementFields.Add('MyVar', 'Hello World');
end;
Si vous ajoutez une variable nommée MyVar
comme ci-dessus, vous l'adressez ainsi dans l'en-tête : {"$MyVar"}
.
Comment fournir des champs de substitution dans les en-têtes de colonnes ?
Les en-têtes de colonnes supportent les variables sur la base des champs présents dans l'en-tête de document.
Si vous souhaitez fournir des variables supplémentaires, vous devez les ajouter dans le dictionnaire fournit par l'événement OnBeforeBuildCustomLineHeaders
.
Comment fournir davantage de champs de substitution dans les lignes ?
Abonnez-vous à l'événement OnBeforeBuildCustomLineDataItem
.
Ajoutez les variables de substitution supplémentaires dans le dictionnaire fournit.
[EventSubscriber(ObjectType::Codeunit, Codeunit::"Print Document Helper RCCAP", 'OnBeforeBuildCustomLineDataItem', '', false, false)]
local procedure OnBeforeBuildCustomLineDataItem(Rec: Variant; DataItemName: Text; var CustomFields: Dictionary of [Text, Text]);
begin
CustomFields.Add('MyVar', 'Hello World');
end;
Si vous ajoutez une variable nommée MyVar
comme ci-dessus, vous l'adressez ainsi dans l'en-tête : {"$MyVar"}
.
Ajouter un élément d'extension dans une édition
Un élément d'extension est un élément de données (dataitem) supplémentaire dans les lignes d'un état. Vous pouvez proposer des éléments d'extensions aux états pour afficher des détails supplémentaires liées à une ligne. Par exemple : ajouter les détails d'une nomenclature, une liste d'ingrédients, etc.
L'exemple ci-dessous illuste comment ajouter un élément d'extensibilité qui va imprimer l'ensemble des attributs articles liés à une ligne d'article dans la confirmation de commande.
- Créez un objet
enumextension
étendant l'énumerationDep.Inv. Feature Impl. UTCAP
. - Ajoutez deux nouvelles valeurs implémentant l'interface
Dep.Inv. Feature Impl. UTCAP
. L'une (iciItemAttributesDI.PTE
) sert à la personnalisation des colonnes à obtenir au moment de la conception à quel élément de données existant est attaché votre élément d'extensibilité. Le second (iciItemAttributesRecords.PTE
) sert au moment de l'exécution de l'état à récupérer les enregistrements à imprimer.
enumextension 50000 "Dep.Inv. Feature Impl. PTE" extends "Dep.Inv. Feature Impl. UTCAP"
{
value(50000; "ItemAttributesDI.PTE")
{
Caption = 'Fetch Report Customization Extensibility Data Items (Item Attributes)';
Implementation = "Dep.Inv. Feature Impl. UTCAP" = "ItemAttributesDIPTE";
}
value(50001; "ItemAttributesRecords.PTE")
{
Caption = 'Fetch Report Customization Extensibility Data Item Records (Item Attributes)';
Implementation = "Dep.Inv. Feature Impl. UTCAP" = "ItemAttributesRecordsPTE";
}
}
- Implémentez dans un nouveau codeunit pour la première option créée dans l'énumération. Ici le nous supportons uniquement la confirmation de commande de CAP Businness et attachons notre élément à l'élément Extension de Sales Line.
codeunit 50000 "ItemAttributesDIPTE" implements "Dep.Inv. Feature Impl. UTCAP"
{
Access = Internal;
SingleInstance = true;
var
ItemAttributesDataItemLbl: Label 'Item Attributes PTE', Locked = true;
procedure Execute(Parameters: JsonObject) Results: JsonObject;
var
JsonHelper: Codeunit "Json Helper UTCAP";
ReportId: Integer;
Payload: JsonObject;
begin
ReportId := JsonHelper.GetInteger(Parameters, 'reportId');
case ReportId of
70344612 /*Sales - Order Conf.*/:
begin
Payload.Add('Data Item Table ID', Database::"Sales Line");
Payload.Add('Name', 'Extension');
Payload.Add('Extension Name', ItemAttributesDataItemLbl);
Results.Add('groupDefinition', Payload);
end;
end;
end;
procedure GetSupportedFeatures() SupportedFeature: List of [Text];
begin
SupportedFeature.Add('Report.FetchExtDataItems.RCCAP');
end;
}
- Implémentez dans un nouveau codeunit pour la seconde option créée dans l'énumération. Dans ce codeunit, vous récupérez l'enregistrement Sales Line sérialisé dans le champ record de Parameters. On utilise la fonction DeserializeJsonToRecord pour réobtenir l'enregistrement et ainsi récupérer l'article qui s'y trouve. La routine consiste ensuite à ajouter tous les attributs articles dans la variable Result.
codeunit 50001 "ItemAttributesRecordsPTE" implements "Dep.Inv. Feature Impl. UTCAP"
{
Access = Internal;
SingleInstance = true;
var
ItemAttributesDataItemLbl: Label 'Item Attributes PTE', Locked = true;
procedure Execute(Parameters: JsonObject) Results: JsonObject;
var
SalesLine: Record "Sales Line";
Item: Record Item;
ItemAttribute: Record "Item Attribute";
ItemAttributeValue: Record "Item Attribute Value";
ItemAttributeValueMapping: Record "Item Attribute Value Mapping";
Utilities: Codeunit "Utilities UTCAP";
JsonHelper: Codeunit "Json Helper UTCAP";
TableId : Integer;
ItemNo: Code[20];
FromRecordPayloadTok: JsonToken;
ItemAttributePayload, FromRecordPayload : JsonObject;
VarRec: Variant;
begin
if JsonHelper.GetText(Parameters, 'extensionName') <> ItemAttributesDataItemLbl then
exit;
TableId := JsonHelper.GetInteger(Parameters, 'tableId');
Parameters.Get('record', FromRecordPayloadTok);
FromRecordPayload := FromRecordPayloadTok.AsObject();
case TableId of
Database::"Sales Line":
begin
VarRec := SalesLine;
Utilities.DeserializeJsonToRecord(FromRecordPayload, VarRec);
SalesLine := VarRec;
if SalesLine.Type <> SalesLine.Type::Item then
exit;
ItemNo := SalesLine."No.";
end;
else
exit;
end;
ItemAttributeValueMapping.SetRange("Table ID", Database::Item);
ItemAttributeValueMapping.SetRange("No.", ItemNo);
if ItemAttributeValueMapping.FindSet() then
repeat
ItemAttribute.Get(ItemAttributeValueMapping."Item Attribute ID");
ItemAttributeValue.Get(ItemAttributeValueMapping."Item Attribute ID", ItemAttributeValueMapping."Item Attribute Value ID");
Clear(ItemAttributePayload);
ItemAttributePayload.Add('Attribute ID', ItemAttributeValueMapping."Item Attribute ID");
ItemAttributePayload.Add('Attribute Value ID', ItemAttributeValueMapping."Item Attribute Value ID");
ItemAttributePayload.Add('Name', ItemAttribute.GetNameInCurrentLanguage());
ItemAttributePayload.Add('Value', ItemAttributeValue.GetValueInCurrentLanguage());
Results.Add(ItemAttributeValueMapping.SystemId, ItemAttributePayload);
until ItemAttributeValueMapping.Next() = 0;
end;
procedure GetSupportedFeatures() SupportedFeature: List of [Text];
begin
SupportedFeature.Add('Report.FetchDataItemExtRec.RCCAP');
end;
}
Vous pouvez à présent déployer votre extension. Rendez-vous dans la personnalisation des colonnes de la confirmation de commande et sélectionnez l'action Obtenir les éléments d'extension. Sélectionnez votre nouvelle extension.
Pour faire référence à vos champs, par exemple pour imprimer le nom suivi de la valeur de l'attribut, inscrivez une expression comme celle-ci :
{"$Name"} : {"$Value"}
Les noms sont toujours préfixés par le symbole $ car l'enregistrement principal reste la table Sales Line.