Showing posts with label Web Service. Show all posts
Showing posts with label Web Service. Show all posts

Wednesday, 5 September 2018

Download SAP Data Dengan RFC & C# WCF Web Service dan SQL Server Part2

Ok melanjutkan postingan saya Sebelumnya untuk membuat wcf web service dengan Visual Studio 2015. langsung saja buka Visual Studio-nya dan buat project baru


Setelah membuat project baru, selanjutnya kita tambahkan libarary RFC Connector kedalam project dengan cara klik kanan pada References->Add Reference


lalu pilih sapnco.dll dan sapnco_util.dll, untuk library nya bisa di download DISINI


kemudian kita tambahkan satu class baru kedalam project dengan nama rfc_Connector


dan didalam class rfc_Connector kita implement interface IDestinationConfiguration dan jangan lupa import name space SAP.Middleware.Connector 




lalu pada bagian RfcConfigParameters tambahkan source code berikut :



lalu kita tambahkan dataset baru kedalam project :




kemudian kita tambahkan table adapter didalam dataset, ikuti gambar berikut untuk menambah table adapter














Kemudian kita tambahkan satu class baru lagi kedalam project dengan nama GlobalData



tambahkan global.asax




Buka file IService1 dan tambah source code berikut :


Buka file Service1.svc dan implement interface yang sudah kita tambahkan pada Iservice1 dan tambahkan name space seperti pada gambar


setelah kita implement interface maka akan terbentuk sebuah method baru dengan nama Download_ZMARA




Berikut Source Code lengkap didalam Service1.svc

string message;
        string status;
        public string Download_ZMARA(string matnr)
        {
            try
            {
                IRfcFunction getDataSAP = GlobalData.rfcRepository.CreateFunction("ZDLMARA");
                getDataSAP.SetValue("P_MATNR", matnr);

                try
                {
                    getDataSAP.Invoke(GlobalData.rfcDestination);
                }
                catch (Exception ex)
                {

                    if (ex.Message.Contains("DATA_NOT_FOUND"))
                    {
                        status = "sukses";
                    }
                    else
                    {
                        status = "gagal";
                    }


                    message = "SAP ZDLMARA ";
                    message += ex.Message;
                    return message;
                }


                IRfcTable IT_MARA = getDataSAP.GetTable("IT_MARA");
                DataSet1 dsUniversal = new DataSet1();

                DataTable dtMARA = dsUniversal.Tables["ZMARA"];

                dtMARA = CreateDataTable(dtMARA, IT_MARA);

                SqlConnection con = GetSQLConn();
                if (con.State == ConnectionState.Closed)
                {
                    con.Open();
                }
                SqlTransaction transaction = con.BeginTransaction();

                SqlCommand command = new SqlCommand("SP_Update_ZMARA", con);
                command.Transaction = transaction;
                command.Parameters.Add(new SqlParameter("@tblZmara", SqlDbType.Structured));
                command.Parameters["@tblZmara"].Value = dtMARA;
                command.Parameters["@tblZmara"].TypeName = "zmaraType";

                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandTimeout = 600000;
                int result = command.ExecuteNonQuery();

                transaction.Commit();
                transaction.Dispose();
                IT_MARA.Clear();
                message = "Download data completed. ";
                message += "ZMARA :" + dtMARA.Rows.Count + " rows. ";
            }
            catch (Exception x)
            {
                return x.Message;
            }

            return message;
        }


        public string GetAppSetting(string key)
        {
            try
            {
                return ConfigurationManager.AppSettings[key];
            }
            catch (Exception)
            {
                return "";
            }
        }

        public SqlConnection GetSQLConn()
        {
            string ConnString = GetAppSetting("ConnString");
            SqlConnection koneksi = new SqlConnection(ConnString);
            return koneksi;
        }

        rfc_Connector konstruktor = new rfc_Connector();

        //function for register to SAP server
        public void Register()
        {

            if (RfcDestinationManager.IsDestinationConfigurationRegistered())
            {
                rfc_Connector konstruktor = new rfc_Connector();
                RfcDestinationManager.UnregisterDestinationConfiguration(konstruktor);
            }
            RfcDestinationManager.RegisterDestinationConfiguration(konstruktor);

        }

        public static DataTable CreateDataTable(DataTable dt, IRfcTable rfcTable)
        {
            foreach (IRfcStructure row in rfcTable)
            {
                DataRow newRow = dt.NewRow();
                for (int element = 0; element < rfcTable.ElementCount; element++)
                {
                    RfcElementMetadata metadata = rfcTable.GetElementMetadata(element);
                    var nrow = newRow[element];
                    var rrow = row.GetString(metadata.Name);
                    newRow[element] = row.GetString(metadata.Name);

                }
                dt.Rows.Add(newRow);
            }

            return dt;

        }

