C#调用SAP RFC如何向RFC的一个表参数传值

问题描述

如题,必须是C#,因为整个项目使用C#完成的,SAP的RFC非常复杂,要传很多参数...,下边是部分代码SAPLogonCtrl.SAPLogonControlClasssapLogon=newSAPLogonCtrl.SAPLogonControlClass();//sapLogon.ApplicationServer="GERPLO.SEC.SAMSUNG.NET";sapLogon.MessageServer="GERPLO.SEC.SAMSUNG.NET";sapLogon.System="GMP";sapLogon.GroupName="RFC_GROUP";sapLogon.SystemNumber=0;sapLogon.User="cpic_sys0395";sapLogon.Password="aa2133bb";sapLogon.Client="100";sapLogon.Language="EN";SAPLogonCtrl.ConnectionsapConn=(SAPLogonCtrl.Connection)sapLogon.NewConnection();if(!sapConn.Logon(0,true))//判断是否连接成功{MessageBox.Show("SAP连接失败");returnfalse;}SAPFunctionsOCX.SAPFunctionsClassfunc=newSAPFunctionsOCX.SAPFunctionsClass();func.Connection=sapConn;SAPFunctionsOCX.IFunctionifunc=(SAPFunctionsOCX.IFunction)func.Add("ZCSB_WB_SBSC_CREATE_CHANGE");SAPFunctionsOCX.IParameterpiModiType=(SAPFunctionsOCX.IParameter)ifunc.get_Exports("PI_MODI_TYPE");piModiType.Value="M";SAPFunctionsOCX.IParameterpiSave=(SAPFunctionsOCX.IParameter)ifunc.get_Exports("PI_SAVE");piSave.Value="Y";SAPFunctionsOCX.IParameterpiBukrs=(SAPFunctionsOCX.IParameter)ifunc.get_Exports("PI_BUKRS");piBukrs.Value="C6V0";SAPFunctionsOCX.IParameterpiSpras=(SAPFunctionsOCX.IParameter)ifunc.get_Exports("PI_SPRAS");piSpras.Value="1";SAPTableFactoryCtrl.TablesiTables=(SAPTableFactoryCtrl.Tables)ifunc.Tables;SAPTableFactoryCtrl.TableptInHeader=(SAPTableFactoryCtrl.Table)iTables.get_Item("PT_IN_HEADER");SAPTableFactoryCtrl.TableptInItem=(SAPTableFactoryCtrl.Table)iTables.get_Item("PT_IN_ITEM");SAPTableFactoryCtrl.TableptOutHeader=(SAPTableFactoryCtrl.Table)iTables.get_Item("PT_OUT_HEADER");SAPTableFactoryCtrl.TableptOutItem=(SAPTableFactoryCtrl.Table)iTables.get_Item("PT_OUT_ITEM");SAPTableFactoryCtrl.TableptError=(SAPTableFactoryCtrl.Table)iTables.get_Item("PT_ERROR");SAPTableFactoryCtrl.TableptOutOther=(SAPTableFactoryCtrl.Table)iTables.get_Item("PT_ERROR");ptInHeader.Refresh();ptInItem.Refresh();ptOutHeader.Refresh();ptOutItem.Refresh();ptError.Refresh();ptOutOther.Refresh();//ptInHeader.InsertRow("");ptInHeader.AppendRow();introwCount=ptInHeader.RowCount;SAPTableFactoryCtrl.Columnscols=(SAPTableFactoryCtrl.Columns)ptInHeader.Columns;//col=(SAPTableFactoryCtrl.Column)cols.get_Item("REFNO");//这里出现问题,这样程序不会出错,但是在SAP端会发现根本没有传进来任何参数使用set_value和set_cell都会出错,请各位大虾指点ptInHeader.AppendGridData(rowCount,((SAPTableFactoryCtrl.Column)cols.get_Item("REFNO")).Index,1,rw["ACCEPT_NO"].ToString());//ACCEPT_NOptInHeader.AppendGridData(rowCount,((SAPTableFactoryCtrl.Column)cols.get_Item("CLMNO")).Index,1,rw["SAP_CLAIM_NO"].ToString().Trim());//NumberofWarrantyClaimptInHeader.AppendGridData(rowCount,((SAPTableFactoryCtrl.Column)cols.get_Item("TR_NO")).Index,1,rw["ACCEPT_NO"].ToString().Substring(1,10));//[WB]TrackingNumberptInHeader.AppendGridData(rowCount,((SAPTableFactoryCtrl.Column)cols.get_Item("STATUS")).Index,1,this.txtStatus.Text);//[WB]TrackingNumber

