Zum Inhalt

API Customization

WebConnector API customizations in Business Central are possible through extensions to this app. Through appropriate events, new services can be integrated into the existing WebConnector solution. In addition, certain events also enable the enrichment or manipulation of data.

Add new services

To add new services to the WebConnector, events must be subscribed to. Then in the WebConnector Setup click on WebConnector Services and then Find Services.

Add codeunit services

Add an event subscriber to the codeunit.

[EventSubscriber(ObjectType::Table, Database::"WebConnector ServicesTWC", 'OnDiscoverWebConnectorServices', '', true, true)]  
local procedure InsertWebConnectorService(sender: Record "WebConnector ServicesTWC")  
var  
  WebConnectorServiceType: enum WebConnectorServiceTypeTWC;  
begin  
  sender.SetupWebConnectorService(WebConnectorServiceType::Codeunit, Codeunit::"<Ihre Codeunit>", '<Ihr Servicename>');  
end;

Example codeunit service

A codeunit as web service can be created standalone or in combination with an XML port. For this the XML port is passed as VAR parameter in the codeunit. This allows the complex structure to be used as a parameter directly with a SOAP client. The following example shows a simple implementation of the service Outbound Contact, which can be used to export contact master data for a customer number.

Codeunit Outobund Contact

codeunit 5371212 "Outbound ContactTWC"  
{  
  [Scope('Cloud')]
  procedure GetContactsFromCustomer(var OutboundContact: XMLport "Outbound ContactTWC"; CustomerNo: Code[20])
  var
    ContactBusinessRelation: Record "Contact Business Relation";
    Contact: Record Contact;
  begin
    ContactBusinessRelation.SetRange("Link to Table", ContactBusinessRelation."Link to Table"::Customer);
    ContactBusinessRelation.SetRange("No.", CustomerNo);
    ContactBusinessRelation.FindFirst();
    Contact.SetRange("Company No.", ContactBusinessRelation."Contact No.");
    OutboundContact.SetTableView(Contact);
  end;
  [EventSubscriber(ObjectType::Table, Database::"WebConnector ServicesTWC", 'OnDiscoverWebConnectorServices', '', true, true)]
  local procedure InsertWebConnectorService(sender: Record "WebConnector ServicesTWC")  
  var  
    WebConnectorServiceType: enum WebConnectorServiceTypeTWC;  
  begin
    sender.SetupWebConnectorService(WebConnectorServiceType::Codeunit, Codeunit::"Outbound ContactTWC", 'OutboundContact');
  end;
}

XML Port Outbound Contact

xmlport 5371211 "Outbound ContactTWC"  
{  
   Direction = Export;  
   Encoding = UTF8;  
   FormatEvaluate = Xml;  
   UseDefaultNamespace = true;  
   schema  
   {  
       textelement(Contacts)  
       {  
           MaxOccurs = Once;  
           tableelement(Contact;Contact)  
           {  
               XmlName = 'Contact';  
               fieldelement(No;Contact."No.")  
               {  
               }  
               fieldelement(Name;Contact.Name)  
               {  
               }  
               fieldelement(Type;Contact.Type)  
               {  
               }  
               fieldelement(CompanyNo;Contact."Company No.")  
               {  
               }  
           }  
       }  
   }  
}

Important: The properties FormatEvaluate = Xml and UseDefaultNamespace = true of the XML port must be set in all cases.

Add page services

To add page services create a code unit, e.g. "WebConnector Cust. Page Subscriber", and bind to the event there to add new services.

[EventSubscriber(ObjectType::Table, Database::"WebConnector ServicesTWC", 'OnDiscoverWebConnectorServices', '', true, true)]  
local procedure WebConnectorServicesOnDiscoverWebConnectorServices(sender: Record "WebConnector ServicesTWC")  
var  
  WebConnectorServiceType: enum WebConnectorServiceTypeTWC;  
begin  
  sender.SetupWebConnectorService(WebConnectorServiceType::Page, Page::"<your Page>", '<your Service name>');  
// additional pages can be entered here.  
end;

Examples for Pages

Pages can be easily created and registered as a WebConnector service with the event corresponding event. The following is a simple example for item variants:

page 5371208 "Item VariantTWC"  
{  
   Caption = 'Item Variant';  
   UsageCategory = None;  
   DeleteAllowed = false;  
   PageType = Document;  
   SourceTable = "Item Variant";  
   layout  
   {  
       area(content)  
       {  
           group(Allgemein)  
           {  
               field("Code"; Code)  
               {  
                   ApplicationArea = all;  
                   ToolTip = 'Specifies Code';  
               }  
               field("Item No."; "Item No.")  
               {  
                   ApplicationArea = all;  
                   ToolTip = 'Specifies Item No.';  
               }  
               field(Description; Description)  
               {  
                   ApplicationArea = all;  
                   ToolTip = 'Specifies Description';  
               }  
               field("Description 2"; "Description 2")  
               {  
                   ApplicationArea = all;  
                   ToolTip = 'Specifies Description 2';  
               }  
           }  
       }  
   }  
}