Configurasi web config






sampai disini web service sudah bisa kita jalankan dan coba download data sap, kita cek apakah data berhasil masuk ke database SQL Server atau tidak.


tambahan sedikit, jika menemukan error kurang lebih seperti gambar berikut :


cara mengatasinya adalah masuk ke regedit :
HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\12.0\WebProjects
HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\14.0\WebProjects

terus double klik Use64BitIISExpress lalu ruba nilai 0 jadi 1 kemudia restart visual studio dan IIS lalu jalankan kembali web service nya.


ok cukup sekian sharing kali ini semoga bermanfaat. :D, yang berminat project lengkapnya bisa tulis email dikolom komentar :D

Download SAP Data Dengan RFC & C# WCF Web Service dan SQL Server Part1

Pada postingan kali saya akan berbagi cara mendownload data dari SAP ke database SQL Server dengan fitur RFC yang ada pada SAP melalui WCF web service C# dengan tools visual studio 2015.

di beberapa perusahaan terkadang membutuhkan data yang ada di system SAP untuk digunakan di aplikasi-aplikasi yang dikembangkan diluar SAP dengan database yang berbeda dari SAP dan salah satu fitur yang bisa digunakan untuk menurunkan data dari SAP ke system diluar SAP adalah RFC (Remote Function Call). 

ok kita langsung saja pada pokok pembahasan, untuk contoh saya akan mendownload data dari table (MARA-MATNR, MAKT-MAKTX, MARA-MEINS, MARA-MATKL, MARA-MTART). ada beberapa step yang akan kita lakukan yaitu :

1. SAP
    - Membuat structure untuk sesuai dengan field2 yang akan kita download
    - Membuat function untuk mengambil data.

2. SQL Server
    - Membuat Database
    - Membuat Table
    - Membuat Table Type
    - Membuat Stored Procedure

3. Visual Studio-> Create New Project WCF WebService.


Pada postingan kali ini saya akan membahas point no 1 dan 2 yaitu SAP dan SQL Server.

SAP
-> Membuat Structure
    untuk membuat structure kita jalankan tcode SE11





-> Membuat Function
    masuk ke tcode SE37 dan buat function baru











Sampai pada tahap ini untuk persiapan di SAP sudah selesai, selanjutnya kita akan menyiapkan database di SQL Server sebagai tujuan untuk menyimpan data yang akan kita download dari SAP.

SQL Server
-> Membuat Database
    Nama database yang akan kita buat EXAM atau bisa diganti sesuai keinginan

-> Membuat Table
    kita akan membuat table dengan nama ZMARA dan structurenya seperti berikut :



note : panjang data minimal harus sama dengan yang di SAP

-> Membuat Table Type
    Table type structurenya harus sama dengan table yang sudah dibuat

    CREATE TYPE [dbo].[zmaraType] AS TABLE(
[matnr] [varchar](50) NOT NULL,
[maktx] [varchar](50) NULL,
[meins] [varchar](3) NULL,
[matkl] [varchar](9) NULL,
[mtart] [varchar](4) NULL
      )

-> Membuat Stored Procedure

CREATE PROCEDURE [dbo].[SP_Update_ZMARA]
-- Add the parameters for the stored procedure here
@tblZmara zmaraType readonly
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
MERGE INTO zmara T1
      USING @tblZmara T2
      ON T1.[matnr] = T2.[matnr]

      WHEN MATCHED THEN
  UPDATE SET 
T1.[MAKTX] = T2.[MAKTX],
T1.[MEINS] = T2.[MEINS],
T1.[MATKL] = T2.[MATKL],
T1.[MTART] = T2.[MTART]
  WHEN NOT MATCHED THEN
INSERT values(
T2.[MATNR], T2.[MAKTX], T2.[MEINS], T2.[MATKL], T2.[MTART]);
END

