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 [未注册用户]