一步一步教你用SAP NCO3.0调用RFC(菜鸟必看)

来源:互联网 发布:windows编程教程 编辑:程序博客网 时间:2024/05/21 19:43

需要的工具:

开发工具:Microsoft Visual Studio 2010 C#环境

NCO3.0:sapnco30dotnet40P_8-20007347.zip(VS2010环境下必须这个版本)  

可到此下载:http://download.csdn.net/detail/szlaptop/4635144

数据库:ORACLE10g

 

示例目的:将oracle的某表数据通过RFC插入SAP自建表。

 

第一步:在SAP里自建表

进入SAP界面:使用T- CODE:SE11 打开建表界面:表名为:ZCHANNEL_MESSAG


自建如下表:(详细建表过程略),针对自身业务,命名关键字段。


第二步:针对自建表ZCHANNEL_MESSAG创建RFC。

使用T- CODE:SE37 打开建RFC界面:命名为:ZCHANNEL_RFC_MESSAGE


RFC如下表:(建立RFC详细过程略),在TABLE参数里设置IT_CHANNELLIKE 刚才自建的表ZCHANNEL_MESSAG。


在EXPORT里设置出参R_SUBRC.


在SOURCE CODE里写代码:


[csharp] view plaincopy
  1. IF IT_CHANNEL[] IS NOT INITIAL.  
  2.     MODIFY ZCHANNEL_MESSAG FROM TABLE IT_CHANNEL[].  
  3.     IF SY-SUBRC = 0.  
  4.       R_SUBRC = 'OK'.  
  5.     ENDIF.  
  6.   ENDIF.  
  7. ENDFUNCTION.  


到此在SAP这边的工作已经就绪。

 

第三步:接下来,我们在oracle10g下建表WW_TRANS:与SAP自建表字段对应。

[sql] view plaincopy
  1. create table WW_TRANS  
  2. (  
  3.   WW_TXDATE    VARCHAR2(50),  
  4.   WW_PLUID     VARCHAR2(50),  
  5.   WW_QTYSOLD   VARCHAR2(1000),  
  6.   WW_AMOUNT    VARCHAR2(50),  
  7.   WW_TELEPHONE VARCHAR2(50)  
  8. )  

 

第四步:剩下的都在VS2010下完成:

 

打开VS2010新建一个WINDOWS窗体应用程序:WindowsFormsApplication2


拖动一个按钮控件到主窗体:


在解决方案资源管理器,引用里引用NCO3.0的sapnco.dll和sapnco_utils

 

右击项目名称WindowsFormsApplication2,点击“属性”,打开属性面板:将目标框架里默认的.NET Framework 4 Client Profile 改为:.NET Framework 4。(很重要)


在解决方案资源管理器里打开配置文件APP.CONFIG,配置如下:

 

[html] view plaincopy
  1. <?xmlversionxmlversion="1.0"?>  
  2. <configuration>  
  3.     <configSections>  
  4.         <sectionGroupnamesectionGroupname="SAP.Middleware.Connector">  
  5.             <sectionGroupnamesectionGroupname="ClientSettings">  
  6.                 <sectionnamesectionname="DestinationConfiguration"type="SAP.Middleware.Connector.RfcDestinationConfiguration,sapnco"/>  
  7.             </sectionGroup>  
  8.         </sectionGroup>  
  9.     </configSections>  
  10.    
  11.     <SAP.Middleware.Connector>  
  12.         <ClientSettings>  
  13.             <DestinationConfiguration>  
  14.                 <destinations>  
  15.                     <addNAMEaddNAME="DEV"USER="WUWEI"PASSWD="WUWEI"CLIENT="500"  
  16.                          LANG="EN"ASHOST="198.16.0.66"SYSNR="00"  
  17.                          MAX_POOL_SIZE="10"IDLE_TIMEOUT="10"/>  
  18.                 </destinations>  
  19.             </DestinationConfiguration>  
  20.         </ClientSettings>  
  21.     </SAP.Middleware.Connector>  
  22.    
  23.     <startup>  
  24.         <supportedRuntimeversionsupportedRuntimeversion="v4.0"sku=".NETFramework,Version=v4.0"/>  
  25.     </startup>  
  26.    
  27. </configuration>  

双击刚拖动的Button1按钮进入代码编辑器:

手工引用:using SAP.Middleware.Connector;


因为使用的是oracle数据库,所以也必须引用oracle10g的System.Data.OracleClient.dll,只要安装了oracle10g客户端

usingSystem.Data.OracleClient;

 

 

接下来看代码:

[csharp] view plaincopy
  1. OracleDataReader reader = sqlCmd.ExecuteReader();  
  2.          //读¨¢取¨?配?置?文?件t信?息¡é,ê?建¡§立¢¡é与®?SAP连¢?接¨®  
  3.          RfcDestination SapRfcDestination = RfcDestinationManager.GetDestination("DEV");  
  4.   
  5.             RfcRepository SapRfcRepository =SapRfcDestination.Repository;  
  6.             // Create and invhuoke function moduleZCHANNEL_RFC_MESSAGE  
  7.             IRfcFunction myfun =SapRfcRepository.CreateFunction("ZCHANNEL_RFC_MESSAGE");  
  8.   
  9.             // Set some input values for the structure.  
  10.             IRfcStructure import = null;  
  11.             IRfcTable table = myfun.GetTable("IT_CHANNEL");  
  12.             while (reader.Read())  
  13.             {  
  14.                 import = SapRfcRepository.GetStructureMetadata("ZCHANNEL_MESSAG").CreateStructure();  
  15.                 import.SetValue("WW_TXDATE",reader.GetString(0));  
  16.                 import.SetValue("WW_PLUID",reader.GetString(1));  
  17.                 import.SetValue("WW_QTYSOLD",reader.GetString(2));  
  18.                 import.SetValue("WW_AMOUNT",reader.GetString(3));  
  19.                 import.SetValue("WW_TELEPHONE",reader.GetString(4));  
  20.                 table.Insert(import);  
  21.             }  
  22.             myfun.Invoke(SapRfcDestination); //执¡ä行D函¡¥数ºy  
  23.             string RETURNStr = myfun.GetString("R_SUBRC");  
  24.             MessageBox.Show(RETURNStr);  


 执行结果:

0 0