ok sampai disini persiapan dari sisi SAP dan SQL Server sudah selesai, untuk selanjutnya kita akan membuat Web Service di Visual Studio dan akan dibahas pada postingan Selanjutnya.


Terimakasih :D

Tuesday, 29 May 2018

Membuat CRUD Dengan Web Service C# & SQL Server


1.     Create Database & Table
Sebelum membuat web service kita siapkan terlebih dahulu database dan table di SQL Server yang akan di olah di web service.
Database name : DBWS
Table name : WSDATA
Table field :
Field
DataType
PersonalID
Int (PK)
PersonalName
Nvarchar(50)
Address
Nvarchar(100)
Gender
Nvarchar(20)
Hoby
Nvarchar(100)

Untuk proses insert, update, delete, select data di SQL tambahkan stored procedure berikut :
·         Stored Procedure Insert
Untuk proses insert bisa dilakukan dengan dua cara yaitu dengan bulk insert atau insert data satu persatu. Bulk insert adalah melakukan insert data yang jumlahnya banyak tanpa harus melakukan looping sedangkan jika melakukan insert data yang jumlahnya banyak tanpa proses bulk insert akan memakan waktu lebih lama karena harus melakukan looping sebanyak jumlah data yang akan di insert, dan yang akan digunakan disini adalah bulk insert. untuk melakukan proses bulk insert di SQL kita harus membuat dataType yang strukturnya sama dengan table tujuan insert data, datatype ini berfungsi sebagai penampung data yang akan di insert ke table. Dan berikut datatype yang untuk proses insert ke table WSDATA :
CREATE TYPE [dbo].[WSDATAype] AS TABLE(
       [PersonalID] [int] NOT NULL,
       [PersonalName] [nvarchar](50) NULL,
       [Address] [nvarchar](100) NULL,
       [Gender] [nvarchar](20) NULL,
       [Hoby] [nvarchar](100) NULL
)


Setelah membuat dataType tambahkan stored procedure dibawah ini :
CREATE PROCEDURE SP_INSERT_WSDATA
       -- Add the parameters for the stored procedure here
        @WsDataInsert WSDATAype READONLY
AS
BEGIN
       -- SET NOCOUNT ON added to prevent extra result sets from
       -- interfering with SELECT statements.
       SET NOCOUNT ON;

    -- Insert statements for procedure here
       INSERT INTO WSDATA(PersonalID,PersonalName,[Address],Gender,Hoby)
       SELECT PersonalID,PersonalName,[Address],Gender,Hoby FROM @WsDataInsert;
END
GO


·         Stored Procedure Update
CREATE PROCEDURE SP_UPDATE_WSDATA
       -- Add the parameters for the stored procedure here
       @PersonalID int,
       @PersonalName Nvarchar(50),
       @Address Nvarchar(100),
       @Gender Nvarchar(20),
       @Hoby Nvarchar(100)
AS
BEGIN
       -- SET NOCOUNT ON added to prevent extra result sets from
       -- interfering with SELECT statements.
       SET NOCOUNT ON;

    -- Insert statements for procedure here
       UPDATE WSDATA SET PersonalName = @PersonalName, [Address] = @Address, Gender = @Gender, Hoby = @Hoby
       WHERE PersonalID = @PersonalID
END
GO


·         Stored Procedure Delete
CREATE PROCEDURE SP_DELETE_WSDATA
       -- Add the parameters for the stored procedure here
       @PersonalID int
AS
BEGIN
       -- SET NOCOUNT ON added to prevent extra result sets from
       -- interfering with SELECT statements.
       SET NOCOUNT ON;

    -- Insert statements for procedure here
       DELETE WSDATA WHERE PersonalID = @PersonalID
END
GO

·         Stored Procedure Select
-> Select All Data
CREATE PROCEDURE SP_SELECT_ALL_WSDATA
       -- Add the parameters for the stored procedure here
      
AS
BEGIN
       -- SET NOCOUNT ON added to prevent extra result sets from
       -- interfering with SELECT statements.
       SET NOCOUNT ON;

    -- Insert statements for procedure here
       SELECT * FROM WSDATA
END
GO


-> Select Dengan Parameter
CREATE PROCEDURE SP_SELECT_WSDATA
       -- Add the parameters for the stored procedure here
       @PersonalID int
