Friday, April 24, 2015

DotNet-SAP Connector - How to Read/Write data to SAP from DotNet



Read and Write data into SAP by DotNet console application.
1. Create VS console application.
2. To connect to SAP need 3 ddl as below:

  •  SAPConnectionManager
  • sapnco
  • sapnco_utils
download the above dlls and add into your application as a reference.

3. Enter SAP configuration settings entries in the app.config app settings.


<appSettings>
    <add key="SAP_ApplicationServerHost" value="ServerName/IP"/>
    <add key="SAP_SystemID" value="DEV"/>
    <add key="SAP_SystemNumber" value="00"/>
    <add key="SAP_User" value="userid"/>
    <add key="SAP_Password" value="password"/>
    <add key="SAP_Client" value="040"/>
    <add key="SAP_Language" value="EN"/>
</appSettings>

4. Add one new class for SAP configuration.
add "SAP.Middleware.Connector" namespace.
inherit the IDestinationCofiguration interface, and right click the call on it to implement the interface

using SAP.Middleware.Connector;

namespace SAPConenctCnsl
{
    public class SAPDstinConfig : IDestinationConfiguration
    {
        public bool ChangeEventsSupported()
        {
            return false;
        }

        public event RfcDestinationManager.ConfigurationChangeHandler ConfigurationChanged;


        public RfcConfigParameters GetParameters(string destinationName)

        {
            RfcConfigParameters parms = new RfcConfigParameters();
            parms.Add(RfcConfigParameters.Name, "DEV");
            parms.Add(RfcConfigParameters.AppServerHost, ConfigurationManager.AppSettings["SAP_ApplicationServerHost"]);
            parms.Add(RfcConfigParameters.SystemNumber, ConfigurationManager.AppSettings["SAP_SystemNumber"]);
            parms.Add(RfcConfigParameters.SystemID, ConfigurationManager.AppSettings["SAP_SystemID"]);
            parms.Add(RfcConfigParameters.User, ConfigurationManager.AppSettings["SAP_User"]);
            parms.Add(RfcConfigParameters.Password, ConfigurationManager.AppSettings["SAP_Password"]);
            parms.Add(RfcConfigParameters.Client, ConfigurationManager.AppSettings["SAP_Client"]);
            parms.Add(RfcConfigParameters.Language, ConfigurationManager.AppSettings["SAP_Language"]);
            parms.Add(RfcConfigParameters.PoolSize, "10");

            return parms;


        }

    }
}

5. add one more new class for Interface , to write your logics


using SAP.Middleware.Connector;
namespace SAPConenctCnsl
{
    public class SAPConntInterface
    {
        private RfcDestination rfcDestination;

// To test the connection

        public bool TestConnection(string destinationName)
        {
            bool result = false;

            try

            {
                rfcDestination = RfcDestinationManager.GetDestination(destinationName);
                if (rfcDestination != null)
                {
                    rfcDestination.Ping();
                    result = true;
                }

            }

            catch (Exception ex)
            {

                result = false;

                throw new Exception("Connection Failed :" + ex.Message);
            }
            return result;
        }
// Getting data with out RFC parameters
 public DataTable GET_VENDOR_CODE(string destinationName)
        {
            RfcRepository rfcRepository = GetRepository(destinationName);
            IRfcFunction rfcFunction = rfcRepository.CreateFunction("Z__GET_VENDOR_CODE");
            rfcFunction.Invoke(rfcDestination);
            IRfcTable tableVendorDetails = rfcFunction.GetTable("GT_VENDORCODE_TAB");
            DataTable dt = new DataTable();
            ConvertToDotNetTable(tableVendorDetails, dt);
            return dt;
        }

// Getting Data from RFC passing string params, and invoke from Table ==> Structure, but return as Table

        public DataTable Get__BANKCODE_Data(string destinationName,string strBankCode)
        {
            RfcRepository rfcRespository = GetRepository(destinationName);
            IRfcFunction rfcFunction = rfcRespository.CreateFunction("Z__GET_BANKCODE_RET");
            IRfcTable t_items = rfcFunction.GetTable("BANK_COUNTRY_KEY");
            RfcStructureMetadata am = rfcRespository.GetStructureMetadata("ZBNKA_BANKS");
            IRfcStructure articol = am.CreateStructure();
            articol.SetValue("ZBANKS",strBankCode);
            t_items.Append(articol);
            rfcFunction.Invoke(rfcDestination);
            IRfcTable tableBankCode = rfcFunction.GetTable("GT_BNKA");
            DataTable dt = new DataTable();
            ConvertToDotNetTable(tableBankCode, dt);
            return dt;
        }


