Páginas filhas
  • 6. Contexto para Adapters

Versões comparadas

Chave

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

...

O conceito de contexto no EAI tem por finalidade aumentar o controle no envio de mensagens para diversos destinos. Este documento descreverá os passos necessários para habilitar o suporte a este conceito nos adapters. Para mais informações sobre contexto, acessar este link.

Novos Adapters

...

O programa de geração de adapters (EAI0032) já insere as funções e trechos de código necessários para suportar o conceito, sendo necessário alguns poucos ajustes no código.

Sintaxe

...

languageruby

No fonte do adapter (EAIAdapter<Transação><Versão>.4gl):

  • Alterar a função EAIAdapter<Transacao><Versao>_getContextNames() e informar a lista de contextos que o adapter suporta. Os elementos da lista devem estar separados por vírgula. Use a função AdvPl eai_get_default_context() para retornar o contexto padrão.

Exemplo

...

Bloco de código
languageruby
linenumberstrue
###############################################
# FUNÇÃO DE RETORNO DOS CONTEXTOS DO ADAPTER  #
###############################################
#---------------------------------------------------#
 FUNCTION EAIAdapterUnitOfMeasure2_getContextNames()
#---------------------------------------------------#
  # Informe a lista de contextos que o adapter suporta, separando os elementos com virgula.
  # Ex.: 'Padrão,Financeiro,Manufatura'
  RETURN _ADVPL_eai_get_default_context() # Retorna a literal 'padrao'.
END FUNCTION
  • Descomentar, no fonte do adapter, as linhas iniciais da função EAIAdapter<Transacao><Versao>_SendBusinessMessage(), relativas ao recebimento dos contextos enviados pelo programa de negócio.

Exemplo

...

Bloco de código
languageruby
linenumberstrue
#--------------------------------------------------------------------#
 FUNCTION EAIAdapterUnitOfMeasure2_SendBusinessMessage(l_MessageType)
#--------------------------------------------------------------------#
  DEFINE l_MessageType  VARCHAR(6) #upsert / delete
  DEFINE l_ContextNames VARCHAR(100)
 
  CALL EAIHelperUnitOfMeasure2_inicializa_record()
 
  ### Atualizar o contexto na mensagem, se informado.
  ### Os contextos devem ser passados para o adapter usando o EAIMapper_set("ContextNames",<stringContexto>).
  # LET l_ContextNames = EAIMapper_getString( "ContextNames" )
  # CALL EAIHelperUnitOfMeasure2_set_ContextNames( l_ContextNames )
 
  IF NOT EAIHelperUnitOfMeasure2_esta_configurado_para_envio() THEN
     RETURN TRUE
  END IF

No fonte do helper não é necessária nenhuma alteração. 

Adapters existentes usando modelo helper/adapter

...

No fonte do adapter (EAIAdapter<Transação><Versão>.4gl): 

  • Alterar a função EAIAdapter<Transacao><Versao>_SendBusinessMessage() para:
    • Definir a variável l_ContextNames como VARCHAR(100).
    • Colocar a chamada de função EAIHelper<Transacao><Versao>_inicializa_record() como uma das primeiras linhas da função.
    • Inserir o trecho que recebe o contexto e o atualiza no Helper logo abaixo da chamada de função EAIHelper<Transacao><Versao>_inicializa_record() e antes da função EAIHelper<Transacao><Versao>_esta_configurado_para_envio(), já que o contexto é agora uma informação relevante para identificar rotas.
  • Incluir a função EAIAdapter<Transacao><Versao>_getContextNames() com o corpo conforme exemplo abaixo. Nesta função deve-se informar a lista de contextos que o adapter suporta. Os elementos da lista devem estar separados por vírgula.

Exemplo

...

Bloco de código
languageruby
linenumberstrue
#----------------------------------------------------------------#
 FUNCTION EAIAdapterUnitOfMeasure2_getContextNames()
#----------------------------------------------------------------#
  RETURN _ADVPL_eai_get_default_context() clipped || “,manufatura,educacional”
  
END FUNCTION

...

  • Definir variável modular _ContextNames com VARCHAR(100)
  • Alterar função EAIHelper<Transacao><Versao>_cria_mensagem_negocio() para:
    • Incluir os parâmetros de versão e de contextos na chamada da função _ADVPL_eai_create_message().

Exemplo 

