"
Apoiado por

Comunicação por evento entre programas

Na mitologia grega a forma de comunicação mais frequentemente utilizada pelos deuses para comunicar com os mortais era o estupro. Estupravam por dá cá aquela palha.

O mais parecido que temos com estupro no ABAP é o comando SUBMIT, que é também a forma mais comum de comunicação entre dois programas.


Mas há formas menos brutas de um programa comunicar com outro. Recorrendo a um evento, por exemplo.

Presumamos que tens um programa chamado ZEUS (em rigor seria ZEUS_TOURO, mas OK) que quer comunicar com outro chamado ZEUROPA.

  1. Na transacção SM62 crias o evento com um nome tipo Z*. Chamemos-lhe ZAS! Uma vez criado podes encontrá-lo perto do fim da longa lista de eventos, junto dos restantes eventos criados pelo cliente;
  2. Se carregares no botão direito podes fazer uma data de coisas com ele. Uma delas é transportá-lo, ou seja, adicioná-lo a uma ordem de transporte;
  3. No programa ZEUS, no sítio onde houver vontade de invocar a ZEUROPA, mete o seguinte código:
    
    CALL FUNCTION 'BP_EVENT_RAISE'
      EXPORTING
        eventid                      = 'ZAS'
     EXCEPTIONS
       BAD_EVENTID                  = 1
       EVENTID_DOES_NOT_EXIST       = 2
       EVENTID_MISSING              = 3
       RAISE_FAILED                 = 4
       OTHERS                       = 5
    
  4. Na transacção SM36 cia um job ZEUS_ZAS_EUROPA com um único passo, a execução (salvo seja) da ZEUROPA;
  5. Nas condições de execução do job escolhe a opção “após evento” e escolhe o evento ZAS. Grava.

Pronto.
Ao correres o programa ZEUS,
Ele lança o evento ZAS,
Que espoleta o job ZEUS_ZAS_EUROPA,
Que executa (salvo seja) a ZEUROPA.

O Abapinho saúda-vos.

2 comentários a “Comunicação por evento entre programas”

  1. Diogo Diz:

    Bom dia.
    Gostaria de registrar minha opnião contra o uso de eventos.
    1- Fica mais difícil para debugar o ZEUROPA;
    2- Fica mais difícil para encontrar todos os pontos de chamada para o ZEUROPA
    3- Não sei se é possível passar parâmetros para o ZEUROPA
    4- Como o ZEUS irá ter conhecimento de que o ZEUROPA terminou a execução?
    5- Alguém pode, inadvertidamente, cancelar o job

  2. Nuno Godinho Diz:

    Olá Diogo,

    Concordo que os eventos de sistema são um bocado toscos e os argumentos que apresentas são válidos mas não considero que sejam argumentos contra o uso de eventos. São antes limitações intrínsecas destes.

    Os eventos não são adequados a todas as situações. Mas há determinadas circunstâncias em que são a melhor (ou mesmo a única) solução.

    Os eventos são um dos mecanismos ideais para fazer programas “loosely coupled”, como se diz em inglês, que não sei dizer em português. A programação GUI moderna, por exemplo, é intrinsecamente “loosely coupled” e amplamente baseada em eventos. Sofre de algumas das desvantagens que apontas mas não é por isso que o uso de eventos não é a melhor opção e não recorrer eles seria bem mais limitativo.

    O exemplo que dei é meramente ilustrativo. Mas repara: basta que no momento do desenvolvimento do ZEUS não se saiba ainda quem este vai chamar ou não se querer pré-defini-lo para ter de recorrer a um evento por forma a manter os dois independentes. Amanhã pode substituir-se o ZEUROPA pelo ZASIA ou pelo ZAMERICA sem ter de alterar um única linha do ZEUS. Aliás, amanhã o ZEUS pode inclusive espoletar os três ao mesmo tempo.

    Quanto às desvantagens que apontaste:
    1. Verdade;
    2. Verdade;
    3. Não é possível, mas só é uma desvantagem se for preciso passar parâmetros;
    4. Não é uma desvantagem se o ZEUS não precisar de o saber;
    5. Não me parece que seja relevante. Alguém pode inadvertidamente matar um processo qualquer também :)

    Na programação OO uma classe pode também publicar e subscrever eventos para criar ligações “loosely coupled” entre métodos. Neste caso o ABAP é mais sofisticado e permite fazer “where used” e tornar o debug mais simples. Quando possível utilizar eventos OO é claramente preferível a utilizar os toscos eventos de sistema.

Deixe um comentário


Acerca do Abapinho
O Abapinho é suportado pelo WordPress
Artigos (RSS) e Comentários (RSS).