一套通过c#-sap-rfc 完整处理内表输入输出并将数据保存至SAP自建表中的程序

研究了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#)完成接口的核心代码。不用谢我了,我叫雷锋!

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT技术与企业应用结合的爱好者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值