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

Wednesday, 31 January 2018

Membuat ALV Grid SAP ABAP

Pada postingan ini saya akan share cara membuat ALV grid di SAP - ABAP, ALV biasanya digunakan untuk menampilkan data dalam bentuk table atau grid dalam web programming atau programming yang lain seperti .Net, java dll.

Ok langsung saja, untuk contoh ini saya akan menampilkan data Purchase Order, berikut source code nya :

 *&---------------------------------------------------------------------*

*& Report ZALVEXMP

*&---------------------------------------------------------------------*

*&

*&---------------------------------------------------------------------*

report zalvexmp.


tables : ekpo, ekko, lfa1.


types :

  begin of t_data,

    ebeln type ebeln,

    ebelp type ebelp,

    matnr type matnr,

    maktx type maktx,

    werks type werks_d,

    lgort type lgort_d,

    menge type menge_d,

    meins type meins,

    netpr type bprei,

    waers type waers,

    lifnr type lifnr,

    name1 type name1,

  end of t_data.


data : it_data type table of t_data,

       wa_data type t_data.



data :it_fldcat          type lvc_t_fcat,

      wa_fldcat          type lvc_s_fcat,

      wa_layout          type lvc_s_layo,

      it_list_commentary type slis_t_listheader,

      wa_list_commentary type slis_listheader.


selection-screen begin of block b0 with frame title text-001.

"Parameter

*parameters : p_ebeln type ebeln.


"select option

select-options:

  s_ebeln for ekpo-ebeln,

  s_matnr for ekpo-matnr,

  s_lgort for ekpo-lgort,

  s_werks for ekpo-werks.

selection-screen end of block b0.



start-of-selection.

  perform getdata.

  perform setfieldcat.

  perform build_alv_header.

  perform display_alv.


form getdata.

  refresh it_data.

  select ekpo~ebeln ekpo~ebelp ekpo~matnr makt~maktx ekpo~menge ekpo~meins ekko~lifnr

         ekpo~werks ekpo~lgort ekpo~netpr ekko~waers lfa1~name1 into corresponding fields of table it_data

    from ekko inner join ekpo on ekko~ebeln = ekpo~ebeln inner join lfa1 on ekko~lifnr = lfa1~lifnr

         inner join makt on ekpo~matnr = makt~matnr

    where ekko~ebeln in s_ebeln and ekpo~matnr in s_matnr and ekpo~lgort in s_lgort and ekpo~werks in s_werks

          and ekpo~menge > 0.


  sort it_data by ebeln ebelp.

endform.