Available events

Inb. Doc. Check Doc. Dup.TWC

CheckSalesHeaderDuplicateOnAfterFilterCreateInboundSalesDocLogEntrySalesHeaderExtNo  
Parameter:   
InboundSalesHeader: Record "Inbound Sales HeaderTWC";   
VAR SalesHeader: Record "Sales Header"
CheckSalesHeaderDuplicateOnAfterFilterInboundSalesDocLogEntrySalesShipHeaderExtNo  
Parameter:   
InboundSalesHeader: Record "Inbound Sales HeaderTWC";   
VAR SalesHeader: Record "Sales Shipment Header"
CheckSalesHeaderDuplicateOnAfterFilterCreateInboundSalesDocLogEntrySalesHeaderYourRef  
Parameter:   
InboundSalesHeader: Record "Inbound Sales HeaderTWC";   
VAR SalesHeader: Record "Sales Header"
CheckSalesHeaderDuplicateOnAfterFilterInboundSalesDocLogEntrySalesShipHeaderYourRef  
Parameter:   
InboundSalesHeader: Record "Inbound Sales HeaderTWC";   
VAR SalesHeader: Record "Sales Shipment Header"
CheckSalesHeaderDuplicateOnAfterFilterCreateInboundSalesDocLogEntrySalesHeaderCreatedDocNo  
Parameter:   
InboundSalesHeader: Record "Inbound Sales HeaderTWC";   
VAR SalesHeader: Record "Sales Header"
CheckInboundSalesHeaderDuplicateOnAfterFilterInboundSalesHeaderFilterCreatedExtNo  
Parameter:   
InboundSalesHeader: Record "Inbound Sales HeaderTWC"; 
CheckInboundSalesHeaderDuplicateOnAfterFilterInboundSalesHeaderFilterCreatedDocNo  
Parameter:   
InboundSalesHeader: Record "Inbound Sales HeaderTWC"; 

InbDocCreateDocument.Codeunit

CreateSalesHeaderOnBeforeInsertSalesHeader  
Parameter:   
InboundSalesHeader: Record "Inbound Sales HeaderTWC";   
VAR SalesHeader: Record "Sales Header"
CreateSalesHeaderOnBeforeModifySalesHeader  
Parameter:   
InboundSalesHeader: Record "Inbound Sales HeaderTWC";   
VAR SalesHeader: Record "Sales Header"
CreateSalesLineOnBeforeInsertSalesLine  
Parameter:   
InboundSalesHeader: Record "Inbound Sales HeaderTWC";   
SalesHeader: Record "Sales Header";   
InboundSalesLine: Record "Inbound Sales LineTWC";   
VAR SalesLine: Record "Sales Line"
CreateSalesLineOnBeforeModifySalesLine  
Parameter:  
InboundSalesHeader: Record "Inbound Sales HeaderTWC";   
SalesHeader: Record "Sales Header";   
InboundSalesLine: Record "Inbound Sales LineTWC";   
VAR SalesLine: Record "Sales Line"
OnBeforeRegisterInboundDocument  
Parameter:  
InboundSalesHeader: Record "Inbound Sales HeaderTWC"
OnBeforeCommitBeforeRelease  
Parameter:  
InboundSalesHeader: Record "Inbound Sales HeaderTWC"
CreateSalesDocumentOnAfterDocumentIsInserted  
Parameter:  
Var InboundSalesHeader: Record "Inbound Sales HeaderTWC";  
Var SalesHeader: Record "Sales Header"
OnValidateCustomerBankAccountFieldFromInboundSalesHeader  
Parameter:  
var CustomerBankAcc: Record "Customer Bank Account";  
InboundSalesHeader: Record "Inbound Sales HeaderTWC"
CreateSalesHeaderOnBeforeTestfieldSellToContactNo  
Parameter:  
InboundSalesHeader: Record "Inbound Sales HeaderTWC"  
var SalesHeader: Record "Sales Header"  
var IsHandled: Boolean
CreateSalesHeaderOnBeforeValidateSellToContactNo  
Parameter:  
InboundSalesHeader: Record "Inbound Sales HeaderTWC"  
var SalesHeader: Record "Sales Header"  
var IsHandled: Boolean
CreateSalesHeaderOnBeforeUpdateSalesHeader  
Parameter:  
InboundSalesHeader: Record "Inbound Sales HeaderTWC"  
var SalesHeader: Record "Sales Header"
CreateSalesLineOnAfterModifySalesLine  
Parameter:  
InboundSalesHeader: Record "Inbound Sales HeaderTWC"  
SalesHeader: Record "Sales Header"  
InboundSalesLine: Record "Inbound Sales LineTWC"  
var SalesLine: Record "Sales Line"

InbDocCreateContact.Codeunit

