Como sabemos o servidor de apresentação do sistema SAP, possui varias funções que permitem comunicação com o servidor de aplicações, como por exemplo, importar e exportar arquivos do lado cliente, entre suas varias outras funções, o servidor de apresentação nos permite também executar programas externos.
WS_EXECUTE é um módulo de função padrão disponível nos sistemas R/3 da SAP, dependendo da versão e nível de release. Esta função é responsável por executar qualquer programa não SAP, por exemplo, um editor, uma calculadora ou qualquer outro programa de sua escolha. WS_EXECUTE executa um programa no servidor de apresentação, podendo também utilizar parâmetros comuns para se comunicar com o executável.
Contudo o sistema SAP possui grande quantidade de funções obsoletas que ainda funcionam por compatibilidade com versões de programas mais antigos, a função WS_EXECUTE é uma delas, você pode substituir esta função pela classe CL_GUI_FRONTEND_SERVICES.
Abaixo vamos criar um programa baseado na brincadeira Simon disse, neste caso nosso programa passara mensagens através de parâmetros para um executável criado em uma outra linguagem de programação, o executável receberá a mensagem e a exibira em seu formulário.
Para a versão mais recente deste procedimento utilize CL_GUI_FRONTEND_SERVICES: Serviços de Frontend SAP
Comunicando-se com um programa C# através de parâmetros
1 – Primeiro precisamos criar um programa C# utilizando a IDE Visual Studio. Arraste para o formulário dois componentes Label, um componente PictureBox, 2 Componentes Panel e um componente Richtextbox. A captura dos parâmetros será executada no evento SHOWN do formulário. Utilize a figura abaixo para modelar o design do seu programa:
2 – Crie um novo programa Abap e utilize o código abaixo. Entre com um ou mais parâmetros separados por espaço na caixa de texto do sistema SAP e pressione o botão executar na barra de tarefas. Dê permissão para o servidor de apresentação executar o programa:
3 – Você receberá uma mensagem de acordo com o resultado apresentado pelo servidor de apresentação:
4 – Pronto o programa C# será executado e receberá os parâmetros enviados que serão mostrados em uma caixa de texto. Visto que o ambiente do .NET Framework nos retorna um ARRAY contendo, primeiro o caminho e o nome do executável e sequencialmente todos os parâmetros enviados:
Exemplo:
Neste exemplo escrevemos dois programas em linguagens de programação diferentes e conseguimos uma comunicação entre eles por meio de parâmetros, este simples exemplo nos mostra inúmeras possibilidades de comunicação entre um programa ABAP e programas externos sem utilizar as funções de RFC da SAP.
C#
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace CsSap { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Shown(object sender, EventArgs e) { // Recupera e exibi parâmetros enviados para o executavel string[] args = Environment.GetCommandLineArgs(); richTextBox1.AppendText(string.Format("{0}", String.Join(", ", args))); // TODO: Criar funcionalidades para os parâmetros recebidos. } } }
Abap
Função WS_EXECUTE:
*&---------------------------------------------------------------------* *& Report ZSAPDISSE *& *&---------------------------------------------------------------------* *& Desenvolvimento Aberto *& SAP Disse: WS_EXECUTE *&---------------------------------------------------------------------* REPORT ZSAPDISSE. * cria parametro para os parametros do executavel PARAMETER SAPDISSE TYPE c LENGTH 70. * declara variavel para o caminho do executavel DATA programa TYPE string. programa = 'C:\Desenvolvimento Aberto\temp\CsSap.exe'. * Chama função que executa um executavel CALL FUNCTION 'WS_EXECUTE' EXPORTING PROGRAM = programa COMMANDLINE = SAPDISSE INFORM = ' ' EXCEPTIONS FRONTEND_ERROR = 1 NO_BATCH = 2 PROG_NOT_FOUND = 3 ILLEGAL_OPTION = 4 GUI_REFUSE_EXECUTE = 5 OTHERS = 6. * verifica estado da execução CASE SY-SUBRC. WHEN 1. WRITE: / 'ERRO NO FRONTEND!'. WHEN 2. WRITE: / 'NO BATCH!'. WHEN 3. WRITE: / 'PROGRAMA NÃO ECONTRADO!'. WHEN 4. WRITE: / 'OPÇÃO ILEGAL!'. WHEN 5. WRITE: / 'SAP GUI SE RECUSOU A EXECUTAR O PROGRAMA!'. WHEN 6. WRITE: / 'OUTROS ERROS!'. WHEN OTHERS. WRITE: / 'PROGRAMA EXECUTADO COM SUCESSO!!!!'. MESSAGE 'Programa executado com sucesso!' TYPE 'S'. ENDCASE.
Classe CL_GUI_FRONTEND_SERVICES:
*&---------------------------------------------------------------------* *& Report ZSAPDISSE_FES *& *&---------------------------------------------------------------------* *& Desenvolvimento Aberto *& CL_GUI_FRONTEND_SERVICES *&---------------------------------------------------------------------* REPORT ZSAPDISSE_FES. * cria parametro para os parametros do executavel PARAMETER SAPDISSE TYPE string. * declara variavel para o caminho do executavel DATA programa TYPE string. programa = 'C:\Desenvolvimento Aberto\temp\CsSap.exe'. * Executa método de classe CL_GUI_FRONTEND_SERVICES=>EXECUTE( exporting APPLICATION = programa PARAMETER = sapdisse exceptions CNTL_ERROR = 1 ERROR_NO_GUI = 2 BAD_PARAMETER = 3 FILE_NOT_FOUND = 4 PATH_NOT_FOUND = 5 FILE_EXTENSION_UNKNOWN = 6 ERROR_EXECUTE_FAILED = 7 SYNCHRONOUS_FAILED = 8 NOT_SUPPORTED_BY_GUI = 9 OTHERS = 10 ). * verifica estado da execução CASE SY-SUBRC. WHEN 1. WRITE: / 'ERRO CNTL!'. WHEN 2. WRITE: / 'ERRO NO FRONTEND!!'. WHEN 3. WRITE: / 'ERRO NO PARAMETRO!'. WHEN 4. WRITE: / 'PROGRAMA NÃO ECONTRADO!'. WHEN 5. WRITE: / 'CAMINHO NÃO ECONTRADO!'. WHEN 6. WRITE: / 'EXTENSÃO DESCONHECIDA!'. WHEN 7. WRITE: / 'ERRO DE EXECUÇÃO!'. WHEN 8. WRITE: / 'FALHA NA SINCRONIZAÇÃO!'. WHEN 9. WRITE: / 'NÃO SUPORTADO PELO GUI!'. WHEN 10. WRITE: / 'OUTROS!'. WHEN OTHERS. WRITE: / 'PROGRAMA EXECUTADO COM SUCESSO!!!!'. MESSAGE 'Programa executado com sucesso!' TYPE 'S'. ENDCASE.