form setfieldcat.

  clear wa_fldcat.

  wa_fldcat-col_pos = 1.

  wa_fldcat-fieldname = 'EBELN'.

  wa_fldcat-scrtext_l = 'Purchase Order'.

  wa_fldcat-ref_table = 'IT_DATA'.

  wa_fldcat-intlen = 16.

  wa_fldcat-outputlen = 16.

  append wa_fldcat to it_fldcat .


  clear wa_fldcat.

  wa_fldcat-col_pos = 2.

  wa_fldcat-fieldname = 'EBELP'.

  wa_fldcat-scrtext_l = 'Item'.

  wa_fldcat-ref_table = 'IT_DATA'.

  wa_fldcat-intlen = 10.

  wa_fldcat-outputlen = 10.

  append wa_fldcat to it_fldcat .


  clear wa_fldcat.

  wa_fldcat-col_pos = 3.

  wa_fldcat-fieldname = 'MATNR'.

  wa_fldcat-scrtext_l = 'Material'.

  wa_fldcat-ref_table = 'IT_DATA'.

  wa_fldcat-intlen = 40.

  wa_fldcat-outputlen = 40.

  append wa_fldcat to it_fldcat .


  clear wa_fldcat.

  wa_fldcat-col_pos = 4.

  wa_fldcat-fieldname = 'MAKTX'.

  wa_fldcat-scrtext_l = 'Material Description'.

  wa_fldcat-ref_table = 'IT_DATA'.

  wa_fldcat-intlen = 40.

  wa_fldcat-outputlen = 40.

  append wa_fldcat to it_fldcat .


  clear wa_fldcat.

  wa_fldcat-col_pos = 5.

  wa_fldcat-fieldname = 'WERKS'.

  wa_fldcat-scrtext_l = 'Plant'.

  wa_fldcat-ref_table = 'IT_DATA'.

  wa_fldcat-intlen = 10.

  wa_fldcat-outputlen = 10.

  append wa_fldcat to it_fldcat .


  clear wa_fldcat.

  wa_fldcat-col_pos = 6.

  wa_fldcat-fieldname = 'LGORT'.

  wa_fldcat-scrtext_l = 'Str. Loc'.

  wa_fldcat-ref_table = 'IT_DATA'.

  wa_fldcat-intlen = 10.

  wa_fldcat-outputlen = 10.

  append wa_fldcat to it_fldcat .


  clear wa_fldcat.

  wa_fldcat-col_pos = 7.

  wa_fldcat-fieldname = 'MENGE'.

  wa_fldcat-scrtext_l = 'Quantity'.

  wa_fldcat-ref_table = 'IT_DATA'.

  wa_fldcat-intlen = 15.

  wa_fldcat-outputlen = 15.

  append wa_fldcat to it_fldcat .


  clear wa_fldcat.

  wa_fldcat-col_pos = 8.

  wa_fldcat-fieldname = 'MEINS'.

  wa_fldcat-scrtext_l = 'Unit'.

  wa_fldcat-ref_table = 'IT_DATA'.

  wa_fldcat-intlen = 10.

  wa_fldcat-outputlen = 10.

  append wa_fldcat to it_fldcat .


  clear wa_fldcat.

  wa_fldcat-col_pos = 9.

  wa_fldcat-fieldname = 'NETPR'.

  wa_fldcat-scrtext_l = 'Net Price'.

  wa_fldcat-ref_table = 'IT_DATA'.

  wa_fldcat-intlen = 15.

  wa_fldcat-outputlen = 15.

  append wa_fldcat to it_fldcat .


  clear wa_fldcat.

  wa_fldcat-col_pos = 10.

  wa_fldcat-fieldname = 'WAERS'.

  wa_fldcat-scrtext_l = 'Currency'.

  wa_fldcat-ref_table = 'IT_DATA'.

  wa_fldcat-intlen = 10.

  wa_fldcat-outputlen = 10.

  append wa_fldcat to it_fldcat .


  clear wa_fldcat.

  wa_fldcat-col_pos = 11.

  wa_fldcat-fieldname = 'NAME1'.

  wa_fldcat-scrtext_l = 'Vendor'.

  wa_fldcat-ref_table = 'IT_DATA'.

  wa_fldcat-intlen = 30.

  wa_fldcat-outputlen = 30.

  append wa_fldcat to it_fldcat .


endform.


form build_alv_header .

* Type H is used to display headers i.e. big font

  clear wa_list_commentary.

  wa_list_commentary-typ  = 'H'.

  wa_list_commentary-info = 'Contoh Report PO'.

  append wa_list_commentary to it_list_commentary.


  clear wa_list_commentary.

  wa_list_commentary-typ = 'H'.

  wa_list_commentary-info = 'PT. PErusahaan SAYA'.

  append wa_list_commentary to it_list_commentary.


* Type S is used to display key and value pairs

  clear wa_list_commentary.

  wa_list_commentary-typ = 'S'.

  wa_list_commentary-key = 'Date :' .

  concatenate sy-datum+6(2) sy-datum+4(2) sy-datum(4) into wa_list_commentary-info separated by '/'.

  append wa_list_commentary to it_list_commentary.


* Type A is used to display italic font

  clear wa_list_commentary.

  wa_list_commentary-typ = 'A'.

  concatenate 'Refresh on' sy-uzeit+0(2) into wa_list_commentary-info separated by space.

  concatenate wa_list_commentary-info sy-uzeit+2(2) sy-uzeit+4(2) into wa_list_commentary-info separated by ':'.

  append wa_list_commentary to it_list_commentary.

endform.


form top_of_page.

  call function 'REUSE_ALV_COMMENTARY_WRITE'

    exporting

      it_list_commentary = it_list_commentary

      i_logo             = 'ENJOYSAP_LOGO'. "ENJOYSAP_LOGO

endform.


form display_alv.
  wa_layout-stylefname = 'FIELD_STYLE'.
  wa_layout-zebra      = 'X'.
  call function 'REUSE_ALV_GRID_DISPLAY_LVC'
    exporting
      i_callback_program     = sy-repid
