|
一直以来连接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 |
|