Guias

Published on March 21st, 2011 | by Mauricio Cruz

8

ABAPZombie Guide to ABAP – Parte 19 – CALL FUNCTION

CALL FUNCTION, comando usado em 10 de cada 6 programas em ABAP.

O que ele faz? É só colocar CALL FUNCTION no Google Translation (en para pt) que vc descobre! 🙄

Bom, basicamente o comando serve para efetuar a chamada de qualquer função presente na transação SE37, como segue:

Você, tem que listar os parâmetros obrigatórios que estiverem na descrição da função na SE37 (importing/exporting/tables) quando usar este comando.

Uma coisa que não é obrigatória na chamada da função mas deve ser usada são as EXCEPTIONS, que correspondem ao tratamento dos diversos erros que a função pode retornar (usando o comando RAISE EXCEPTION).

Caso a função retorne um erro, o código da EXCEPTION será transportado para a variável de sistema SY-SUBRC, e você pode tratar o erro adequadamente.

Importante: Caso você não liste as EXCEPTIONs no programa que está dando o CALL FUNCTION, e a função disparar uma exceção o seu programa irá “dumpar”. Como você não gosta de dumps, use sempre as exceptions 😉

O comando CALL FUNCTION também possue outras particularidades, vejamos:

RFCs: Você pode usar o comando CALL FUNCTION para chamar funções de outros sistemas SAP, desde que haja uma conexão configurada entre os dois sistemas e função for do tipo “RFC” (configurável na primeira aba da SE37) no sistema destino. Chamamos essa “conexão” de DESTINATION, e é através dele que o SAP sabe onde deve conectar-se para executar a função. Exemplo:

No caso acima, a função foi executada no sistema caracterizado pelo destinado V_DEST, e não no sistema onde o programa está rodando. É extremamente importante utilizar os EXCPETIONs especiais para chamadas de funções remotas (Exceptions de RFC alí em cima).

UPDATE TASK: A chamada em UPDATE TASK de uma função faz com que a função não seja executada automaticamente, mas sim guardada na memória para ser executada dentro do work process de atualização do sistema. Esse work process é disparado quando um programa executa o comando COMMIT WORK. Se você chamar mais de uma função em UPDATE TASK num mesmo programa, alguns parâmetros que podem ser definidos na SE37 vão controlar a sequência de execução da pilha.
Exemplo:

STARTING NEW TASK: velho conhecido da galera adepta do paralelismo. Na verdade, a idéia aqui é fazer a execução de uma função RFC de modo assíncrono, ou seja, o programa chama uma função de outro sistema e não espera resposta. Porém, muita gente usa esse comando por aí para chamar uma função de modo assíncrono dentro do próprio sistema, abrindo assim várias tasks que rodam em paralelo. Esse é o esquema mágico paralelismo, que sempre assombra a vida de quem dá manutenção em programas malucos. Exemplo:

Lembrando que no caso acima, eu coloquei o DESTINATION apontando para o mesmo sistema onde o programa está rodando. Nada impede que você abra tasks num sistema destino. Ah, e o código acima, obviamente, não faz muito sentido funcionamente… é mais para mostrar os comandos mesmo. 🙂

IN BACKGROUND TASK: Muito parecido com o UPDATE TASK, no COMMIT WORK um programa que roda num Work Process em Background dispara a execução da(s) função(s). Ele é pouco usado em programas Z, mas o standard usa bastante para executar processos gigantes pós-commit das transações.

Phew, terminei os mais usados. Aidna tem muitos outros tipos de chamadas de função, mas acho que esses são os mais usados para programas Z.

Abraços a todos aqueles que já chamaram uma função.

Share on FacebookTweet about this on TwitterShare on LinkedInShare on Google+Email this to someonePrint this page

Tags: , , , ,


About the Author

é pasteleiro há alguns anos e criou o ABAPZombie junto com o Mauro em 2010. Gosta de filosofar sobre fundamentos básicos da programação e assuntos polêmicos. Músicas estranhas, artes marciais e games indies são legais. Zumbis não. Converse comigo no twitter e conheça o meu livro de ABAP!



8 Responses to ABAPZombie Guide to ABAP – Parte 19 – CALL FUNCTION

  1. Rafael Vieira says:

    mano, vc é um lixo

    "Zumbis estão atacando" foi foda
    kkkkkkkkkkkkkkkkkkkk

    O PERFORMING ON END OF TASK é útil hein, não conhecia isso não.
    Abraço!

  2. Kaio says:

    caso eu queira criar uma função 'z' e colocar algumas exceções quais codigos eu preciso inserir no texto fonte da função?!

    grato

    • Fala Kaio!

      Primeiro você deve "declarar" a existência da exceção na aba "Exceptions" da SE37. Depois, você deve seguir o mesmo padrão de declaração ali do exemplo da chamada da função GUI_UPLOAD. E lembre-se de disparar a exceção dentro da função com o comando RAISE EXCEPTION, sempre que tiver um erro na execução da função.

      Abraços 🙂

  3. Henrique Dias says:

    Uma coisa interessante que eu descobri esses dias é que você pode colocar a exceção ERROR_MESSAGE em uma função para suprimir as mensagens que ela exibiria. Muito útil para algumas funções metidas a bapi que mostram mensagem invés de usar tabela de retorno.

    • igor vilela says:

      so pra constar … interessante de mais seu comentario … porem explicar melhor …
      Ex.
      CALL FUNCTION ‘GUI_DOWNLOAD’
      EXPORTING
      FILENAME = LV_DIR
      TABLES
      DATA_TAB = LT_DATA
      EXCEPTIONS
      ERROR_MESSAGE = 0
      OTHERS = 22.

Leave a Reply

Your email address will not be published. Required fields are marked *

Back to Top ↑