ANVEDI Integration
La codeunit ANVEDI Integration contiene todas las llamadas a la API pública del módulo EDI, que es posible que desee llamar desde su código personalizado. Todas las funciones de esta codeunit deben utilizarse si se desea iniciar directamente una acción EDI mediante código.
Conceptos generales
En esta sección discutiremos primero los conceptos básicos, que deberías entender para poder leer los ejemplos de código.
Transacciones de los usuarios
Anvaigo EDI Connect tiene un concepto llamado «transacciones de usuario», que puede abarcar múltiples transacciones de base de datos y recoger múltiples errores. La mayoría de las acciones en Anvaigo EDI Connect requerirán una transacción de usuario abierta para ejecutarlas. Puede iniciar una transacción de usuario llamando a:
// Start a new user transaction with the description given by TextDescription
ANVEDIIntegration.BEGIN_USER_TRANSACTION(TextDescription);
// Your EDI code
// End the user transaction and show an error list, if there were any
ANVEDIIntegration.END_USER_TRANSACTION(TRUE, FALSE);
La llamada a END_USER_TRANSACTION permite mostrar errores, romper la transacción actual de la base de datos u obtener un valor de retorno, si hubo un error. Más adelante hablaremos de ello en detalle.
BEGIN_USER_TRANSACTION
Inicia una nueva transacción de usuario. Tenga en cuenta que sólo se integran llamadas en el módulo EDI en los puntos en los que puede tener lugar un COMMIT. En muchos casos, el módulo confirmará todos los cambios de la base de datos antes de ejecutar la lógica EDI. Considere también la posibilidad de limitarse a marcar los datos y utilizar una tarea en segundo plano para ejecutar la lógica EDI.
El texto dado se muestra al usuario, si se abre un diálogo de espera, porque el proceso lleva tiempo.
BEGIN_USER_TRANSACTION(Text : Text[1024])
Siempre debe terminar una llamada a BEGIN_USER_TRANSACTION con una llamada a END_USER_TRANSACTION.
SHOWDIALOGS
Esta función puede utilizarse para ocultar cualquier diálogo EDI.
SHOWDIALOGS(ShowDialogs : Boolean)
El parámetro especifica si los diálogos se muestran o no. Una llamada a esta función tiene que estar dentro de una transacción de usuario. Normalmente llamará a esta función directamente después de BEGIN_USER_TRANSACTION.
ISPROCESSING
Esta función devuelve si se encuentra dentro de una ejecución mapping. Puede comprobar este valor al validar disparadores, por ejemplo, para conseguir un comportamiento diferente al procesar procesos EDI. También puede utilizar este valor para mostrar diálogos de entrada sólo cuando no esté procesando EDI.
END_USER_TRANSACTION
Esta función terminará una transacción de usuario.
END_USER_TRANSACTION(ShowErrorList : Boolean; BreakOnError : Boolean) Success : Boolean
Si se han producido errores durante la transacción, muéstrelos en un cuadro de diálogo al usuario final. Este parámetro no tiene ningún efecto, si GUIALLOWED es False.
Si el módulo debe lanzar un error, rompiendo el flujo actual del proceso. Todo el código después de esta línea no se ejecuta, si hubo un error durante la transacción. Si se establece este parámetro a True, se mostrará un mensaje de error indicando que se han producido uno o más errores, si los hubiera. En este caso, el usuario no puede ver la lista completa de errores.
Un valor de retorno, si hubo un error o no. Devuelve True en caso de éxito, es decir no hubo errores; False en caso contrario.
El valor de retorno se denominaba de forma diferente en versiones anteriores del módulo, pero tenía la misma función. El antiguo nombre del valor de retorno era incorrecto, la función siempre devolvía True en caso de éxito.
Trabajar con transacciones comerciales
RUN_BUSINESSTRANSACTION_JOB
Ejecuta el trabajo de recopilación de datos de un tipo de transacción empresarial especificado. Esto tiene que ser llamado desde dentro de una transacción de usuario.
RUN_BUSINESSTRANSACTION_JOB(BusinessTransactionTypeCode : Code[20])
Código del tipo de transacción comercial.
// Start a new user transaction with the description given by TextDescription
ANVEDIIntegration.BEGIN_USER_TRANSACTION(TextDescription);
// Collects the data of the Business Transaction Type "INVOICE_OUT" and processes the mappings
ANVEDIIntegration.RUN_BUSINESSTRANSACTION_JOB('INVOICE_OUT');
// End the user transaction and show an error list, if there were any
ANVEDIIntegration.END_USER_TRANSACTION(TRUE, FALSE);
START_BT_WITH_REC
Inicia una nueva transacción comercial para el código y el identificador de registro dados.
START_BT_WITH_REC(BusinessTransactionTypeCode : Code[20];RecID : RecordID)
RUN_BT_BATCH_JOB
Ejecuta el trabajo de recogida por lotes con el nombre especificado. Esto tiene que ser llamado desde dentro de una transacción de usuario.
RUN_BT_BATCH_JOB(BatchCode : Code[20])
Si quieres combinarlo con RUN_BUSINESSTRANSACTION_JOB, necesitas encapsular ambas funciones en bloques separados BEGIN..END_USER_TRANSACTION y añadir lo siguiente entre medias:
COMMIT;
SELECTLATESTVERSION();
Acciones
A veces se desea crear un botón en una página para iniciar un proceso EDI, o se desea integrarlo, por ejemplo, en el proceso de liberación. Para estos casos se pueden ejecutar casi todas las acciones del módulo desde el código. Tenga en cuenta que, por lo general, los procesos EDI deben automatizarse y ejecutarse en segundo plano. Así que antes de añadir acciones en el código, considere la posibilidad de un trabajo en segundo plano como alternativa.
Ejecutar un EDI Mapping
Para ejecutar un EDI Mapping necesitaremos iniciar una transacción de usuario. Después puede que queramos pasar datos al mapping. A continuación, podemos ejecutar el mapping y comprobar el resultado al finalizar la transacción del usuario. Encontrará la descripción detallada de los comandos después del ejemplo de código.
// Start a new user transaction with the description given by TextDescription
ANVEDIIntegration.BEGIN_USER_TRANSACTION(TextDescription);
// Reset any existing table views
ANVEDIIntegration.RESET_TABLEVIEWS();
// Copy sales invoice header from Rec to a local variable
SalesInvoiceHeader := Rec;
// Filter the local variable to the current record
SalesInvoiceHeader.SETRECFILTER;
// Store the filter to the record under the name INVOICE
ANVEDIIntegration.SET_TABLEVIEW('INVOICE', SalesInvoiceHeader.GETVIEW(FALSE));
// Run the mapping EXAMPLE, NAV, INVOICE. You can access the invoice header, by adding the table and setting the filter to a named table view and enter INVOICE as the name. In general, you can pass as many filters as you need to the mapping.
ANVEDIIntegration.RUN('EXAMPLE', 'NAV', 'INVOICE', FALSE, TRUE, '');
// End the user transaction and show an error list, if there were any
ANVEDIIntegration.END_USER_TRANSACTION(TRUE, FALSE);
RESET_TABLEVIEWS
Restablece todas las vistas de tabla almacenadas existentes. Debe llamarse desde dentro de una transacción de usuario.
RESET_TABLEVIEWS()
SET_TABLEVIEW
Almacena una vista de tabla con un nombre especificado. Debe llamarse desde dentro de una transacción de usuario.
SET_TABLEVIEW(FilterName : Code[30];FilterText : Text[1024])
Código que representa el nombre del filtro. Tendrá que especificar exactamente el mismo nombre en la EDI Mapping para recuperar el filtro.
El texto del filtro en forma de tabla Anvaigo EDI Connect. Debe utilizar la función GETVIEW de Microsoft Dynamics 365 Business Central, si es posible, para obtener la cadena con el formato correcto.
GET_TABLEVIEW
Recupera un filtro almacenado. Debe llamarse desde dentro de una transacción de usuario.
GET_TABLEVIEW(FilterName : Code[30]) : Text[1024]
RUN
Ejecutar uno o varios mapeos EDI. Debe llamarse desde dentro de una transacción de usuario.
RUN(ProjectFilter : Text[250];FormatFilter : Text[250];CodeFilter : Text[250];MultipleAllowed : Boolean;ProcessFollowing : Boolean;ProcessingQueueView : Text[250])
El código del proyecto o una cadena de filtro que coincida con el código del proyecto.
El código del formato mapping o una cadena de filtro que coincida con el código del formato.
El código del mapping o un filtro que coincida con los códigos de mapping deseados.
Si se deben ejecutar varias asignaciones en caso de que se especifique un filtro. Se trata de una función de seguridad, que le impide ejecutar más de un mapping.
Si debe ejecutarse el postprocesamiento. Por lo general, es preferible que sea True.
Un filtro en los postprocesamientos. Normalmente puede querer pasar una cadena vacía.
Otras acciones
RECEIVE_ALL
Función obsoleta. Debe evitar llamar a la función general y llamar a una de las más específicas que aparecen a continuación.
Recibe todos los canales de comunicación. Esta función debe llamarse desde dentro de una transacción de usuario.
RECEIVE_ALL(ProcessFollowing : Boolean;ProcessingQueueView : Text[250])
RECEIVE_FOLDER
Recibe los datos de la carpeta o carpetas de transmisión especificadas. Esta función debe llamarse desde dentro de una transacción de usuario.
RECEIVE_FOLDER(TransmissionFolderCodeFilter : Text[250];ProcessFollowing : Boolean;ProcessingQueueView : Text[250])
El código del filtro de transmisión o una cadena de filtro en el campo de código.
Si debe ejecutarse el postprocesamiento. Por lo general, es preferible que sea True.
Un filtro en los postprocesamientos. Normalmente puede querer pasar una cadena vacía.
RECEIVE_COMMUNICATIONCHANNEL
Recibe datos del canal de comunicación especificado. Esta función debe llamarse desde dentro de una transacción de usuario.
RECEIVE_COMMUNICATIONCHANNEL(CommunicationChannelCodeFilter : Text[250];ProcessFollowing : Boolean;ProcessingQueueView : Text[250])
El código del canal de comunicación o una cadena de filtro en el campo de código.
Si debe ejecutarse el postprocesamiento. Normalmente, es preferible establecerlo en True.
Un filtro en los postprocesamientos. Normalmente puede querer pasar una cadena vacía.
SEND_ALL
Función obsoleta. Debe evitar llamar a la función general y llamar a una de las más específicas que aparecen a continuación.
Envía todos los canales de comunicación. Esta función debe llamarse desde dentro de una transacción de usuario.
SEND_ALL(ProcessFollowing : Boolean;ProcessingQueueView : Text[250])
Si debe ejecutarse el postprocesamiento. Por lo general, es preferible que sea True.
Un filtro en los postprocesamientos. Normalmente puede querer pasar una cadena vacía.
SEND_FOLDER
Envía las transmisiones abiertas de la carpeta de transmisión especificada. Esta función debe llamarse desde dentro de una transacción de usuario.
SEND_FOLDER(TransmissionFolderCodeFilter : Text[250];ProcessFollowing : Boolean;ProcessingQueueView : Text[250])
El código de la carpeta de transmisión o una cadena de filtro en el campo de código.
Si debe ejecutarse el postprocesamiento. Por lo general, es preferible que sea True.
Un filtro en los postprocesamientos. Normalmente puede querer pasar una cadena vacía.
SEND_COMMUNICATIONCHANNEL
Envía transmisiones abiertas del canal de comunicación especificado. Esta función debe llamarse desde dentro de una transacción de usuario.
SEND_COMMUNICATIONCHANNEL(CommunicationChannelCodeFilter : Text[250];ProcessFollowing : Boolean;ProcessingQueueView : Text[250])
El código del canal de comunicación o una cadena de filtro en el campo de código.
Si debe ejecutarse el postprocesamiento. Por lo general, es preferible que sea True.
Un filtro en los postprocesamientos. Normalmente puede querer pasar una cadena vacía.
PROCESS
PROCESS(ProcessFollowing : Boolean;ProcessingQueueView : Text[250];UserTransactionFilter : Boolean)
Si debe ejecutarse el postprocesamiento. Por lo general, es preferible que sea True.
Un filtro en los postprocesamientos. Normalmente puede querer pasar una cadena vacía.
Si sólo deben procesarse los postprocesos de la transacción actual del usuario.
Establecer el destinatario / remitente
SET_COMMUNICATION_CHANNEL
Establece el canal de comunicación para la siguiente llamada mapping dentro de la transacción de usuario.
SET_COMMUNICATION_CHANNEL(ChannelCode : Code[20])
El código del canal de comunicación.
SET_RECEIVER_PARTNER
Establece el interlocutor receptor para la siguiente llamada de mapping dentro de la transacción de usuario.
SET_RECEIVER_PARTNER(ReceiverPartner : Code[20])
El código de socio receptor.
SET_RECEIVER_IDENTIFICATION
Establece la identificación del receptor para la siguiente llamada de mapping dentro de la transacción de usuario.
SET_RECEIVER_IDENTIFICATION(Identification : Text[64])
La identificación del receptor. Se trata de un texto libre, que puede tener un significado especial en canales de comunicación específicos.
SET_SENDER_PARTNER
Establece el socio emisor para la siguiente llamada de mapping dentro de la transacción de usuario.
SET_SENDER_PARTNER(PartnerCode : Code[20])
El código de socio emisor.
SET_SENDER_IDENTIFICATION
Establece la identificación del remitente para la siguiente llamada de mapping dentro de la transacción de usuario.
SET_SENDER_IDENTIFICATION(Identification : Text[64])
La identificación del receptor. Se trata de un texto libre, que puede tener un significado especial en canales de comunicación específicos.
Registro y gestión de errores
Las siguientes funciones sólo pueden invocarse mientras se está ejecutando un mapping. Estas funciones están pensadas para ser utilizadas por los gestores de errores personalizados del código.
LogError
Registra un mensaje de error.
LogError(ErrorMessage : Text[1024])
El mensaje de error. La ejecución continuará después de esta llamada. Para interrumpir el flujo de control, utilice la función nativa ERROR.
LogWarning
Registra una advertencia.
LogWarning(WarningMessage : Text[1024])
El texto de la advertencia.
LogInformation
Registra la información.
LogInformation(InformationMessage : Text[1024])
La información que debe registrarse.
LogDocumentError
Registra un error perteneciente a un Documento EDI. Existe una función más universal llamada LogRecIDErrorWithCode.
LogDocumentError(ErrorMessage : Text[1024];EDIDocument : Record "EDI Document")
El mensaje de error.
El documento EDI al que pertenece el error.
LogDocumentWarning
Registra un aviso perteneciente a un Documento EDI. Existe una función más universal llamada LogRecIDWarningWithCode.
LogDocumentWarning(WarningMessage : Text[1024];EDIDocument : Record "EDI Document")
La advertencia que debe registrarse.
El documento EDI al que pertenece el error.
LogDocumentInformation
Registra una información perteneciente a un Documento EDI. Existe una función más universal llamada LogRecIDInformationWithCode.
LogDocumentInformation(InformationMessage : Text[1024];EDIDocument : Record "EDI Document")
La información que debe registrarse.
El documento EDI al que pertenece el error.
LogDocumentLineError
Registra un error perteneciente a una línea de documento EDI. Existe una función más general llamada LogRecIDErrorWithCode.
LogDocumentLineError(ErrorMessage : Text[1024];EDIDocumentLine : Record "EDI Document Line")
El mensaje de error que se registrará.
La línea de documento EDI a la que pertenece el error.
LogDocumentLineWarning
Registra un aviso perteneciente a una línea de documento EDI. Existe una función más general llamada LogRecIDWarningWithCode.
LogDocumentLineWarning(WarningMessage : Text[1024];EDIDocumentLine : Record "EDI Document Line")
La advertencia que debe registrarse.
La línea de documento EDI a la que pertenece el error.
LogDocumentLineInformation
Registra una información perteneciente a una Línea de Documento EDI. Existe una función más general llamada LogRecIDInformationWithCode.
LogDocumentLineInformation(InformationMessage : Text[1024];EDIDocumentLine : Record "EDI Document Line")
La información que debe registrarse.
La línea de documento EDI a la que pertenece el error.
LogErrorWithCode
Registra un error con un código de error adicional.
LogErrorWithCode(ContinueExecution : Boolean;ErrorMessage : Text[1024];Code : Code[20])
Si se interrumpe el flujo de control o se continúa con la ejecución
El mensaje de error que se registrará.
Un código para identificar el error.
LogWarningWithCode
Registra una advertencia con un código de error adicional.
LogWarningWithCode(WarningMessage : Text[1024];Code : Code[20])
La advertencia que debe registrarse.
Un código para identificar el error.
LogInformationWithCode
Registra una información con un código de error adicional.
LogInformationWithCode(InformationMessage : Text[1024];Code : Code[20])
La información que debe registrarse.
Un código para identificar el error.
LogRecIDErrorWithCode
Registra un mensaje de error que debería pertenecer a un registro específico.
LogRecIDErrorWithCode(ContinueExecution : Boolean;ErrorMessage : Text[1024];RecID : RecordID;Code : Code[20];IsUserAcceptable : Boolean)
Si se interrumpe el flujo de control o se continúa la ejecución.
El mensaje de error que se registrará.
ID del registro al que pertenece el error.
Un código de error para identificar el error.
Si el error puede ser aceptado por el usuario final. Esto requerirá un código de error no vacío.
LogRecIDWarningWithCode
Registra un aviso que debería pertenecer a un registro.
LogRecIDWarningWithCode(WarningMessage : Text[1024];RecID : RecordID;Code : Code[20])
La advertencia que debe registrarse.
El identificador del registro al que debe pertenecer el aviso.
Un código para identificar la entrada de registro.
LogRecIDInformationWithCode
Registra una información que debería pertenecer a un registro.
LogRecIDInformationWithCode(InformationMessage : Text[1024];RecID : RecordID;Code : Code[20])
La información que debe registrarse.
El identificador de registro al que debe pertenecer la información.
Un código para identificar la entrada de registro.