.Net通过NCO连接SAP总结

环境:VS2010,NCO3.0,SAP ECC6.0 EHP7

说明:NCO区分32位和64位,依系统不同安装不同的版本(安装时无特殊注意点);

WINFORM开发:

目标框架应设置为.Net Framework 4(项目->属性->应用程序)

 

 添加引用:sapnco,sapnco_utils

 

 项目中添加app.config;程序代码中需添加

using SAP.Middleware.Connector;

using System.Configuration;

 App.config内容如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <sectionGroup name="SAP.Middleware.Connector">
      <sectionGroup name="ClientSettings">
        <section name="DestinationConfiguration" type="SAP.Middleware.Connector.RfcDestinationConfiguration,sapnco"/>
      </sectionGroup>
    </sectionGroup>
  </configSections>

  <SAP.Middleware.Connector>
    <ClientSettings>
      <DestinationConfiguration>
        <destinations>
          <add NAME= "EP1" USER="USER" PASSWD = "PAS" CLIENT="CLIENT"
               LANG="ZH" ASHOST="IP" SYSNR="00"
               MAX_POOL_SIZE="10" IDLE_TIMEOUT="10"/>
        </destinations>
      </DestinationConfiguration>
    </ClientSettings>
  </SAP.Middleware.Connector>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
