超酷小 发表于 2015-9-20 11:59:20

C# 调用 SAP RFC 方法

C# 调用 SAP RFC 方法


原文地址:C#调用SAP函数之RFC_READ_TABLE作者:天壤的劫火
  public void test()
  {
  SAPLogonControlClass connctl = new SAPLogonControlClass();
  //下面的参数值根据实际情况赋值                        connctl.Client = "集团号";             connctl.Language = "ZH";             connctl.ApplicationServer = "服务器IP";             connctl.SystemNumber = 00;             connctl.User = "SAP登录名";             connctl.Password = "SAP密码";
  Connection conn = (Connection)connctl.NewConnection();             //登陆             if (conn.Logon(null, true))             {               SAPFunctionsClass functions = new SAPFunctionsClass();               functions.Connection = conn;
  //这里就传入函数名称RFC_READ_TABLE               Function fucntion = (Function)functions.Add("RFC_READ_TABLE");
  //这里是传入值参数QUERY_TABLE 就是要查询的表名 DELIMITER就是字段间的间隔符号,因为函数的返回参数不是表格形式               Parameter parameter1 = (Parameter)fucntion.get_Exports("QUERY_TABLE");               parameter1.Value = "BSEG";               Parameter parameter2 = (Parameter)fucntion.get_Exports("DELIMITER");               parameter2.Value = "@";
  //这里是传入表的参数,这里有两个表OPTIONS和FIELDS;OPTION表是存放查询条件的,为空的话是不限制条件,FIELDS是存放你想要查询的字段,按理说可以为空,但是试过不行,只能设置要取的字段               Tables Tables1 = (Tables)fucntion.Tables;
  Table table0 = (Table)Tables1.get_Item("OPTIONS");               table0.AppendGridData(1, 1, 1, "");//设置条件,例如(MANDT=‘100’)
  Table talble1 = (Table)Tables1.get_Item("FIELDS");               talble1.AppendGridData(1, 1, 1, "MANDT");//                      talble1.AppendGridData(2, 1, 1, "BUKRS");//               talble1.AppendGridData(3, 1, 1, "BELNR");//                           talble1.AppendGridData(4, 1, 1, "GJAHR");//               talble1.AppendGridData(5, 1, 1, "BUZEI");//
  talble1.AppendGridData(1, 2, 1, "SHKZG");//
  talble1.AppendGridData(2, 2, 1, "MENGE");//               talble1.AppendGridData(3, 2, 1, "MEINS");//               talble1.AppendGridData(4, 2, 1, "EBELN");//
  talble1.AppendGridData(5, 2, 1, "EBELP");//
  //调用函数,并读取数据               if (fucntion.Call())               {                     Tables1 = (Tables)fucntion.Tables;
  //获取函数返回内容                     Table talbe2 = (Table)Tables1.get_Item("DATA");
  MessageBox.Show(talbe2.get_cell(1,1).ToString());
  或者
  MessageBox.Show(talbe2.get_cell(1,"MANDT").ToString());                   }             //退出登陆             conn.Logoff();         }