AS
BEGIN
       -- SET NOCOUNT ON added to prevent extra result sets from
       -- interfering with SELECT statements.
       SET NOCOUNT ON;

    -- Insert statements for procedure here
       SELECT * FROM WSDATA WHERE PersonalID = @PersonalID
END
GO


Sampai disini persiapan dari SQL sudah selesai selanjutnya di web service




1.     Create New Project
-> Buka Visual Studio pilih File->New->Project

->Masukkan Nama Project dan pilih framework seperti pada gambar dibawah dan centang Application insights.

Jika sudah pilih OK, maka akan langsung tercreate project seperti berikut :


Sampai ditahap ini create project webservice sudah selesai, untuk proses selanjutnya tinggal membuang function atau class sesuai kebutuhan. 

3.     Setting Web Config
Web config fungsinya sebagai tempat referensi dari object-object yang akan digunakan dalam aplikasi, seperti connection string, dan pengaturan lainnya bisa dilakukan di web config.
Setting web config seperti dibawah ini :



<?xml version="1.0"?>
<configuration>

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true"/>
    <add key="ConString" value="Data Source=IP Server;Initial Catalog=Nama Database;Persist Security Info=True;User ID=UserDatabase;Password=PasswordDatabase;Pooling=false" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5.2"/>
    <httpRuntime targetFramework="4.5.2"/>
    <httpModules>
      <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web"/>
    </httpModules>
  </system.web>
  <system.serviceModel>
    <services>
      <service name="WSUX.Service1">
        <endpoint address="../Service1.svc" binding="webHttpBinding" contract="WSUX.IService1" behaviorConfiguration="webBehaviour" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="webBehaviour">
          <webHttp />
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <protocolMapping>
        <add binding="basicHttpsBinding" scheme="https"/>
    </protocolMapping>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" minFreeMemoryPercentageToActivateService="0"/>
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <remove name="ApplicationInsightsWebTracking"/>
      <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web"
        preCondition="managedHandler"/>
    </modules>
    <!--
        To browse web app root directory during debugging, set the value below to true.
        Set to false before deployment to avoid disclosing web app folder information.
      -->
    <directoryBrowse enabled="true"/>
    <validation validateIntegratedModeConfiguration="false"/>
  </system.webServer>

</configuration>





4.     Menambah Class & Interface URL
-> Class disini dibuat untuk menampung function untuk interaksi ke SQL dan Class sebagai Entity untuk menampung result data dari SQL dan mengirim parameter ke SQL.
·         Class interaksi ke SQL
Class ini berisi function untuk konek ke SQL dan menjalankan perintah SQL Query.

Untuk menambahkan class baru didalam project klik kanan pada project solution ->add->New Items->pilih Class dan setelah itu masukkan nama Class yang akan dibuat.


Jika sudah klik Add dan akan terbentuk sebuah class baru dan tambahkan variable string seperti berikut :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace WSUX
{
    Public static class SQLFunct
    {
        public static string sqlMessage;
    }
}

Selanjutnya tambahkan function yang dibutuhakan, Membaca koneksi string dari web config, Set koneksi, Execute Query, Execute Reader, Execute Scalar
-> Function Membaca Koneksi String dari web config
public static string GetAppSetting(string key)
        {
            try
            {
               return ConfigurationManager.AppSettings[key];
            }
            catch (Exception x)
            {
                return "";
            }
        }





-> Function Set Koneksi
public static string GetConnString()
        {
            string connString = "";
            connString = GetAppSetting("ConString");

            return connString;
        }

-> Function Execute Query
Function ini diguanakan untuk menjalan Query SQL seperti Insert, Update dan Delete
public static string ExecuteNonQuery(SqlCommand command)
        {
            string connString = GetConnString();
            string result = "";
            SqlConnection con = new SqlConnection(connString);
            if (con.State == ConnectionState.Closed)
            {
                con.Open();
            }
            SqlTransaction transaction = con.BeginTransaction();
            try
            {
                command.Transaction = transaction;
                command.CommandTimeout = 600000;
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.Connection = con;
                command.ExecuteNonQuery();

                transaction.Commit();
                transaction.Dispose();
                con.Close();
                con.Dispose();
                sqlMessage = "1";
                return sqlMessage;
            }
            catch (Exception x)
            {
                if (x.Message.Contains("Violation of PRIMARY KEY"))
                {
                    sqlMessage = x.Message;
                }
                else
                {
                    sqlMessage = "0";
                }
                transaction.Rollback();
                transaction.Dispose();
                con.Close();
                con.Dispose();
                return sqlMessage;
            }
            finally
            {
                con.Close();
            }
        }

