c#连接SAP新方式
一直以来连接sap bapi都非常慢,但是最近有项目需要连接SAP,但是要求速度上有要求,于是我就在网上搜索了一番,终于给我发现一个sapnco3.0这一个东西,用了之后发现速度非常不错,第一次连接速度不算快,但是第二次连接就速度可以算秒连了,更加让我兴奋的是居然服务器不需要安装sap就可以连接sap,哈哈,我简直兴奋不已了
1.安装Setup_ntintel_302.msi
2.在C:\Program Files (x86)\SAP\SAP_DotNetConnector3_x86发现了4个文件,当然在自己的.net项目中全部引用这个4个dll啦,不过,抱歉,好像只能其中2个能
引用成功,哈哈,没有关系,不影响使用
引用完了,当然是封装自己喜爱的类啦
using SAP.Middleware.Connector; namespace JcWeb.CLass { public class SapClass { public RfcConfigParameters rfc { get; set; } public RfcDestination rfcdest { get; set; } public RfcRepository rfcrep { get; set; } public IRfcFunction myfun { get; set; } public bool open() { try { //都是一句话,根据自己实际情况填,哈哈,为了不暴露公司sap相关信息,参数都以*替代 rfc = new RfcConfigParameters(); rfc.Add(RfcConfigParameters.Name, "*");//sap名字 rfc.Add(RfcConfigParameters.AppServerHost, "*");//SAP服务器IP rfc.Add(RfcConfigParameters.Client, "*");//端口 rfc.Add(RfcConfigParameters.User, "*");//用户名 rfc.Add(RfcConfigParameters.Password, "*");//密码 rfc.Add(RfcConfigParameters.SystemNumber, "*"); rfc.Add(RfcConfigParameters.Language, "EN"); rfc.Add(RfcConfigParameters.PoolSize, "50"); rfc.Add(RfcConfigParameters.MaxPoolSize, "100"); rfc.Add(RfcConfigParameters.IdleTimeout, "5000"); rfcdest = RfcDestinationManager.GetDestination(rfc); rfcrep = rfcdest.Repository; } catch { return false; } } public List<JcWeb.Models.DnInfo> ZBAPI_SD_ZSDR135_T1_Output(List<string> dn){ List<JcWeb.Models.DnInfo> data = new List<Models.DnInfo>(); myfun = null;
myfun = rfcrep.CreateFunction("ZBAPI_SD_ZSDR135_T1");//连接BAPI
//如果输入参数不是一个表的话,以下方式设值
//myfun.SetValue("AAA", "值");
//如果输入参数是一个表的话,以下方式设值
IRfcTable dntable = myfun.GetTable("DN");
foreach(var t in dn){
dntable.Insert();
dntable.CurrentRow.SetValue("VBELN", t);
}
myfun.Invoke(rfcdest);//把数据返回SAP执行
IRfcTable outtable = myfun.GetTable("T02");//返回数据的表格
JcWeb.Models.DnInfo dndata;
for (var i = 0; i <= outtable.RowCount - 1; i++) { outtable.CurrentIndex = i; dndata=new Models.DnInfo(); dndata.Dn = outtable.CurrentRow.GetString("VBELN").ToString(); dndata.Batch = outtable.CurrentRow.GetString("CHARG").ToString(); dndata.custname = outtable.CurrentRow.GetString("NAME1").ToString(); dndata.Dnitem = outtable.CurrentRow.GetString("UEPOS").ToString(); dndata.liaohao_after = outtable.CurrentRow.GetString("MATNR").ToString(); dndata.liaohao_before = outtable.CurrentRow.GetString("MATNR1").ToString(); dndata.Qty = Convert.ToDouble(outtable.CurrentRow.GetString("KCMENG").ToString()); dndata.Rounding_Value = Convert.ToDouble(outtable.CurrentRow.GetString("SCMNG").ToString()); dndata.Sales_Office = outtable.CurrentRow.GetString("VKBUR").ToString(); dndata.Sales_Org = outtable.CurrentRow.GetString("VKORG").ToString(); if (outtable.CurrentRow.GetString("HSDATS").ToString() != "0000-00-00") { dndata.scdate = Convert.ToDateTime(outtable.CurrentRow.GetString("HSDATS").ToString()); } dndata.scpihao = outtable.CurrentRow.GetString("CHARGS").ToString(); dndata.shipto = outtable.CurrentRow.GetString("KUNNR").ToString(); dndata.soldto = outtable.CurrentRow.GetString("KUNAG").ToString(); dndata.taping_date = Convert.ToDateTime(outtable.CurrentRow.GetString("HSDAT").ToString()); data.Add(dndata); } return data; } } }
根据自己的需求可以自己封装操作类啦,不要评价我的封装类,嘻嘻
不过到这里新的悲剧出现,这个插件真他妈的牛B,把我耍了大半天时间才知道什么回事
因为这个插件有时候会出现sap连接失败的,不过次数不多,一天偶尔发生一两次,不影响使用,其次我要重点说明下开发时候的问题
举个例子
IRfcTable dntable = myfun.GetTable("DN"); foreach(var t in dn){ dntable.Insert(); dntable.CurrentRow.SetValue("VBELN", t); } myfun.Invoke(rfcdest); IRfcTable outtable = myfun.GetTable("T02");
假如你的BAPI里面没有T02这个表,好啦,你第一次使用这个插件开发,你就给他耍死你,不过有我指点你
假如你的BAPI里面没有T02这个表,报错代码不会停留在 IRfcTable outtable = myfun.GetTable("T02")这里的
他会在myfun = rfcrep.CreateFunction("ZBAPI_SD_ZSDR135_T1")这条代码这里提示说找不到这个BAPI
说到这里这个插件牛B不,还没有运行到下面的就知道下面代码出错了,害我白瞎搞白天,所以大家别给错误提示误导
我估计到这里,大家都明白怎样使用这个插件啦,下面是附上插件的下载地址
Hi,推荐文件给你 "sapnco30P_2-20007347.zip" http://vdisk.weibo.com/s/iEwEb