解决方案

解决方案二:
晕,这样的调用方式够古老。
解决方案三:
是不是可以换个思路?传字符参数进去,RFC中再将字符串转成内表不就成了?
解决方案四:
用VB吧我用c#调用RFC但是不行用VB可以代码网上找的到的如果出入一个内表没有试过
解决方案五:
不知道你这个问题解决了没有,是否可以共享一下.谢谢greateast@126.com
解决方案六:
估计是没解决,不然就结贴了,呵呵我当时也是用C#调VB.net实现的非要用C#的话,就象我说的,以字符串方式传入,用VB.net可以传表参数都是.net,用VB.net和C#实现还不都是一样?
解决方案七:
引用5楼wren2004的回复:

估计是没解决,不然就结贴了,呵呵我当时也是用C#调VB.net实现的非要用C#的话,就象我说的,以字符串方式传入,用VB.net可以传表参数都是.net,用VB.net和C#实现还不都是一样?

能说说思路吗?或者把代码贴出来看看
解决方案八:
思路我应该已经说的很明白了吧,传字符串,无非是用将数据以某字符相隔(比如|),然后在RFC中分拆,填到内表中去就行了VB.NET的方式,网上有很多例子,搜下就有了现成的代码嘛,还真没有,好久以前做的啦
解决方案九:
//sapLogon.ApplicationServer="GERPLO.SEC.SAMSUNG.NET";把这个注释掉,靠其它信息能够连接上SAP么?
解决方案十:
帮忙顶起
解决方案十一:
帮忙顶起
解决方案十二:
建议采用vs.2003的c#,同时通过sapconnector连接SAP,编写调用saprfc的dll,然后再在其他地方调用。
解决方案十三:
variant、数组等类型通过com传递参数时(比如byref),.net下可能会有问题。用原生的代码控制比好,比如VB6。另外visualstudio.net下的vb.net编译器,在调用com组件时,会尽可能模拟传统vb的行为。(需要设置一些项目参数),也可以尝试。
解决方案十四:
VS2005用C#直接调用SAPRFC是不可能的!建议这部分用VB.net来写会方便很多
解决方案十五:
该回复于2010-11-12 15:13:36被版主删除
解决方案:该回复于2010-11-15 09:17:40被版主删除
解决方案:用这个组件传内表,好像不可以。我这有C#传内表的例子,需要的联系QQ121676762
其他方案:
SAPLogonCtrl.SAPLogonControlClassconnctl=newSAPLogonCtrl.SAPLogonControlClass();connctl.ApplicationServer=this.textBox1.Text;//服务器IPconnctl.System=this.textBox2.Text;//系统标识connctl.SystemNumber=Convert.ToInt32(this.textBox3.Text);//connctl.Client=this.textBox4.Text;//客户端connctl.User=this.textBox5.Text;//用户名connctl.Password=this.textBox6.Text;//密码connctl.Language=this.textBox7.Text;//语言SAPLogonCtrl.Connectionconn=(SAPLogonCtrl.Connection)connctl.NewConnection();if(conn.Logon(0,true)==false){MessageBox.Show("连接失败!");return;}else{MessageBox.Show("连接成功!");return;}
解决方案:该回复于2011-07-08 16:30:46被版主删除
解决方案:该回复于2011-07-08 16:30:46被版主删除
解决方案:用appenddatagrid会增加行,用set_value会报错。有人能给个详细的例子么,感谢QQ:82592236
解决方案:这方面有不懂的可以问我,有几个项目经验QQ2-4-9-1-3-1-9-6-6
解决方案:http://www.cnblogs.com/mengxin523/这里讲的够多了~你可以去看看!!
解决方案:usingSAP.Middleware.Connector;///<summary>///连接SAP并返回一张IRfcTable类型的表,如果需要取该表里面的数据,请将其转换为DataTable即可,Import参数可以根据需要来传入。///</summary>///<paramname="ModelName">实例名称--自定义</param>///<paramname="IP">SAP服务器的IP地址</param>///<paramname="Client">客户端编号</param>///<paramname="UserID">连接SAP的用户名</param>///<paramname="UserPassword">连接SAP的密码</param>///<paramname="SystemNumber">SystemNumber</param>///<paramname="Language">语言</param>///<paramname="RfcName">SAP里面被调用的函数名称</param>///<paramname="TableName">指定函数里面返回的内表名称</param>///<paramname="Parameters1">SAP里面函数需要的第一个参数</param>///<paramname="Value1">第一个参数的值</param>///<paramname="Parameters2">SAP里面函数需要的第二个参数</param>///<paramname="Value2">第二个参数的值</param>///<paramname="Parameters3">SAP里面函数需要的第三个参数</param>///<paramname="Value3">第三个参数的值</param>///<returns>返回IRfcTable</returns>publicIRfcTableGetIRfcTable(stringModelName,stringIP,stringClient,stringUserID,stringUserPassword,stringSystemNumber,stringLanguage,stringRfcName,stringTableName,stringParameters1,stringValue1,stringParameters2,stringValue2,stringParameters3,stringValue3){RfcConfigParametersrfcPar=newRfcConfigParameters();rfcPar.Add(RfcConfigParameters.Name,ModelName);rfcPar.Add(RfcConfigParameters.AppServerHost,IP);rfcPar.Add(RfcConfigParameters.Client,Client);rfcPar.Add(RfcConfigParameters.User,UserID);rfcPar.Add(RfcConfigParameters.Password,UserPassword);rfcPar.Add(RfcConfigParameters.SystemNumber,SystemNumber);rfcPar.Add(RfcConfigParameters.Language,Language);RfcDestinationdest=RfcDestinationManager.GetDestination(rfcPar);RfcRepositoryrfcrep=dest.Repository;IRfcFunctionmyfun=null;myfun=rfcrep.CreateFunction(RfcName);myfun.SetValue(Parameters1,Value1);myfun.SetValue(Parameters2,Value2);myfun.SetValue(Parameters3,Value3);myfun.Invoke(dest);IRfcTableIrfcTable=myfun.GetTable(TableName);returnIrfcTable;}