...

Bloco de código
languageruby
linenumberstrue
_ADVPL_eai_create_message(
     EAIHelper<Transacao><Versao>_get_transaction_name(),
     EAIHelper<Transacao><Versao>_get_adapter_versao(),
     _ContextNames )

 

    • Incluir chamada à função EAIHelper<Transacao><Versao>_set_contextNames() após a chamada à função _ADVPL_eai_create_message().
  • Criar a função EAIHelper<Transacao><Versao>_set_contextNames() com o seguinte corpo:

Exemplo 

...

Bloco de código
languageruby
linenumberstrue
#----------------------------------------------------------------#
 FUNCTION EAIHelperUnitOfMeasure2_set_ContextNames(l_contextNames)
#----------------------------------------------------------------#
  DEFINE l_contextNames VARCHAR(100)
  
  LET _ContextNames = l_contextNames
  IF _ContextNames IS NOT NULL AND g_eai_msg_negocio IS NOT NULL THEN
    CALL _ADVPL_eai_set_context_names(g_eai_msg_negocio, _ContextNames)
  END IF
END FUNCTION

 

  • Alterar a função EAIHelper<Transacao><Versao>_esta_configurado_para_envio() para informar na chamada à função_ADVPL_eai_is_send_configured() a variável _ContextNames.

Exemplo 

...

Bloco de código
languageruby
linenumberstrue
_ADVPL_eai_is_send_configured(
     EAIHelper<Transacao><Versao>_get_transaction_name(),
     EAIHelper<Transacao><Versao>_get_adapter_version(),
     _ContextNames )

Adapters existentes usando modelo antigo (apenas adapter)

...

No fonte do adapter alterar a função <Adapter>_envia_mensagem_eai_adapter() para:

  • Definir a variável modular _ContextNames como VARCHAR(100)
  • Recuperar o contexto enviado pelo programa de negócio usando a função EAIMapper_getString().
  • Passar o contexto na chamada à função _ADVPL_eai_is_send_configured().
  • Atualizar o contexto na mensagem usando a função _ADVPL_eai_set_context_names(). Observe que a mensagem já deve ter sido criada pela função_ADVPL_eai_create_message().

Exemplo 

...

Bloco de código
languageruby
linenumberstrue
#--- Recupera o contexto informado para a mensagem ---#
LET _ContextNames = EAIMapper_getString("ContextNames")
 
#== Integração com outros sistemas ativa?
IF NOT _ADVPL_eai_is_send_configured(adp10004_get_transaction_name(), adp10004_get_adapter_version(), _ContextNames) THEN      
   CALL adp10004_inicializa_record()
   RETURN TRUE #Não pode retornar FALSE neste caso.
END IF
 
#== Cria a mensagem que será enviada
   CASE l_operacao
   WHEN 'IN' LET l_mensagem = _ADVPL_eai_create_message('CurrencyQuotation','upsert')
   WHEN 'MO' LET l_mensagem = _ADVPL_eai_create_message('CurrencyQuotation','upsert')
   WHEN 'EX' LET l_mensagem = _ADVPL_eai_create_message('CurrencyQuotation','delete')
   OTHERWISE
      CALL log0030_processa_mensagem('Operação inválida','info',l_modo_exibicao)
      CALL adp10004_inicializa_record()
      RETURN FALSE
END CASE
 
CALL adp10004_carrega_elementos_xml()
 
#--- Atribuição do contexto na mensagem ---#
IF l_contexts IS NOT NULL THEN
   CALL _ADVPL_eai_set_context_names( l_mensagem, _ContextNames )
END IF
  • Criar a função <Adapter>_getContextNames() para retornar a lista de contextos do adapter. Veja exemplo de corpo da função na seção Adapters existentes usando modelo helper/adapter.
  • Alterar a função <Adapter>_esta_configurado_para_envio() para enviar a versão do adapter e os contextos para a função_ADVPL_eai_is_send_configured().

Exemplo

 

Bloco de código
languageruby
linenumberstrue
#---------------------------------------------#
FUNCTION adp10004_esta_configurado_para_envio()
#---------------------------------------------#
   IF NOT _ADVPL_eai_is_send_configured(adp10004_get_transaction_name(), adp10004_get_adapter_version, _ContextNames) THEN
      RETURN FALSE
   END IF
   RETURN TRUE
END FUNCTION