Este documento se destina a exemplificar o uso de adapters nos programas de regra de negócio. No Logix, o envio e recebimento de mensagens utiliza dois modelos de adapter: o modelo atual, utilizando Adapter e Helper (ver o significado destes conceitos aqui), e o modelo antigo, com um único fonte de adapter.
Modelo atual
Este exemplo de código demonstra como utilizar adapters do modelo novo para envio de mensagens. Observe a utilização do EAIMapper para a passagem de parâmetros.
#--------------------------------------#
FUNCTION test_eai_send_unitofmeasure()
#--------------------------------------#
define l_retorno smallint
define l_qtd_erros smallint
define l_mensagem char(2000)
define l_count smallint
define l_context char(100)
let l_context = "financeiro"
# Limpar o conteúdo da estrutura no Mapper
CALL EAIMapper_clear()
# Limpar os erros do Mapper
CALL EAIMapper_errorClear()
# Informar os dados da mensagem
CALL EAIMapper_set("Code","UN")
CALL EAIMapper_set("InternalId","UN")
CALL EAIMapper_set("Description","Unidade")
CALL EAIMapper_set("ShortName","Unid.")
# Informar os contextos
IF l_context IS NOT NULL THEN
CAll EAIMapper_set("ContextNames", l_context )
END IF
# Enviar a mensagem e receber o retorno
LET l_retorno = EAIAdapterUnitOfMeasure2_sendBusinessMessage( "upsert" )
# Tratar o retorno
IF l_Retorno = FALSE THEN
LET l_qtd_erros = EAIMapper_errorSize()
FOR l_count = 1 TO nErrors
LET l_mensagem = l_mensagem, EAIMapper_getError(l_count) CLIPPED, " "
END FOR
CALL log0030_mensagem("Unit of Measure - Não foi possivel enviar mensagem. Erro " || l_mensagem, "EXCL" )
ELSE
CALL log0030_mensagem("Unit of Measure - Envio realizado com sucesso", "INFO" )
END IF
END FUNCTION
Modelo antigo
O exemplo de código abaixo descreve como utilizar um adapter do modelo antigo para enviar mensagens. Observe que para passar o contexto deve-se utilizar a função EAIMapper_set() para evitar a criação de novas funções no adapter.
#------------------------------------------------#
FUNCTION test_eai_send_unitofmeasureconversion()
#------------------------------------------------#
DEFINE l_retorno SMALLINT
DEFINE l_context CHAR(100)
LET l_context = "manufatura"
# Limpar o conteúdo da estrutura no Mapper
CALL EAIMapper_clear()
# Limpar o conteúdo da estrutura no adapter
CALL adp10027_inicializa_record()
# Informar os dados da mensagem
CALL adp10027_set_BusinessContent_UnitOfMeasureOriginCode("KG")
CALL adp10027_set_BusinessContent_UnitOfMeasureDestinationCode("G")
CALL adp10027_set_BusinessContent_MultiplicationFactorValue(1000)
# Informar o tipo de mensagem (inclusão ou alteração -> upsert; eliminação -> delete)
CALL adp10027_set_MessageType( "upsert" )
# Informar contextos
IF l_context IS NOT NULL THEN
CAll EAIMapper_set("ContextNames", l_context )
END IF
# Obter retorno do envio
LET l_retorno = adp10027_envia_mensagem_eai_adapter()
# Tratar retorno do envio
IF l_Retorno = FALSE THEN
CALL log0030_mensagem("Unit Of Measure Conversion - Não foi possivel enviar mensagem", "EXCL")
ELSE
CALL log0030_mensagem("Unit Of Measure Conversion - Envio realizado com sucesso", "INFO" )
END IF
END FUNCTION
Modelo Antigo
O recebimento de informações é codificado dentro do adapter, nas funções <Adapter>_recebe_negocio_eai_adapter(), nesta função o desenvolvedor deverá chamar funções padrões como, ADVPL_eia_get_business_content, ADVPL_eai_create_response e também poderá chamar funções de negócio e manipular tabelas através do SQL.
#-----------------------------------------------------------------------------#
FUNCTION adp10023_recebe_negocio_eai_adapter(l_mensagem)
#-----------------------------------------------------------------------------#
CALL adp10023_inicializa_record() # Limpa record da msg
# realiza a carga do RECORD com a mensagem de negócio que chegou
LET l_conteudo = _ADVPL_eai_get_business_content(l_mensagem, _BusinessContent, 'adp10023')
# cria uma mensagem de resposta baseada na mensagem de negócio
LET l_resposta = _ADVPL_eai_create_response(l_mensagem)
# se a carga ocorreu sem erros
IF _ADVPL_eai_get_success(l_conteudo) THEN
# Verifica existência do cadastro De/Para Empresas - EAI10000/Configuração/Aplicativos Externos
CALL log00021_busca_CompanyInternalId(l_mensagem,
adp10023_get_BusinessContent_CompanyId(),
adp10023_get_BusinessContent_BranchId())
LET l_sistema_gerador = adp10023_get_BusinessContent_OriginCode()
LET l_periodo_contab = adp10023_retorna_periodo_contabil(adp10023_get_BusinessContent_PeriodStartDate())
LET l_segmento_periodo = adp10023_retorna_segmento_periodo_contabil(adp10023_get_BusinessContent_PeriodStartDate())
LET l_num_lote = adp10023_get_BusinessContent_BatchNumber()
FOR l_ind = 1 TO 10000
IF adp10023_get_BusinessContent_Entries_Entry_EntryNumber(l_ind) IS NULL then
EXIT FOR
END IF
LET l_centro_de_custo = adp10023_get_BusinessContent_Entries_Entry_CostCenterCode(l_ind)
LET lar_lancamentos[l_ind].l_cta_deb = adp10023_get_BusinessContent_Entries_Entry_DebitAccountCode(l_ind)
LET lar_lancamentos[l_ind].l_cta_cre = adp10023_get_BusinessContent_Entries_Entry_CreditAccountCode(l_ind)
LET lar_lancamentos[l_ind].l_dat_movto = adp10023_formata_data(adp10023_get_BusinessContent_Entries_Entry_MovementDate(l_ind))
LET lar_lancamentos[l_ind].l_val_lancto = adp10023_get_BusinessContent_Entries_Entry_EntryValue(l_ind)
LET lar_lancamentos[l_ind].l_hist_padrao = adp10023_get_BusinessContent_Entries_Entry_HistoryCode(l_ind)
IF adp10023_possui_historico(adp10023_get_BusinessContent_Entries_Entry_ComplementaryHistory(l_ind)) = TRUE THEN
LET lar_lancamentos[l_ind].l_compl_hist = 'S'
ELSE
LET lar_lancamentos[l_ind].l_compl_hist = 'N'
END IF
LET lar_lancamentos[l_ind].l_linha_produto = l_centro_de_custo[1,2]
LET lar_lancamentos[l_ind].l_linha_receita = l_centro_de_custo[3,4]
LET lar_lancamentos[l_ind].l_segmto_mercado = l_centro_de_custo[5,6]
LET lar_lancamentos[l_ind].l_classe_uso = l_centro_de_custo[7,8]
LET lar_lancamentos[l_ind].l_hist_compl_txt = adp10023_get_BusinessContent_Entries_Entry_ComplementaryHistory(l_ind)
LET lar_lancamentos[l_ind].l_num_relac = adp10023_get_BusinessContent_Entries_Entry_RelationshipNumber(l_ind)
END FOR
CALL con6071_set_cod_empresa(l_cod_empresa)
CALL con6071_set_m_sistema_gerador(l_sistema_gerador)
CALL con6071_set_periodo_contab(l_periodo_contab)
CALL con6071_set_segmto_periodo(l_segmento_periodo)
IF l_status THEN
CALL adp10023_set_ReturnContent_BatchNumber(l_num_lote)
FOR l_ind = 1 TO 10000
IF lar_lancamentos[l_ind].l_dat_movto IS NULL THEN
EXIT FOR
END IF
CALL adp10023_set_ReturnContent_Entries_Entry_EntryNumber(l_ind, l_ind)
CALL adp10023_set_ReturnContent_Entries_Entry_RelationshipNumber(con6071_get_num_relacionto(l_ind), l_ind)
END FOR
CALL _ADVPL_eai_set_return_content(l_resposta, _ReturnContent, _XmlElements)
ELSE
CALL _ADVPL_eai_log_add_message(l_resposta, 'ERROR', '1', l_msg)
END IF
ELSE
# se ocorreu algum erro, adiciona na mensagem de resposta
CALL _ADVPL_eai_log_add_message(l_resposta, 'ERROR', '0', _ADVPL_eai_get_error_message(l_conteudo))
END IF
RETURN l_resposta
END FUNCTION
Modelo Novo
O Egine do EAI chama a função EAIHelper<Transação><Versão>_recebe_negocio_eai_adapter(), que realizará a chamada para função EAIAdapter<Transação><Versão>_ReceiveBusinessMessage que é possível chamar funções de negócio existentes ou fazer a manipulação direta no banco através de comandos SQL (DMLs).
#--------------------------------------------------------------------#
FUNCTION EAIHelperInvoice3_recebe_negocio_eai_adapter(l_msg_negocio)
#--------------------------------------------------------------------#
DEFINE l_msg_negocio VARCHAR(10),
l_conteudo VARCHAR(10)
CALL EAIHelperInvoice3_inicializa_record() # Limpa record da msg
LET g_eai_msg_negocio = l_msg_negocio
CALL EAIHelperInvoice3_carrega_elementos_xml()
### Carrega o tipo da mensagem.
LET _MessageType = _ADVPL_eai_get_event(g_eai_msg_negocio)
### Realiza a carga do RECORD com a mensagem de negócio que chegou
LET l_conteudo = _ADVPL_eai_get_business_content(g_eai_msg_negocio, _BusinessContent, 'EAIHelperInvoice3')
### Verifica se o estado da mensagem recebida está ok.
IF NOT _ADVPL_eai_get_success(l_conteudo) THEN
CALL _ADVPL_eai_log_add_message(g_eai_msg_negocio, 'error', '0', _ADVPL_eai_get_error_message(l_conteudo))
RETURN NULL
END IF
### Mensagem de resposta baseada na mensagem de negócio
LET g_eai_msg_resposta = _ADVPL_eai_create_response(g_eai_msg_negocio)
### Tratamento da mensagem de retorno pelo 'Adapter'.
IF NOT EAIAdapterInvoice3_ReceiveBusinessMessage() THEN
### Retorna com a descrição dos erros.
RETURN g_eai_msg_resposta
END IF
IF NOT EAIAdapterInvoice3_CreateReturnMessage() THEN
#Retorna com a descrição dos erros.
RETURN g_eai_msg_resposta
END IF
### Inclui o conteúdo de retorno na mensagem criada.
LET l_conteudo = _ADVPL_eai_set_return_content(g_eai_msg_resposta, _ReturnContent, _XmlElements)
IF NOT _ADVPL_eai_get_success(l_conteudo) THEN
RETURN NULL
END IF
RETURN g_eai_msg_resposta
END FUNCTION