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, 4 September 2018

Mengenal Komponen SAPUI5/UI5 - Belajar SAPUI5/UI5 Part 4

Hallo...
Seperti yang sudah saya sampai pada postingan Sebelumnnya, pada postingan kali ini saya akan berbagi cara menggunakan komponen table pada sapui5. saya akan membuat contoh penggunaan table pada sapui5 dengan library sap.m.Table dan sap.ui.table.Table. 

Pertama kita buka project pada postingan Sebelumnya, jika sudah kita buat view baru dengan nama ui5_table atau apa terserah teman2 :D dan tambahkan html baru untuk menampilkan view ui5_table.view dengan ui5_table.html, setelah membuat view dan file html kita tambah satu folder baru didalam WebContent dengan nama json, didalam folder json tersebut kita tambah file baru bernama data.json, caranya klik kanan pada folder json dan masukkan nama file data.json lalu copy-kan json berikut :


{
"ProductCollection": [
{
"ProductId": "1239102",
"Name": "Power Projector 4713",
"Category": "Projector",
"SupplierName": "Titanium",
"WeightMeasure": 1467,
"WeightUnit": "kg",
"Price": 856.49,
"CurrencyCode": "EUR",
"Status": "Available",
"Quantity": 3,
"UoM": "PC"
},
{
"ProductId": "2212-121-828",
"Name": "Gladiator MX",
"Category": "Graphics Card",
"SupplierName": "Technocom",
"WeightMeasure": 321,
"WeightUnit": "pc",
"Price": 81.7,
"CurrencyCode": "USD",
"Status": "Discontinued",
"Quantity": 10,
"UoM": "PC"
},
{
"ProductId": "K47322.1",
"Name": "Hurricane GX",
"Category": "Graphics Card",
"SupplierName": "Red Point Stores",
"WeightMeasure": 588,
"WeightUnit": "pc",
"Price": 219,
"CurrencyCode": "EUR",
"Status": "Out of Stock",
"Quantity": 25,
"UoM": "PC"
},
{
"ProductId": "22134T",
"Name": "Webcam",
"Category": "Accessory",
"SupplierName": "Technocom",
"WeightMeasure": 700,
"WeightUnit": "g",
"Price": 59,
"CurrencyCode": "EUR",
"Status": "Available",
"Quantity": 22,
"UoM": "PC"
}
]
}

setelah itu save dan buka file ui5_table.view lalu tambah source code berikut :

1. Deklarasai sap.m.Table

var oTable = new sap.m.Table("idTable", {
headerToolbar : new sap.m.Toolbar({
content : new sap.m.Label({
text : "Products"
})
}),
columns : [
new sap.m.Column({
header : new sap.m.Label({
    text : "Product"
})
}),
    new sap.m.Column({
    header : new sap.m.Label({
    text : "Supplier"
    })
    }),
    new sap.m.Column({
    header : new sap.m.Label({
    text : "Status"
    })
    }),
    new sap.m.Column({
    header : new sap.m.Label({
    text : "Weight"
    })
    }),
    new sap.m.Column({
    header : new sap.m.Label({
    text : "Price"
    })
    })
]
})
//binding json data to table
oTable.bindItems("/ProductCollection", new sap.m.ColumnListItem({
        cells : [ 
        new sap.m.ObjectIdentifier({
        title : "{Name}",
        text : "{Category}"
        }),
        new sap.m.Text({
            text : "{SupplierName}"
        }),
        new sap.m.Text({
            text : "{Status}"
        }),
        new sap.m.ObjectNumber({
        number : "{WeightMeasure}",
unit : "{WeightUnit}"
        }),
        new sap.m.ObjectNumber({
        number : "{Price}",
unit : "{CurrencyCode}"
        })
        ]
    }))

2. Deklarasi sap.ui.Table
var oTableUI = new sap.ui.table.Table("uiTable",{
selectionMode : sap.ui.table.SelectionMode.Single,
navigationMode: sap.ui.table.NavigationMode.Scrollbar,
alternateRowColors:true,
enableColumnReordering:true,
enableCellFilter:true,
visibleRowCount:5
})
//add uitable columns
oTableUI.addColumn(new sap.ui.table.Column({
    label: new sap.ui.commons.Label({text: "Product"}),
    template: new sap.ui.commons.TextField().bindProperty("value", "Name") 
  }));

oTableUI.addColumn(new sap.ui.table.Column({
    label: new sap.ui.commons.Label({text: "Supplier"}),
    template: new sap.ui.commons.TextField().bindProperty("value", "SupplierName")
  }));

oTableUI.addColumn(new sap.ui.table.Column({
    label: new sap.ui.commons.Label({text: "Status"}),
    template: new sap.ui.commons.TextField().bindProperty("value", "Status")
  })); 
oTableUI.addColumn(new sap.ui.table.Column({
    label: new sap.ui.commons.Label({text: "Weight"}),
    template: new sap.ui.commons.TextField().bindProperty("value", "WeightMeasure")
  }));