       //Insert data into One table

public void test(string destinationName)
        {
            try
            {
         RfcRepository rfcRepository = GetRepository(destinationName);
        IRfcFunction bapiTEST = rfcRepository.CreateFunction("Z__SET_PAYMENT_PLAN");
             IRfcTable tblInput = bapiTEST.GetTable("GT_CPP");

             RfcStructureMetadata metaData = rfcRepository.GetStructureMetadata("Z_CPP_TAB");

             IRfcStructure tblInputSt = metaData.CreateStructure();

             tblInputSt.SetValue("SCHONO", "10000001");

             tblInputSt.SetValue("COUTY", "MSY");
             tblInputSt.SetValue("BANKL", "BR");
             tblInputSt.SetValue("ENDDT", "2015-01-01");
    tblInput.Append(tblInputSt);

 IRfcStructure tblInputSt1 = metaData.CreateStructure();


tblInputSt1.SetValue("SCHONO", "11200000");

tblInputSt1.SetValue("COUTY", "MSY");
tblInputSt1.SetValue("BANKL", "BR");
tblInputSt1.SetValue("ENDDT", "2015-01-01");
tblInput.Append(tblInputSt1);
   
RfcSessionManager.BeginContext(rfcDestination);
bapiTEST.Invoke(rfcDestination);
IRfcTable t_items = bapiTEST.GetTable("LOG");
        List<string> lstReturn = new List<string>();
if (t_items.RowCount > 0)
{
   for (int i = 0; i < t_items.RowCount; i++)
   {
       lstReturn.Add(t_items[i].GetString(0));
   }
      }

RfcSessionManager.EndContext(rfcDestination)

   
            }
            catch (RfcCommunicationException ex)
            {
            }
            catch (RfcLogonException ex)
            {
                // user could not logon...
            }
            catch (RfcAbapRuntimeException ex)
            {
                // serious problem on ABAP system side...
            }
            catch (RfcAbapBaseException ex)
            {
                // The function module returned an ABAP exception, an ABAP message
                // or an ABAP class-based exception...
            }
        }

              //Insert data into mutiple table using Changing RFC Param

        public void SET__SCHOLAR_MASTER(string destinationName, DataSet ds)
        {
            try
            {

            

            object obj = null;
            RfcRepository rfcRepository = GetRepository(destinationName);
            IRfcFunction rfcFunction = rfcRepository.CreateFunction("Z__SET_SCHOLAR_MASTER");
            foreach (DataTable dt in ds.Tables)
            {
            IRfcTable tblGTCPP = rfcFunction.GetTable(dt.TableName);
            string strTblStName = string.Empty;
            if (dt.TableName.Contains("GT_ZT"))
            {
                strTblStName = dt.TableName.Replace("GT_Z", "");
            }
            //GT_ZB011
            if (dt.TableName.Contains("GT_ZB"))
            { 
                strTblStName = dt.TableName.Replace("GT_", "");
            }
            RfcStructureMetadata metaData = rfcRepository.GetStructureMetadata(strTblStName);
            IRfcStructure tblInputStructM = metaData.CreateStructure();

            

                foreach (DataRow dr in dt.Rows)
                {
                    IRfcStructure tblInputStruct = metaData.CreateStructure();
                    foreach (DataColumn column in dt.Columns)
                    {
                        obj = dr[column];
                        tblInputStruct.SetValue(column.ToString(), obj);

                    }

                    
                    tblGTCPP.Append(tblInputStruct);
                }
            }

            RfcSessionManager.BeginContext(rfcDestination);

            rfcFunction.Invoke(rfcDestination);
            IRfcTable tblLog = rfcFunction.GetTable("LOG");

            List<string> lstReturn = new List<string>();

            if (tblLog.RowCount > 0)
            {
                for (int i = 0; i < tblLog.RowCount; i++)
                {
                    lstReturn.Add(tblLog[i].GetString(0));

                }


            }

            RfcSessionManager.EndContext(rfcDestination);
            }
            catch (RfcCommunicationException ex)
            {
            }
            catch (RfcLogonException ex)
            {
                // user could not logon...
            }
            catch (RfcAbapRuntimeException ex)
            {
                // serious problem on ABAP system side...
            }
            catch (RfcAbapBaseException ex)
            {
                // The function module returned an ABAP exception, an ABAP message
                // or an ABAP class-based exception...
            }
        }
      
// Build Repository        
        private RfcRepository GetRepository(string destinationName)
        {
            rfcDestination = null;
            rfcDestination = RfcDestinationManager.GetDestination(destinationName);
            RfcRepository rfcRepository = rfcDestination.Repository;
            return rfcRepository;
        }

// Convert to DotNet DataTable

