Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7202659
  • 博文数量: 655
  • 博客积分: 10264
  • 博客等级: 上将
  • 技术积分: 8278
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-04 17:47
个人简介

ABAP顾问

文章分类

全部博文(655)

文章存档

2017年(2)

2014年(8)

2013年(3)

2012年(2)

2011年(18)

2010年(102)

2009年(137)

2008年(274)

2007年(134)

分类:

2009-01-14 15:25:11

版权为我的学生王变宏
 
 
Microsoft Visual Studio® 2005 下使用DataProviderSAP 调用SAP RFC
 
1. DataProviderSAP. 安装:
 执行安装文件进行安装DataProviderSAP.msi,默认安装路径:
C:\Program Files\Common Files\Microsoft Shared\Adapters\ SAP\。
 
2Microsoft Visual Studio® 2005新建项目
添加引用Microsoft.Adapter.SAP.SAPProvider.dll。
Microsoft.Adapter.SAP.SAPProvider.dll从以下安装路径查找:
C:\Program Files\Common Files\Microsoft Shared\Adapters\ SAP\。
 
3C# 调用FRC语句:
 
using Microsoft.Adapter.SAP;//添加引用
 
  SAPConnection con = new SAPConnection("ASHOST=10.1.10.102; CLIENT=200;SYSNR=00;USER=***;PASSWD=***;LANG=zh");//SAP服务器连接参数设置,
            con.Open();
            SAPCommand cmd = new SAPCommand(con);
            cmd.CommandText = "EXEC BAPI_CUSTOMER_GETLIST @IDRANGE=@param OUTPUT";//执行远程RFC BAPI_CUSTOMER_GETLIST,执行RFC的参数传递过程参考下边的EXEC 语句的语法
 
//以下为RFC调用参数赋值并指定Input、Output类型
            SAPParameter param = new SAPParameter("@param", ParameterDirection.InputOutput);
            DataTable dt = new DataTable();
            dt.Columns.Add("SIGN");
            dt.Columns.Add("OPTION");
            dt.Columns.Add("LOW");
            dt.Columns.Add("HIGH");
            DataRow row = dt.NewRow();
            row["LOW"] = 1;
            row["HIGH"] = 1000;
            dt.Rows.Add(row);
            param.Value = dt;
            cmd.Parameters.Add(param);
//执行结果放在SAPDataReade中
            SAPDataReader dr = cmd.ExecuteReader();
 
            //retrieving returned datareaders
            do
            {
                Console.WriteLine("value of returned datareader: " + dr.GetSchemaTable().TableName);
                while (dr.Read())
                {
                    string line = "";
                    for (int i = 0; i < dr.FieldCount; i++)
                        line = line + "| " + dr.GetValue(i).ToString();
                    Console.WriteLine(line);
                }
            }
            while (dr.NextResult());
            Console.WriteLine("Checking returned value of parameter @IDRANGE...");
            DataTable dt1 = (DataTable)param.Value;
            foreach (DataRow row1 in dt1.Rows)
            {
                string line = "";
                for (int i = 0; i < dt1.Columns.Count; i++)
                    line = line + "| " + row1[i].ToString();
                Console.WriteLine(line);
            }
 
4EXEC 语句的语法
以下几节介绍了针对该提供程序实现 EXEC 语句的语法规范。请注意,在某些情况下,该语法与 Transact-SQL 语法稍有不同。
4.1 EXEC 语法
    EXEC rfc_name

    [{value | @variable [OUTPUT]}][,...n]

    [@parameter = {value | @variable [OUTPUT]}][,...n] [;]
   
其中:
rfc_name 指定要执行的函数调用的名称。
parameter 指定函数接口中定义的参数名。
value 指定参数值。
@variable 指定替换参数。使用 DbParameter 接口可以绑定参数值。
output 指定 SAP RFC 参数为 OutputInputOutput
4.2 处理命名参数和未命名参数
以下内容是在 EXEC 查询中指定命名参数和未命名参数的准则:
1.  在指定参数时,可以通过命名这些参数(例如,@parameter_name=value)来指定参数,也可以只提供值。
2.  当使用默认值定义参数时,可以在不指定参数的情况下执行该操作。
3.  当使用 @parameter_name=value 格式时,则无需按照函数调用中所定义的顺序来提供参数名和常数。
4.  未命名参数的所需顺序如下所示:
o        IMPORT (Input)
o        EXPORT (Output)
o        TABLE (InputOutput)

但是,排序是在参数类型内按照上面所列顺序进行的。例如,您有 6 个未命名参数,这 3 种参数类型各两个,如下表所示,参数排序应为 param1param2param3param4param5param6
IMPORT 参数
EXPORT 参数
TABLE 参数
param1
param3
param5
param2
param4
param6
 
