Aplikasi Data Transformation Services

Project Review

     Ada kebutuhan perusahaan untuk mentransfer data dari satu cabang ke cabang lainnya, cabang ke Head Office(HO), ataupun Head Office ke Cabang. nahh aplikasi ini merupakan salah satu alternatif untuk data transfer services tersebut dimana jika cabang membutuhkan update data maka cabang bisa langsung mendownload data dari cabang ataupun HO yang diinginkan. Sebenarnya hal ini bisa dicover melalui aplikasi task scheduler dimana aplikasi tersebut akan mendownload, upload atau transfer data dari cabang ke HO ataupun sebaliknya secara otomatis setiap 5 menit atau sesuai schedule secara otomatis., akan tetapi tentu memiliki effort yang lebih besar mengingat ada puluhan-ratusan cabang seluruh indonesia yang akan menjalankan aplikasi ini setiap menit sehingga aplikasi task schedulling tersebut hanya dijalankan di saat transaksi lainnya tidak dijalankan semisal jam 1 dini hari selain itu custom dan filter data melalui aplikasi ini akan lebih memudahkan user dalam mengelola data. Dan aplikasi data transformation services ini bisa dijalankan ketika user membutuhkan data dengan cara mendownload atau upload data, sehingga tidak mengganggu transaksi data lainnya mengingat beban kerja server.

   Adapun struktur dari aplikasi adalah seperti gambar dibawah berikut. dimana data user dan settingan user ada di server yaitu asp web application dan  application database. satu cabang(branch) bisa berhubungan dengan cabang lainnya ataupun HO dan begitu juga sebaliknya. Cara kerja dari aplikasi ini adalah dengan cara menfilter data melalui store procedure yang ada di server kemudian data yang telah didapat melalui datatable/dataset akan dimasukkan ke database yang dituju semisal database local yang ada di cabang dengan meneksekusi sp_insert yang telah disediakan di database local/cabang.
ASP WEB APPLICATION dts
Struktur Aplikasi

How To Use  
Berikut merupakan tampilan Home dari aplikasi ini. standar lah yya.. :)

home page asp membership

Berikut akan dijelaskan langkah – langkah pemakaian aplikasi ini lengkap dengan snapshot gambar dan codenya.

1. Log In
    
    Aplikasi ini sudah terlebih dahulu disetting user admin melalui ASP.Net Configuration Members. sehingga untuk login diawal untuk admin yang ingin mendaftarkan member lainnya bisa login seperti gambar berikut.

log in asp membership


2. Post Login

    Setelah login admin bisa melihat menu seperti gambar di bawah, di pojok kanan ada welcome message dan kode business unit (BU) yang belum di set. Menu bar sendiri ada set BU, Data Transfer (Download, Upload, Failed Download, Failed Upload), Setup( Users, Register, Business Unit, dan Menu ) dan Change Password. untuk langkah awal admin bisa mendaftarkan user member di sub menu register.

ihsan saidi application

3. Register Member

     Jika admin mengklik sub menu register maka akan tampil layar seperti gambar berikut :

aplikasi ihsan saidi

   Disini admin bisa mendaftarkan user baru dengan mengisi textbox user id, user name, email, password, confirm password dan hak akses apakah dia sebagai admin HO, Branch atau pun None. klik tombol insert untuk memasukkan data, dan apabila ingin mengupdate atau delete user bisa memilih(select) user yang ingin diupdate atau delete datanya. apa perbedaan antara hak akses HO, branch dan None? jika admin memilih radio button Head Office maka user tersebut memiliki akses menu [setup]., jika memilih Radio button Branch, maka user tersebut bisa melihat menu [admin cabang] sedangkan None adalah user biasa tanpa bisa mengakses menu yang bisa diakses oleh HO dan Branch. apa saja fitur dari menu tersebut akan dijelaskan di langkah berikutnya. berikut adalah contoh pengisian inserting data dan code snapshot.

asp.net membership

