Technische Erweiterungsmöglichkeiten
Der Candis Connector lässt sich flexibel erweitern – sowohl durch die Nutzung von Event-Abonnements als auch durch die Integration von Objekterweiterungen. In Abschnitt Alle Events werden zunächst alle verfügbaren Events tabellarisch dargestellt. Anschließend erläutert Abschnitt Stammdatenübertragung die Erweiterungsmöglichkeiten im Rahmen der Stammdatenübertragung. Abschnitt Einkaufsrechnungsimport und Datenverarbeitung beschreibt schließlich, wie der Import von Einkaufsbelegen einschließlich der zugrunde liegenden Verarbeitungslogik individuell angepasst werden kann.
Alle Events
| Modul | Event | Datei |
|---|---|---|
| Vendor | OnCheckCandisVendorUpdateNeeded(var Vendor: Record Vendor; var xVendor: Record Vendor; var isNeeded: Boolean) | SNCC Transfer Vendor Mgt. |
| Vendor | OnCheckCandisVendorBankAccountUpdateNeeded(var VendorBankAccount: Record "Vendor Bank Account"; var xVendorBankAccount: Record "Vendor Bank Account"; var isNeeded: Boolean) | SNCC Transfer Vendor Mgt. |
| Vendor | OnBeforeUpdateCandisVendorEntry(var SNCCVendorUpdate: Record "SNCC Vendor Update"; var Vendor: Record Vendor) | SNCC Transfer Vendor Mgt. |
| Vendor | OnBeforeUpdateVendorChangeLog(var SNCCVendorLatestChange: Record "SNCC Vendor Latest Change"; var Vendor: Record Vendor) | SNCC Vendor Change Mgt. |
| Vendor | OnBeforeApplyLatestChange(var SNCCVendorLatestChange: Record "SNCC Vendor Latest Change"; var SNCCVendorUpdate: Record "SNCC Vendor Update") | SNCC Vendor Change Mgt. |
| Vendor | OnBeforeSetHttpRequestBodyValues(var SNCCVendorUpdate: Record "SNCC Vendor Update"; var ContentBody: JsonObject) | SNCC Vendor HTTP Handler |
| PaymentTerm | OnCheckCandisPaymentTermUpdateNeeded(var PaymentTerms: Record "Payment Terms"; var xPaymentTerms: Record "Payment Terms"; var isNeeded: Boolean) | SNCC Transfer Payment Term |
| PaymentTerm | OnBeforeUpdateCandisPaymentTermEntry(var SNCCPaymentTermUpdate: Record "SNCC Payment Term Update"; var PaymentTerms: Record "Payment Terms") | SNCC Transfer Payment Term |
| PaymentTerm | OnBeforeSetHttpRequestBody(var SNCCPaymentTermUpdate: Record "SNCC Payment Term Update"; var ContentBodys: JsonArray) | SNCC Payment HTTP Handler |
| PaymentTerm | OnBeforeApplyLatestChange(var SNCCPaymentTermUpdate: Record "SNCC Payment Term Update"; var SNCCPaymentTeLatestChange: Record "SNCC Payment Te. Latest Change") | SNCC Payment Term Change Mgt. |
| PaymentTerm | OnBeforeUpdatePaymentTermChangeLog(var SNCCPaymentTeLatestChange: Record "SNCC Payment Te. Latest Change"; var PaymentTerms: Record "Payment Terms") | SNCC Payment Term Change Mgt. |
| GLAccount | OnCheckCandisGLAccountUpdateNeeded(var GLAccount: Record "G/L Account"; var xGLAccount: Record "G/L Account"; var isNeeded: Boolean) | SNCC Transfer G/L Account Mgt. |
| GLAccount | OnBeforeUpdateCandisGLAccountEntry(var SNCCGLAccountUpdate: Record "SNCC G/L Account Update"; var GLAccount: Record "G/L Account") | SNCC Transfer G/L Account Mgt. |
| GLAccount | OnBeforeSetHttpRequestBody(var SNCCGLAccountUpdate: Record "SNCC G/L Account Update"; var ContentBody: JsonObject) | SNCC G/L Account HTTP Handler |
| GLAccount | OnBeforeApplyLatestChange(var SNCCGLAccountLastChange: Record "SNCC G/L Account Last. Change"; var SNCCGLAccountUpdate: Record "SNCC G/L Account Update") | SNCC G/L Account Change Mgt. |
| GLAccount | OnBeforeUpdateGLAccountChangeLog(var SNCCGLAccountLastChange: Record "SNCC G/L Account Last. Change"; var GLAccount: Record "G/L Account") | SNCC G/L Account Change Mgt. |
| VatPostSet | OnCheckCandisVatPostSetUpdateNeeded(var VATPostingSetup: Record "VAT Posting Setup"; var xVATPostingSetup: Record "VAT Posting Setup"; var isNeeded: Boolean) | SNCC Transfer VATPostSet Mgt. |
| VatPostSet | OnBeforeUpdateCandisVATPostSetEntry(var SNCCVATPostSetUpdate: Record "SNCC VATPostSet Update"; var VATPostingSetup: Record "VAT Posting Setup") | SNCC Transfer VATPostSet Mgt. |
| VatPostSet | OnBeforeSetHttpRequestBody(var SNCCVATPostSetUpdate: Record "SNCC VATPostSet Update"; var ContentBody: JsonObject) | SNCC VATPostSet HTTP Handler |
| VatPostSet | OnBeforeApplyLatestChange(var SNCCVATPostSetUpdate: Record "SNCC VATPostSet Update"; var SNCCVATPostSetLatestChange: Record "SNCC VATPostSet Latest Change") | SNCC VATPostSet Change Mgt. |
| VatPostSet | OnBeforeUpdateVATPostSetChangeLog(var SNCCVATPostSetLatestChange: Record "SNCC VATPostSet Latest Change"; var VATPostingSetup: Record "VAT Posting Setup") | SNCC VATPostSet Change Mgt. |
| Dimension | OnAfterApplyInterfaceSetup(var SNCCInterfaceSetup: Record "SNCC Interface Setup") | SNCC Interface Setup Wizard |
| Dimension | OnCheckDimensionActive(var IsDimensionActive: Boolean) | SNCC Dimension Helper |
| Dimension | OnBeforeCheckDimensionTypeValid(var DimensionValue: Record "Dimension Value"; var SNCCDimensionType: Enum "SNCC Dimension Type"; var isHandled: Boolean) | SNCC Transfer Dimension Mgt. |
| Dimension | OnAfterCombineDimensionTypeFiler(var DimensionTypeFilter: Text) | SNCC Dimension Helper |
| Dimension | OnBeforeSetHttpRequestBody(var SNCCDimensionUpdate: Record "SNCC Dimension Update"; var ContentBody: JsonObject) | SNCC Dimension HTTP Handler |
| Candis Import | OnBeforeInsertPurchInvHeader(var SNCCPurchInvHeader: Record "SNCC Purch. Inv. Header"; var ContentObject: JsonObject) | SNCC Export Doc Data Handler |
| Candis Import | OnBeforeInsertPurchInvLine(var SNCCPurchInvLine: Record "SNCC Purch. Inv. Line"; var LineContent: JsonToken) | SNCC Export Doc Data Handler |
| BC-Rechnungserstellung | OnBeforeModifyPurchaseHeader(var SNCCPurchInvHeader: Record "SNCC Purch. Inv. Header"; var PurchaseHeader: Record "Purchase Header") | SNCC Export Doc Transformer |
| BC-Rechnungserstellung | OnBeforeInsertPurchaseLine(var SNCCPurchInvLine: Record "SNCC Purch. Inv. Line"; var PurchaseLine: Record "Purchase Line") | SNCC Export Doc Transformer |
| VATReporting Date Extension - Setup | OnCheckVATReportingDateUsage(DeliveryDateUsage: Enum "SNCC Delivery Date Usage") | Table -> SNCC Interface Setup |
| VATReporting Date Extension - Wizard | OnCheckVATReportingDateUsage(SNCCDeliveryDateUsage: Enum "SNCC Delivery Date Usage") | Page -> SNCC Interface Setup Wizard |
| VATReporting Date Extension | OnSetDeliveryDateOnPurchaseHeader(var DeliveryDateUsage: Enum "SNCC Delivery Date Usage"; var PurchaseHeader: Record "Purchase Header"; var DeliveryDate: Date) | SNCC Export Doc Transformer |
Stammdatenübertragung
Im Rahmen der Weiterentwicklung des SIEVERS Candis Connectors besteht die Möglichkeit, zusätzliche Felder in den Stammdatenmodulen zu berücksichtigen und an das Candis-Portal zu übertragen. Die erforderlichen Implementierungsschritte können je nach Modul variieren. Abschnitt Kreditorenmodul beschreibt exemplarisch die Vorgehensweise zur Erweiterung der Stammdatenübertragung am Beispiel des Kreditorenmoduls. Diese Vorgehensweise ist auf die übrigen Module übertragbar. Eine Ausnahme bildet das Dimensionsmodul, da es abweichende Anforderungen an die Erweiterung stellt. Aus diesem Grund wird dessen spezifische Implementierung gesondert in Abschnitt Dimensionsmodul erläutert.
Kreditorenmodul
Hinweis: Das hier beschriebene Vorgehen gilt analog auch für die Module PaymentTerm, GLAccount und VatPostSet.
Die Erweiterung des Kreditorenmoduls umfasst drei wesentliche Anpassungen:
Erweiterung der Tabellen und Pages
Die Tabellen
SNCC Vendor Update,SNCC Vendor Updates ArchivsowieSNCC Vendor Latest Changemüssen um die neuen Felder erweitert werden. Dabei ist zwingend sicherzustellen, dass Basis und Archiv identisch aufgebaut sind. Für die Synchronisierung wird die interne AL-FunktionTransferFieldsverwendet, um Daten zwischen den Tabellen zu übertragen.Übernahme von Änderungen am Kreditor
Sobald im System Änderungen an Kreditor-Stammdaten vorgenommen werden, erfolgt deren Prüfung und Übernahme über mehrere Events:
- Überprüfung ob eine Änderung stattgefunden hat:
SNCC Transfer Vendor Mgt.->OnCheckCandisVendorUpdateNeededund/oderOnCheckCandisVendorBankAccountUpdateNeeded
[EventSubscriber(ObjectType::Codeunit, Codeunit::"SNCC Transfer Vendor Mgt.", 'OnCheckCandisVendorUpdateNeeded', '', false, false)] local procedure OnCheckCandisVendorUpdateNeeded(var Vendor: Record Vendor; var xVendor: Record Vendor; var isNeeded: Boolean) begin if Vendor."Country/Region Code" <> xVendor."Country/Region Code" then begin isNeeded := true; end; end;- Übernahme aus dem Kreditor in eine Update Entität:
SNCC Transfer Vendor Mgt.→OnBeforeUpdateCandisVendorEntry
[EventSubscriber(ObjectType::Codeunit, Codeunit::"SNCC Transfer Vendor Mgt.", 'OnBeforeUpdateCandisVendorEntry', '', false, false)] local procedure OnBeforeUpdateCandisVendorEntry(var SNCCVendorUpdate: Record "SNCC Vendor Update"; var Vendor: Record Vendor) begin SNCCVendorUpdate.Validate(Country, Vendor."Country/Region Code"); end;- Übernahme aus dem Kreditor in die Folgeaktualsierungen:
SNCC Vendor Change Mgt.→OnBeforeUpdateVendorChangeLog
[EventSubscriber(ObjectType::Codeunit, Codeunit::"SNCC Vendor Change Mgt.", 'OnBeforeUpdateVendorChangeLog', '', false, false)] local procedure OnBeforeUpdateVendorChangeLog(var SNCCVendorLatestChange: Record "SNCC Vendor Latest Change"; var Vendor: Record Vendor) begin SNCCVendorLatestChange.Validate(Country, Vendor."Country/Region Code"); end;- Übernahme aus den Folgeaktualsierungen in die Update Entität:
SNCC Vendor Change Mgt.→OnBeforeApplyLatestChange
[EventSubscriber(ObjectType::Codeunit, Codeunit::"SNCC Vendor Change Mgt.", 'OnBeforeApplyLatestChange', '', false, false)] local procedure OnBeforeApplyLatestChange(var SNCCVendorLatestChange: Record "SNCC Vendor Latest Change"; var SNCCVendorUpdate: Record "SNCC Vendor Update") begin SNCCVendorUpdate.Validate(Country, SNCCVendorLatestChange.Country); end;- Überprüfung ob eine Änderung stattgefunden hat:
Erweiterung der HTTP-Anfragen
Um die erweiterten Felder auch in die Kommunikation mit dem Candis-Portal einzubeziehen, wird der HTTP-Body im Event
OnBeforeSetHttpRequestBodyder CodeunitSNCC Vendor HTTP Handlererweitert.[EventSubscriber(ObjectType::Codeunit, Codeunit::"SNCC Vendor HTTP Handler", 'OnBeforeSetHttpRequestBodyValues', '', false, false)] local procedure OnBeforeSetHttpRequestBodyValues(var SNCCVendorUpdate: Record "SNCC Vendor Update"; var ContentBody: JsonObject) var CountryJsonValue: JsonValue; begin CountryJsonValue.SetValueToNull(); if SNCCVendorUpdate.Country <> '' then CountryJsonValue.SetValue(SNCCVendorUpdate.Country); ContentBody.Add('Country', CountryJsonValue); end;
Dimensionsmodul
Setup-Erweiterung In der
SNCC Interface Setup-Tabelle und der zugehörigen Page wird eine neue Dimension ergänzt.Enum-Erweiterung
Über eine Enum Erweiterung wird das Enum
SNCC Dimension Typeum einen neuen Typen ergänzt.Zuweisungslogik anpassen
Das Event
OnBeforeCheckDimensionTypeValidwird genutzt um die neue Dimension der Abfrage Logik bei einem Update hinzuzufügen. Weiterhin muss das EventOnCheckDimensionActivegenutzt werden, da die Standard Dimensionen deaktiviert werden können. Wenn keine Dimension aktiv ist, wird weiterführende Logik nicht ausgeführt. Dieses Event muss zur Aktivierung den Boolean passend setzen.[EventSubscriber(ObjectType::Codeunit, Codeunit::"SNCC Transfer Dimension Mgt.", 'OnBeforeCheckDimensionTypeValid', '', false, false)] local procedure OnBeforeCheckDimensionTypeValid(var DimensionValue: Record "Dimension Value"; var SNCCDimensionType: Enum "SNCC Dimension Type"; var isHandled: Boolean) var SNCCInterfaceSetup: Record "SNCC Interface Setup"; begin SNCCInterfaceSetup.Get(); case DimensionValue."Dimension Code" of SNCCInterfaceSetup."New Dimension": begin SNCCDimensionType := SNCCDimensionType::"New Dimension"; isHandled := true; end; end; end; [EventSubscriber(ObjectType::Codeunit, Codeunit::"SNCC Dimension Helper", 'OnCheckDimensionActive', '', false, false)] local procedure OnCheckDimensionActive(var IsDimensionActive: Boolean) var SNCCInterfaceSetup: Record "SNCC Interface Setup"; begin if not SNCCInterfaceSetup.Get() then begin SNCCInterfaceSetup.Init(); SNCCInterfaceSetup.Insert(true); end; isDimensionActive := (SNCCInterfaceSetup."Interface NEW DIMENSION Active" or SNCCInterfaceSetup."Interface Active"); end;Erweiterung der HTTP-Anfragen
Der Filtermechanismus zur Setzung von Dimensionsfiltern muss entsprechend erweitert werden. Hierfür steht das Event OnAfterCombineDimensionTypeFiler zur Verfügung. Wenn mehrere Dimensionen ergänzt werden sollen, ist ab der zweiten Dimension eine logische ODER-Verknüpfung mithilfe des Pipe-Operators (|) vorzunehmen. Da bereits eine Dimension gesetzt sein kann, muss dies zunächst überprüft werden.
[EventSubscriber(ObjectType::Codeunit, Codeunit::"SNCC Dimension Helper", 'OnAfterCombineDimensionTypeFiler', '', false, false)] local procedure OnAfterCombineDimensionTypeFiler(var DimensionTypeFilter: Text) begin if DimensionTypeFilter = '' then DimensionTypeFilter := Format(Enum::"SNCC Dimension Type"::"New Dimension") else DimensionTypeFilter += '|' + Format(Enum::"SNCC Dimension Type"::"New Dimension"); DimensionTypeFilter += '|' + Format(Enum::"SNCC Dimension Type"::"New Dimension 2"); end;Das Event
OnAfterSetHttpRequestBodyin der CodeunitSNCC Dimension HTTP Handlerwird angepasst, um die neue Dimension in den JSON-Body zu integrieren.[EventSubscriber(ObjectType::Codeunit, Codeunit::"SNCC Dimension HTTP Handler", 'OnBeforeSetHttpRequestBody', '', false, false)] local procedure OnBeforeSetHttpRequestBody(var SNCCDimensionUpdate: Record "SNCC Dimension Update"; var ContentBody: JsonObject) begin case SNCCDimensionUpdate."Dimension Type" of Enum::"SNCC Dimension Type"::"New Dimension": ContentBody.Add('type', 'New Dimension'); end; end;
Mit erfolgreicher Umsetzung dieser Erweiterung lassen sich zusätzliche Dimensionen systemseitig verwalten und vollautomatisch an das Candis-Portal übertragen.
Einkaufsbelegimport und Datenverarbeitung
Neben der Stammdatenübertragung bestehen weitere Möglichkeiten zur Erweiterung im Bereich des Einkaufsbelegimport aus dem Candis-Portal.
Empfangen weiterer Felder aus Candis in SNCCPurchInvHeader/Line
Erweiterung von Tabellen und Pages
- Tabellen:
SNCC Purch. Inv. HeaderundSNCC Purch. Inv. Header Archivfür Header-Felder - Pages:
SNCC Purch. Inv. HeadersundSNCC Purch. Inv. Head. Archivs - Tabellen:
SNCC Purch. Inv. LineundSNCC Purch. Inv. Line Archivfür Positionsdaten - Pages:
SNCC Purch. Inv. LinesundSNCC Purch. Inv. Line Archivs
- Tabellen:
Verarbeitung per Event-Subscriber
Das Event
SNCC Export Doc Data Handler:OnBeforeInsertPurchInvHeader: ermöglicht das Einlesen zusätzlicher Felder aus dem ContentObject und deren Speicherung in der TransfertabelleSNCCPurchInvHeader.OnBeforeInsertPurchInvLineist das Equivalent zu verwendende Event für die Purchase Line.[EventSubscriber(ObjectType::Codeunit, Codeunit::"SNCC Export Doc Data Handler", 'OnBeforeInsertPurchInvHeader', '', false, false)] local procedure OnBeforeInsertPurchInvHeader(var SNCCPurchInvHeader: Record "SNCC Purch. Inv. Header"; var ContentObject: JsonObject) var Country: Code[10]; CountryCode: JsonToken; LabelCountry: Label 'Country'; begin ContentObject.SelectToken(LabelCountry, CountryCode); SNCCPurchInvHeader."Country" := CountryCode.AsValue().AsText(); end; [EventSubscriber(ObjectType::Codeunit, Codeunit::"SNCC Export Doc Data Handler", 'OnBeforeInsertPurchInvLine', '', false, false)] local procedure OnBeforeInsertPurchInvLine(var SNCCPurchInvLine: Record "SNCC Purch. Inv. Line"; var LineContent: JsonToken) var Country: Code[10]; CountryCode: JsonToken; LabelCountry: Label 'Country'; begin LineContent.SelectToken(LabelCountry, CountryCode); SNCCPurchInvLine."Country" := CountryCode.AsValue().AsText(); end;
Verarbeitung von SNCCPurchInvHeader/Line zu einem BC-Beleg
Verarbeitung per Event-Subscriber
In
SNCC Export Doc Transformer:OnBeforeModifyPurchaseHeader: erzeugt einen BC-Purchase Header aus dem Candis-Header
[EventSubscriber(ObjectType::Codeunit, Codeunit::"SNCC Export Doc Transformer", 'OnBeforeModifyPurchaseHeader', '', false, false)] local procedure OnBeforeModifyPurchaseHeader(var SNCCPurchInvHeader: Record "SNCC Purch. Inv. Header"; var PurchaseHeader: Record "Purchase Header") begin PurchaseHeader.Validate("Field", SNCCPurchInvHeader.Field); end;OnBeforeInsertPurchaseLine: erzeugt eine BC-Purchase Line aus der Candis-Zeile
[EventSubscriber(ObjectType::Codeunit, Codeunit::"SNCC Export Doc Transformer", 'OnBeforeInsertPurchaseLine', '', false, false)] local procedure OnBeforeInsertPurchaseLine(var SNCCPurchInvLine: Record "SNCC Purch. Inv. Line"; var PurchaseLine: Record "Purchase Line") begin PurchaseLine.Validate("Area", SNCCPurchInvLine.Country); end;
Erweiterung der Logik für das Setzen des Leistungsdatum
Ziel dieser Erweiterung ist es, das Leistungsdatum vom Candis Portal in ein anderes Feld des Purchase Headers zu schreiben. Wie Abschnitt Einkaufsbeleg Einrichtung beschreibt, kann ddas Leistungsdatum so konfiguriert werden, dass es in andere Felder geschrieben wird.
Erweiterung des Enums
SNCC Delivery Date UsageNeue Option zur alternativen Zuweisung des Datums hinzufügenSubscriber zur Auswahlkontrolle der Konfiguration (Optional) Wenn notwendig kann an dieser Stelle eine Überprüfung stattfinden
SNCC Interface Setup(Table) →OnCheckVATReportingDateUsage
Subscriber zum Setzen des konfigurierten Feldes
SNCC Export Doc Transformer→OnSetDeliveryDateOnPurchaseHeader
[EventSubscriber(ObjectType::Codeunit, Codeunit::"SNCC Export Doc Transformer", 'OnSetDeliveryDateOnPurchaseHeader', '', false, false)] local procedure OnSetDeliveryDateOnPurchaseHeader(var DeliveryDateUsage: Enum "SNCC Delivery Date Usage"; var PurchaseHeader: Record "Purchase Header"; var DeliveryDate: Date) begin case DeliveryDateUsage of "SNCC Delivery Date Usage"::"New usage": begin PurchaseHeader.Validate("Order Date", DeliveryDate); end; end; end;
Mit diesen Erweiterungen wird die Flexibilität und Erweiterbarkeit des Candis Connectors im Bereich der automatisierten Einkaufsbelegverarbeitung gewährleistet.
Kacheln des Candis Connectors in weitere Rollencenter integrieren
Die CueGroup mit den Kacheln des Candis Connectors ist in einer eigenständigen DataPart Page namens SNCC Cues implementiert. Diese Page kann flexibel in beliebige Rollencenter eingebunden werden.
Nachfolgend ein Beispiel zur Einbindung der SNCC Cues in das Team Member Role Center:
pageextension 72093123 "SNCC TeamMemberRoleCenter" extends "Team Member Role Center"
{
layout
{
addafter(Control3)
{
part("SNCC Cues"; "SNCC Cues")
{
ApplicationArea = Suite;
}
}
}
}
Wenn kein Candis-Interface aktiv ist und die entsprechenden Kacheln nicht benötigt werden, können diese über die „Personalisieren“-Funktion in Microsoft Dynamics 365 Business Central ausgeblendet werden.
Gehen Sie dazu wie folgt vor:
Öffnen Sie das entsprechende Rollencenter.
Klicken Sie oben rechts auf das Zahnrad-Symbol und wählen Sie „Personalisieren“ aus.
Markieren Sie den Bereich „Candis.
Klicken Sie auf das kleine rote Dreieck in der oberen rechten Ecke des markierten Bereichs und wählen Sie „Ausblenden“.
Wenn Sie die Kacheln später wieder einblenden möchten, führen Sie dieselben Schritte erneut aus. Anstelle der Option „Ausblenden“ wird Ihnen die Option „Einblenden“ angeboten.
Diese Vorgehensweise ermöglicht eine einfache Erweiterung bestehender Rollencenter um die Candis-spezifischen Kacheln, ohne die Originalstruktur wesentlich zu verändern.