解决方案:有办法,比如一个内表有10个字段,就把这个内表分拆成10个内表,每个内表有一个字段。TablesTables1=(Tables)fucntion.Tables;TableZNEWBS=(Table)Tables1.get_Item("ZNEWBS");TableZBLDAT=(Table)Tables1.get_Item("ZBLDAT");TableZNEWKO=(Table)Tables1.get_Item("ZNEWKO");TableZNEWUM=(Table)Tables1.get_Item("ZNEWUM");TableZWRBTR=(Table)Tables1.get_Item("ZWRBTR");TableZKOSTL=(Table)Tables1.get_Item("ZKOSTL");TableZPRCTR=(Table)Tables1.get_Item("ZPRCTR");TableZVBEL2=(Table)Tables1.get_Item("ZVBEL2");TableZPOSN2=(Table)Tables1.get_Item("ZPOSN2");TableZGSBER=(Table)Tables1.get_Item("ZGSBER");ZNEWBS.AppendGridData(1,1,1,"40");ZBLDAT.AppendGridData(1,1,1,"5501010105");ZNEWKO.AppendGridData(1,1,1,"");ZNEWUM.AppendGridData(1,1,1,"1000");ZWRBTR.AppendGridData(1,1,1,"2C6040000");ZKOSTL.AppendGridData(1,1,1,"3100");ZPRCTR.AppendGridData(1,1,1,"600002144");ZVBEL2.AppendGridData(1,1,1,"");ZPOSN2.AppendGridData(1,1,1,"");ZGSBER.AppendGridData(1,1,1,"WCF120900003");传到RFC后,再把它合并就成了一个内表了。

时间: 2024-10-27 05:58:54

C#调用SAP RFC如何向RFC的一个表参数传值的相关文章

C#开发webservice调用SAP的webservice后返回值是表类型,如何获取值?