Code Insert :
protected void CreateAccountButton_Click(object sender, EventArgs e)
        {

            SqlConnection con = new SqlConnection(GetConnectionString());
            string pwd = Password.Text;
            string pwd2 = Password2.Text;

            if (pwd == pwd2)
            {


                try
                {
                    MembershipUser newUser = Membership.CreateUser(Username.Text, Password.Text);
                    string newUID = Membership.GetUser(Username.Text).ProviderUserKey.ToString();
                    SqlCommand cmd = new SqlCommand("spUpdateCreatedUser", con);
                    cmd.Parameters.AddWithValue("@PisAdmin", RadioButton1.Checked ? 1 : 0);
                    cmd.Parameters.AddWithValue("@Pcabang", RadioButton2.Checked ? 1 : 0);
                    cmd.Parameters.AddWithValue("@Pusername2", txtUsername2.Text);
                    cmd.Parameters.AddWithValue("@Pemail", txtEmail.Text);
                    cmd.Parameters.Add("@pnewuid", SqlDbType.UniqueIdentifier).Value = new Guid(newUID);
                    cmd.CommandType = CommandType.StoredProcedure;
                    try
                    {
                        con.Open();
                        cmd.ExecuteNonQuery();
                        //ho
                        if (RadioButton1.Checked == true)
                        {
                            SqlCommand cmdcreatemenu = new SqlCommand("update dts_menu set muser=1,mregister=1,mmenu=1,mbusinessunit=1 where userid='" + newUID + "'", con);
                            cmdcreatemenu.CommandType = CommandType.Text;
                            cmdcreatemenu.ExecuteNonQuery();
                        }
                        //cabang
                        if (RadioButton2.Checked == true) 
                        {
                            SqlCommand cmdcreatemenu = new SqlCommand("update dts_menu set musercabang=1,mregistercabang=1,mmenucabang=1 where userid='"+newUID+"'", con);
                            cmdcreatemenu.ExecuteNonQuery();
                        }
                        con.Close();
                        this.Populate(); clear();
                        lblsuccess.Text = " Your account has been successfully created.";
                        lblerror.Text = "";
                    }
                    catch (Exception ex1)
                    {

                        lblerror.Text = ex1.Message;
                    }
                       
                }
                catch (Exception ex1) { lblerror.Text = ex1.Message; }
            }
            else
            {
                lblerror.Text = "password does not match";
            }

        }

4. Create Business Unit

     Untuk membuat Business Unit, admin/user bisa mengakses sub menu [Business Unit]. Kegunaan BU ini adalah untuk mengalokasikan data user, Internet Protokol, dst yang akan saling berhubungan nantinya. misalnya Cabang1 ingin mendownload/upload data dari/ke Cabang2 maka kita akan membuat sebuah BU dimana detail dari BU tersebut terdapat beberapa field yang dibutuhkan untuk menghubungkan data dari satu cabang ke cabang/HO tertentu seperti IP- Address, password, username, nama database dst. nahh di halaman ini kita akan membuat suatu penghubung antara cabang ke cabang, ke HO atau sebaliknya sehingga nantinya user tinggal memilih data dari cabang mana yang hendak ia download.Berikut adalah gambar  page yang dimaksud :

dts application

     Untuk menambahkan data, user bisa langsung menginput data melalui textbox kemudia klik tombol [save] untuk menyimpan. Sedangkan untuk edit dan delete data business unit user bisa langsung mengedit/delete melalui datagrid view yang ada di halaman business unit tersebut.


5. Users

      Menu [Users] yang terdapat di submenu [Setup] berfungsi untuk menentukan user boleh memakai BU mana saja., tentunya setelah admin sudah meregister user dan register BU seperti yang sudah dijelaskan pada point sebelumnya.

hak akses user

      Untuk memberi hak akses BU kepada user tertentu, maka admin bisa mencentang checklist BU mana saja yang akan diberi akses kemudian [save] untuk menyimpan. untuk menghapus hak akses admin bisa menchecklist data BU dan  klik tombol [delete]. status akses itu bisa dilihat di gridview, jika status 0 maka dia tak memiliki hak akses dan jika status nya adalah 1 maka ia memiliki hak akses terhadap BU tersebut. berikut gambar dan code behind nya.

hak akses user

Code Delete :


protected void btndelete_Click(object sender, EventArgs e)
        {
            SqlConnection con = new SqlConnection(GetConnectionString());
            foreach (GridViewRow row in GvConfig.Rows)
            {
                CheckBox chk = (CheckBox)row.FindControl("chkSelect");

                if (chk.Checked)
                {

                    try
                    {
                        SqlCommand SqlComm = new SqlCommand("[DeleteUserConfig]", con);
                        SqlComm.CommandType = CommandType.StoredProcedure;
                        SqlComm.Parameters.Add("@kd_bu", SqlDbType.VarChar).Value = row.Cells[1].Text;
                        SqlComm.Parameters.Add("@user_id", SqlDbType.UniqueIdentifier).Value = new Guid(txtuserid.Text);

                        con.Open();
                        SqlComm.ExecuteNonQuery();
                        GetData();
                        lblerror.Text = "";
                    }
                    catch (Exception ex2)
                    {
                        lblerror.Text = ex2.Message;
                    }
                    finally { con.Close(); }

                }
            }
        }

