Integrar el Page Part de contactos B2Brouter
El Page Part B2Brouter vincula un cliente de Business Central con un contacto de su cuenta B2Brouter desde una página personalizada. Como en la Ficha de cliente estándar, permite buscar, crear y actualizar contactos, comprobar receptores Peppol y configurar los tipos de transporte y documento.
Requisitos y alcance
- Instale Document Dispatch, active su licencia y configure el acceso de usuarios. Incluya Document Dispatch y CORE by Simova en las dependencias de
app.json, con los IDs, el editor y las versiones compatibles de las aplicaciones instaladas. Descargue sus símbolos. - Configure cuenta y clave API en la Configuración del módulo B2Brouter. El modo de prueba utiliza staging; de lo contrario se utiliza producción. La condición de visibilidad del ejemplo solo comprueba que exista un ID de cuenta, sin validar la conexión seleccionada.
- Los usuarios necesitan acceso a la página principal y a
Customer, además de los permisos de Document Dispatch.SIM_EDS USERySIM_EDS ADMINincluyen el Page Part, su tabla de contactos y la codeunit de gestión. La visibilidad no concede permisos. - Utilice un cliente guardado con un número no vacío. Adapte el ID de objeto
50100, los nombres y los títulos a su solución.
Páginas personalizadas basadas en Customer
El flujo completo requiere actualmente SourceTable = Customer. Aunque SetContext acepta un ID de tabla, Crear contacto, Actualizar contacto y los cambios de enrutamiento recuperan internamente un Customer mediante el número recibido. La confirmación también busca la vinculación con Database::Customer. Pasar un ID de tabla personalizada independiente no adapta estas acciones a dicha tabla. Para otra entidad, defina primero su correspondencia con un cliente real y pase el número, ID de tabla y datos de ese cliente.
Objetos y almacenamiento
El objeto integrado es la página 5492741, SIM_EDS B2Brouter Contact LP. A pesar del sufijo LP, su PageType es CardPart. Su origen es la tabla 5492683, SIM_EDS B2Brouter Contact, con SourceTableTemporary = true.
El Page Part muestra una fila temporal y lee la configuración persistente mediante la clave compuesta No. + Table Id. Las páginas con la misma clave de cliente comparten la vinculación. Se guardan el ID del contacto, los ajustes y resultados del directorio, los tipos de transporte/documento y el estado pendiente del enrutamiento. La clave no incluye cuenta ni entorno: cambiar el modo de prueba no selecciona automáticamente otra vinculación local. Compruebe el contacto en la cuenta seleccionada.
Rellenar el Page Part con SetContext
SubPageLink relaciona el Page Part con la clave del cliente. Además, debe llamar al procedimiento público SetContext para preparar la fila temporal y las variables de búsqueda. SubPageLink por sí solo no es suficiente.
procedure SetContext(ParamNoCode: Code[50]; ParamTableIdInteger: Integer;
ParamNameText: Text; ParamCountryCodeText: Text;
ParamSchemeCodeText: Text; ParamIdentifierText: Text; ParamEmailText: Text)
| Parámetro | Tipo | Valor y finalidad |
|---|---|---|
ParamNoCode |
Code[50] |
Rec."No.": número de cliente y primera parte de la clave. |
ParamTableIdInteger |
Integer |
Database::Customer: segunda parte de la clave; debe coincidir con SubPageLink. |
ParamNameText |
Text |
Rec.Name: texto para buscar contactos. |
ParamCountryCodeText |
Text |
Rec."Country/Region Code": país para la búsqueda en el directorio. |
ParamSchemeCodeText |
Text |
'' para buscar por NIF-IVA y país, o un esquema B2Brouter válido. El Page Part admite hasta 100 caracteres. |
ParamIdentifierText |
Text |
Rec."VAT Registration No.": identificador predeterminado. |
ParamEmailText |
Text |
Rec."E-Mail": se considera al ofrecer los tipos de transporte. |
Cada llamada reconstruye la fila temporal y carga la vinculación existente. Directory Scheme Code guardado sustituye al esquema recibido. Se utiliza Lookup Identifier guardado si no está vacío y hay un esquema seleccionado; en caso contrario se utiliza el identificador predeterminado recibido. El Page Part gestiona la selección y validación del esquema. Un esquema vacío en la llamada no borra uno guardado.
Abrir o cambiar de cliente no crea una vinculación persistente. Guardar ajustes del directorio, vincular/crear un contacto o comprobar el directorio sí puede crearla. Para un contacto vinculado, SetContext puede consultar sus datos de enrutamiento en B2Brouter. El contexto cargado se conserva para evitar una nueva consulta en cada validación de campo; la llamada no es exclusivamente local.
Ejemplo completo: ficha de cliente personalizada
Esta página independiente utiliza Customer e incluye el Page Part en el grupo B2Brouter. Actualiza el contexto al cambiar de registro y después de editar. Los diez campos transferidos solicitan una actualización externa solo cuando cambia realmente su valor.
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;
}
Adaptar el ejemplo
- Integre grupo, variables, procedimientos y triggers en su página de
Customer. En una Page Extension, agregue el grupo conaddlast(Content)o un anclajeaddafter(...)adecuado. Amplíe las validaciones mediantemodify(...)yOnAfterValidate, conHandleCustomerChange(Rec.<campo> <> xRec.<campo>). CurrPage.B2BrouterContact.Page...se refiere al controlpart(B2BrouterContact; ...), no al nombre del objeto de página integrado.- Llame a
SetContextenOnAfterGetCurrRecordpara actualizar la vinculación al navegar. Actualice también el contexto después de cambiar nombre, país, NIF-IVA o correo y después de guardar. Conserve las validaciones y la lógica de guardado existentes. - Para reproducir la ficha estándar, gestione Nombre, Dirección, Dirección 2, Código postal, Población, Provincia, Código de país o región, NIF-IVA, Correo electrónico y Teléfono. Tras actualizar el contexto, pase el cliente actual completo, incluidas las modificaciones aún no guardadas, a
ConfirmCustomerContactUpdate(ParamRecordCustomer: Record Customer). Este procedimiento público solicita confirmación antes de actualizar un contacto vinculado. Si se rechaza o falla, se conserva la edición de BC. - No solicite confirmación simplemente al abrir, navegar o guardar sin cambios. El
OnModifyRecorddel ejemplo solo actualiza el contexto. El Page Part gestiona sus acciones; la página principal no llama a procedimientos internos deSIM_EDS B2Brouter Contact Mgt. - La ficha de cliente estándar ya incluye este Page Part. Agréguelo a su propia página sin duplicarlo en la ficha estándar.
Funciones disponibles
Lookup Contact selecciona un contacto existente de la cuenta. Create Contact utiliza datos de cliente guardados, incluida la dirección y el teléfono; guarde antes el cliente. Update Contact transfiere los datos actuales tras la confirmación. La página principal solo necesita los dos procedimientos públicos descritos.
En Check Peppol Receiver, deje el esquema vacío para usar NIF-IVA y país o seleccione un esquema con su identificador. Se guardan el resultado y la fecha de comprobación. Si cambia el país, esquema o identificador, el estado indica datos modificados hasta repetir la comprobación. La disponibilidad del receptor y la vinculación con un contacto de la cuenta son resultados independientes.
Tipo de transporte y Tipo de documento se cargan para el contacto vinculado. Utilice las búsquedas de valores admitidos y seleccione primero el transporte. Para Peppol deben confirmarse los formatos del receptor para el identificador actual. Los cambios de enrutamiento solicitan confirmación; si se rechazan o fallan, quedan como Routing Changes Pending. Update Contact permite reintentarlos. Refresh Contact recarga los valores remotos y pide confirmación antes de descartar cambios pendientes. Estos ajustes no sustituyen el perfil de envío ni la configuración del esquema JSON.
Comprobar la integración
- Abra un cliente guardado sin vinculación: el Page Part debe mostrar su contexto sin crear un contacto solo por abrir la página.
- Cambie entre dos clientes y vuelva a abrir la página. Compruebe cada vinculación y sus ajustes guardados.
- Vincule un contacto, compruebe un receptor y cree un contacto para otro cliente guardado en la cuenta de prueba configurada. Verifique los datos en B2Brouter.
- Cambie cada campo transferido. Una edición real de un cliente vinculado debe ofrecer una actualización; abrir o guardar sin cambios no debe solicitarla. Pruebe aceptar y rechazar.
- Cambie el enrutamiento, rechace la transferencia y reintente con Update Contact. Pruebe Refresh Contact con cambios pendientes y el estado del receptor tras cambiar identificador/país.
| Síntoma | Comprobación |
|---|---|
| Page Part oculto | Permisos, registro de configuración, variable de visibilidad e IDs de cuenta de producción/staging. |
| Contexto vacío o incorrecto | Rec, nombre del control, OnAfterGetCurrRecord, los siete argumentos de SetContext y clave coincidente en SubPageLink. |
| Cliente inexistente en una acción | Número de cliente guardado y Database::Customer; el flujo completo no admite IDs de tablas independientes. |
| Error de conexión o sin opciones de enrutamiento | Entorno/cuenta/clave API, contacto vinculado, país/esquema/identificador y formatos del receptor. |
| Confirmaciones repetidas | Confirmar solo cambios reales de campos, no desde triggers de navegación o guardado. |