问题描述 求助,C#调用SAP的webservice后返回值是表类型,如何获取表的行数? 解决方案 解决方案二:什么叫表类型?DataTable?SAP天堂也返回这样的东西?解决方案三:ws返回的就是xml了,里面的数据是可以获取的.至于你说的表,具体是什么?如果是datatable,好办,解析xml就是了.如果单单是某个表名,那就啥都不能获取到.解决方案四:引用2楼guwei4037的回复: ws返回的就是xml了,里面的数据是可以获取的.至于你说的表,具体是什么?如果是datatable,好

rfc-C#调用SAP RFC 无法获取内表对象的一个字段

问题描述 C#调用SAP RFC 无法获取内表对象的一个字段 标题写的有可能不清楚.流程是这样的,RFC函数 中没有传入参数,只有一个返回参数,还有一个内表对象.该接口不用返回参数进行返回信息的记录.均使用内表对象.譬如:该内表对象有ABCD4个字段,我为内表对象赋值,执行函数,执行之后,无论是成功与否,数据是否满足业务逻辑.都会将A字段进行修改.也就是A字段记录了相关的返回信息.我读取该字段作为返回信息.我执行前不会为A赋值,这样执行后我获得的A字段就是空,如果我为A赋值,执行后的A和执行前的

php-PHP调用 SAP RFC函数,传入字符串参数,RFC接收到的是空字符串

问题描述 PHP调用 SAP RFC函数,传入字符串参数,RFC接收到的是空字符串 $result = $sap->callFunction( "XXX", array( array( "IMPORT", "I_ZCZLX", "1" ), array( "IMPORT", "I_WRITER", "MAO" ), array( "IMPORT&quo

方法 rfc sap-java调用SAP的RFC标准函数 料件和BOM

问题描述 java调用SAP的RFC标准函数 料件和BOM 在做一个项目 java服务集成SAP的.实现读料件.传料件和传BOM的功能 听说有标准RFC的方法. 跪求~ 请大神眷顾一下 万分感谢

sap-java调用SAP的RFC如何传递数组参数

问题描述 java调用SAP的RFC如何传递数组参数 SAP是服务端,使用JCO3的jia包,RFC服务端的函数有一个数组类型的参数. java代码这边用什么形式给它传值.新手请赐教 解决方案 Java中连接SAP进行RFC调用JAVA本地方法调用(2)数组参数传递java调用SAP RFC函数

C#如何通过NCO3.0来连接SAP并调用SAP中的RFC

C#如何通过NCO3.0来连接SAP并调用SAP中的RFC首先安装NCO3.0,这是SAP针对.Net开发的专用组件,安装完成之后在C:\Program Files\SAP\SAP_DotNetConnector3_x86目录下面会有sapnco_utils.dll sapnco.dll rscp4n.dll libicudecnumber.dll四个DLL文件,在项目里面添加引用,找到这个4个DLL文件,引用到项目里面,libicudecnumber.dll会提示无法引用,貌似要将项目的.NE

Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC

转载:(http://blog.csdn.net/zeroso/article/details/70592179) 错误现象: java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986 at org.apache.coyote.http11.InternalInputBuff

调用SAP提供的webservice时报Web 服务处理错误

问题描述 Web服务处理错误;提供者端Web服务错误日志中的更多详细信息(世界协调时间时戳20160420124852:事务标识56BE7493CE26322AE1000000AC100091)背景:与SAP做接口,调用SAP的webservice错误消息是上面描述的那样,SAP在程序里面加断点的话也不会进入到SAP的接口程序里面,直接在我这边就会报这个错了求助各位大神,有遇到过此类状况吗?之前有的服务会出现这种错误,但后面不知不觉就会好了,偶尔还会再发生,很是莫名其妙,现在SAP那端也查不出来

ava webservices-java cxf webservices 动态调用sap的一个服务地址,地址是带用户名和密码的权限。

问题描述 java cxf webservices 动态调用sap的一个服务地址,地址是带用户名和密码的权限. import java.net.URL; import javax.xml.namespace.QName; import org.apache.cxf.configuration.security.AuthorizationPolicy; import org.apache.cxf.endpoint.Client; import org.apache.cxf.jaxws.endpoi