问题描述
如题,必须是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后,再把它合并就成了一个内表了。