6. Menu 
 
    Di Menu Setup terdapat submenu [Menu]. Halaman ini berfungsi untuk memberikan hak akses yang lebih spesifik. Misalnya seorang user hanya boleh mengakses menu [Set BU] saja., menu ini sendiri seperti Site Map di sebuah website, jika ingin memberi halaman yang lebih spesifik seperti itu maka admin bisa menyetting hak akses halaman web tertentu tersebut di halaman [Menu]. Checklist halaman web yang akan diberi hak akses kemudian klik tombol [Save]. Berikut adalah tampilan menu dan snapshot code loaded data di gridview.

customize menu site map

Code LoadGridView :
private void LoadGridView()
        {
            SqlConnection con = new SqlConnection(GetConnectionString());
            using (SqlCommand cmd = new SqlCommand("SELECT am.UserName2 [UserName],us.username [nik] from dts_menu dm inner JOIN aspnet_Membership am on am.UserId=dm.UserId INNER JOIN aspnet_Users us ON us.UserId=am.UserId", con))
            {
                DataTable tablemenu1 = new DataTable();
                tablemenu1.Columns.Add("NIK");
                tablemenu1.Columns.Add("UserName");

                using (SqlDataAdapter da = new SqlDataAdapter(cmd))
                {

                    try
                    {
                        con.Open();
                        da.Fill(tablemenu1);
                        GridView1.DataSource = tablemenu1;
                        GridView1.DataBind();
                        con.Close();
                    }
                    catch (Exception ex1)
                    {

                        lblerror.Text = ex1.Message;
                    }

                }
            }
        }

7. Admin Cabang

    Menu [Admin Cabang] adalah akses yang diberikan kepada admin cabang seluruh indonesia. fungsinya, jika ada user/member baru ingin didaftarkan dan ia merupakan bagian dari anak cabang maka admin cabang bisa menambahkannya tanpa harus menghubungi user admin HO. tentunya admin cabang memiliki hak akses yang lebih sedikit dibanding admin HO. Berikut adalah 3 perbedaan antara admin HO dengan Admin Cabang. 1. Admin cabang hanya bisa mereview user yang telah ia buat “anak cabang” dan admin cabang hanya bisa mereview user yang memakai BU yang sama dengan admin cabang, contoh: jika cabang01 memiliki anak cabang dimana anak cabang ini bisa mengakses BU dengan kode BU001. kemudian cabang02 juga diberi akses kode BU001 oleh admin HO. maka cabang02 bisa mereview anak cabang01. 2. Admin Cabang tidak bisa memberi hak akses admin kepada user baru. user yang dibikin oleh admin cabang otomatis akan menjadi anak dari cabang tersebut. 3. Admin cabang tidak bisa membuat Business Unit.Berikut tampilan Menu Bar dari Admin Cabang :

admin cabang

7 point tersebut merupakan settingan awal dari aplikasi ini. sedangkan [Set BU] dan [Data Transfer](Download, Upload, Failed Download dan Failed Upload) adalah menu utama yang nantinya akan lebih sering digunakan dari Aplikasi Data Transformation Services ini.

8. Set BU

      Menu [Set BU] diperlukan oleh user untuk menentukan BU mana yang akan dipakai lengkap dengan status sedang Offline atau Online. Sehingga user bisa mendownload atau mengupload data ke BU yang telah dipilih. Rincian tentang Business Unit sendiri bisa dibaca di point ke-4.
Berikut adalah tampilan halaman [Set BU] dan code selected row :

set business unit


Code Selected Row :