-> Function Execute Reader
Function ini diguanakan untuk menjalan Query Select
public static DataTable ExecuteReader(SqlCommand command)
        {

            string connString = GetConnString();
            SqlConnection con = new SqlConnection(connString);
            DataTable dtTable = new DataTable();
            try
            {
                //string ConnString = GetAppSetting(connString);
               
                if (con.State == ConnectionState.Closed)
                {
                    con.Open();
                }

                command.CommandTimeout = 600000;
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.Connection = con;

                SqlDataReader reader;
                reader = command.ExecuteReader();
                dtTable.Load(reader);

                reader.Close();
                con.Close();
                con.Dispose();

                return dtTable;
            }
            catch (Exception x)
            {
                return dtTable;
            }
            finally
            {
                con.Close();
            }

        }

-> Function Excute Scalar
Function ini digunakan untuk menjalankan query select yang hanya mengembalikan nilai satu field record data.
public static string ExecuteScalar(SqlCommand command)
        {
            string connString = GetConnString();
            SqlConnection con = new SqlConnection(connString);
            try
            {
                //string ConnString = GetAppSetting(connString);
                string result = "";
               
                if (con.State == ConnectionState.Closed)
                {
                    con.Open();
                }
                SqlTransaction transaction = con.BeginTransaction();

                command.Transaction = transaction;
                command.CommandTimeout = 600000;
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.Connection = con;
                result = command.ExecuteScalar().ToString();

                transaction.Commit();
                transaction.Dispose();
                con.Close();
                con.Dispose();

                return result;
            }
            catch (Exception x)
            {
                return "error " + x.Message;
            }
            finally
            {
                con.Close();  
            }
        }

·         Class Entity
Class Entity ini digunakan untuk menampung hasil result query dari SQL yang akan ditampilkan dalam bentuk json dan untuk mengirimkan parameter ke SQL.
Buat class baru dengan nama Ent_WSDATA
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace WSUX
{
    public class Ent_WSDATA
    {
        public string PersonalID { get; set; }
        public string PersonalName { get; set; }
        public string Address { get; set; }
        public string Gender { get; set; }
        public string Hoby { get; set; }
    }
}





·         Membuat Interface URL
Tambahkan interface berikut di IService1.cs untuk proses insert, update, delete, dan select data
[OperationContract]
        [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "INSERTDATA")]
        string INSERTDATA(Stream param);
[OperationContract]
        [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "UPDATEWSDATA")]
        string UPDATEWSDATA(Stream param);

        [OperationContract]
        [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "DELETEWSDATA")]
        string DELETEWSDATA(Stream param);
[OperationContract]
        [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "GETDATA")]
        List<Ent_WSDATA> GETDATA(Stream param);

·         Implement Interface URL
Setelah membuat interface di IService1.cs selanjutnya implment Interface tersebut di Service1.svc seperti berikut :
-> Implement INSERTDATA
public string INSERTDATA(Stream param)
        {
            try
            {
                StreamReader reader = new StreamReader(param);
                string JSONdata = reader.ReadToEnd();
                JavaScriptSerializer jss = new JavaScriptSerializer();
                List<Ent_WSDATA> listWSDATA = jss.Deserialize<List<Ent_WSDATA>>(JSONdata);


                DataTable dtWSDATA = SQLFunct.ToDataTable<Ent_WSDATA>(listWSDATA);

                string connString = SQLFunct.GetConnString();
                SqlConnection con = new SqlConnection(connString);

                if (con.State == ConnectionState.Closed)
                {
                    con.Open();
                }

                SqlCommand command = new SqlCommand("SP_INSERT_WSDATA", con);
                command.Parameters.Add(new SqlParameter("@WsDataInsert", SqlDbType.Structured));
                command.Parameters["@WsDataInsert"].Value = dtWSDATA;
                command.Parameters["@WsDataInsert"].TypeName = "WSDATAype";

                string result = SQLFunct.ExecuteNonQuery(command);

                return "1";

            }
            catch (Exception x)
            {
                return x.Message;
            }           
        }