*     i_callback_pf_status_set = 'SET_PF_STATUS'
      i_callback_top_of_page = 'TOP_OF_PAGE'
      is_layout_lvc          = wa_layout
      it_fieldcat_lvc        = it_fldcat[]
      i_save                 = 'X'
    tables
      t_outtab               = it_data
    exceptions
      program_error          = 1
      others                 = 2.
endform.

 
Jika dijalankan tampilan programnya seperti berikut :

tampilan diatas adalah untuk memasukkan paramter filter data yang akan di tampilkan, jika tidak ada yang diisi maka akan menampilkan semua data. Berikut tampilan ALV Grid nya :

Sekian Semoga Bermanfaat. :D

Wednesday, 6 September 2017

Membuat CRUD sederhana dengan Laravel



Pada postingan kali ini saya akan sharing cara membuat proses Create, Read, Update, Delete atau yang lebih dikenal dengan istilah CRUD :D.


Ok langsung saja :

Create new project
untuk nama project-nya saya buat dengan nama crud

composer create-project --prefer-dist laravel/laravel crud

Create database
setelah membuat project laravel, selanjutnya kita buat database dan table di mysql, untuk nama databasenya kita buat sama denga nama projectnya yaitu : crud. Setelah itu kita buat table dengan nama Books dan struktur tablenya seperti berikut :



sampai disini persiapan awal sudah selesai, selanjutnya buka folder project laravel yang sudah kita buat dan ikut step-step berikut :

Setting koneksi
untuk setting koneksi kita buka file .env dan kita rubah menjadi seperti berikut :
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=crud
DB_USERNAME=root
DB_PASSWORD=

Tambahkan bootstrap css
agar tampilan web yang akan kita buat lebih baik, kita tambahkan css bootstrap di project kita. jika belum punya boostrap bisa di download Disini. Setelah itu copy file bootstrap.css yang ada di folder css ke folder public/css yang ada di project kita.



Membuat View
dalam view ini kita bisa mengatur tampilan website yang akan kita buat, view ini terletak di folder resource/views, adapun view-view yang akan kita buat disini adalah :

1. View index
    view index ini berfungsi sebagai tampilan awal dari website kita, tambahkan kode berikut     di view index.blade.php
<!DOCTYPE html>
<html>
<head>
    <title>CRUD Laravel</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="{{asset('css/bootstrap.css')}}">
</head>
<body>
    <div class="container">
        <div class="panel panel-default">
            <div class="panel-heading">
                <h4>Tutorial CRUD Laravel</h4>
            </div>
            <div class="panel-body">
                <form action="{{url('create')}}" method="get">
                    <div class="form-group">
                        <input type="submit" name="new" id="new" value="Entry Baru" class="btn btn-success">
                    </div>
                </form>
                <table class="table table-striped">
                    <thead>
                        <tr>
                            <th>Kode Buku</th>
                            <th>Judul</th>
                            <th>Deskripsi</th>
                            <th>Action</th>
                        </tr>
                    </thead>

                    <tbody>
                        @foreach($data as $key => $d)
                        <tr>
                            <td>{{ $d->kode_buku }}</td>
                            <td>{{ $d->judul }}</td>
                            <td>{{ $d->deskripsi }}</td>
                            <td>
                                <a href="{{url('read',array($d->id))}}">Read</a>
                                <a href="{{url('delete',array($d->id))}}">Delete</a>
                                <a href="{{url('edit',array($d->id))}}">Edit</a>
                            </td>
                        </tr>
                        @endforeach
                    </tbody>
                </table>
            </div>
        </div>
    </div>
</body>
</html>

2. view create.blade.php

<!DOCTYPE html>
<html>
<head>
    <title>CRUD Laravel</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="{{asset('css/bootstrap.css')}}">
</head>
<body>
    <div class="container">
        <div class="panel panel-default">
            <div class="panel-heading">
                <h4>Tutorial CRUD Laravel</h4>
            </div>
            <div class="panel-body">
                <form action="{{url('insert')}}" method="post">
                    <div class="form-group">
                        <label for="kode">Kode Buku</label>
                        <input type="text" name="kode" id="kode" class="form-control" required="require">
                    </div>
                    <div class="form-group">
                        <label for="judul">Judul Buku</label>
                        <input type="text" name="judul" id="judul" class="form-control">
                    </div>                    
                    <div class="form-group">
                        <textarea id="deskripsi" name="deskripsi" class="form-control"></textarea>
                    </div>
                    <div class="form-group">
                        <input type="submit" name="send" id="send" value="Simpan" class="btn btn-success">{!!csrf_field()!!}                       
                    </div>
                </form>
            </div>
        </div>
    </div>
