SAP接口调用公共方法

54 篇文章 0 订阅

在和SAP进行系统对接时,提供的是RFC接口,每个接口函数写一个调用方法的话会比较麻烦,现对其进行一些封装,通过字段映射的方式去实现接口的调用。

1、首先,新建一个类,以函数名作为类名,类成员为传参参数,如果传递的参数是一个表的话,将其封装成一个类对象,如下图:

    public class ZSDIE002
    {
        /// <summary>
        /// 表头
        /// </summary>
        public HEADER HEADER { get; set; }

        //public ITEM ITEM { get; set; }
        //public KBERT KBERT { get; set; }

        /// <summary>
        /// 物料明细
        /// </summary>
        public List<ITEM> ITEM { get; set; }

        /// <summary>
        /// 价格明细
        /// </summary>
        public List<KBERT> KBERT { get; set; }
    }

2、将步骤1创建的类作为参数,返回值table名也传递进来

        /// <summary>
        /// SAP函数调用
        /// </summary>
        /// <typeparam name="T">传参model</typeparam>
        /// <param name="requestInfo"></param>
        /// <param name="funName">函数名</param>
        public static DataResponseInfo<DataTable> SAPRequestApi<T>(T requestInfo, string returnName) where T : class
        {
            var responseInfo = new DataResponseInfo<DataTable>();
            try
            {
                var destination = SAPRFCHelper.GetSAPConnection();

                //获取SAPmodel类属性
                Type t = requestInfo.GetType();
                IRfcFunction function = destination.Repository.CreateFunction(t.Name);//SAP接口函数

                //获取函数类的属性对象
                PropertyInfo[] PropertyList = t.GetProperties();
                foreach (PropertyInfo propertyInfo in PropertyList)
                {
                    //获取内表 
                    IRfcTable item = function.GetTable(propertyInfo.Name);
                    IRfcStructure struSAP = item.Metadata.LineType.CreateStructure();
                    object proValue = propertyInfo.GetValue(requestInfo, null);
                    if (proValue == null)
                        continue;

                    //判断类成员是否为List集合
                    if (propertyInfo.PropertyType.Name == typeof(List<>).Name)
                    {
                        dynamic dList = proValue;
                        foreach (object d in dList)
                        {
                            IRfcStructure struList = item.Metadata.LineType.CreateStructure();
                            GetStruTable(item, struList, d);
                        }
                    }
                    else
                    {
                        //获取属性值
                        GetStruTable(item, struSAP, proValue);
                    }
                    function.SetValue(propertyInfo.Name, item);
                }

                //执行函数
                function.Invoke(destination);
                IRfcTable returnTable = function.GetTable(returnName);
                DataTable dataTable = returnTable.Count > 0 ? SAPRFCHelper.RFCTableToDataTablex(returnTable) : null;

                if (dataTable == null || dataTable.Rows.Count <= 0)
                {
                    responseInfo.Msg = "SAP没有返回数据";
                    return responseInfo;
                }

                //客户编码 BUT000-PARTNER  CHAR    10
                //消息状态 TYPE   CHAR    1   S为处理正确 / E为错误
                //消息 MESSAGE    CHAR    255 
                DataRow dr = dataTable.Rows[0];
                string TYPE = string.Empty;
                string MESSAGE = string.Empty;
                if (dataTable.Columns.Contains("TYPE"))
                {
                    TYPE = dr["TYPE"].ToString();
                    MESSAGE = dr["MESSAGE"].ToString();
                    if (TYPE.ToLower() != "s")
                    {
                        responseInfo.Msg = "SAP处理失败:" + MESSAGE;
                        return responseInfo;
                    }
                }
                else
                {
                    TYPE = dr["ZTYPE"].ToString();
                    MESSAGE = dr["ZMESSAGE"].ToString();
                    if (TYPE.ToLower() != "s")
                    {
                        responseInfo.Msg = "SAP处理失败:" + MESSAGE;
                        return responseInfo;
                    }
                }

                responseInfo.Msg = "SAP处理成功:" + MESSAGE;
                responseInfo.IsSuccess = true;
                responseInfo.Data = dataTable;

                return responseInfo;
            }
            catch (Exception ex)
            {
                responseInfo.Msg = ex.Message;
            }
            return responseInfo;
        }

