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.





