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

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

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.

Bloco de código
languageruby
linenumberstrue
#--------------------------------------#
 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

...

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.

Bloco de código
languageruby
linenumberstrue
#-----------------------#
FUNCTION adp10023_teste()
#---------------------------#
   DEFINE l_mensagem VARCHAR(10),
          l_resposta VARCHAR(10)

#-------------------------------RETIRAR----------#
FUNCTION adp10023_recebe_negocio_eai_adapter(l_mensagem)
#-------------------------------#
   LET p_user = 'demo'
   LET p_cod_empresa = '21'
#-----------------------------------------------------------------------------#

   LET l_mensagem = _ADVPL_eai_create_message_from_file("C:\\LOGIX\\testes\\adp10023\\adp10023.xml")
   LET l_resposta = adp10023_recebe_negocio_eai_adapter(l_mensagem)

   CALL _ADVPL_eai_write_message_to_file(l_resposta, "C:\\LOGIX\\testes\\adp10023\\resposta_adp10023.xml")

END FUNCTION

Modelo Novo

#
  
   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  EAIAdapter<Transação><Versão>_ReceiveBusinessMessage() (modelo novo). Destas funções é possível chamar funções de negócio existentes ou fazer a manipulação direta no banco através de comandos SQL (DMLs).

Bloco de código
languageruby
linenumberstrue
#--------------------------------------------------------------------#
 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

 

...