PS:如果传参的list集合的话,做字段映射的时候,需要通过取巧实现获取object类型的对象遍历,取巧方式如下图:

                PropertyInfo[] PropertyList = t.GetProperties();
                foreach (PropertyInfo propertyInfo in PropertyList)
                {
                    //获取内表 
                    IRfcTable item = function.GetTable(propertyInfo.Name);
                    IRfcStructure struSAP = item.Metadata.LineType.CreateStructure();
                    object proValue = propertyInfo.GetValue(requestInfo, null);
                    if (proValue == null)
                        continue;

                    //判断类成员是否为List集合
                    if (propertyInfo.PropertyType.Name == typeof(List<>).Name)
                    {
                        //将值转为dynamic 类型去遍历
                        dynamic dList = proValue;
                        foreach (object d in dList)
                        {
                            IRfcStructure struList = item.Metadata.LineType.CreateStructure();
                            GetStruTable(item, struList, d);
                        }
                    }
                    else
                    {
                        //获取属性值
                        GetStruTable(item, struSAP, proValue);
                    }
                    function.SetValue(propertyInfo.Name, item);
                }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Delphi是一种广泛使用的编程语言,具有强大的集成开发环境(IDE),可以用于开发各种软件应用程序。在使用Delphi调用SAP(Systems, Applications, and Products in Data Processing)接口函数的过程中,我们首先需要创建一个SAP连接,然后使用该连接来调用我们所需的接口函数。 首先,我们需要确保已经安装了相应的SAP RFC(Remote Function Call)库,并在Delphi中导入相关的扩展包。然后,我们需要通过创建一个RFC连接对象来建立与SAP系统的通信。在连接对象中,我们需要提供SAP系统的相关信息,比如SAP服务器的主机名、系统编号、客户端号码等。 一旦我们成功建立了与SAP系统的连接,我们就可以开始调用SAP接口函数了。我们可以使用RFC连接对象的CallFunction方法调用函数,在调用时需要提供接口函数的名称以及相应的参数。在调用成功后,我们可以通过获取返回的结果数据来处理和使用。 在调用SAP接口函数时,我们需要确保提供正确的函数参数和参数类型,以及正确的数据格式。我们可以使用Delphi提供的相关功能来进行参数类型转换和数据格式处理。 在调用函数之前,我们还需要考虑如何处理和处理潜在的错误和异常。我们可以使用Delphi提供的异常处理机制来捕获和处理可能出现的错误,以确保程序的稳定性和可靠性。 综上所述,使用Delphi调用SAP接口函数需要先建立与SAP系统的连接,然后通过RFC连接对象调用相应的接口函数,并处理返回的结果数据和潜在的错误和异常。这样可以实现Delphi与SAP系统的集成,实现数据的交互和共享。 ### 回答2: Delphi是一种编程语言,可以用于调用SAP接口函数。SAP是一种集成的企业资源计划软件,它提供了各种接口函数,可以与其他系统进行数据交换和集成。 在Delphi中调用SAP接口函数,首先需要通过SAP提供的API文档了解接口函数的参数和返回值。然后,在Delphi中创建一个新的项目或使用现有的项目,在项目中引入SAP的相关库文件和命名空间。 接下来,可以使用Delphi的相关语法,如函数调用、变量声明等,来调用SAP接口函数。根据接口函数的参数要求,可以在Delphi代码中传入需要的参数,并接收返回值。 在调用SAP接口函数时,需要确保Delphi和SAP的连接是正常的。可以通过设置连接参数,如SAP系统的用户名、密码、连接字符串等来确保连接成功。 在调用SAP接口函数之前,可能需要进行一些前期准备工作。例如,可能需要创建SAP连接对象、打开连接、连接到具体的SAP系统等。 调用SAP接口函数后,可以根据返回值来进行相应的处理。根据接口函数的返回值类型,可以使用条件语句、循环语句等来判断并处理返回结果。 在调用SAP接口函数时,还需要注意异常处理。如果在调用过程中发生了错误或异常,可以使用Delphi提供的异常处理机制来捕获和处理异常,以防止程序崩溃或不稳定。 总之,通过Delphi调用SAP接口函数可以实现与SAP系统的数据交换和集成。这样可以方便地在Delphi程序中使用SAP的功能和数据,提高系统的灵活性和扩展性。 ### 回答3: 使用Delphi调用SAP接口函数需要以下步骤: 1. 在Delphi中设置与SAP接口通信的环境。这可以通过使用SAP提供的相关库文件来完成。通常,这些库文件可以作为一个包被导入到Delphi项目中。 2. 使用SAP提供的函数或类来建立与SAP服务器的连接。这些函数或类可以通过指定SAP服务器的IP地址、端口号、用户名和密码来建立连接。 3. 一旦连接建立,可以通过调用相应的SAP函数或方法来执行所需的操作。这些操作可能包括读取或写入SAP系统的数据,调用SAP的业务逻辑函数或者执行其他与SAP相关的任务。 4. 在调用SAP函数或方法之前,可能需要根据SAP接口的要求设置相应的输入参数。这些参数通常是一个结构体或一个数组,其中包含了传递给SAP函数的数据。 5. 当SAP函数执行完成后,可能会返回一个结果,这可以是一个结构体或一个值。根据需要,可以解析结果并进一步处理。 6. 最后,使用SAP提供的功能来关闭与SAP服务器的连接,并释放相关的资源,以确保程序的完整性和安全性。 需要注意的是,具体的调用方式和步骤可能因为SAP接口的版本和特性而有所不同。因此,在进行Delphi调用SAP接口函数的实际操作前,应该先详细阅读SAP的相关文档,并了解其具体的接口规范和要求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值