protected void gvUser_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (GridView1.SelectedIndex >= 0)
            {
                int index = GridView1.SelectedIndex;
                Session["kd_bu"] = GridView1.Rows[index].Cells[1].Text;
                Session["nm_bu"] = GridView1.Rows[index].Cells[2].Text;
                Session["db_pusat"] = GridView1.Rows[index].Cells[3].Text;
                Session["ip_local"] = GridView1.Rows[index].Cells[4].Text;
                Session["db_local"] = GridView1.Rows[index].Cells[5].Text;
                Session["usr_local"] = GridView1.Rows[index].Cells[6].Text;
                Session["pwd_local"] = GridView1.Rows[index].Cells[7].Text;
            }


            DataSet dsDTS = new DataSet();
            SqlDataAdapter daDTS;
            SqlConnection con = new SqlConnection(GetConnectionString());
            con.Open();
            daDTS = new SqlDataAdapter("select ip_pusat, usr_pusat,pwd_pusat from dts_bu  where kd_bu='" + Session["kd_bu"] + "'", con);
            daDTS.Fill(dsDTS, "dts");
            DataTable table = new DataTable();
            table.Columns.Add("ip_pusat");
            table.Columns.Add("usr_pusat");
            table.Columns.Add("pwd_pusat");

            if (dsDTS.Tables["dts"].Rows.Count > 0)
            {
                DataRow dr = dsDTS.Tables["dts"].Rows[0];
                Session["ip_pusat"] = dr["ip_pusat"].ToString();
                Session["usr_pusat"] = dr["usr_pusat"].ToString();
                Session["pwd_pusat"] = dr["pwd_pusat"].ToString();
            }
            Response.Redirect(Request.RawUrl);
        }


9. Download

    [Download] adalah menu user untuk mendownload data dari BU yang telah dipilih sebelumnya di halaman [Set BU]. User bisa memfilter data pada tanggal-tanggal tertentu seperti gambar berikut. setelah memilih tanggal user bisa langsung mengklik tombol download.


image

     Dibawah sub menu [download] terdapat sub menu [failed download]. Apa perbedaan menu download dengan menu failded download? perbedaan nya adalah ketika user mendownload data dari server kemudian ada kendala download data semisal karena jaringan terputus dengan pusat, sebenarnya data dipusat tetap akan tetap diproses karena kemungkinan kegagalan proses data di server akan kecil kemungkinan terjadi karena jaringan di server/pusat pasti akan lebih baik dibanding di wilayah/daerah. nahh jika terjadi kegagalan seperti itu maka user bisa mendownload kembali data tersebut di halaman [failed download]. data log, error juga akan tersimpan di failed download sebelum di perbaiki data errornya semisal store procedure di cabang tidak up to date.

Code Download :

