Het B2Brouter-contact-Page-Part integreren
Met het Page Part B2Brouter koppelt u een Business Central-klant op een eigen klantpagina aan een contact in uw B2Brouter-account. Zoals op de standaard Klantenkaart kunt u contacten zoeken, maken en bijwerken, Peppol-ontvangers controleren en transport- en documenttypen instellen.
Vereisten en toepassingsgebied
- Installeer en licentieer Document Dispatch en richt de gebruikerstoegang in. Neem Document Dispatch en CORE by Simova op als afhankelijkheden in
app.json. Gebruik de ID's, uitgever en compatibele versies van de geïnstalleerde apps en download hun symbolen. - Stel account-ID en API-sleutel in bij B2Brouter-module-instellingen. De testmodus gebruikt staging; anders wordt productie gebruikt. De zichtbaarheidscontrole in het voorbeeld controleert alleen een aanwezig account-ID, zonder de geselecteerde verbinding te valideren.
- Gebruikers hebben toegang nodig tot de hoofdpagina en
Customer, plus passende Document Dispatch-machtigingen.SIM_EDS USERenSIM_EDS ADMINbevatten het Page Part, de contacttabel en de beheercodeunit. Zichtbaarheid verleent geen machtigingen. - Gebruik een opgeslagen klant met een ingevuld nummer. Pas object-ID
50100, namen en bijschriften aan uw oplossing aan.
Eigen pagina's op basis van Customer
De volledige werking vereist momenteel SourceTable = Customer. Hoewel SetContext een tabel-ID accepteert, halen Contact maken, Contact bijwerken en routeringswijzigingen intern een Customer op via het opgegeven nummer. Ook de bevestiging zoekt de koppeling met Database::Customer. Een willekeurige eigen tabel-ID maakt deze acties niet geschikt voor die tabel. Koppel een andere entiteit eerst aan een echte klant en geef het nummer, tabel-ID en de gegevens van die klant door.
Objecten en opgeslagen gegevens
Het ingesloten object is pagina 5492741, SIM_EDS B2Brouter Contact LP. Ondanks het achtervoegsel LP is het PageType CardPart. De brontabel is 5492683, SIM_EDS B2Brouter Contact, met SourceTableTemporary = true.
Het Page Part gebruikt een tijdelijke regel en leest de blijvende configuratie via de samengestelde sleutel No. + Table Id. Pagina's met dezelfde klantsleutel delen de koppeling. Opgeslagen worden contact-ID, zoekinstellingen en resultaten, transport-/documenttype en openstaande routeringswijzigingen. De sleutel bevat geen account of omgeving: wisselen van testmodus selecteert niet automatisch een afzonderlijke lokale koppeling. Controleer het gekoppelde contact in het geselecteerde account.
Het Page Part vullen met SetContext
SubPageLink koppelt het Page Part aan de klantsleutel. Roep daarnaast de openbare procedure SetContext aan om de tijdelijke regel en zoekvariabelen te vullen. Alleen SubPageLink is onvoldoende.
procedure SetContext(ParamNoCode: Code[50]; ParamTableIdInteger: Integer;
ParamNameText: Text; ParamCountryCodeText: Text;
ParamSchemeCodeText: Text; ParamIdentifierText: Text; ParamEmailText: Text)
| Parameter | Type | Waarde en doel |
|---|---|---|
ParamNoCode |
Code[50] |
Rec."No.": klantnummer en eerste deel van de sleutel. |
ParamTableIdInteger |
Integer |
Database::Customer: tweede sleuteldeel; moet overeenkomen met SubPageLink. |
ParamNameText |
Text |
Rec.Name: zoektekst voor contacten. |
ParamCountryCodeText |
Text |
Rec."Country/Region Code": land voor de zoekopdracht. |
ParamSchemeCodeText |
Text |
'' voor zoeken op btw-nummer en land, of een geldige B2Brouter-schemacode. Het Page Part accepteert maximaal 100 tekens. |
ParamIdentifierText |
Text |
Rec."VAT Registration No.": standaardidentificatie voor de zoekopdracht. |
ParamEmailText |
Text |
Rec."E-Mail": wordt gebruikt bij de beschikbare transportkeuzes. |
Elke aanroep bouwt de tijdelijke regel opnieuw op en laadt een bestaande koppeling. Opgeslagen Directory Scheme Code vervangt het doorgegeven schema. Een ingevulde opgeslagen Lookup Identifier wordt gebruikt als er een schema is geselecteerd; anders geldt de doorgegeven standaardidentificatie. Het Page Part beheert de keuze en validatie van het schema. Een leeg doorgegeven schema wist geen opgeslagen keuze.
Een klant openen of naar een andere klant gaan maakt geen blijvende koppeling aan. Zoekinstellingen opslaan, een contact koppelen/maken of het register controleren kan dat wel doen. Voor een gekoppeld contact kan SetContext routeringsgegevens bij B2Brouter ophalen. De geladen context wordt bewaard om een nieuwe aanvraag bij elke veldvalidatie te voorkomen; de aanroep is dus niet uitsluitend lokaal.
Volledig voorbeeld: eigen klantenkaart
Deze zelfstandige pagina gebruikt Customer en plaatst het Page Part in een groep B2Brouter. De context wordt bijgewerkt bij een andere huidige record en na wijzigingen. De tien overgedragen velden vragen alleen een externe update als hun waarde werkelijk verandert.
page 50100 "My B2Brouter Customer Card"
{
PageType = Card;
SourceTable = Customer;
ApplicationArea = All;
Caption = 'My Customer Card';
layout
{
area(Content)
{
group(General)
{
Caption = 'General';
field(CustomerNo; Rec."No.")
{
ApplicationArea = All;
}
field(Name; Rec.Name)
{
ApplicationArea = All;
trigger OnValidate()
begin
HandleCustomerChange(Rec.Name <> xRec.Name);
end;
}
field(Address; Rec."Address")
{
ApplicationArea = All;
trigger OnValidate()
begin
HandleCustomerChange(Rec."Address" <> xRec."Address");
end;
}
field(Address2; Rec."Address 2")
{
ApplicationArea = All;
trigger OnValidate()
begin
HandleCustomerChange(Rec."Address 2" <> xRec."Address 2");
end;
}
field(PostCode; Rec."Post Code")
{
ApplicationArea = All;
trigger OnValidate()
begin
HandleCustomerChange(Rec."Post Code" <> xRec."Post Code");
end;
}
field(City; Rec."City")
{
ApplicationArea = All;
trigger OnValidate()
begin
HandleCustomerChange(Rec."City" <> xRec."City");
end;
}
field(County; Rec."County")
{
ApplicationArea = All;
trigger OnValidate()
begin
HandleCustomerChange(Rec."County" <> xRec."County");
end;
}
field(CountryCode; Rec."Country/Region Code")
{
ApplicationArea = All;
trigger OnValidate()
begin
HandleCustomerChange(Rec."Country/Region Code" <> xRec."Country/Region Code");
end;
}
field(VATRegistrationNo; Rec."VAT Registration No.")
{
ApplicationArea = All;
trigger OnValidate()
begin
HandleCustomerChange(Rec."VAT Registration No." <> xRec."VAT Registration No.");
end;
}
field(Email; Rec."E-Mail")
{
ApplicationArea = All;
trigger OnValidate()
begin
HandleCustomerChange(Rec."E-Mail" <> xRec."E-Mail");
end;
}
field(PhoneNo; Rec."Phone No.")
{
ApplicationArea = All;
trigger OnValidate()
begin
HandleCustomerChange(Rec."Phone No." <> xRec."Phone No.");
end;
}
}
group(B2Brouter)
{
Caption = 'B2Brouter';
Visible = B2BrouterVisible;
part(B2BrouterContact; "SIM_EDS B2Brouter Contact LP")
{
ApplicationArea = All;
SubPageLink = "No." = field("No."),
"Table Id" = const(Database::Customer);
}
}
}
}
trigger OnOpenPage()
var
EDSSetup: Record "SIM_EDS Setup";
COREManagement: Codeunit "SIM_CORE Mgt";
begin
if not COREManagement.CheckPermissions(
UserSecurityId(), 'SIM_EDS USER | SIM_EDS ADMIN | SUPER')
then
exit;
if not EDSSetup.Get() then
exit;
B2BrouterVisible := (EDSSetup."B2Brouter Account Id" <> '') or
(EDSSetup."B2Brouter Account Id Staging" <> '');
end;
trigger OnAfterGetCurrRecord()
begin
UpdateB2BrouterContext();
end;
trigger OnModifyRecord(): Boolean
begin
UpdateB2BrouterContext();
exit(true);
end;
local procedure UpdateB2BrouterContext()
begin
if not B2BrouterVisible then
exit;
CurrPage.B2BrouterContact.Page.SetContext(
Rec."No.", Database::Customer, Rec.Name,
Rec."Country/Region Code", '',
Rec."VAT Registration No.", Rec."E-Mail");
end;
local procedure HandleCustomerChange(Changed: Boolean)
begin
UpdateB2BrouterContext();
if B2BrouterVisible and Changed then
CurrPage.B2BrouterContact.Page.ConfirmCustomerContactUpdate(Rec);
end;
var
B2BrouterVisible: Boolean;
}
Het voorbeeld aanpassen
- Integreer groep, variabelen, procedures en triggers in uw eigen
Customer-pagina. Gebruik in een Page Extensionaddlast(Content)of een geschikteaddafter(...)-positie. Breid veldvalidaties uit metmodify(...)enOnAfterValidate, metHandleCustomerChange(Rec.<veld> <> xRec.<veld>). CurrPage.B2BrouterContact.Page...verwijst naar de controlenaam inpart(B2BrouterContact; ...), niet naar de objectnaam van de ingesloten pagina.- Roep
SetContextaan inOnAfterGetCurrRecord, zodat navigeren de juiste koppeling toont. Vernieuw de context ook na wijzigingen van naam, land, btw-nummer of e-mail en na opslaan. Behoud bestaande validatie- en opslaglogica. - Verwerk voor hetzelfde gedrag als de standaardkaart Naam, Adres, Adres 2, Postcode, Plaats, Regio, Land-/regiocode, Btw-nummer, E-mail en Telefoonnummer. Geef na het vernieuwen van de context de volledige huidige klant, inclusief nog niet opgeslagen veldwijzigingen, door aan
ConfirmCustomerContactUpdate(ParamRecordCustomer: Record Customer). Deze openbare procedure vraagt toestemming voor het bijwerken van een gekoppeld contact. Bij weigering of een fout blijft de BC-wijziging behouden. - Vraag geen bevestiging bij alleen openen, navigeren of ongewijzigd opslaan. Het
OnModifyRecordin het voorbeeld vernieuwt uitsluitend de context. Het Page Part beheert de eigen acties; de hoofdpagina roept geen interne procedures vanSIM_EDS B2Brouter Contact Mgtaan. - De standaardklantenkaart bevat dit Page Part al. Voeg het toe aan uw eigen pagina zonder het op de standaardkaart te dupliceren.
Beschikbare functies
Lookup Contact selecteert een bestaand accountcontact. Create Contact gebruikt opgeslagen klantgegevens, inclusief adres en telefoon; sla de klant vooraf op. Update Contact verstuurt de huidige gegevens na bevestiging. De hoofdpagina heeft alleen de twee beschreven openbare procedures nodig.
Laat voor Check Peppol Receiver het schema leeg om btw-nummer en land te gebruiken, of selecteer een schema met identificatie. Resultaat en tijdstip worden opgeslagen. Na wijziging van land, schema of identificatie meldt de status gewijzigde gegevens totdat u opnieuw controleert. Ontvangerregistratie en een koppeling met een accountcontact zijn afzonderlijke resultaten.
Transporttype en Documenttype worden voor een gekoppeld contact geladen. Gebruik de keuzelijsten voor ondersteunde waarden en kies eerst het transport. Voor Peppol moeten de ontvangerformaten voor de huidige identificatie bevestigd zijn. Routeringswijzigingen vragen bevestiging; bij weigering of een fout blijven ze als Routing Changes Pending openstaan. Update Contact verstuurt ze opnieuw. Refresh Contact haalt externe waarden op en vraagt bevestiging voordat openstaande wijzigingen worden verworpen. Deze instellingen vervangen het verzendprofiel of de JSON-schema-inrichting niet.
De integratie controleren
- Open een opgeslagen klant zonder koppeling: het zichtbare Page Part toont de context zonder alleen door het openen een contact aan te maken.
- Wissel tussen twee klanten en open de pagina opnieuw. Controleer elke koppeling en de opgeslagen zoekinstellingen.
- Koppel een contact, controleer een ontvanger en maak voor een andere opgeslagen klant een contact in het ingestelde testaccount. Controleer de gegevens in B2Brouter.
- Wijzig elk overgedragen veld. Een echte wijziging van een gekoppelde klant moet een update aanbieden; openen en ongewijzigd opslaan mogen dit niet doen. Test bevestigen en weigeren.
- Wijzig de routering, weiger de overdracht en probeer opnieuw met Update Contact. Test Refresh Contact bij openstaande wijzigingen en de ontvangerstatus na wijziging van identificatie/land.
| Symptoom | Controle |
|---|---|
| Page Part verborgen | Machtigingen, instellingsrecord, zichtbaarheidsvariabele en productie-/staging-account-ID's. |
| Lege of verkeerde context | Rec, controlenaam, OnAfterGetCurrRecord, alle zeven SetContext-argumenten en overeenkomende SubPageLink-sleutel. |
| Klant ontbreekt bij een actie | Opgeslagen klantnummer en Database::Customer; de volledige werking ondersteunt geen willekeurige tabel-ID's. |
| Verbindingsfout of geen routeringskeuzes | Omgeving/account/API-sleutel, gekoppeld contact, land/schema/identificatie en ontvangerformaten. |
| Herhaalde bevestigingen | Alleen bevestigen bij echte veldwijzigingen, niet vanuit navigatie- of opslagtriggers. |