</configuration>

 在SAP中通过SE37开发RFC函数;ZQRDETAIL为自定义结构

  

  

  .Net调用RFC函数传递参数过程中,导入参数与表所使用的方式不同,使用导入导出参考代码如下:

        public DataTable GetSapData(string Vbeln, string Posnr)
        {
            DataTable Dtable = new DataTable();
            try
            {
                RfcDestination rfcDestination = RfcDestinationManager.GetDestination("EP1");
                RfcRepository rfcRepository = rfcDestination.Repository;
                IRfcFunction myfun = rfcRepository.CreateFunction("ZMM_RFC_ORDER_DETAILS");

                IRfcStructure import = null;


                import = rfcRepository.GetStructureMetadata("ZQRDETAIL").CreateStructure();

                myfun.SetValue("I_VBELN", Vbeln);
                myfun.SetValue("I_POSNR",Posnr);
                myfun.Invoke(rfcDestination);
                sta = myfun.GetString("E_STATUS");
                msg = myfun.GetString("E_MESSAGE");
                if (sta == "S")
                {
                    IRfcTable tables = myfun.GetTable("T_ITEM");
                    Dtable = ConverToDoNetTable(tables);
                }
                else
                {
                    MessageBox.Show( msg);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            return Dtable;
        }
private DataTable ConverToDoNetTable(IRfcTable RFCTable)
        {
            DataTable dtTable = new DataTable();
            //Create table
            for (int item = 0; item < RFCTable.ElementCount; item++)
            {
                RfcElementMetadata metadata = RFCTable.GetElementMetadata(item);
                dtTable.Columns.Add(metadata.Name);
            }

            foreach (IRfcStructure row in RFCTable)
            {
                DataRow dr = dtTable.NewRow();
                for (int item = 0; item < RFCTable.ElementCount; item++)
                {
                    RfcElementMetadata metadata = RFCTable.GetElementMetadata(item);
                    if (metadata.DataType == RfcDataType.BCD)
                    {
                        dr[item] = row.GetDouble(metadata.Name);
                    }
                    else
                    {
                        dr[item] = row.GetString(metadata.Name);
                    }
                }
                dtTable.Rows.Add(dr);
            }
            return dtTable;
        }

如果导入导出中均未设置参数,参数全部通过表传入SAP,如下参考:

获取参数部分代码如下:

       private string ConvertToSap(int X, RfcDestination dest)
        {
            RfcRepository SapRfcRepository = dest.Repository;
            // Create and invhuoke function module
            IRfcFunction myfun = SapRfcRepository.CreateFunction("ZQM_SAW_RESULT_LOAD");
            // Set some input values for the structure.  
            IRfcStructure import = null;
            IRfcTable tables = myfun.GetTable("ZQM_ELEMENT");

            for (int C = 0; C <= dgvShow.ColumnCount - 8; C++)
            {
                import = SapRfcRepository.GetStructureMetadata("ZZSQM_SAW_ELEM").CreateStructure();

                string zsamno = dgvShow.Rows[X].Cells["Name"].Value.ToString().Trim();

                import.SetValue("ZSAMNO", zsamno);

                import.SetValue("ZNETUN", "KG");
   
                tables.Insert(import);
            }
            myfun.Invoke(dest);
        }

 其他代码参考:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using SAP.Middleware.Connector;
using System.Configuration;
using System.IO;

namespace ImpHrReadSap
{
    class Program
    {
        private static DataTable ConverToDoNetTable(IRfcTable RFCTable)
        {
            DataTable dtTable = new DataTable();
            //Create table
            for (int item = 0; item < RFCTable.ElementCount; item++)
            {
                RfcElementMetadata metadata = RFCTable.GetElementMetadata(item);
                dtTable.Columns.Add(metadata.Name);
            }

            foreach (IRfcStructure row in RFCTable)
            {
                DataRow dr = dtTable.NewRow();
                for (int item = 0; item < RFCTable.ElementCount; item++)
                {
                    RfcElementMetadata metadata = RFCTable.GetElementMetadata(item);
                    if (metadata.DataType == RfcDataType.BCD)
                    {
                        dr[item] = row.GetDouble(metadata.Name);
                    }
                    else
                    {
                        dr[item] = row.GetString(metadata.Name);
                    }
                }
                dtTable.Rows.Add(dr);
            }
            return dtTable;
        }
        
        static void Main(string[] args)
        {
            int F = 0;
            //Path
            string FilePath = "D:\\SAPLOG\\";
            string Log = "HRLog.txt";
            string dt = DateTime.Now.ToString("yyyyMMdd");
            string SqlConString = ConfigurationManager.ConnectionStrings["SapYcSqlConnectiongString"].ConnectionString.ToString();
            SqlConnection conn = new SqlConnection(SqlConString);
            SqlCommand com = new SqlCommand("DelTIAB", conn);
            try
            {
                conn.Open();
                SqlTransaction trans = conn.BeginTransaction();
                com.CommandType = CommandType.StoredProcedure;
                com.Transaction = trans;
                com.Parameters.Add("@RET", SqlDbType.Int);
                com.Parameters["@RET"].Direction = ParameterDirection.ReturnValue;
                com.ExecuteNonQuery();
                F = (int)com.Parameters["@RET"].Value;
                RfcDestination rfcDestination = RfcDestinationManager.GetDestination("EP1");
                RfcRepository rfcRepository = rfcDestination.Repository;
                IRfcFunction myfun = rfcRepository.CreateFunction("Z_HR_PA_001");
                myfun.SetValue("I_BEGDA", dt);
                myfun.SetValue("I_ENDDA", dt);
                myfun.Invoke(rfcDestination);
                IRfcTable Mtables = myfun.GetTable("RESULT_OUT");
                DataTable Master = ConverToDoNetTable(Mtables);
                using (SqlBulkCopy SqlBc = new SqlBulkCopy(conn, SqlBulkCopyOptions.Default, trans))
                {
                    try
                    {
                        SqlBc.DestinationTableName = "SAPTEMPHR";
                        SqlBc.WriteToServer(Master);
                        com.CommandText = "SelTempHrToTIAB";
                        com.ExecuteNonQuery();
                        trans.Commit();
                    }
                    catch (Exception ex)
                    {
                        trans.Rollback();
                        FileStream FS = new FileStream(FilePath + Log, System.IO.FileMode.OpenOrCreate);
                        StreamWriter WR = new StreamWriter(FS);
                        WR.Write(ex.Message);
                        WR.Flush();
                        WR.Close();
                        FS.Close();
                    }
                }
            }
            catch (Exception ex)
            {
                FileStream FS = new FileStream(FilePath + Log, System.IO.FileMode.OpenOrCreate);
                StreamWriter WR = new StreamWriter(FS);
                WR.Write(ex.Message);
                WR.Flush();
                WR.Close();
                FS.Close();
            }
        }
    }
}

 

posted @ 2019-11-12 15:33  kang09  阅读(798)  评论(0编辑  收藏  举报