原文地址:C# 调用 SAP RFC 方法作者:Danny
  C# 调用 SAP RFC 方法 收藏 添加SAP安装程序的四个dll文件引用:
  Interop.SAPBAPIControlLib.dll Interop.SAPFunctionsOCX.dll Interop.SAPLogonCtrl.dll Interop.SAPTableFactoryCtrl.dll
  调用方法体:
  private void GetMateriel()   {         string number = this.txtNumber.Text.Trim();         string desc = this.txtDesc.Text.Trim();
  Config config = new Config();         SAPLogonCtrl.SAPLogonControlClass login = new SAPLogonCtrl.SAPLogonControlClass();
  login.ApplicationServer = config.Server;         login.Client = config.Client;         login.Language = config.Language;         login.User = config.User;         login.Password = config.Password;         login.SystemNumber = config.Number;
  SAPLogonCtrl.Connection conn = (SAPLogonCtrl.Connection)login.NewConnection();         DataSet ds = new DataSet();         DataTable table = new DataTable();         table.Columns.Add("Number", typeof(string));         table.Columns.Add("Desc1", typeof(string));         table.Columns.Add("Desc2", typeof(string));         table.Columns.Add("Desc3", typeof(string));         table.Columns.Add("Uint", typeof(string));
  if (conn.Logon(0, true))         {             SAPFunctionsOCX.SAPFunctionsClass func = new SAPFunctionsOCX.SAPFunctionsClass();             func.Connection = conn;
  SAPFunctionsOCX.IFunction ifunc = (SAPFunctionsOCX.IFunction)func.Add("Z_MATERIAL_APPLICATION"); //(Z_MATERIAL_APPLICATION) SAP RFC 名称
  SAPFunctionsOCX.IParameter gclient = (SAPFunctionsOCX.IParameter)ifunc.get_Exports("I_WERKS"); //(I_WERKS)输入参数             gclient.Value = Factory; //(Factory)对参数赋值
  SAPFunctionsOCX.IParameter matnr = (SAPFunctionsOCX.IParameter)ifunc.get_Exports("I_MATNR");             matnr.Value = number;
  SAPFunctionsOCX.IParameter maktx = (SAPFunctionsOCX.IParameter)ifunc.get_Exports("I_MAKTX");             maktx.Value = desc;
  ifunc.Call();             SAPTableFactoryCtrl.Tables tables = (SAPTableFactoryCtrl.Tables)ifunc.Tables;             SAPTableFactoryCtrl.Table ENQ = (SAPTableFactoryCtrl.Table)tables.get_Item("PO_TAB"); (PO_TAB)输出表名
  for (int i = 1; i <= ENQ.RowCount; i++)             {               DataRow dr = table.NewRow();               dr = ENQ.get_Cell(i, "MATNR");               dr = ENQ.get_Cell(i, "MAKTX");               dr = ENQ.get_Cell(i, "MAKTX2");               dr = ENQ.get_Cell(i, "MAKTX3");               dr = ENQ.get_Cell(i, "MEINS");               table.Rows.Add(dr);             }
  ds.Tables.Add(table);         }         conn.Logoff();
  this.Repeater1.DataSource = ds.Tables;         this.DataBind();         this.lblCount.Text = "共找到" + ds.Tables.Rows.Count.ToString() + "條記錄";         ScriptManager.RegisterStartupScript(btnSAP, this.GetType(), "", "$(document).ready( function (){ jQuery.page('page',10);} )", true);   }
  本文来自CSDN博客,转载请标明出处:http://blog.iyunv.com/robaot/archive/2009/10/20/4704127.aspx
  
  
  另一篇:C# 连接SAP,并调用RFC函数 (基于Com组件) 收藏 1) 新建工程后,首先添加3个Com组建的引用,分别为 SAPFunctionsOCX,SAPLogonCtrl,SAPTableFactoryCtrl; 2) 项目添加引用 using SAPFunctionsOCX; using SAPLogonCtrl; using SAPTableFactoryCtrl; 3) 连接并调用RFC             SAPLogonControlClass connctl = new SAPLogonControlClass();             //下面的参数值根据实际情况赋值             connctl.Client = "200";             connctl.Language = "EN";             connctl.ApplicationServer = "xxx.xxx.xxx.xxx";//Application server IP             connctl.SystemNumber = 00;             connctl.User = "XXXX";             connctl.Password = "XXXXXXX";
  Connection conn = (Connection)connctl.NewConnection();             //登陆             if (conn.Logon(null,true))             {               MessageBox.Show("Successful");             }                        SAPFunctionsClass functions = new SAPFunctionsClass();             functions.Connection = conn;             //这里就可以传入Function Name             Function fucntion = (Function)functions.Add("RFC_READ_TABLE");。             //这里是传入值参数             Parameter parameter1 = (Parameter)fucntion.get_Exports("QUERY_TABLE");             parameter1.Value = "VEKP";             Parameter parameter2 = (Parameter)fucntion.get_Exports("DELIMITER");             parameter2.Value = ";";             //这里是传入表的参数,这里有两个表OPTIONS和FIELDS             Tables Tables1 = (Tables)fucntion.Tables;             Table table0 = (Table)Tables1.get_Item("OPTIONS");             table0.AppendGridData(1, 1, 1, "EXIDV = '00000000001000000022'");             Table talble1 = (Table)Tables1.get_Item("FIELDS");             talble1.AppendGridData(1, 1, 1, "VENUM");             talble1.AppendGridData(2, 1, 1, "VPOBJKEY");             talble1.AppendGridData(3, 1, 1, "VSTEL");             //调用函数,并读取数据             if (fucntion.Call())             {               Tables1 = (Tables)fucntion.Tables;               Table talbe2 = (Table)Tables1.get_Item("DATA");               MessageBox.Show(talbe2.get_Cell(1, 1).ToString());             }             //退出登陆             conn.Logoff();
  本文来自CSDN博客,转载请标明出处:http://blog.iyunv.com/superying/archive/2009/12/10/4977062.aspx
  
