http://www.cnblogs.com/jirigala/archive/2008/11/26/1341345.html 这几天做杭州炼油厂的SAP地磅接口、力控开发系统下的Rosemount流量计接口。SAP版本是4.6C,应该是比较早期的版本,中石化统一的版本吧。 连接SAP有一个叫SAP .NET Connector 2.0,NND,必须需要VS2003的开发环境才可以安装,现在都2008年年底了,我哪里还去找VS2003, 而且电脑里装得软件已经很多,基本上没有地方好装VS2003了,还不知道已经装了VS2008还能否安装VS2003了,不是一般的闹心,是非常的闹心。 已安装了Microsoft Visual Studio 2008、Oralce、SQL2000、SQL2005、MySql, 为了调试还装了SAP的客户端SAP Front End。 真的不想再折腾了,再去下载VS2003, 安装这个,简直是杀人啊。 SAP .NET Connector 2.0 是无法用了,想找到这个包的相关DLL,也没能找到,没办法,就直接引用了SAP的客户端的Com组件,想通过直接调用 客户端的组件来登录到SAP,然后调用RFC,这些接近折腾了1天,终于连接是可以了,但是死活调用不了RFC函数调用的功能,一对Connection赋值 就会抛出异常 Bad variant type,http://topic.csdn.net/u/20080219/14/83e2d29e-899b-4186-9910-e98fd6daac35.html 搞死人,折腾了一晚上,用C#, VB.net的都无法搞定,都同样会抛出异常,看了别人的解决方法,还是VS2003B编译什么的,我哪里去找VS2003了。 第二天,其实是有些绝望了,到处打电话咨询,找救兵,也没太多实质性的进展,我这个人有一个最大的优点,就是有些自信,而且不愿意放弃, 更不愿意认输,继续找找看吧,找来找去,感觉微软有一个新的连接SAP的方法,SQL2005 NET Data Provider for mySAP Business Suite,DataProviderSAP.exe 下载这个看看,感觉是比较新的,应该在VS2008里可以用,找了下载找得稍微有点儿晕,最终还是找到了,哈哈,安装也成 功了,接下来再找了例子程序,引用了相关的DLL,结果奇迹发生了,能调用SAP里的RFC函数了,不知道都调要了啥功能,总算能连接SAP,还能执 行RFC函数了。这时早已过了下班时间了,SAP的工程师都回去了,我们想调试自己写的RFC函数,死活就是不回来正确的结果。 第三天,经过跟SAP工程师的协调,发现SAP里,数据库里标准格式是 char10,我们传输过去的参数有8位的长度,应该是长度不够导致结果不 正常,SAP也比较怪一些,需要在前面补2个零。哦,结果正常,好开心啊,连接SAP成果,参数传递正确,调用RFC成功,读取结果正确。 以上文章,希望给有同样折腾中的人,少走点儿弯路,不浪费时间,提高生活质量吧,多陪陪家人。 总结: 可能很多技术问题都不难,折腾过了,走过一些弯路了,心里就有数了,这就是所谓的经验吧。多折腾了,经验就更多了,人也值钱了。 RFC 就像数据库里的 存储过程一样的调用就可以了,之前都不知道这个是什么东东云里雾里,原来还可以这么简单就可以调用了。 将权限管理、工作流管理做到我能力的极致,一个人只能做好那么很少的几件事情。 posted on 2008-11-26 12:35 吉日嘎拉 阅读(1881) 评论(23) 编辑 收藏 网摘 评论 #1楼 回复 引用 查看 呵呵,够折腾的 2008-11-26 12:51 | chy710 #2楼 222.66.39.* 回复 引用 用VB.NET直接调用 相关的COM就行了 网上有VB6的例子的,不过用c#直接调用就报错,除非使用反射 这个问题用VB解决比较方便。 2008-11-26 13:09 | byrybye [未注册用户] #3楼 回复 引用 查看 支持楼主一下 2008-11-26 13:11 | JesseZhao #4楼 [楼主] 回复 引用 查看 VB.NET 也测试过,一样的错误,死活不行,我怀疑是跟SAP的版本及 相关DLL的版本也有关系,可能有些版本上会很顺利就可以了。 2008-11-26 13:13 | 吉日嘎拉 #5楼 回复 引用 查看 支持楼主 2008-11-26 13:51 | aoper #6楼 回复 引用 查看 力控那东西贼拉恶心,功能是强大,太难用了!! 2008-11-26 15:47 | 天启 #7楼 回复 引用 查看 装了sap Client后,在vb.net中C:\Program Files\SAP\FrontEnd\Controls\wdtfuncs.ocx这个文件的com引用,即可直接调用sap了,我用此在上海石化的sap上读过数据。 ' 2008-11-26 16:18 | 81 #8楼 回复 引用 查看 写的真好,支持,文章关注中 2008-11-26 16:53 | Mahon #9楼 回复 引用 查看 直接引用ocx用vb.net可以的,记得主线程必须是STA,这是ocx机制的原因 2008-11-26 19:12 | RicCC #10楼 回复 引用 查看 记得当年也是碰到"Bad variant type"错误,在sap论坛上有人解决了 2008-11-26 19:15 | RicCC #11楼 回复 引用 查看 恩在这里呢,怀念一下05年的帖子,八成你也是这个问题造成的 https://www.sdn.sap.com/irj/scn/thread?messageID=367189 2008-11-26 19:27 | RicCC #12楼 [楼主] 回复 引用 查看 真的是牛人多多啊,天外有天,有时候不服不行。 2008-11-26 19:56 | 吉日嘎拉 #13楼 61.149.31.* 回复 引用 你也在用.net开发Rosemount流量计接口呀,我也有个 E+H的流量计,想用C#从串口取数据,然后转译到图形界面上再存到数据库里面。 你有这方面开发的例子么。 2008-11-26 21:24 | DXM [未注册用户] #14楼 119.39.26.* 回复 引用 我记得当时调用了后会弹出来登陆窗口 就因为这个问题当时就没有再用了 有什么办法不让登陆窗口弹出来吗 ^^ 2008-11-27 00:12 | jumbo1025 [未注册用户] #15楼 回复 引用 查看 用VB.Net是可以的,要安装SAP客户端组件。。。 用C#不会,我上个月也为了这个问题折腾了好几天,最后用VB.Net写的,打包成dll,在C#中引用。 Public Function QMStoSAP(ByVal dt As DataTable) As Boolean QMStoSAP = False Dim sapConn As Object ''Declare variant sapConn = CreateObject("SAP.Functions") ''Create ActiveX object ''Specify user sapConn.Connection.user = strUser ''Then password sapConn.Connection.Password = strPassword ''Client sapConn.Connection.Client = strClient ''Target server address sapConn.Connection.ApplicationServer = strApplicationServer ''Language code sapConn.Connection.Language = strLanguage ''SystemNumber sapConn.Connection.SystemNumber = iSystemNumber If sapConn.Connection.Logon(0, True) <> True Then QMStoSAP = False MsgBox("Cannot Log on to SAP") ''Issue message if cannot logon Exit Function End If 'Define function Dim objRfcFunc As Object objRfcFunc = sapConn.Add("ZRFC_WO_AUTO_GR") Dim objVBPA As Object objVBPA = objRfcFunc.Tables("ITABIN") strErrorMsg = "" strPostNO = "" 'set value for shipemnt For Each dr As DataRow In dt.Rows objVBPA.Rows.Add() objVBPA(objVBPA.RowCount, "ZPALLETID") = Trim(dr("ZPALLETID")) objVBPA(objVBPA.RowCount, "PLANT") = Trim(dr("PLANT")) objVBPA(objVBPA.RowCount, "COSTCENTER") = Trim(dr("COSTCENTER")) objVBPA(objVBPA.RowCount, "WO") = Trim(dr("WO")) objVBPA(objVBPA.RowCount, "QTY") = Trim(dr("QTY")) objVBPA(objVBPA.RowCount, "MATERIAL") = Trim(dr("MATERIAL")) objVBPA(objVBPA.RowCount, "REGION") = Trim(dr("REGION")) objVBPA(objVBPA.RowCount, "LOCA") = Trim(dr("LOCA")) objVBPA(objVBPA.RowCount, "REF1") = Trim(dr("REF1")) objVBPA(objVBPA.RowCount, "REF2") = Trim(dr("REF2")) Next If objRfcFunc.Call = False Then sapConn.Connection.Logoff() QMStoSAP = False MsgBox("Error occured - " & objRfcFunc.Exception) Exit Function End If ''VB6.0 中的写法:strPostNO = objRfcFunc.Imports("POSTNO"),在.Net中是不行的,因.Net是强类型语言 strPostNO = objRfcFunc.Imports("POSTNO").Value strErrorMsg = objRfcFunc.Imports("ERRORMSG").Value sapConn.Connection.Logoff() If Trim(strPostNO) <> "" Then QMStoSAP = True Else QMStoSAP = False End If End Function 2008-11-27 08:37 | 毛必盛 #16楼 回复 引用 查看 可否再花点时间写篇文章介绍一下DataProviderSAP的用法,造福大家。。。 2008-11-27 08:43 | 毛必盛 #17楼 59.40.167.* 回复 引用 收藏了,谢谢,之前做过一个,不过是用的vs2003解决的 2008-11-27 10:45 | imbin [未注册用户] #18楼 10.137.130.* 回复 引用 想不通,为什么VS2005和VS2008不支持SAP Connector了?? 2008-11-28 10:26 | nh022 [未注册用户] #19楼 [楼主] 回复 引用 查看 SAP Connector 是针对 vs2003 的插件,在VS2005,VS2008里无法安装了。 不是 VS2005,VS2008 不支持这些,我想是。 2008-11-28 11:22 | 吉日嘎拉 #20楼 123.112.118.* 回复 引用 我使用VS2005+ECC6.0,在VS2005中调用SAP Com组件,可以登录也可以调用RFC.代码如下 SAPFunctionsOCX.SAPFunctionsClass func = new SAPFunctionsOCX.SAPFunctionsClass(); func.Connection = conn; SAPFunctionsOCX.IFunction ifunc = (SAPFunctionsOCX.IFunction)func.Add("ENQUEUE_READ"); ifunc.Call(); 没有抛出楼主说的 Bad variant type异常.不知道是不是与ECC的版本有关系呢!此外,楼主能否提供一下在调用了RFC之后,如何对RFC中的参数进行赋值以及获得结果呢,谢谢! 2008-12-28 23:41 | flysky927 [未注册用户] #21楼 219.142.122.* 回复 引用 昨完的问题已经解决了,谢谢!大概如下: SAPFunctionsOCX.IParameter gclient = (SAPFunctionsOCX.IParameter)ifunc.get_Exports("GCLIENT"); gclient.Value = "301"; SAPTableFactoryCtrl.Tables ENQs = (SAPTableFactoryCtrl.Tables)ifunc.Tables; SAPTableFactoryCtrl.Table ENQ = (SAPTableFactoryCtrl.Table)ENQs.get_Item("ENQ"); 2008-12-29 14:35 | flysky927 [未注册用户] #22楼 219.142.122.* 回复 引用 昨天说错了,使用VS2005+ECC6.0,在form中不会报错,但在web下会报Bad variant type异常.使用了楼主说的方法但没有成功,最后使用了--引用-------------------------------------------------- RicCC: 恩在这里呢,怀念一下05年的帖子,八成你也是这个问题造成的 https://www.sdn.sap.com/irj/scn/thread?messageID=367189 -------------------------------------------------------- 帖中的方法!成功! 2008-12-30 17:47 | flysky927 [未注册用户] #23楼 59.41.47.* 回复 引用 您好: 我刚开始接触 .net通过RFC连接sap,现在把vs2008 和DataProviderSAP.exe 安装好,但下一步不知如何着手?vs2008中如何有SAPFunctionsocx控件呀 。小弟愚笨,谢谢了! 2009-01-13 16:59 | cara [未注册用户]
posted on 2009-02-04 14:40  yxbsmx  阅读(970)  评论(0编辑  收藏  举报