oTableUI.addColumn(new sap.ui.table.Column({
    label: new sap.ui.commons.Label({text: "Unit"}),
    template: new sap.ui.commons.TextField().bindProperty("value", "WeightUnit")
  })); 
oTableUI.addColumn(new sap.ui.table.Column({
    label: new sap.ui.commons.Label({text: "Price"}),
    template: new sap.ui.commons.TextField().bindProperty("value", "Price")
  })); 
oTableUI.addColumn(new sap.ui.table.Column({
    label: new sap.ui.commons.Label({text: "Currency"}),
    template: new sap.ui.commons.TextField().bindProperty("value", "CurrencyCode")
  })); 
oTableUI.bindRows("/ProductCollection");


terakhir pada bagian berikut :

     return new sap.m.Page({
title: "UI5 Table",
content: [oTableUI,oTable
]
});


setelah itu kita buka file ui5_table.controller.js, lalu kita aktifkan function bawaan sapui5 yang bagian onInit dan masukkan source code berikut :

var oModel = new sap.ui.model.json.JSONModel();
oModel.loadData("json/data.json");
sap.ui.getCore().setModel(oModel);

source didalam onInit ini berfungsi untuk mengambil data json didalam folder json/data.json lalu ditampung didalam sebuah model yang bernama oModel


setelah itu kita coba jalankan dan lihat hasilnya, jika berhasil maka akan tampil seperti berikut :




sekian sharing kali ini semoga bermanfaat, Terimakasih :D.

Mengenal Komponen SAPUI5/UI5 - Belajar SAPUI5/UI5 Part 3

Halo...
Pada postingan kali ini saya akan melanjutkan postingan sayang sebelumnya mengenal komponen sapui5 part2, saya akan melanjutkan pembahasan tentang komponen sapui5 dan yang akan saya bahas pada postingan kali ini adalah Button, pada umumnya setiap aplikasi yang kita buat pasti akan membutuh yang namanya si Button ini heee :D

Ok, langsung saja kita buka project sebelumnya yang sudah kita buat pada postingan saya membuat project baru sapui5, setelah membuka projectnya kita tambahkan view baru dengan nama ui5_button, untuk menambah view baru caranya kita klik menu file atau klik kanan di folder belajar_ui5->new->Other



lalu pilih SAPUI5 Application Development->View



 Masukkan nama view "ui5_button" dan klik finish

Setelah membuat view akan langsung terbentuk dua file yaitu ui5_button.view.js dan ui5_button.controller.js untuk file html tidak ter-create otomatis seperti pada pertama kali kita membuat project, file html untuk menampilkan view ui5_button.view akan kita tambahkan secara manual, untuk memudahkan kita copy saja file index.html dengan nama ui5_button.html




untuk menambah html caranya klik kanan pada WebContent->html, berikut struktur project kita setelah menambah file html :


dan ganti file ui5_button.html menjadi seperti berikut :


Ok selanjutnya kita buka file ui5_button.view dan kita tambahkan komponen button, untuk button disini saya akan menggunakan sap.m.Button dan sap.ui.commons.Button :


untuk masing-masing button saya hanya menggunakan 2 properti saja yaitu text dan icon, untuk icon apa saja yang bisa kita gunakan bisa lihat DISNI tinggal kita copy nama iconnya terus dimasukkan di properti icon. pada bagian sap.m.Page saya menampilkan uiButton pada properti subHeader dan mButton pada content dan saya menambahkan properti footer. untuk melihat lebih details properti apa saja yang ada pada sap.m.Page bisa dilihat di https://sapui5.hana.ondemand.com/docs/api//symbols/sap.m.Page.html#constructor


ok sekarang kita coba jalankan dan kita lihat hasilnya :


kita sudah berhasil membuat button, dan sekarang kita akan menambahk event klik pada masing-masing button, untuk menambahkan event klik pada button kita harus menambahkan event press pada masing-masing button dan membuat function yang akan dijalankan pada event klik tersebut, untuk function kita taruh di dalam controller, ok kita buka file ui5_button.controller dan kita buat function dengan onKlik




secara default pada controller sudah tersedia 4 function, yaitu :
1. onInit : akan dijalankan ketika pertama kali halaman di load
2. onBeforeRendering : akan berjalan sebelum proses rendering halaman website
3. onAfterRendering    : akan berjalan setelah proses rendering halaman website
4. onExit : akan berjalan ketika kita keluar dari halaman

ok, kita coba refresh dan lihat hasilnya apakah event klik pada button sudah berjalan lancara, jika muncul alert Hallo berarti kita berhasil menambahkan even klik pada button




Ok cukup sekian sharing kali ini, untuk berikutnya saya akan sharing tentang table pada sapui5, ok sampai jumpa pada postingan selanjutnya, Terimakasih.... :D


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...