</body>
</html>


3. view edit.blade.php

<!DOCTYPE html>
<html>
<head>
    <title>CRUD Laravel</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="{{asset('css/bootstrap.css')}}">
</head>
<body>
    <div class="container">
        <div class="panel panel-default">
            <div class="panel-heading">
                <h4>Tutorial CRUD Laravel</h4>
            </div>
            <div class="panel-body">
                <form action="{{url('update', $data->id)}}" method="post">
                    <!-- <input type="hidden" name="id" id="id" value="{{$data->id}}"> -->
                    <div class="form-group">
                        <label for="kode">Kode Buku</label>
                        <input type="text" name="kode" id="kode" value="{{$data->kode_buku}}" class="form-control">
                    </div>
                    <div class="form-group">
                        <label for="judul">Judul Buku</label>
                        <input type="text" name="judul" id="judul" value="{{$data->judul}}" class="form-control">
                    </div>                    
                    <div class="form-group">
                        <textarea id="deskripsi" name="deskripsi" class="form-control">
                            {!!$data->deskripsi!!}
                        </textarea>
                    </div>
                    <div class="form-group">
                        <input type="submit" name="send" id="send" value="Simpan" class="btn btn-success">{!!csrf_field()!!}                       
                    </div>
                </form>
            </div>
        </div>
    </div>
</body>
</html>

4. view read.blade.php

<!DOCTYPE html>
<html>
<head>
    <title>CRUD Laravel</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="{{asset('css/bootstrap.css')}}">
</head>
<body>
    <div class="container">
        <div class="panel panel-default">
            <div class="panel-heading">
                <h4>Tutorial CRUD Laravel</h4>
            </div>
            <div class="panel-body">
                    <!-- <input type="hidden" name="id" id="id" value="{{$data->id}}"> -->
                    <div class="form-group">
                        <label for="kode">Kode Buku</label>
                        <input type="text" name="kode" id="kode" value="{{$data->kode_buku}}" class="form-control" readonly>
                    </div>
                    <div class="form-group">
                        <label for="judul">Judul Buku</label>
                        <input type="text" name="judul" id="judul" value="{{$data->judul}}" class="form-control" readonly>
                    </div>                    
                    <div class="form-group">    
                        <label for="desk">Deskripsi</label>    
                        <input type="text" name="desk" id="desk" value="{{$data->deskripsi}}" class="form-control" readonly>
                    </div>
                    <form action="{{url('back')}}" method="get">
                        <div class="form-group">
                            <input type="submit" value="Back" class="btn btn-success">
                        </div>
                    </form>
            </div>
        </div>
    </div>
</body>
</html>


Membuat Controller
controller ini berfungsi untuk menuliskan logic program (contohnya : query ke database)
untuk membuat controller kita jalan command line dan tuliskan command berikut :

php artisan make:controller BooksController
setelah itu dalam project kita akan terbentuk sebuah controller dengan nama BooksController yang trsimpan di folder app/Http/Controllers dan tambahkan kode berikut :

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use DB;
use App\Books;
class BooksController extends Controller
{
    public function index(){
     $data=Books::all();
        return view('index',compact('data'));
    }

    public function back(){
     return redirect ('/');
    }
    
    public function create(){
     return view('create');
    }

    public function insert(Request $request){
     $data=new Books();
        $data->kode_buku=$request->get('kode');
        $data->judul=$request->get('judul');
        $data->deskripsi=$request->get('deskripsi');
        $data->save();
     return redirect ('/');
    }

    public function delete($id){
     $data=Books::find($id);
        $data->delete();
        return back();
    }

    public function edit($id){
     $data=Books::find($id);
     return view('edit',compact('data'));
    }

    public function update(Request $request, $id){     
     $data = Books::findOrFail($id);
        $data->kode_buku=$request->get('kode');
        $data->judul=$request->get('judul');
        $data->deskripsi=$request->get('deskripsi');
        $data->save();
     return redirect ('/')->with('alert-success','Data berhasil Diubah.');
    }

