C# 连接SAP

从前曾经尝试在EXCEL中使用com 来调用SAP的RFC、ABAP函数来获取数据。可是非常不方便,特别是在往RFC函数中传递参数非常困难。

今天尝试在C#中通过.net connector调用SAP中RFC、BAPI函数。

 

1需要用到一个工具:SAP RFC Proxy Builder .它的主要工作就是生成特定RFC、BAPI函数.net connector 的代理类。这个工具是韩文的,不过不影响使用。

 

2.第一步设置登陆设置。这跟平常的登陆设置是一样的。

image

3.成功登陆后就可以点击上面的按钮获取服务器中的函数列表,在左边可以进行名字的筛选。选择需要的函数名,再点击下一步。

image 

4.可以修改命名空间与类名。选择存放文件夹。再点击最大的按键,直接生成类库。

image

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查看

image

posted @ 2010-08-26 15:32  wwsheng  阅读(4696)  评论(1编辑  收藏  举报