c# 調用sap rfc -

  版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://qiqeloveyou.blogbus.com/logs/75375580.html
  1.C#与数据库访问技术:http://wenku.baidu.com/view/e590c268a98271fe910ef99e.html
  2.实现用C#向SAP内表和结构写入数据
  appenddatagrid可以替代set_Cell
  SAPLogonCtrl.SAPLogonControlClass SapLogon = new SAPLogonCtrl.SAPLogonControlClass(); SapLogon.Client = "800"; SapLogon.Language = "ZH"; SapLogon.User = "";//R3登陆用户名 SapLogon.Password = "";//登陆密码 SapLogon.ApplicationServer = "";//r3服务器 SapLogon.SystemNumber = 0; //以下建立与R3的通信机制   SAPLogonCtrl.Connection EnterSap = (SAPLogonCtrl.Connection)SapLogon.NewConnection();//建立连接 if (EnterSap.Logon(0, true) == false) { MessageBox.Show("no"); //this.Label1.Text = "aa"; } else { MessageBox.Show("yes"); //this.Label1.Text = "bb"; }
SAPFunctionsOCX.SAPFunctionsClass sapfc = new SAPFunctionsOCX.SAPFunctionsClass();         
SAPFunctionsOCX.IFunction sapfu = (SAPFunctionsOCX.IFunction)sapfc.Add("ZOA_UPDATE_PARKED_DOC_ZS"); sapfc.Connection = EnterSap;
SAPFunctionsOCX.IStructure stru = (SAPFunctionsOCX.IStructure)sapfu.get_Exports("zyztt");         
stru.set_Value("bldat", "20070205"); stru.set_Value("BUDAT", "20070205"); stru.set_Value("BLART","SA"); stru.set_Value("BUKRS","4100"); stru.set_Value("WAERS","RMB");
         SAPTableFactoryCtrl._CSAPTaFacTables impor = (SAPTableFactoryCtrl._CSAPTaFacTables)sapfu.Tables; SAPTableFactoryCtrl._CSAPTaFacTable partable = (SAPTableFactoryCtrl._CSAPTaFacTable)impor.get_Item("ZYZHXM");
partable.AppendRow();
int i=1; partable.set_Cell(i,"NEWKO",55032500); partable.set_Cell(i,"NEWBS","40");//执行到这里出现错 误:未处理的“System.Runtime.InteropServices.COMException”类型的异常出现在 mscorlib.dll 中。其他信息: 非选择性的参数。                                 MessageBox.Show(partable.get_Cell(i,1).ToString());使用set_Cell地確會出現異常 但是用appenddatagrid可以替代上面用法,本人調用成工            partable.set_Value(i,"KOSTL","J0"); partable.set_Value(i,"WRBTR","40"); partable.set_Value(i,"SGTXT","11月费用");            partable.AppendRow(); i++; partable.set_Value(i,"NEWBS","50");            partable.set_Value(i,"NEWKO","10010100"); partable.set_Value(i,"ZZCASH","A92"); partable.set_Value(i,"WRBTR","40"); partable.set_Value(i,"SGTXT","11月费用");
sapfu.Call();
EnterSap.Logoff();
页: [1]
查看完整版本: C# 调用 SAP RFC 方法