ASp.net 中调用BAPI

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

posted on 2010-05-16 14:10  魏绰  阅读(1141)  评论(0编辑  收藏  举报

导航