protected void Downloadbtn_Click(object sender, EventArgs e)
        {
            SqlConnection con = new SqlConnection(GetConnectionString());
            if (Session["kd_bu"] != null)
            {
                Pkd_bu = Session["kd_bu"].ToString();
                Pnm_bu = Session["nm_bu"].ToString();
                Pip_pusat = Session["ip_pusat"].ToString();
                Pdb_pusat = Session["db_pusat"].ToString();
                Pusr_pusat = Session["usr_pusat"].ToString();
                Ppwd_pusat = Session["pwd_pusat"].ToString();
                Pip_local = Session["ip_local"].ToString();
                Pdb_local = Session["db_local"].ToString();
                Pusr_local = Session["usr_local"].ToString();
                Ppwd_local = Session["pwd_local"].ToString();
               


                ///get data pusat and fill into dataset/server 
                DataSet ds = new DataSet();
                SqlDataAdapter daserver = new SqlDataAdapter();
                SqlConnection cn = new SqlConnection();
                SqlDataAdapter da = new SqlDataAdapter();
                cn.ConnectionString = "Data Source=" + Pip_pusat + ";Initial Catalog=" + Pdb_pusat + ";User Id=" + Pusr_pusat + ";Password=" + Ppwd_pusat + "";
                try { cn.Open(); }
                catch (Exception eg) 
                { Label1.Text = "please check business unit data source = "+Pip_pusat+", user id and password. "+eg.Message; }

                da.MissingSchemaAction = MissingSchemaAction.AddWithKey;
                string paramtgl = TextBox1.Text;
                da.SelectCommand = new SqlCommand("spKamar", cn);
                da.SelectCommand.CommandType = CommandType.StoredProcedure;
                da.SelectCommand.Parameters.Add("@tgl", SqlDbType.DateTime, 10).Value = paramtgl;

                try
                {
                    da.Fill(ds, "dts_download");
                }
                catch (Exception exconvert) { Label1.Text = exconvert.Message; }

                ///save to dts_download/temp server
                DataTable tabledownload = new DataTable();
                tabledownload.Columns.Add("kd_bu");
                tabledownload.Columns.Add("userid");
                tabledownload.Columns.Add("username");
                tabledownload.Columns.Add("data");
                tabledownload.Columns.Add("status");
                tabledownload.Columns.Add("current_date");
                tabledownload.Columns.Add("tgl_proses");

                if (ds.Tables["dts_download"] != null)
                {

                    if (ds.Tables["dts_download"].Rows.Count > 0)
                    {

                        foreach (DataTable tab in ds.Tables)
                        {

                            foreach (DataRow row in tab.Rows)
                            {
                                daserver.MissingSchemaAction = MissingSchemaAction.AddWithKey;
                                daserver.InsertCommand = new SqlCommand("[spDaServer]", con);
                                daserver.InsertCommand.CommandType = CommandType.StoredProcedure;

                                DataRow dr = tabledownload.NewRow();
                                dr["kd_bu"] = Pkd_bu;
                                dr["userid"] = UserID;
                                dr["username"] = PUsername;
                                dr["data"] = row["data"].ToString();//insert is here
                                dr["status"] = 0;
                                dr["current_date"] = DateTime.Today;
                                dr["tgl_proses"] = paramtgl;
                                tabledownload.Rows.Add(dr);

                                daserver.InsertCommand.Parameters.Add("@kd_bu", SqlDbType.VarChar, 20).Value = Pkd_bu;
                                daserver.InsertCommand.Parameters.Add("@user_id", SqlDbType.UniqueIdentifier, 50).Value = new Guid(UserID);
                                daserver.InsertCommand.Parameters.Add("@username", SqlDbType.VarChar, 20).Value = PUsername;
                                daserver.InsertCommand.Parameters.Add("@data", SqlDbType.VarChar, 5000).Value = row["data"].ToString();
                                daserver.InsertCommand.Parameters.Add("@status", SqlDbType.Int, 10).Value = 0;
                                daserver.InsertCommand.Parameters.Add("@currentdate", SqlDbType.DateTime).Value = DateTime.Today;
                                daserver.InsertCommand.Parameters.Add("@tgl_proses", SqlDbType.DateTime).Value = paramtgl;


                                try
                                {
                                    con.Open();
                                    daserver.InsertCommand.ExecuteNonQuery();
                                }
                                catch (Exception exex)
                                {
                                    Label1.Text = exex.Message;
                                }
                                finally
                                {
                                    con.Close();
                                }

                            }
                        }
                    }
                }
                
                ///exec into local 
                SqlDataAdapter daexac = new SqlDataAdapter();
                DataSet dsexac = new DataSet();
                daexac.MissingSchemaAction = MissingSchemaAction.AddWithKey;
                daexac.SelectCommand = new SqlCommand("[uspDownload]", con);
                daexac.SelectCommand.CommandType = CommandType.StoredProcedure;
                daexac.SelectCommand.Parameters.Add("@kd_bu", SqlDbType.VarChar, 20).Value = Pkd_bu;
                daexac.SelectCommand.Parameters.Add("@tgl", SqlDbType.DateTime, 10).Value = DateTime.Today;
                daexac.SelectCommand.Parameters.Add("@puserid", SqlDbType.UniqueIdentifier).Value = new Guid(UserID);
                
                try
                {
                    daexac.Fill(dsexac, "dts_exacdownloaded");
                }
                catch (Exception exconvert) { Label1.Text = exconvert.Message; }

                DataTable tabledownload2 = new DataTable();
                tabledownload2.Columns.Add("sysid");
                tabledownload2.Columns.Add("data");


                if (dsexac.Tables["dts_exacdownloaded"] != null)
                {

                    if (dsexac.Tables["dts_exacdownloaded"].Rows.Count > 0)
                    {
                        foreach (DataTable table in dsexac.Tables)
                        {
                            SqlConnection cn2 = new SqlConnection();
                            cn2.ConnectionString = "Data Source=" + Pip_local + ";Initial Catalog=" + Pdb_local + ";User Id=" + Pusr_local + ";Password=" + Ppwd_local + " ";
                            try
                            {
                                foreach (DataRow row in table.Rows)
                                {
                                    var sysid = row["sysid"].ToString();
                                    var execquery = row["data"].ToString();
                                    da.InsertCommand = new SqlCommand("" + execquery + "", cn2);
                                    try
                                    {
                                        cn2.Open();
                                        da.InsertCommand.ExecuteNonQuery();

                                        DataRow dr = tabledownload2.NewRow();
                                        dr["sysid"] = row["sysid"].ToString();
                                        dr["data"] = row["data"].ToString();
                                        tabledownload2.Rows.Add(dr);

                                        //update flag
                                        con.Open();
                                        SqlCommand cmdupdatef = new SqlCommand("UPDATE dts_download SET status=1 WHERE sysId=" + sysid + "", con);
                                        cmdupdatef.ExecuteNonQuery();
                                        //delete server that has exec
                                        SqlCommand cmddelf = new SqlCommand("DELETE FROM dts_download WHERE status=1", con);
                                        cmddelf.ExecuteNonQuery();
                                        con.Close();
                                    }
                                    catch (Exception exn)
                                    {
                                        Label2.Text = "Message: some query error to exec, " + exn.Message;
                                    }
                                    finally
                                    {
                                        cn2.Close();
                                    }
                                }
                            }
                            catch (Exception opc)
                            {
                                Label1.Text = opc.Message;
                            }

                        }

                        DataSet ds2 = new DataSet("dts_download2");
                        ds2.Tables.Add(tabledownload2);
                        int n1 = ds.Tables["dts_download"].Rows.Count;
                        int n2 = ds2.Tables[0].Rows.Count;
                        Label1.Text = (n2.ToString() + " Data succesfully transfer of " + n1 + " data(s)");
                        GridView1.DataSource = ds2;
                        GridView1.DataBind();


                    }
                    else
                    {
                        Label1.Text = "No Data update";
                        GridView1.DataSource = null;
                        GridView1.DataBind();

                    }

                   
                }

                //update log
                con.Open();
                SqlCommand cmdlog = new SqlCommand("INSERT INTO dts_log VALUES ('" + Pkd_bu + "','" + UserID + "','" + "Error Download" + "',getdate())", con);
                cmdlog.ExecuteNonQuery();
                con.Close();
            }
            else
            {
                Label1.Text = "Please set kode business unit";
            }
        }

