从前曾经尝试在EXCEL中使用com 来调用SAP的RFC、ABAP函数来获取数据。可是非常不方便,特别是在往RFC函数中传递参数非常困难。
今天尝试在C#中通过.net connector调用SAP中RFC、BAPI函数。
1需要用到一个工具: .它的主要工作就是生成特定RFC、BAPI函数.net connector 的代理类。这个工具是韩文的,不过不影响使用。
2.第一步设置登陆设置。这跟平常的登陆设置是一样的。
3.成功登陆后就可以点击上面的按钮获取服务器中的函数列表,在左边可以进行名字的筛选。选择需要的函数名,再点击下一步。
4.可以修改命名空间与类名。选择存放文件夹。再点击最大的按键,直接生成类库。
5.在VS工程中引用生成的类库文件。一个测试程序
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ProxyBuilder;
using SAP.Connector;
using SAP.Connector.Rfc;
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.button1.Enabled = false;
}
//声明连接
SAP.Connector.Destination dest = new Destination();
//声明代理类
ProxyBuilder.SAPProxy proxy = new ProxyBuilder.SAPProxy();
private void btnConnect_Click(object sender, EventArgs e)
{
//这里是连接的具体参数,用过SAP的人都知道。。
dest.AppServerHost = "";
dest.Client = ;
dest.Password = "";
dest.Username = "";
dest.SystemNumber = ;
SAP.Connector.SAPConnection conn = new SAPConnection(dest);
proxy.Connection = conn;
try
{
proxy.Connection.Open();
this.button1.Enabled = true;
}
catch
{
MessageBox.Show("login failed");
proxy.Connection.Close();
}
}
private void button1_Click(object sender, EventArgs e)
{
//用来保存返回表,实际上这里返回的是一个结构Wa。
ProxyBuilder.TAB512Table tb512 = new TAB512Table();
//定义字段参数
RFC_DB_FLD fld=new RFC_DB_FLD();
RFC_DB_FLDTable tbfld=new RFC_DB_FLDTable();
fld.Fieldname = "BELNR";
tbfld.Add(fld);
fld.Fieldname = "BUKRS ";
tbfld.Add(fld);
fld.Fieldname = "GJAHR ";
tbfld.Add(fld);
//可以指定条件参数
RFC_DB_OPT opt = new RFC_DB_OPT();
RFC_DB_OPTTable TBOPT=new RFC_DB_OPTTable();
try
{
//调用此函数来读取SAP中表数据。
//先解释一下RFC_READ_TABLE的参数:
// importing:
// QUERY_TABLE: 读取的表
// DELIMITER:字段之间的分隔符(当选择多个字段时)
// NO_DATA:输入'X'时,不向传出表DATA输出数据
// ROWSKIPS:输出数据的第一条数据的行号(从0开始计)
// ROWCOUNT:从ROWSKIPS开始,一共输出的数据行数(0代表所有数据)
// Table:
// OPTIONS:表查询条件,比如对MARA表来说,可以写MATNR = 'ABCD'。留空代表选择所有数据。
// FIELDS:输出的表字段。留空代表输出所有字段。
// DATA:输入的数据记录
// 其中第一个参数QUERY_TABLE应该是必输项,否则这次调用就无意义(不知道要选那个表啊!),函数返回TABLE_NOT_AVAILABLE错误。
// 调用字串中第一个参数是空字串。这应该是错误的原因。
// FIELDS参数实际允许空
proxy.RFC_READ_TABLE(",", "", "BKPF", 20, 0, ref tb512, ref tbfld, ref TBOPT);
if (tb512.Count > 0)
{
//可以直接绑定数据控件。
dataGridView1.DataSource = tb512;
}
proxy.Connection.Close();
}
catch (Exception ee)
{
MessageBox.Show(ee.Message);
}
}
}
}
6.有关于RFC_READ_TABLE 有关的信息,可以通过SE80程序组SDTX查看