[SAP] 如何在.net 環境call SAP BAPI

若需要從SAP中取出data, 除了用web service 外, 可以直接call其BAPI call. 方法如下:

SapDestinationConfiguration.cs

using SAP.Middleware.Connector;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Test.Poc.Sap.Library
{
    public class SapDestinationConfiguration : IDestinationConfiguration
    {
        public event RfcDestinationManager.ConfigurationChangeHandler ConfigurationChanged;

        public bool ChangeEventsSupported()
        {
            return false;
        }

        public RfcConfigParameters GetParameters(string destinationName)
        {
            RfcConfigParameters param = new RfcConfigParameters();
            param.Add(RfcConfigParameters.Name, "MM");
            param.Add(RfcConfigParameters.AppServerHost, "10.10.28.172");
            param.Add(RfcConfigParameters.SystemNumber, "00");
            param.Add(RfcConfigParameters.SystemID, "NAD");
            param.Add(RfcConfigParameters.User, "sapna01");
            param.Add(RfcConfigParameters.Password, "abcd1234");
            param.Add(RfcConfigParameters.Client, "502");
            param.Add(RfcConfigParameters.Language, "EN");
            param.Add(RfcConfigParameters.PoolSize, "10");
            return param;
        }
    }
}

SapConnector.cs

using Test.Poc.Sap.Library.Bases;
using SAP.Middleware.Connector;
using SPEED.SAPConnection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Test.Poc.Sap.Library
{
    public class SapConnector : IConnector
    {
        private bool isConnected;
        public bool IsConnected
        {
            get { return isConnected; }
            set { isConnected = value; }
        }

        private RfcDestination rfcDestination;

        public RfcDestination RfcDestination
        {
            get { return rfcDestination; }
            set { rfcDestination = value; }
        }

        public bool Connect()
        {
            bool result = false;
            string destinationConfigurationName = "MM";
            IDestinationConfiguration destinationConfig = null;
            bool isDestinationInitialize = false;

            try
            {
                if (!isDestinationInitialize)
                {
                    destinationConfig = new SapDestinationConfiguration();
                    destinationConfig.GetParameters(destinationConfigurationName);

                    if (RfcDestinationManager.TryGetDestination(destinationConfigurationName) == null)
                    {
                        RfcDestinationManager.RegisterDestinationConfiguration(destinationConfig);
                        isDestinationInitialize = true;
                        this.IsConnected = true;
                        result = true;
                    }
                    else
                    {
                        this.IsConnected = false;
                    }
                    if (rfcDestination == null)
                    {
                        rfcDestination = RfcDestinationManager.GetDestination("MM");
                    }
                    rfcDestination.Ping();
                }
            }
            catch (Exception ex)
            {
                throw (ex);
            }
            return result;
        }

        public bool Disconnect()
        {
            rfcDestination= null;
            return true;
        }

        public bool testConnection()
        {
            bool result = false;
            try
            {
                if(this.rfcDestination==null)
                    rfcDestination = RfcDestinationManager.GetDestination("MM");
                rfcDestination.Ping();
                result = true;
            }
            catch (Exception ex)
            {
                throw(ex);
            }
            return result;
        }
    }
}

SapExecutor.cs

using Test.Poc.Sap.Library.Bases;
using SAP.Middleware.Connector;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Test.Poc.Sap.Library
{
    public class SapExecuter : BaseExecuter
    {
        public SapExecuter(SapConnector sapConnector): base(sapConnector)
        {
            
        }
        public override object Execute()
        {
            DataSet result = new DataSet();

            RfcDestination rfcDestination = ((SapConnector)connector).RfcDestination;
            RfcRepository rfcRepository = rfcDestination.Repository;
            IRfcFunction rfcFunction = rfcRepository.CreateFunction("BAPI_PO_GETITEMSREL");
            rfcFunction.SetValue("REL_GROUP", "Z2");
            rfcFunction.SetValue("REL_CODE", "5");
            rfcFunction.Invoke(rfcDestination);

            String names = "";
            for (int i = 1; i < rfcFunction.Count; i++)
            {
                names += rfcFunction.GetElementMetadata(i).Name+", ";
                IRfcTable customerData = rfcFunction.GetTable("RETURN");
                result.Tables.Add(ConvertToDataTable(customerData));
            }

            //IRfcTable customerSummary = rfcDestination.Repository.GetTableMetadata("ZIRM_CUSTOMER_SUMMARY").CreateTable();
            //customerSummary = customerData.GetTable("CUSTOMER_DATA");
            //result.Tables.Add(this.ConvertToDataTable(customerSummary));
            return result;
        }

        private DataTable ConvertToDataTable(IRfcTable rfcTable)
        {
            DataTable dataTable = new DataTable();

            // Add columns.
            for (int item = 0; item < rfcTable.ElementCount; item++)
            {
                RfcElementMetadata metaData = rfcTable.GetElementMetadata(item);
                dataTable.Columns.Add(metaData.Name);
            }

            foreach (IRfcStructure row in rfcTable)
            {
                DataRow dataRow = dataTable.NewRow();
                for(int item=0; item<rfcTable.ElementCount; item++)
                {
                    RfcElementMetadata metaData = rfcTable.GetElementMetadata(item);
                    if ((metaData.DataType == RfcDataType.BCD) && (metaData.Name=="ABC"))
                        dataRow[item] = row.GetInt(metaData.Name);
                    else
                        dataRow[item] = row.GetString(metaData.Name);
                }
                dataTable.Rows.Add(dataRow);
            }

            return dataTable;
        }
    }
}

 

Reference:

About C.H. Ling 260 Articles
a .net / Java developer from Hong Kong and currently located in United Kingdom. Thanks for Google because it solve many technical problems so I build this blog as return. Besides coding and trying advance technology, hiking and traveling is other favorite to me, so I will write down something what I see and what I feel during it. Happy reading!!!

Be the first to comment

Leave a Reply

Your email address will not be published.


*


This site uses Akismet to reduce spam. Learn how your comment data is processed.