研究了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个表都用表格形式表现出来。