您的位置:首页 > 编程语言 > C#

一套通过c# sap-rfc 完整处理内表输入输出的程序

2016-01-11 21:31 676 查看
研究了3天c#接口处理sap接口,通过rfc生成凭证后,问题马上来了,如果需要批量输入表数据在sap里生成多行凭证,甚至保存数据该怎么处理呢?

马上投入研究内表输入输出!

于是研究了一套通过内表输入输出的程序,作为以后一个使用模板,希望公司以后使用rfc的时候能够用上,反正我先准备着,也算是今天晚上的一个收获。

具备条件:

sap

vs2010

ok开始!

sap里创建函数

上图-》











function源代码部分:

data: maxprice2 like sflight-price.
FUNCTION ZTEST_SIMPLE05.
*"----------------------------------------------------------------------
*"*"Local interface:
*"  IMPORTING
*"     VALUE(CARRID) LIKE  SFLIGHT-CARRID
*"     VALUE(CURRENCY) TYPE  S_CURRCODE OPTIONAL
*"  EXPORTING
*"     VALUE(PRICE) TYPE  S_PRICE
*"  TABLES
*"      AIRDATA STRUCTURE  SFLIGHT
*"      ZT001 STRUCTURE  T001
*"  EXCEPTIONS
*"      UNIT_NOT_FOUND
*"----------------------------------------------------------------------
select * from sflight into table airdata where carrid = carrid and currency = currency.
 *select * from t001 into table zt001 .
 if sy-subrc <> 0.
raise unit_not_found.
else.
perform getmaxprice2 tables airdata.
price = maxprice2.
endif.
  
ENDFUNCTION.
form getmaxprice2 tables l_tab structure sflight.
read table  l_tab  index 1.
maxprice2 = l_tab-price.
endform.
 这里我通过se38建立一个测试程序

源代码部分:

*& Report  ZTEST21
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
 
REPORT  ZTEST22.
 
parameter: xarrid like sflight-carrid obligatory,
lcurr type s_currcode default 'USD'.
data : lpprice type s_price,
lt_air like standard table of sflight with header line,
lt_t001 like standard table of t001 with header line.
CALL FUNCTION 'ZTEST_SIMPLE05'
  EXPORTING
        CARRID         = xarrid
    CURRENCY       = lcurr
  IMPORTING
    PRICE          = lpprice
  TABLES
    AIRDATA        = lt_air
    ZT001                = lt_t001
 EXCEPTIONS
   UNIT_NOT_FOUND       = 1
   OTHERS               = 2
          .
IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
 
write: lpprice.
loop at lt_air.
  write: / lt_air-carrid,
  lt_air-connid,
  lt_air-fldate.
endloop.
 
loop at lt_t001.
  write: / lt_t001-bukrs,
 
   lt_t001-butxt.
endloop.
 执行结果:



注意了!lt_t001内表中没有数据,因为function中的

 *select * from t001 into table zt001 .这段代码注释了。
这也是为了建立c#项目做准备。
下面c#登场!
vs2010建立项目
在form中建立1个标签,2个文本框
在后台cs代码中输入
using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using SAP.Middleware.Connector;

namespace WindowsFormsApplication1

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private void Form1_Load(object sender, EventArgs e)

        {

            RfcConfigParameters rfcPar = new RfcConfigParameters();

            rfcPar.Add(RfcConfigParameters.Name, "sss");

            rfcPar.Add(RfcConfigParameters.AppServerHost, "sss.sss.sss.sss");

            rfcPar.Add(RfcConfigParameters.Client, "sss");

            rfcPar.Add(RfcConfigParameters.User, "sss");

            rfcPar.Add(RfcConfigParameters.Password, "ssssss");

            rfcPar.Add(RfcConfigParameters.SystemNumber, "00");

            rfcPar.Add(RfcConfigParameters.Language, "EN");

            RfcDestination dest = RfcDestinationManager.GetDestination(rfcPar);

            RfcRepository rfcrep = dest.Repository;

            IRfcFunction myfun = null;

            myfun = rfcrep.CreateFunction("ZTEST_SIMPLE05");

            IRfcTable rfcTable = myfun.GetTable("ZT001");

            rfcTable.Insert();

            rfcTable.CurrentRow.SetValue("BUKRS", "5001");

            rfcTable.CurrentRow.SetValue("BUTXT", "梦想有限公司");

            rfcTable.Insert();

            rfcTable.CurrentRow.SetValue("BUKRS", "5002");

            rfcTable.CurrentRow.SetValue("BUTXT", "实现有限公司");

            rfcTable.Insert();

            rfcTable.CurrentRow.SetValue("BUKRS", "5003");

            rfcTable.CurrentRow.SetValue("BUTXT", "梦想与现实有限公司");

     

            myfun.SetValue("CARRID", "AA");//SAP里面的传入参数

            myfun.SetValue("CURRENCY", "USD");//SAP里面的传入参数

            myfun.Invoke(dest);

            string ERMSG = myfun.GetValue("PRICE").ToString();

            this.label1.Text = ERMSG;

            dest = null;

            rfcrep = null;

            IRfcTable IrfTable = myfun.GetTable("AIRDATA");

            //提前实例化一个空的表结构出来

            DataTable dt = new DataTable();

            dt.Columns.Add("CARRID");

            dt.Columns.Add("CONNID");

            dt.Columns.Add("FLDATE");

            for (int i = 0; i < IrfTable.Count; i++)

            {

                IrfTable.CurrentIndex = i;

                DataRow dr = dt.NewRow();

                dr["CARRID"] = IrfTable.GetString("CARRID");

                dr["CONNID"] = IrfTable.GetString("CONNID");

                dr["FLDATE"] = IrfTable.GetString("FLDATE");

                textBox1.AppendText(IrfTable.GetString("CARRID")+IrfTable.GetString("CONNID")+IrfTable.GetString("FLDATE")+'\n');

                    dt.Rows.Add(dr);

            }

            IRfcTable IrfTable1 = myfun.GetTable("ZT001");

            //提前实例化一个空的表结构出来

            DataTable dt1 = new DataTable();

            dt1.Columns.Add("BUKRS");

            dt1.Columns.Add("BUTXT");

            for (int i = 0; i < IrfTable1.Count; i++)

            {

                IrfTable1.CurrentIndex = i;

                DataRow dr1 = dt1.NewRow();

                dr1["BUKRS"] = IrfTable1.GetString("BUKRS");

                dr1["BUTXT"] = IrfTable1.GetString("BUTXT");

                textBox2.AppendText(IrfTable1.GetString("BUKRS") + IrfTable1.GetString("BUTXT") + '\n');

                dt1.Rows.Add(dr1);

            }

        }

    }

}

输出效果



 

 

 补充一下,上述c#的代码如果最后添加一下(需要添加2个dataGridView控件)

          
dataGridView2.DataSource = dt;

            dataGridView1.DataSource = dt1;

则会把2个表都用表格形式表现出来。

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C# ABAP ADO.NET sap