-> Implement UPDATEDATA
public string UPDATEWSDATA(Stream param)
        {
            try
            {
                StreamReader reader = new StreamReader(param);
                string JSONdata = reader.ReadToEnd();

                JavaScriptSerializer jss = new JavaScriptSerializer();
                Ent_WSDATA ListUpdateWsData = jss.Deserialize<Ent_WSDATA>(JSONdata);

                SqlCommand command = new SqlCommand("SP_UPDATE_WSDATA");
                command.Parameters.Add(new SqlParameter("@PersonalID", ListUpdateWsData.PersonalID));
                command.Parameters.Add(new SqlParameter("@PersonalName", ListUpdateWsData.PersonalName));
                command.Parameters.Add(new SqlParameter("@Address", ListUpdateWsData.Address));
                command.Parameters.Add(new SqlParameter("@Gender", ListUpdateWsData.Gender));
                command.Parameters.Add(new SqlParameter("@Hoby", ListUpdateWsData.Hoby));

                SQLFunct.ExecuteNonQuery(command);

                string result;

                if (SQLFunct.sqlMessage == "1")
                {
                    result = "1";
                }
                else
                {
                    result = SQLFunct.sqlMessage;
                }

                return result;

            }
            catch (Exception)
            {
                throw;
            }
        }

-> Implement DELETEDATA
public string DELETEWSDATA(Stream param)
        {
            try
            {
                StreamReader reader = new StreamReader(param);
                string JSONdata = reader.ReadToEnd();

                JavaScriptSerializer jss = new JavaScriptSerializer();
                Ent_WSDATA ListUpdateWsData = jss.Deserialize<Ent_WSDATA>(JSONdata);

                SqlCommand command = new SqlCommand("SP_DELETE_WSDATA");
                command.Parameters.Add(new SqlParameter("@PersonalID", ListUpdateWsData.PersonalID));

                SQLFunct.ExecuteNonQuery(command);

                string result;

                if (SQLFunct.sqlMessage == "1")
                {
                    result = "1";
                }
                else
                {
                    result = SQLFunct.sqlMessage;
                }

                return result;

            }
            catch (Exception)
            {
                throw;
            }
        }

-> Implement GETDATA
public List<Ent_WSDATA> GETWSDATA(Stream param)
        {
            List<Ent_WSDATA> ListWSDATA = new List<Ent_WSDATA>();
            try
            {
                StreamReader reader = new StreamReader(param);
                string JSONdata = reader.ReadToEnd();
                JavaScriptSerializer jss = new JavaScriptSerializer();
                Ent_WSDATA prm = jss.Deserialize<Ent_WSDATA>(JSONdata);

                SqlCommand command = new SqlCommand();
                if (prm.PersonalID == "")
                {
                    command = new SqlCommand("SP_SELECT_ALL_WSDATA");
                }
                else
                {
                    command = new SqlCommand("SP_SELECT_WSDATA");
                    command.Parameters.Add(new SqlParameter("@PersonalID", prm.PersonalID));
                }

                DataTable dtListWSDATA = SQLFunct.ExecuteReader(command);

                ListWSDATA = (from DataRow row in dtListWSDATA.Rows
                              select new Ent_WSDATA
                              {
                                  PersonalID = row["PersonalID"].ToString(),
                                  PersonalName = row["PersonalName"].ToString(),
                                  Address = row["Address"].ToString(),
                                  Gender = row["Gender"].ToString(),
                                  Hoby = row["Hoby"].ToString()
                              }).ToList();

                return ListWSDATA;

            }
            catch (Exception x)
            {
                return ListWSDATA;
                throw;
            }           
        }

1.     Testing WSDATA
·         Insert Data
Sebelum Insert











Selanjutnya tambahkan source code berikut di dalam method
protected void Application_BeginRequest(object sender, EventArgs e)
{
}

            try
            {
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
                if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
                {
                    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "POST, PUT, DELETE"); 
                    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept"); 
                    HttpContext.Current.Response.Flush(); 
                    HttpContext.Current.Response.SuppressContent = true;  
                    HttpContext.Current.ApplicationInstance.CompleteRequest(); 
                }
            }
            catch (Exception x)
            {
                string msg = x.Message;
            }

 Ok. Semoga Bermanfaat

Belajar SAP ABAP RAP

  Belajar SAP ABAP RAP: Pengenalan dan Konsep Dasar Restful ABAP Programming Model Kalau kamu seorang ABAPer yang mulai terjun ke dunia SAP...