ANVEDI Integration
A codeunit ANVEDI Integration contém todas as chamadas API públicas para o módulo EDI, que pode querer chamar a partir do seu código personalizado. Todas as funções desta codeunit devem ser utilizadas quando se pretende iniciar diretamente uma ação EDI por código.
Conceitos gerais
Nesta secção, começaremos por discutir os conceitos fundamentais, que deve compreender para poder ler os exemplos de código.
Transacções de utilizadores
Anvaigo EDI Connect tem um conceito chamado “transacções do utilizador”, que pode abranger várias transacções da base de dados e recolher vários erros. A maior parte das acções no Anvaigo EDI Connect requerem uma transação de utilizador aberta para serem executadas. É possível iniciar uma transação de utilizador chamando:
// 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);
A chamada a END_USER_TRANSACTION permite-lhe mostrar os erros, interromper a transação atual da base de dados ou obter um valor de retorno, caso tenha havido um erro. Mais tarde, falaremos sobre isso em pormenor.
BEGIN_USER_TRANSACTION
Inicia uma nova transação de utilizador. É importante observar que só é possível integrar chamadas no módulo EDI nos pontos em que pode ocorrer um COMMIT. Em muitos casos, o módulo efectua todas as alterações na base de dados antes de executar a lógica EDI. Considere também a possibilidade de marcar apenas os dados e utilizar um trabalho em segundo plano para executar a lógica EDI.
O texto fornecido é mostrado ao utilizador, se for aberta uma caixa de diálogo em espera, porque o processo demora algum tempo.
BEGIN_USER_TRANSACTION(Text : Text[1024])
Deve-se sempre terminar uma chamada a BEGIN_USER_TRANSACTION com uma chamada a END_USER_TRANSACTION.
SHOWDIALOGS
Esta função pode ser utilizada para ocultar quaisquer diálogos EDI.
SHOWDIALOGS(ShowDialogs : Boolean)
O parâmetro especifica se as caixas de diálogo são mostradas ou não. Uma chamada a esta função tem de estar dentro de uma transação do utilizador. Normalmente, esta função é chamada diretamente após BEGIN_USER_TRANSACTION.
ISPROCESSING
Esta função devolve se o utilizador está dentro de uma execução mapping. É possível verificar esse valor ao validar acionadores, por exemplo, para obter um comportamento diferente ao processar processos EDI. Também é possível usar esse valor para exibir diálogos de entrada apenas quando não estiver processando EDI.
END_USER_TRANSACTION
Esta função encerra uma transação do utilizador.
END_USER_TRANSACTION(ShowErrorList : Boolean; BreakOnError : Boolean) Success : Boolean
Se houver erros durante a transação, mostrá-los numa caixa de diálogo ao utilizador final. Este parâmetro não tem qualquer efeito se GUIALLOWED for False.
Se o módulo deve lançar um erro, interrompendo o fluxo do processo atual. Todo o código após esta linha não é executado, se houver um erro durante a transação. Se este parâmetro for definido como True ), aparecerá uma mensagem de erro a indicar a ocorrência de um ou mais erros, caso existam. Neste caso, o utilizador não pode ver a lista completa de erros.
Um valor de retorno, quer tenha havido um erro ou não. Retorna True em caso de sucesso, ou seja não houve erros; False caso contrário.
O valor de retorno tinha um nome diferente nas versões anteriores do módulo, mas tinha a mesma função. O antigo nome do valor de retorno estava incorreto, a função devolvia sempre True em caso de sucesso.
Trabalhar com transacções comerciais
RUN_BUSINESSTRANSACTION_JOB
Executa o trabalho de recolha de dados de um tipo de transação comercial especificado. Tem de ser chamado a partir do interior de uma transação do utilizador.
RUN_BUSINESSTRANSACTION_JOB(BusinessTransactionTypeCode : Code[20])
Código do tipo de transação 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 uma nova transação comercial para o código e o ID de registo indicados.
START_BT_WITH_REC(BusinessTransactionTypeCode : Code[20];RecID : RecordID)
RUN_BT_BATCH_JOB
Executa a tarefa de recolha de lotes com o nome especificado. Tem de ser chamado a partir do interior de uma transação do utilizador.
RUN_BT_BATCH_JOB(BatchCode : Code[20])
Se pretender combiná-la com RUN_BUSINESSTRANSACTION_JOB, tem de encapsular ambas as funções em blocos separados BEGIN..END_USER_TRANSACTION e acrescentar o seguinte entre eles:
COMMIT;
SELECTLATESTVERSION();
Acções
Por vezes, pretende-se criar um botão numa página para iniciar um processo EDI, ou integrá-lo, por exemplo, no processo de lançamento. Nestes casos, é possível executar quase todas as acções do módulo a partir do código. Não se esqueça de que os processos EDI devem ser normalmente automatizados e executados em segundo plano. Por isso, antes de adicionar acções no código, considere a possibilidade de um trabalho em segundo plano como alternativa.
Executar um Mapping EDI
Para executar um EDI Mapping, é necessário iniciar uma transação do utilizador. Em seguida, podemos querer passar dados para o mapping. Podemos então executar o mapping e verificar o resultado quando terminarmos a transação do utilizador. A descrição pormenorizada dos comandos encontra-se após o exemplo 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
Repõe todas as vistas de tabela armazenadas existentes. Tem de ser chamado a partir do interior de uma transação do utilizador.
RESET_TABLEVIEWS()
SET_TABLEVIEW
Armazena uma vista de tabela com um nome especificado. Tem de ser chamado a partir do interior de uma transação do utilizador.
SET_TABLEVIEW(FilterName : Code[30];FilterText : Text[1024])
Um código que representa o nome do filtro. Terá de especificar exatamente o mesmo nome no EDI Mapping para obter o filtro.
O texto do filtro tem a forma de uma vista de tabela Anvaigo EDI Connect. Deve utilizar a função integrada Microsoft Dynamics 365 Business Central GETVIEW, se possível, para obter a cadeia de caracteres corretamente formatada.
GET_TABLEVIEW
Recupera um filtro armazenado. Tem de ser chamado a partir do interior de uma transação do utilizador.
GET_TABLEVIEW(FilterName : Code[30]) : Text[1024]
RUN
Executar um ou mais mapeamentos EDI. Tem de ser chamado a partir do interior de uma transação do utilizador.
RUN(ProjectFilter : Text[250];FormatFilter : Text[250];CodeFilter : Text[250];MultipleAllowed : Boolean;ProcessFollowing : Boolean;ProcessingQueueView : Text[250])
O código do projeto ou uma cadeia de filtro que corresponda ao código do projeto.
O código do formato mapping ou uma cadeia de filtro que corresponde ao código do formato.
O código do mapping ou um filtro que corresponda aos códigos mapping pretendidos.
Se devem ser executados vários mapeamentos no caso de ser especificado um filtro. Trata-se de uma função de segurança que impede a execução de mais do que um mapping.
Se o pós-processamento deve ser executado. Normalmente, esta opção deve ser definida como True.
Um filtro para os pós-processamentos. Normalmente, pode querer passar uma string vazia.
Outras acções
RECEIVE_ALL
Função obsoleta. Deve-se evitar chamar a função geral e chamar uma das funções mais específicas abaixo.
Recebe todos os canais de comunicação. Esta função tem de ser chamada a partir do interior de uma transação do utilizador.
RECEIVE_ALL(ProcessFollowing : Boolean;ProcessingQueueView : Text[250])
RECEIVE_FOLDER
Recebe os dados da pasta de transmissão especificada ou das pastas. Esta função tem de ser chamada a partir do interior de uma transação do utilizador.
RECEIVE_FOLDER(TransmissionFolderCodeFilter : Text[250];ProcessFollowing : Boolean;ProcessingQueueView : Text[250])
O código do filtro de transmissão ou uma cadeia de filtros no campo de código.
Se o pós-processamento deve ser executado. Normalmente, esta opção deve ser definida como True.
Um filtro para os pós-processamentos. Normalmente, pode querer passar uma string vazia.
RECEIVE_COMMUNICATIONCHANNEL
Recebe dados do canal de comunicação especificado. Esta função tem de ser chamada a partir do interior de uma transação do utilizador.
RECEIVE_COMMUNICATIONCHANNEL(CommunicationChannelCodeFilter : Text[250];ProcessFollowing : Boolean;ProcessingQueueView : Text[250])
O código do canal de comunicação ou uma cadeia de filtros no campo do código.
Se o pós-processamento deve ser executado. Normalmente, esta opção deve ser definida como True.
Um filtro para os pós-processamentos. Normalmente, pode querer passar uma string vazia.
SEND_ALL
Função obsoleta. Deve-se evitar chamar a função geral e chamar uma das funções mais específicas abaixo.
Envia todos os canais de comunicação. Esta função tem de ser chamada a partir do interior de uma transação do utilizador.
SEND_ALL(ProcessFollowing : Boolean;ProcessingQueueView : Text[250])
Se o pós-processamento deve ser executado. Normalmente, esta opção deve ser definida como True.
Um filtro para os pós-processamentos. Normalmente, pode querer passar uma string vazia.
SEND_FOLDER
Envia transmissões abertas da pasta de transmissão especificada. Esta função tem de ser chamada a partir do interior de uma transação do utilizador.
SEND_FOLDER(TransmissionFolderCodeFilter : Text[250];ProcessFollowing : Boolean;ProcessingQueueView : Text[250])
O código da pasta de transmissão ou uma cadeia de filtro no campo do código.
Se o pós-processamento deve ser executado. Normalmente, esta opção deve ser definida como True.
Um filtro para os pós-processamentos. Normalmente, pode querer passar uma string vazia.
SEND_COMMUNICATIONCHANNEL
Envia transmissões abertas do canal de comunicação especificado. Esta função tem de ser chamada a partir do interior de uma transação do utilizador.
SEND_COMMUNICATIONCHANNEL(CommunicationChannelCodeFilter : Text[250];ProcessFollowing : Boolean;ProcessingQueueView : Text[250])
O código do canal de comunicação ou uma cadeia de filtros no campo do código.
Se o pós-processamento deve ser executado. Normalmente, esta opção deve ser definida como True.
Um filtro para os pós-processamentos. Normalmente, pode querer passar uma string vazia.
PROCESS
PROCESS(ProcessFollowing : Boolean;ProcessingQueueView : Text[250];UserTransactionFilter : Boolean)
Se o pós-processamento deve ser executado. Normalmente, esta opção deve ser definida como True.
Um filtro para os pós-processamentos. Normalmente, pode querer passar uma string vazia.
Se apenas os pós-processamentos da transação do utilizador atual devem ser processados.
Definir o destinatário/remetente
SET_COMMUNICATION_CHANNEL
Define o canal de comunicação para a seguinte chamada mapping dentro da transação do utilizador.
SET_COMMUNICATION_CHANNEL(ChannelCode : Code[20])
O código do canal de comunicação.
SET_RECEIVER_PARTNER
Define o parceiro recetor para a seguinte chamada mapping dentro da transação do utilizador.
SET_RECEIVER_PARTNER(ReceiverPartner : Code[20])
O código do parceiro recetor.
SET_RECEIVER_IDENTIFICATION
Define a identificação do recetor para a seguinte chamada mapping dentro da transação do utilizador.
SET_RECEIVER_IDENTIFICATION(Identification : Text[64])
A identificação do recetor. Trata-se de um texto livre, que pode ter um significado especial em canais de comunicação específicos.
SET_SENDER_PARTNER
Define o parceiro emissor para a seguinte chamada mapping dentro da transação do utilizador.
SET_SENDER_PARTNER(PartnerCode : Code[20])
O código do parceiro emissor.
SET_SENDER_IDENTIFICATION
Define a identificação do remetente para a seguinte chamada mapping dentro da transação do utilizador.
SET_SENDER_IDENTIFICATION(Identification : Text[64])
A identificação do recetor. Trata-se de um texto livre, que pode ter um significado especial em canais de comunicação específicos.
Registo e tratamento de erros
As seguintes funções só podem ser chamadas enquanto um mapping estiver a ser executado. Estas funções destinam-se a ser utilizadas para manipuladores de erros personalizados a partir do código.
LogError
Regista uma mensagem de erro.
LogError(ErrorMessage : Text[1024])
A mensagem de erro. A execução continuará após esta chamada. Para interromper o fluxo de controlo, utilize a função nativa ERROR.
LogWarning
Regista um aviso.
LogWarning(WarningMessage : Text[1024])
O texto do aviso.
LogInformation
Informação de registos.
LogInformation(InformationMessage : Text[1024])
As informações a registar.
LogDocumentError
Regista um erro pertencente a um documento EDI. Existe uma função mais universal chamada LogRecIDErrorWithCode.
LogDocumentError(ErrorMessage : Text[1024];EDIDocument : Record "EDI Document")
A mensagem de erro.
O documento EDI a que pertence o erro.
LogDocumentWarning
Regista um aviso pertencente a um documento EDI. Existe uma função mais universal chamada LogRecIDWarningWithCode.
LogDocumentWarning(WarningMessage : Text[1024];EDIDocument : Record "EDI Document")
O aviso a registar.
O documento EDI a que pertence o erro.
LogDocumentInformation
Regista uma informação pertencente a um documento EDI. Existe uma função mais universal chamada LogRecIDInformationWithCode.
LogDocumentInformation(InformationMessage : Text[1024];EDIDocument : Record "EDI Document")
A informação a registar.
O documento EDI a que pertence o erro.
LogDocumentLineError
Regista um erro pertencente a uma linha de documento EDI. Existe uma função mais geral chamada LogRecIDErrorWithCode.
LogDocumentLineError(ErrorMessage : Text[1024];EDIDocumentLine : Record "EDI Document Line")
A mensagem de erro a registar.
A linha de documento EDI a que pertence o erro.
LogDocumentLineWarning
Regista um aviso pertencente a uma linha de documento EDI. Existe uma função mais geral denominada LogRecIDWarningWithCode.
LogDocumentLineWarning(WarningMessage : Text[1024];EDIDocumentLine : Record "EDI Document Line")
O aviso que deve ser registado.
A linha de documento EDI a que pertence o erro.
LogDocumentLineInformation
Regista uma informação pertencente a uma linha de documento EDI. Existe uma função mais geral denominada LogRecIDInformationWithCode.
LogDocumentLineInformation(InformationMessage : Text[1024];EDIDocumentLine : Record "EDI Document Line")
A informação a registar.
A linha de documento EDI a que pertence o erro.
LogErrorWithCode
Regista um erro com um código de erro adicional.
LogErrorWithCode(ContinueExecution : Boolean;ErrorMessage : Text[1024];Code : Code[20])
Se deve interromper o fluxo de controlo ou continuar a execução
A mensagem de erro a registar.
Um código para identificar o erro.
LogWarningWithCode
Regista um aviso com um código de erro adicional.
LogWarningWithCode(WarningMessage : Text[1024];Code : Code[20])
O aviso que deve ser registado.
Um código para identificar o erro.
LogInformationWithCode
Regista uma informação com um código de erro adicional.
LogInformationWithCode(InformationMessage : Text[1024];Code : Code[20])
As informações que devem ser registadas.
Um código para identificar o erro.
LogRecIDErrorWithCode
Regista uma mensagem de erro que deve pertencer a um registo específico.
LogRecIDErrorWithCode(ContinueExecution : Boolean;ErrorMessage : Text[1024];RecID : RecordID;Code : Code[20];IsUserAcceptable : Boolean)
Se deve interromper o fluxo de controlo ou continuar a execução.
A mensagem de erro a registar.
A identificação do registo a que pertence o erro.
Um código de erro para identificar o erro.
Se o erro pode ser aceite pelo utilizador final. Para tal, é necessário um código de erro não vazio.
LogRecIDWarningWithCode
Regista um aviso que deveria pertencer a um registo.
LogRecIDWarningWithCode(WarningMessage : Text[1024];RecID : RecordID;Code : Code[20])
O aviso que deve ser registado.
A identificação do registo a que deve pertencer o aviso.
Um código para identificar a entrada de registo.
LogRecIDInformationWithCode
Regista uma informação que deve pertencer a um registo.
LogRecIDInformationWithCode(InformationMessage : Text[1024];RecID : RecordID;Code : Code[20])
As informações que devem ser registadas.
A identificação do registo a que as informações devem pertencer.
Um código para identificar a entrada de registo.