CreateBillToContactOnBeforeInsertContact  
Parameter  
InboundSalesHeader: Record "Inbound Sales HeaderTWC";   
VAR Contact: Record Contact
CreateBillToContactOnBeforeModifyContact  
Parameter:  
InboundSalesHeader: Record "Inbound Sales HeaderTWC";   
VAR Contact: Record Contact
CreateSellToContactOnBeforeInsertContact  
Parameter:  
InboundSalesHeader: Record "Inbound Sales HeaderTWC";   
VAR Contact: Record Contact
CreateSellToContactOnBeforeModifyContact  
Parameter:  
InboundSalesHeader: Record "Inbound Sales HeaderTWC"  
VAR Contact: Record Contact
CreateCustomerOnBeforeCreateCustomer  
Parameter:  
Contact: Record Contact
CreateSellToContactOnAfterCreateCustomer  
Parameter:  
InboundSalesHeader: Record "Inbound Sales HeaderTWC";  
Contact: Record Contact
CreateBillToContactOnAfterCreateCustomer  
Parameter:  
InboundSalesHeader: Record "Inbound Sales HeaderTWC";  
Contact: Record Contact
OnAfterCreateContacts  
Parameter:  
InboundSalesHeader: Record "Inbound Sales HeaderTWC"

SalesManagement.Codeunit

AddToTempSalesHeaderOnBeforeInsertTempSalesHeader  
Parameter:  
FromTempSalesHeader: Record "Sales Header" temporary;   
VAR TempSalesHeader: record "Sales Header" temporary
AddToTempSalesHeaderOnBeforeModifyTempSalesHeader  
Parameter:  
FromTempSalesHeader: Record "Sales Header" temporary  
VAR TempSalesHeader: record "Sales Header" temporary
AddToTempSalesLineOnBeforeInsertTempSalesLine  
Parameter:  
FromTempSalesHeader: Record "Sales Header" temporary;   
FromTempSalesLine: Record "Sales Line" temporary;   
var TempSalesLine: Record "Sales Line"
AddToTempSalesLineOnBeforeModifyTempSalesLine  
Parameter:  
FromTempSalesHeader: Record "Sales Header" temporary;   
FromTempSalesLine: Record "Sales Line" temporary;   
var TempSalesLine: Record "Sales Line"
CreateContactFromShopOnBeforeInsertContact  
Parameter:  
SalesHeader: Record "Sales Header";   
var Contact: Record Contact
CreateContactFromShopOnBeforeModifyContact  
Parameter:  
SalesHeader: Record "Sales Header";   
var Contact: Record Contact
CreateShippingAddressOnBeforeInsertShipToAddress  
Parameter:  
SalesHeader: Record "Sales Header";   
var ShipToAddress: Record "Ship-to Address"
CreateShippingAddressOnBeforeModifyShipToAddress  
Parameter:  
SalesHeader: Record "Sales Header";   
var ShipToAddress: Record "Ship-to Address"

InbDocCheckMgt.codeunit

``` objectpascal
OnCheckCodeunitIsValid  
Parameter:   
var IsValid: Boolean;   
CodeunitID: Integer
ProcessingAllowedOnBeforeFindCheckInbDocCode  
Parameter:  
var CheckInbDocCode: Record "Inb. Doc. Test Step DetailsTWC"
local procedure OnBeforeProcessTestPlan  
Parameter:  
InbSalesHeader: Record "Inbound Sales HeaderTWC"
local procedure OnAfterProcessTestPlan  
Parameter:  
InbSalesHeader: Record "Inbound Sales HeaderTWC"  
InbDocCode: Record "Inb. Doc. Test Step DetailsTWC"
local procedure OnBeforeCreateTestplan  
Parameter:  
var TestPlan: Record "Inb. Sales Doc. Test PlanTWC"  
InbSalesHeader: Record "Inbound Sales HeaderTWC"
local procedure OnTestplanIsEmpty  
Parameter:  
var TestPlan: Record "Inb. Sales Doc. Test PlanTWC"

Inb. Doc. Check PositionsTWC.codeunit

OnAfterInitErrorState  
Parameter:  
var ItemErrorStateList: List of [Text] 
OnAfterCheckPositions  
Parameter:  
InboundSalesLine: Record "Inbound Sales LineTWC";   
var TempItemTracingBuffer: Record "Item Tracing Buffer" temporary;   
ItemErrorStateList: List of [Text]
OnBeforeModifyUpdateInboundDocumentCode  
Parameter:  
var InboundDocumentCode: Record "Inb. Doc. Test Step DetailsTWC";  
var TempItemTracingBuffer: Record "Item Tracing Buffer" temporary;  
ItemErrorStateList: List of [Text]

Inb. Doc. Identify ContactTWC.codeunit

FindContactOnBeforeContactFindlast  
Parameter:  
var Contact: Record Contact;   
InboundSalesHeader: Record "Inbound Sales HeaderTWC"

InboundDocumentTestStep.table

OnInitializeCheckRoutines  
Parameter:  
None
OnInitializeCheckPlan  
Parameter:  
None

Outbound Item Availability.xmlport

OnBeforePassVariableItemAvailabilityAvailability  
Parameter:  
var Item: Record Item

Outbound Sales Invoice.xmlport

OnBeforePassFieldHeaderGeneralOrderDate  
Parameter:  
var SalesInvHeader: Record "Sales Invoice Header"