研究了3天c#接口处理sap接口,给自己提出一个课题:如何把外部程序提取的数据通过内表保存到SAP的数据表中?赶紧测试,效果立现,请看源代码.
具备条件:
sap
vs2010
ok开始!
sap里创建函数
上图-》
source code:
data: maxprice3 like sflight-price.
data: SJ like ZFUNCTION_TEST-SJ1.
data g_itb_save01 type table of ZFUNCTION_TEST with header line.
TYPES: BEGIN OF t_ZFT.
INCLUDE TYPE ZFUNCTION_TEST.
TYPES: END OF t_ZFT.
DATA:
tB_ZFT TYPE TABLE OF t_ZFT WITH HEADER LINE.
DATA WA_ZFT LIKE LINE OF tB_ZFT.
FUNCTION ZTEST_SIMPLE06.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" VALUE(CARRID) LIKE SFLIGHT-CARRID
*" VALUE(CURRENCY) TYPE S_CURRCODE OPTIONAL
*" EXPORTING
*" VALUE(PRICE) TYPE S_PRICE
*" VALUE(LABEL) TYPE ZFUNCTION_TEST-SJ1
*" VALUE(MESSAGE) TYPE BUTXT
*" TABLES
*" AIRDATA STRUCTURE SFLIGHT
*" ZT001 STRUCTURE T001
*" ZFT STRUCTURE ZFUNCTION_TEST
*" EXCEPTIONS
*" UNIT_NOT_FOUND
*"----------------------------------------------------------------------
LOOP AT ZFT INTO WA_ZFT .
APPEND WA_ZFT TO tB_ZFT.
ENDLOOP.
INSERT ZFUNCTION_TEST from table tB_ZFT.
IF sy-subrc = 0.
COMMIT WORK AND WAIT.
MESSAGE = '操作成功' .
ELSE.
ROLLBACK WORK.
MESSAGE = '操作失败' .
ENDIF.
select * from sflight into table airdata where carrid = carrid and currency = currency.
if sy-subrc <> 0.
raise unit_not_found.
else.
perform getmaxprice3 tables airdata.
price = maxprice3.
perform SJ tables ZFT.
LABEL = SJ.
endif.
* CLEAR ZFT.
* CLEAR ZFT[].
* CLEAR tB_ZFT.
* CLEAR tB_ZFT[].
ENDFUNCTION.
*&---------------------------------------------------------------------*
*& Form getmaxprice3
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->L_TAB text
*----------------------------------------------------------------------*
form getmaxprice3 tables l_tab structure sflight.
read table l_tab index 1.
maxprice3 = l_tab-price.
endform. "getmaxprice3
*&---------------------------------------------------------------------*
*& Form SJ
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->ZFT text
*----------------------------------------------------------------------*
form SJ tables ZFT structure ZFUNCTION_TEST.
read table ZFT index 1.
SJ = ZFT-SJ1.
endform. "SJ
下面c#登场!
vs2010建立项目,注意引用nco!!!注意目标框架是.net framework 3.5 (测试半天有些代码报错,只能调整到3.5,解决这个问题花了我3个小时,查资料无数)
在form中建立3个标签,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, "DXX");
rfcPar.Add(RfcConfigParameters.AppServerHost, "1XX.XXX.XXX.XX");
rfcPar.Add(RfcConfigParameters.Client, "XX0");
rfcPar.Add(RfcConfigParameters.User, "XXX05");
rfcPar.Add(RfcConfigParameters.Password, "XXXXXX");
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_SIMPLE06");
//ZTEST212
IRfcTable rfcTable = myfun.GetTable("ZFT");
rfcTable.Insert();
rfcTable.CurrentRow.SetValue("BUKRS", "x019");
rfcTable.CurrentRow.SetValue("SJ1", "600.12");
rfcTable.Insert();
rfcTable.CurrentRow.SetValue("BUKRS", "x089");
rfcTable.CurrentRow.SetValue("SJ1", "300.13");
//rfcTable.Insert();
//rfcTable.CurrentRow.SetValue("BUKRS", "4wxq");
//rfcTable.CurrentRow.SetValue("SJ1", "555.31");
myfun.SetValue("CARRID", "AA");//SAP里面的传入参数
myfun.SetValue("CURRENCY", "USD");//SAP里面的传入参数
myfun.Invoke(dest);
string ERMSG = myfun.GetValue("PRICE").ToString();
this.label1.Text = ERMSG;
string SJX = myfun.GetValue("LABEL").ToString();
this.label2.Text = SJX;
string MES = myfun.GetValue("MESSAGE").ToString();
this.label3.Text = MES;
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("ZFT");
//提前实例化一个空的表结构出来
DataTable dt1 = new DataTable();
dt1.Columns.Add("BUKRS");
dt1.Columns.Add("SJ1");
for (int i = 0; i < IrfTable1.Count; i++)
{
IrfTable1.CurrentIndex = i;
DataRow dr1 = dt1.NewRow();
dr1["BUKRS"] = IrfTable1.GetString("BUKRS");
dr1["SJ1"] = IrfTable1.GetString("SJ1");
textBox2.AppendText(IrfTable1.GetString("BUKRS") + IrfTable1.GetString("SJ1") + '\n');
dt1.Rows.Add(dr1);
}
}
}
}
输出:
进入sap 通过se16查看ZFUNCTION_TEST表
这就是通过2个系统、一个接口完成的SAP数据库表更新的全部过程,它也是rfc(通过c#)完成接口的核心代码。不用谢我了,我叫雷锋!