    public function read($id){
     $data=Books::find($id);
     return view('read',compact('data'));
    }
}

Membuat model
untuk membuat model tuliskan command berikut di command line :
php artisan make:model Books
Tuliskan kode berikut di model Books
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Books extends Model
{
    protected $table="Books";
 protected $primaryKey="id";
 protected $fillable=['kode_buku','judul','deskripsi'];
}


Routing
routing ini berfungsi untuk menghubungkan controller dengan view, routing ini kita tambahkan didalam folder routes/web.php dan tambahkan kode berikut :

Route::get('/','BooksController@index');

Route::get('back','BooksController@back');

Route::get('create','BooksController@create');

Route::post('insert', 'BooksController@insert');

Route::get('delete/{id}','BooksController@delete');

Route::get('edit/{id}','BooksController@edit');

Route::post('update/{id}', 'BooksController@update');

Route::get('read/{id}','BooksController@read');


jika sudah selesai semua, coba jalankan programnya melalui web browser.

Berikut screen shot dari aplikasi ini :

index

Read




Edit



Sekian sharing kali ini, semoga bermanfaat.
keep sharing..... :D









Tuesday, 5 September 2017

Membuat Project Baru di Laravel


Setelah membahas mengenal laravel pada postingan Sebelumnya, pada postingan kali ini saya akan sharing cara membuat project baru di laravel. Sebelum membuat project baru pastikan sudah meng-install composer laravel jika belum bisa di download Disini. untuk IDE saya sarankan menggunakan Visual Studio Code. 

Sebelum membuat project laravel, Pastikan komputer/laptop terhubung internet.

Ok lansung saja kita mulai step-step membuat project baru di laravel :

Buka command line di folder tempat kita akan meletakkan file project kita dengan cara klik kanan + tombol shift kemudian tuliskan command berikut :
contoh disini saya akan membuat project seperti digambar berikut :



Setelah command line dijalankan, tuliskan command berikut :
composer create-project --prefer-dist laravel/laravel nama_project

nama project yang saya buat adalah Latihan1, setelah itu tekan enter dan tunggu proses instalasi laravel sampai selesai.




Setelah proses instalasi selesai maka akan tercreate satu folder baru dengan Latihan1 dan strukture foldernya seperti berikut :


Sampai disini kita sudah berhasil membuat project baru di laravel dan kita bisa langsung menjalankan project melalui web browser, untuk menjalankan projectnya kita buka command line didalam folder project Latihan1 kemudian tuliskan command berikut :

php artisan serve


Setelah itu jalankan : http://localhost:8000/ di browser maka akan muncul tampilan seperti berikut :


Ok, sekian sharing kali ini semoga bermanfaat.
:D

Mengenal Laravel




Laravel merupakan salah satu framework PHP yang banyak digunakan oleh para web developer untuk membangun sebuah sistem berbasis web. Laravel juga sudah menerapkan konsep MVC (model view controller).

MVC adalah sebuah pendekatan perangkat lunak yang memisahkan aplikasi logika dari presentasi. MVC memisahkan aplikasi berdasarkan komponen- komponen aplikasi, seperti : manipulasi data, controller, dan user interface.
  1. Model, Model mewakili struktur data. Biasanya model berisi fungsi-fungsi yang membantu seseorang dalam pengelolaan basis data seperti memasukkan data ke basis data, pembaruan data dan lain-lain.
  2. View, View adalah bagian yang mengatur tampilan ke pengguna. Bisa dikatakan berupa halaman web. 
  3. Controller, Controller merupakan bagian yang menjembatani model dan view.

Beberapa fitur yang terdapat di Laravel :
  1. Bundles, yaitu sebuah fitur dengan sistem pengemasan modular dan tersedia beragam di aplikasi.
  2. Eloquent ORM, merupakan penerapan PHP lanjutan menyediakan metode internal dari pola “active record” yang menagatasi masalah pada hubungan objek database.
  3. Application Logic, merupakan bagian dari aplikasi, menggunakan controller atau bagian Route.
  4. Reverse Routing, mendefinisikan relasi atau hubungan antara Link dan Route.
  5. Restful controllers, memisahkan logika dalam melayani HTTP GET and POST.
  6. Class Auto Loading, menyediakan loading otomatis untuk class PHP.
  7. View Composer, adalah kode unit logikal yang dapat dieksekusi ketika view sedang loading.
  8. IoC Container, memungkin obyek baru dihasilkan dengan pembalikan controller.
  9. Migration, menyediakan sistem kontrol untuk skema database.
  10. Unit Testing, banyak tes untuk mendeteksi dan mencegah regresi.
  11. Automatic Pagination, menyederhanakan tugas dari penerapan halaman.