5.  使用未命名参数时,您需要指定所有参数(包括可选参数和必选参数)的值。只有当可选参数出现在参数列表的末尾时,才可以省略它们。不支持使用“Default”或空格跳过可选参数,如下面示例所示:

EXEC Proc_Test_Defaults , 'A';

请改用下列语法以获取所需的结果:

EXEC Proc_Test_Defaults @p2='A';
6.  EXEC 查询不支持使用具有下列属性的参数:
o        嵌套结构(包含其他结构作为其字段的结构)。
o        嵌套表。
o        包含结构的表。
o        包含表的结构。
o        字段中包含复合字符串类型(例如 SSTRINGRAWSTRING)的结构或表。
7.  下表列出了执行 RFC 时 RFC 参数类型与参数方向之间的逻辑映射:
PFC 参数类型
查询关键字
参数方向
Import 参数
Paramdirection.Input
Export 参数
Output
Paramdirection.Output
Table 参数
Output /无
InputOutput
8.   
9.  以下内容是处理参数的一般准则:
a.      您可以将参数值指定为常数,也可以通过在查询中使用占位符来指定参数值。
b.      在查询中使用占位符时,必须创建 SAPParameter 对象并将其添加到相应的命令对象中。然后,将占位符的名称传递到构造函数中;方向和值取决于上下文。
§         对于 Input 参数,请不要在查询中指定参数方向的关键字。但必须设置该参数对象的 value 字段,否则该提供程序将引发异常。请一定不能显式设置该参数对象的 direction 字段,因为该提供程序的默认设置为 Input
§         对于其他参数,请使用格式 @paramname=@placeholder 并在查询中显式指定 Output 关键字。然后,您必须添加与占位符相对应的 SAPParameter 并根据参数类型将参数方向显式设置为 ParamDirection.OutputParamDirection.InputOutput
c.      参数名称和占位符名称不区分大小写。
d.      除非参数具有不同的方向,否则它们的名称不能在查询中重复。
e.      占位符名称不能在查询中重复。
4.3 EXEC 语句示例
· 若要执行不带输入参数的 BAPI,请使用以下语法;数据通过 DataReader 对象返回:
·                EXEC BAPI_COMPANYCODE_GETLIST
       
· 若要执行带有输入参数的 RFC,请使用以下语法:
·                Exec RFC_CUSTOMER_GET @NAME1='Contoso'
       
· 若要执行带有指定的输入参数但没有参数名称的 RFC,请使用以下语法:
·                Exec RFC_CUSTOMER_GET '*', 'Contoso'
       
· 若要执行带有指定为变量的输入参数的 RFC,请使用以下语法:
·                Exec RFC_CUSTOMER_GET @var
       
在此示例中,必须创建名为 @var 的参数,并显式设置该参数的值(例如,设置为“1001”),原因是 RFC_CUSTOMER_GET 的第一个参数对应于 KUNNR(客户号)。
· 若要执行使用变量作为输入参数名称的 RFC,请使用以下语法:
·                Exec RFC_CUSTOMER_GET @KUNNR=@var1, @NAME1='Contoso'
       
您必须创建名为 @var1 的 SAPParameter,指定它的值,然后将它绑定到对应的命令对象。新创建的参数对象的默认方向为 input
· 若要执行 BAPI,并将表作为参数返回,请使用以下语法:
·                EXEC BAPI_COMPANYCODE_GETLIST @ COMPANYCODE_LIST=@tableVar OUTPUT
       
您必须创建名为 @var1 的 SAPParameter,指定它的值,然后将它绑定到对应的命令对象。新创建的参数对象的方向应为 InputOutput
 
    附:
阅读(6916) | 评论(9) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-04-19 14:08:43

请问一下楼上的各位,这个连接需要在SM59里配置什么东西吗?

chinaunix网友2010-04-09 15:37:25

“查出来的数据,列与列之间的内容会串在一起” 我和楼上的朋友一样的问题,有知道怎么解决吗?请告知解决办法,非常感谢! zouc@zlzk.com

chinaunix网友2009-12-16 10:46:43

我查出来的数据,列与列之间的内容会串在一起。即后一列的值有部分会在前一个字段中去,不知道是哪里需要配置

chinaunix网友2009-09-12 11:25:08

http://scnblogs.techweb.com.cn/laobai/archives/71.html

chinaunix网友2009-09-04 16:29:18

RFC Communication link error. Error Message 'Function module "Z_READ_FUNCTION_METADATA" not found.'.