Páginas filhas
  • 6. Utilização dos Adapters em Regras de Negócio

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.

Envio de informações


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

Recebimento de informações


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