10. Upload

    Menu [Upload] diperlukan untuk user yang ingin mengUpload data dari local db dia ke database pusat/target. akan ada informasi data yang berhasil diupload. jika ada data yang tak berhasil diupload maka user bisa melihat kembali data tersebut di halaman [failed upload], setelah memperbaiki maka user dapat mengupload kembali data tersebut. juga akan ada informasi berapa data yang berhasil di eksekusi dan data yang gagal dieksekusi seperti gambar berikut :

dts failedupload

Code Failed Upload :

protected void btnfailedupload_Click(object sender, EventArgs e)
        {
            SqlConnection con = new SqlConnection(GetConnectionString());

            if (Session["kd_bu"] != null)
            {
                Pkd_bu = Session["kd_bu"].ToString();
                Pnm_bu = Session["nm_bu"].ToString();
                Pip_pusat = Session["ip_pusat"].ToString();
                Pdb_pusat = Session["db_pusat"].ToString();
                Pusr_pusat = Session["usr_pusat"].ToString();
                Ppwd_pusat = Session["pwd_pusat"].ToString();
                Pip_local = Session["ip_local"].ToString();
                Pdb_local = Session["db_local"].ToString();
                Pusr_local = Session["usr_local"].ToString();
                Ppwd_local = Session["pwd_local"].ToString();
                //Plast_update = Session["last_update"].ToString();

                //get local data and fill into dataset
                DataSet ds = new DataSet();
                SqlConnection cn = new SqlConnection();
                SqlDataAdapter daupload = new SqlDataAdapter();
                SqlDataAdapter da = new SqlDataAdapter();
                ///cn.ConnectionString = "Data Source=" + Pip_local + ";Initial Catalog=" + Pdb_local + ";User Id=" + Pusr_local + ";Password=" + Ppwd_local + " ";
                try { con.Open(); }
                catch (Exception eg) { Label1.Text = "please check business unit data source = " + Pip_local + ", user id and password. " + eg.Message; }
                

                da.MissingSchemaAction = MissingSchemaAction.AddWithKey;
                string paramtgl = txtuploadfail.Text;
                da.SelectCommand = new SqlCommand("[uspUpload]", con);
                da.SelectCommand.CommandType = CommandType.StoredProcedure;
                da.SelectCommand.Parameters.Add("@kd_bu", SqlDbType.VarChar, 20).Value = Pkd_bu;
                da.SelectCommand.Parameters.Add("@tgl", SqlDbType.VarChar, 10).Value = paramtgl;
                da.SelectCommand.Parameters.Add("@puserid", SqlDbType.UniqueIdentifier).Value = new Guid(UserID);

                try
                {
                    da.Fill(ds, "dts_uploadfail");
                }
                catch (Exception exconvert) { Label1.Text = exconvert.Message; }
                finally { con.Close(); }

                DataTable tableuploadfail = new DataTable();
                tableuploadfail.Columns.Add("sysid");
                tableuploadfail.Columns.Add("data");

                ///exec into pusat 
                if (ds.Tables["dts_uploadfail"] != null)
                {

                    if (ds.Tables["dts_uploadfail"].Rows.Count > 0)
                    {
                        foreach (DataTable table in ds.Tables)
                        {
                            SqlConnection cn2 = new SqlConnection();
                            cn2.ConnectionString = "Data Source=" + Pip_pusat + ";Initial Catalog=" + Pdb_pusat + ";User Id=" + Pusr_pusat + ";Password=" + Ppwd_pusat + " ";
                            try
                            {
                                foreach (DataRow row in table.Rows)
                                {
                                    var sysid = row["sysid"].ToString();
                                    var execquery = row["data"].ToString();
                                    da.InsertCommand = new SqlCommand("" + execquery + "", cn2);
                                    try
                                    {
                                        cn2.Open();
                                        da.InsertCommand.ExecuteNonQuery();


                                        DataRow dr = tableuploadfail.NewRow();
                                        dr["sysid"] = row["sysid"].ToString();
                                        dr["data"] = row["data"].ToString();
                                        tableuploadfail.Rows.Add(dr);

                                        //update flag
                                        con.Open();
                                        SqlCommand cmdupdatef = new SqlCommand("UPDATE dts_upload SET status=1 WHERE sysId=" + sysid + "", con);
                                        cmdupdatef.ExecuteNonQuery();
                                        SqlCommand cmddelf = new SqlCommand("DELETE FROM dts_upload WHERE status=1", con);
                                        cmddelf.ExecuteNonQuery();
                                        con.Close();
                                    }
                                    catch (Exception exn)
                                    {
                                        Label2.Text = "Message : some query error to exec, " + exn.Message;
                                    }
                                    finally
                                    {
                                        cn2.Close();
                                    }

                                }
                              


                            }
                            catch (Exception opc)
                            {
                                Label1.Text = opc.Message;
                            }

                        }

                        DataSet ds2 = new DataSet();
                        ds2.Tables.Add(tableuploadfail);
                        int n2 = ds2.Tables[0].Rows.Count;
                        int n1 = ds.Tables["dts_uploadfail"].Rows.Count;
                        Label1.Text = (n2.ToString() + " Data succesfully transfer of " + n1 + " data(s)");
                        GridView1.DataSource = ds2;
                        GridView1.DataBind();


                    }
                    else
                    {
                        Label1.Text = "No Data update";
                        GridView1.DataSource = null;
                        GridView1.DataBind();
                    }
                }
                //update log
                con.Open();
                SqlCommand cmdlog = new SqlCommand("INSERT INTO dts_log VALUES ('" + Pkd_bu + "','" + UserID + "','" + "Error Failed Upload" + "',getdate())", con);
                cmdlog.ExecuteNonQuery();
                con.Close();
            }
            else
            {
                Label1.Text = "Please set kode business unit";
            }

        }

11. Change Password

   Menu [Change Password] bisa diakses semua user setelah login, disini user harus melakukan verifikasi old password kemudian memasukkan password baru.

change password  


12. Struktur Database

Berikut gambaran Struktur Database secara garis besar :

strukture database


Summary

   Secara keseluruhan pengerjaan project ini tidak memakan waktu terlalu lama, kurang dari sebulan akan tetapi kedepan tentu akan ada perubahan atau penambahan2 fitur yang dibutuhkan untuk lebih mempermudah user dalam mengelola data semisal pengelolaan data log dsb. Semoga Aplikasi dan dokumentasi ini bermanfaat buat perusahaan sosro :) dan teman2 juga bisa mereview project ini beserta code behind yang ada. Hubungi Contact jika membutuhkan informasi lebih lanjut. Wassalam..

0 comments:

Post a Comment