Menurut tulisan akun “kursuswebdesign” di Kompasiana.com, ada beberapa kelebihan PHP Framework Laravel, antara lain:

Tampilan Sintak Lebih Artistic
Berbagai sintaks pada Laravel tersaji dengan sangat artistik, laravel memperhatikan dengan betul tampilan sintaks yang digunakan, sehingga bukan hanya terlihat lebih rapi juga lebih indah dipandang.

Blade Tamplating
Blade templating akan membantu developer dalam membuat template yang lebih terstruktur serta dinamis, yaitu dengan cara memotong struktur pada template agar lebih mudah dalam pengembangan.

Sintak Mudah Dipahami
Selama menggunakan Laravel maka akan dipastikan kita tidak akan merasa kesulitan ketika harus membaca sintaks. Mamahami sintaks pada beberapa framework yang biasanya akan terasa sulit tidak berlaku pada Laravel. Penggunaan bahasa untuk pengoperasiaannya tergolong mudah untuk dipahami dan juga singkat. Kondisi ini akan lebih memudahkan para programmer dalam menggunakan sintaks meski pada awalnya termasuk yang belum pernah menggunakannya.

Dilengkapi dengan Aplikasi Eloquent ORM
Aplikasi Eloquent ORM akan Aplikasi Eloquent ORM akan melakukan penyederhanaan proses query ke database, sehingga SQL query sama sekali tidak akan digunakan. Terdengar sangat praktis bukan? Hal ini berlaku ketika kita akan mengambil semua data pada tabel users.

Mempunyai Dokumentasi yang Lengkap.
Laravel merupakan salah satu Framework PHP yang dirancanng dengan dokumentasi yang sangat lengkap, sehingga membuatnya lebih mudah ketika digunakan.

Composer yang Sangat Lengkap
Programmer pastinya sudah tidak asing lagi dengan package manager bagi PHP yang satu ini. Laravel didukung dengan composer yang sangat support, penggunaannya pun sangat mudah untuk diaplikasikan. Composer ini akan secara otomatis menginstall library yang dibutuhkan tanpa harus mendownload library atau fitur baru bagi aplikasi yang sedang dibuat. Sehingga proses mengupdate aplikasi pun akan lebih mudah dilakukan.

Menggunakan Kosep Model View Controller (MVC)
Laravel merupakan framework yang menerapkan penggunaan konsep MVC pada struktur aplikasi yang akan dibangun. Penggunaan konsep MVC ini sangat diperlukan untuk menghasilkan kode program yang lebih bersih dan juga terstruktur tertutama bagi pengembangan aplikasi dengan skala yang besar. Hal ini sangat berguna ketika akan melakukan update.
Framework Laravel ini bisa dipelajari dengan bimbingan NF Computer  (NF Computer) dengan durasi training 28 jam. Model kelas ada 3 pilihan yaitu Public Training dengan minimal jumlah peserta 6 orang, Exclusive Training dengan peserta minimal 2 orang secara full day training selama 4 hari kerja (weekday), dan Inhouse Training dengan peserta maksimal 10 orang per group dari satu institusi atau perusahaan. Kelebihan inhouse training dibanding 2 model kelas yang lain adalah waktu dan lokasi pelaksanaan sesuai dengan kesepakatan. (YTN)

Link Terkait :
https://idcloudhost.com/pengertian-dan-keunggulan-framework-laravel/

http://www.kompasiana.com/kursuswebdesign/kelebihan-php-laravel_5667e266d87a61cf2268c692

ABAP CDS View Part 10 : Authorization & DCL untuk ABAP CDS

Authorization & DCL di ABAP CDS | Panduan Lengkap (PFCG, @AccessControl, DCL) Authorization & DCL untuk ABAP CDS — Pandua...