        private static void ConvertToDotNetTable(IRfcTable tableVendorDetails, DataTable dt)
        {
            for (int i = 0; i < tableVendorDetails.ElementCount; i++)
            {
                RfcElementMetadata metadata = tableVendorDetails.GetElementMetadata(i);
                dt.Columns.Add(metadata.Name);
            }
            foreach (IRfcStructure row in tableVendorDetails)
            {
                DataRow dr = dt.NewRow();
                for (int elem = 0; elem < tableVendorDetails.ElementCount; elem++)
                {
                    RfcElementMetadata metadata = tableVendorDetails.GetElementMetadata(elem);
                    
                }
                dt.Rows.Add(dr);
            }
        }

        


        public DataSet buildTestChangeDataSet()

        {
            DataSet ds = new DataSet();

            // Table GT_ZT9B01

            DataTable dtGT_ZT9B01 = new DataTable("GT_ZT9B01");
             
                     
            dtGT_ZT9B01.Columns.Add("MANDT", typeof(string));
            dtGT_ZT9B01.Columns.Add("DISPCD", typeof(int));
            dtGT_ZT9B01.Columns.Add("DISPNAME", typeof(string));
            dtGT_ZT9B01.Columns.Add("COURSE", typeof(int));
            dtGT_ZT9B01.Columns.Add("CATEG", typeof(int));

            DataRow drGT_ZT9B01 = dtGT_ZT9B01.NewRow();

            
            drGT_ZT9B01["MANDT"] = "2014-01-01";
            drGT_ZT9B01["DISPCD"] = 2;
            drGT_ZT9B01["DISPNAME"] = "BR";
            drGT_ZT9B01["COURSE"] = 2;
            drGT_ZT9B01["CATEG"] = 3;

            dtGT_ZT9B01.Rows.Add(drGT_ZT9B01);


            drGT_ZT9B01 = dtGT_ZT9B01.NewRow();


            drGT_ZT9B01["MANDT"] = "2014-02-02";

            drGT_ZT9B01["DISPCD"] = 21;
            drGT_ZT9B01["DISPNAME"] = "BR";
            drGT_ZT9B01["COURSE"] = 2;
            drGT_ZT9B01["CATEG"] = 3;

            dtGT_ZT9B01.Rows.Add(drGT_ZT9B01);



            // Table GT_ZT9B08

            DataTable dtGT_ZT9B08 = new DataTable("GT_ZT9B08");
           // dtGT_ZT9B08.DisplayExpression = "T9B08";

            dtGT_ZT9B08.Columns.Add("CLIENT", typeof(string));

            dtGT_ZT9B08.Columns.Add("LEVSD", typeof(int));
            dtGT_ZT9B08.Columns.Add("DESCRIP", typeof(string));
           
            DataRow drGT_ZT9B08 = dtGT_ZT9B08.NewRow();

            drGT_ZT9B08["CLIENT"] = "111";

            drGT_ZT9B08["LEVSD"] = 2;
            drGT_ZT9B08["DESCRIP"] = "BR1";
            
            dtGT_ZT9B08.Rows.Add(drGT_ZT9B08);

            drGT_ZT9B08 = dtGT_ZT9B08.NewRow();


            drGT_ZT9B08["CLIENT"] = "112";

            drGT_ZT9B08["LEVSD"] = 21;
            drGT_ZT9B08["DESCRIP"] = "BR2";

            dtGT_ZT9B08.Rows.Add(drGT_ZT9B08);


            // adding tables into dataset


            ds.Tables.Add(dtGT_ZT9B08);

            ds.Tables.Add(dtGT_ZT9B01);
             
            return ds;
        
        }
    }

}

6. At Program file


            string destinationConfigName = "DEV";
            IDestinationConfiguration destinationConfig = null;
            

             SAPConntInterface objSAPConntInterface = new  SAPConntInterface();

            objSAPConntInterface.TestConnection(destinationConfigName);
           objSAPConntInterface.GET__VENDOR_CODE(destinationConfigName);         
           objSAPConntInterface.Get__BANKCODE_Data(destinationConfigName, "MYS");
           objSAPConntInterface.test(destinationConfigName);
           
          DataSet ds=  objSAPConntInterface.buildTestChangeDataSet();

          objSAPConntInterface.SET__SCHOLAR_MASTER(destinationConfigName, ds);

1 comment: