O SAP .NET Connector 3.0 é a versão atual do ambiente de desenvolvimento da SAP para a comunicação entre os sistemas da plataforma SAP e Microsoft .NET. Este conector suporta RFCs e serviços Web. Ele permite que você escreva aplicações diferentes, na plataforma Web, Windows Form, ou aplicativos de console. Para baixa-lo você precisa ter um usuário na SAP MarketPlace com direitos de download, entretanto existe um projeto Open Source que estende o SAP Connector e disponibiliza a biblioteca do conector da SAP na versão para computadores x86 e x64 compilados para o Microsoft Framework 4.0.
SAP Oficial: SAP .NET Connector 3.0
SAP Connector Library: https://github.com/ion-sapoval/NSAPConnector/tree/master/Libraries
O que é Remote Function Call (RFC)?
Uma chamada de função remota (RFC) é a chamada ou a execução remota de um módulo de função remoto em um sistema externo. No sistema da SAP, estas funções são fornecidas pelo sistema de interface de RFC. O sistema de interface RFC permite chamadas de função entre dois sistemas SAP, ou entre um sistema SAP e um sistema externo. As transações de dados não se limitam a obtenção de dados a partir do servidor, mas também podem inserir dados em registros do servidor. O sistema SAP pode atuar como um cliente ou um servidor em uma chamada RFC.
Usando o SAP .NET Connector 3.0 no Visual Studio
1 – Após baixar a biblioteca adequada para seu sistema operacional, crie um projeto C# Windows Forms e em suas propriedades mude o Target para que seja compilado na versão 4.0 do framework. Ressaltando que estamos utilizando a versão das dlls baixadas do projeto hospedado no Github no link acima. Adicione as três bibliotecas ao seu projeto e para referencia veja a figura abaixo:
2 – No Netweaver abra transação SE16, e verifique o conteúdo da tabela de exemplo chamada SCARR no seu ambiente de desenvolvimento, caso não possua os dados do Netweaver em um ambiente de desenvolvimento, veja como configurar um ambiente DEV (200) e alimentar dados à tabela SCARR nos posts anteriores:
3 – No Visual Studio crie um design simples utilizando painéis, rótulos, caixas de textos e um botão:
Exemplo:
Neste exemplo utilizamos SAP Connector 3.0 e funções RFC do Netweaver para exportar dados contidos no sistema SAP através de chamadas remotas de uma aplicação escrita em C#.
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; using SAP.Middleware.Connector; // SAP .NET Connector namespace DASapNetConnector3 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { // Cria parametros de conexão RfcConfigParameters meusap = new RfcConfigParameters(); // Alimenta parametros SAP Logon meusap.Add(RfcConfigParameters.Name, textBox1.Text); meusap.Add(RfcConfigParameters.AppServerHost, textBox2.Text); meusap.Add(RfcConfigParameters.SystemNumber, textBox3.Text); // Alimenta parametros SAP GUI meusap.Add(RfcConfigParameters.Client, textBox4.Text); meusap.Add(RfcConfigParameters.User, textBox5.Text); meusap.Add(RfcConfigParameters.Password, textBox6.Text); // Cria destino RfcDestination meurfc = RfcDestinationManager.GetDestination(meusap); try { if (meurfc != null) { // Verifica conexão meurfc.Ping(); label1.Text = "SAP - Conectado com sucesso."; // Lê tabela RfcRepository repo = meurfc.Repository; // Define função de exportação de textos IRfcFunction funcaoRT = repo.CreateFunction("RFC_READ_TABLE"); // Define parametros da função funcaoRT.SetValue("query_table", "SCARR"); funcaoRT.SetValue("delimiter", "|"); // Chama função funcaoRT.Invoke(meurfc); // Recupera Dados cru, você precisa trata-los para // que sejam humanamente legivel IRfcTable tabela = funcaoRT.GetTable("DATA"); // Recupera texto string dados = tabela.ToString(); // Workaround para limpar tabela // Existem métodos mais eficientes // Este é apenas um caminho rápido para exemplo // Também há possibilidades em diferentes funções e BAPis // Converter um set de dados da função em um set de dados .NET dados = dados.Replace("TABLE [STRUCTURE TAB512 { FIELD WA=",""); dados = dados.Replace("[STRUCTURE TAB512 { FIELD WA=", ""); dados = dados.Replace("}]", "\n"); // alimenta GUI richTextBox1.AppendText(dados.TrimStart()); } } catch (Exception ex) { // Erro ao conectar label1.Text = "SAP - Desconectado"; MessageBox.Show(ex.ToString(), "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } }