sonny210183

See also: Other Geeks@INDC
Kirim Email Attachment dengan file dari bytes

Mengirim file attachment yg berasal dari lokasi file fisik mungkin sudah biasa. Virtual Path ada yg diberi hak akses agar tidak menulis file langsung ke fisik, melainkan file tersebut disimpan dalam database. Pada SQL Server terdapat tipe data yg disebut image, di .NET dikenal sebagai tipe data byte[].

Dari kontrol FileUpload, data dalam bentuk bytes dapat langsung diperoleh dengan properti .FileBytes.


        byte[] datafile = FileUpload1.FileBytes;
        SaveToDB(FileUpload1.FileName, FileUpload1.FileBytes); //method ini dibuat sendiri sesuai dataaccess yg dipakai masing2


Lalu serangkaian kode ini akan mengirimkan email berupa attachment yg berupa bytes[]. Anggap saja konten tsb merupakan file Ms Word (.doc).

            String namapengirim = System.Configuration.ConfigurationSettings.AppSettings.Get("PengirimEmail");
            String smtpserver = System.Configuration.ConfigurationSettings.AppSettings.Get("SMTPServer");
            String alamatpengirim = System.Configuration.ConfigurationSettings.AppSettings.Get("AlamatPengirimEmail");
            int smtpport = Convert.ToInt32(System.Configuration.ConfigurationSettings.AppSettings.Get("SMTPPort"));

            String alamatpengirim = "admin@domain.com";
            String namapengirim = "admin";       
            String alamatpenerima = "sonny@domain.com";
            String namapenerima = "Sonny";
            MailAddress SendFrom = new MailAddress(alamatpengirim, namapengirim);
            MailAddress SendTo = new MailAddress(alamatpenerima, namapenerima);
            byte[] datafile = GetDataFileFromDB(); //method ini dibuat sendiri untuk ambil data dari database yg bertipe bytes[]
        String filename = "namafile.doc";
            MailMessage MyMessage = new MailMessage(SendFrom, SendTo);
            try
            {
                MyMessage.Subject = "subjek";
                MyMessage.Body = "isi attachment";
                MemoryStream ms = new MemoryStream(datafile);
                MyMessage.Attachments.Add(new Attachment(ms, filename)); //pada add attachment terdapat parameter berupa Stream
                SmtpClient emailClient = new SmtpClient(smtpserver, smtpport);

                emailClient.Send(MyMessage);
                lblWarn.Text = "Email has been sent!";
            }
            catch (Exception ex)
            {
                lblWarn.Text = ex.Message;
            }
 

Share this post: | | | |
Kasih alamat kyknya kurang cukup tanpa koordinat (longitude,latitude)

 Coba deh buka http://maps.google.com

Langkah 1: search apaan gitu terserah, misalnya jalan dipatiukur. nah ada hasil pencariannya, bahwa "jalan dipatiukur" yg mana yg dimaksud, dan ternyata dekat indonesia. Peta di gampar tsb diarahin ke negara lain.
http://img231.imageshack.us/img231/2750/langkah1gmaps.jpg

Langkah 2:
Setelah ketemu nih maka akan langsung disorot ke indonesia donk.Di sebelah kiri ada pilihan, dipatiukur yg mana yg dimaksud sbnrnya. Misalnya pilih terminal damri, nah klik aja disitu.
http://img513.imageshack.us/img513/4825/langkah2gmaps.jpg

Langkah 3:
Nah coba dizoom deh, klik tanda plus biar lebih jelas lagi
http://img204.imageshack.us/img204/6431/langkah3gmaps.jpg

Langkah 4:
Setelah dizoom dan makin jelas, klik kanan deh salah satu titik, pilih "What's here?/Ada apa di sini?"
http://img513.imageshack.us/img513/3174/langkah4gmaps.jpg

Langkah 5:
Lambang tanda panah ijo langsung muncul, deketin mouse kesitu pasti dapet tuh koordinatnya segitu kira2
http://img264.imageshack.us/img264/2504/langkah5gmaps.jpg
Lambang panah tsb bisa diklik jg kok dan akan nampil gede, nah catet deh koordinatnya. di gambar tsb tertulis -6.892278, 107.619441
http://img263.imageshack.us/img263/3043/langkah6gmaps.png

Cukup pasangan latitude, longitude saja yg dikasih ke orang. Misnya -6.892278, 107.619441
Kenapa disitu latitude minus?karena terletak dibawah garis ekuator (Lintang selatan), longitude disitu positif karena di belahan timur. Coba qlo di US, pasti longitude-nya positif.

Pasangan latitude, longitude tsb bisa kok langsung search di google. pasti yg ketemu di search result adalah gambar peta, search result nomor 1 pula. Mantap kan?Tinggal klik aja langsung ketahuan kok lokasinya disitu tokh rupanya, biar jelas langsung perbesar saja.

http://img231.imageshack.us/img231/4659/searchkoordinat1.jpg

http://img509.imageshack.us/img509/8333/searchresult1.jpg

http://img412.imageshack.us/img412/9484/searchresult2.jpg

Laen kali nih ada temen nanya alamat (rumah orang, lokasi pernikahan, lokasi pesta, dll) udah cukup kasih koordinat (latitude, longitude) langsung paham kok. Coba pas kirim pos alamatnya begini doank:

Kepada: Hananiel Anindito
di -6.21107,106.821333

sudah, cukup begitu doank deh. Kira2 bakal nyampe kan itu surat ya?kalau pak posnya bawa GPS, wah ga bakal nyasar deh. HP skg kan yg baru sudah ada GPS, Blackberry saja ada, HP HTC (OS Windows Mobile) yg skg pun ada, bisa gunakan google maps yg umum atau garmin.

Contoh percakapannya akan menjadi begini deh nanti:

--------------------------

-------------------------
AAA: eh,btw rumah lo dimana ya?
BBB: rumah gw di -6.343235, 106.244223
AAA: ooh ya disitu tokh, dekat anu ya...perapatan anu ya
BBB: iya benar sekali

----------------------------------------------

X: eh ada undangan si B di zzz
Y: dimana tuh zzz?
X: di -6.133222, 105.442252
Y: oh ya gw tau,ooh disitu tokh. tunggu gw disana ya

---------------------------------------------

A: woy gw mo ke -6.133222, 105.442252 nih. mo ikut ga?
B: ok gw ikut deh, kalo lokasi tsb sebaeknya lewat jalan anu..lalu belok ke anu..dapet deh
A: siippp
Share this post: | | | |
Posted: Jan 16 2010, 12:53 AM by sonny210183 | with 1 comment(s)
Filed under:
Rumus menghitung jarak antar 2 titik koordinat (latitude,longitude)

 
Ada yg pernah pakai Google Maps? Lokasi dimana Anda berada dapat ditunjukkan dengan koordinat, seperti "-6.2110,106.8214". Jika kalian mengetahui lokasi suatu tempat kan tinggal klik kanan-lalu pilih "Ada apa disini?what's here?" , maka koordinat akan didapat. Nah diantara titik2 tempat yg ingin Anda ketahui, pasti perlu tau berapa jarak dari kedua titik tersebut.


public double getDistance(double lat1, double lon1, double lat2, double lon2)
{
            double R = 6371;//ini kalau tidaksalah adalah Radius bumi
            double dividerToRad = 57.29577951;

                double lat1rad = lat1 / dividerToRad;
                double lon1rad = lon1 / dividerToRad;
                double lat2rad = lat2 / dividerToRad;
                double lon2rad = lon2 / dividerToRad;
                double dLat = (lat2 - lat1);
                double dLon = (lon2 - lon1);
                double a = Math.Sin(dLat / 2) * Math.Sin(dLat / 2) + Math.Cos(lat1rad) * Math.Cos(lat2rad) * Math.Sin(dLon / 2) * Math.Sin(dLon / 2);
                double c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
                double d = R * c;

        return d; //jarak dua titik didapat (dalam satuan kilometer)

}



Contoh input:
Misalnya saya ingin mengetahui berapa jarak dari kantor saya ke BEJ. Koordinat gedung kantor saya terletak pada "-6.2110,106.8214", sedangkan untuk BEJ terletak di "-6.223497,106.808631". Maka pemanggilan methodnya menjadi seperti ini:

double jarak = getDistance(-6.2110,106.8214,-6.223497,106.808631);

Setelah dihitung kira2 jarak yg didapat adalah: 1.98073733882295 km atau kira2 1980.7373 meter

Share this post: | | | |
SQL Paging Query

 Pada aplikasi yang membutuhkan query data untuk ditampilkan pada grid pasti selalu membutuhkan paging. Akan tetapi banyak

orang awam yang tidak tahu bagaimana jika melakukan sebuah query kemudian akan di-paging.

Saya akan memberitahu langkah-langkahnya bagaimana generate code untung paging. Pertama kali bikin saja dulu file sembarang

yg bernama SQLQuery.template yg isinya adalah sebagai berikut:

      With PagingList as
      (SELECT ROW_NUMBER() OVER (ORDER BY List.$orderby$ $direction$
      ) as [Number],[List].* FROM
      (
      #sqlQuery#
      )  as List
      )
      SELECT #ColumnsList# FROM PagingList
      where [Number] between #range1# and #range2#
      order by $orderby$ $direction$

Contoh 1:

      With PagingList as
      (SELECT ROW_NUMBER() OVER (ORDER BY List.$orderby$ $direction$
      ) as [Number],[List].* FROM
      (
      select NIM, Nama, Alamat from Mahasiswa
      )  as List
      )
      SELECT NIM, Nama, Alamat# FROM PagingList
      where [Number] between #range1# and #range2#
      order by $orderby$ $direction$

Yang ada tanda # atau $ adalah parameter yg akan dikirim dan nantinya akan direplace. #ColumList# harus mengandung kolom yang

terbentuk dari hasil query yg dilakukan oleh #sqlQuery#. Setelah itu maka buatlah method dengan pola berikut:

public #CollectionDataType# SelectMahasiswaPaging(int pagenumber, int recordperpage, String orderby, String orderdirection)
{

    int range1, range2;
    range1 = ((pagenumber - 1) * recordperpage) + 1;
    range2 = (pagenumber * recordperpage);

    String sqlQuery=readQueryFromFileMahasiswa(); //method untuk ini bisa dibuat sendiri untuk baca file yg isinya spt

pada Contoh 1
    
    sqlQuery = sqlQuery.replace("#range1#",range1);
    sqlQuery = sqlQuery.replace("#range2#",range2);
    sqlQuery = sqlQuery.replace("$orderby$",range1);
    sqlQuery = sqlQuery.replace("$direction$",orderdirection);

    #CollectionDataType# objKol = executeQuery(sqlQuery); //method executeQuery bisa dibuat sendiri sesuai keinginan

asalkan return tipe data collection yg sesuai

    return objKol;


}


DataAccess yg saya contohkan adalah seperti diatas ini, developer lain terserah ingin pakai apa saja.
#CollectionDataType# terserah bisa berupa DataTable, Array of Object atau List<T>. pagenumber adalah halaman ke berapa

(dimulai dari 1), recordperpage adalah jumlah record yg ditampilkan dalam satu page.

orderdirection nantinya akan diisi dengan DESC atau ASC, orderby adalah dasar pengurutan berdasarkan apa. Misalnya dari

contoh 1 kita bisa masukkan "NIM" agar query tersebut diurutkan berdasarkan NIM.

Daftar nama-nama kolom sebenarnya bisa langsung diketahui setelah query berhasil dijalankan. Coba lah buat suatu multiline

textbox bernama txtSQLQuery. Lalu sebuah tombol bernama "Generate". Jika dijalankan maka

         StreamReader sr_query = new StreamReader("Template\\SQLQuery.template");
            String templatequery = sr_query.ReadToEnd();
        DataTable dtHasil = new DataTable();
            String connectionString = "server=" + namaserver + ";uid=" + userid + ";pwd=" + password + ";database=" +

namadatabase; //contoh untuk SQL Server umumnya seperti ini
            SqlConnection kon = new SqlConnection(connectionString);
            String query = txtQuery.Text;
            SqlDataAdapter da = new SqlDataAdapter(query, kon);
            da.Fill(dtHasil);

                StringBuilder sbColumns = new StringBuilder();

//kolom hasil query secara otomatis diketahui nama kolom2-nya
                for (int i = 0; i < dtHasil.Columns.Count - 1; i++)
                {
                    sbColumns.Append("[" + dtHasil.ColumnsIdea.ToString() + "], ");

                }

                sbColumns.Append("[" + dtHasil.Columns[dtHasil.Columns.Count - 1].ToString() + "]");

                String replaceQuery = templatequery.Replace("#ColumnsList#", sbColumns.ToString());
                replaceQuery = replaceQuery.Replace("#sqlQuery#", query); //query diambil dari txtQuery.Text, multiline

tempat query ditulis (mis: "Select NIM, Nama, Alamat from Mahasiswa")
        StreamWriter sw_query = new StreamWriter(folderdest + "\\QueryResult.sql", false); //folderdest adalah

variabel string yg diassign dari folder tujuan, diambil dari folderBrowserDialog

        sw_query.WriteLine(replaceQuery);

        sq_query.Close();

Setelah method dan query terbentuk, maka pada aplikasi utama dapat langsung menggunakannya. Pada inisialisasi biasanya nilai

pagenumber=1. Pada windowsform atau windowsmobileform, pagenumber menjadi variabel global tetapi pada webform menjadi

ViewState atau session.

Ketika tombol next diklik:

if (SelectMahasiswaPaging(pagenumber+1,pagesize,"NIM","DESC").Count>0)
    {
    pagenumber++;
    reloadGrid();
    
    }
else
    MessageBox.show("You reach the last page");




Ketika tombol prev diklik:

if (SelectMahasiswaPaging(pagenumber-1,pagesize,"NIM","DESC").Count>0)
    {
    pagenumber--;
    reloadGrid();
    
    }
else
    MessageBox.show("You reach the first page"); //pada webform menggunakan alert


isi method reloadGrid:

private void reloadGrid()
{
dgMahasiswa.DataSource = SelectMahasiswaPaging(pagenumber,pagesize,"NIM","DESC");

}


       

Share this post: | | | |
"Transtool Multibahasa" dengan Google API
Masih ingat dengan program transtool yg mampu menerjemahkan kata, kalimat bahkan paragraf?Google translate pun sekarang mampu melakukan pekerjaan transtool dan bisa multibahasa. Contoh ini saya buat di windows form. Berikut ini saya akan kasih beberapa potong kode:

public void Translate()
{
            String languageSource = ConvertLanguage(cultureList[cmbSource.SelectedIndex].Name); //contoh: en,de, id, dsb;


            String languageDest = ConvertLanguage(cultureList[cmbDest.SelectedIndex].Name); //contoh: en, de,id, dsb;
            //System.Globalization.
            String strSourceText = HttpUtility.HtmlEncode(txtSourceTrans.Text); //sumber yg akan di-translate, diambil dari textbox multiline (bagian atas)
            //List<String> countries = GetCountryList();
            
            String strMap = "http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=" + strSourceText + "&langpair=" + languageSource + "%7C" + languageDest;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(strMap);

            // execute the request
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream resStream = response.GetResponseStream();

            StreamReader sread = new StreamReader(resStream);

            String strread = sread.ReadToEnd();
            String[] split = strread.Split('\"');
            String translated = split[5].Replace('\"','\0');

            txtDestTrans.Text = translated; //hasil translate tampilkan di textbox multiline (bagian bawah)
}
Ketika button diklik akan memanggil fungsi Translate();
Hasil pemanggilan dgn httprequest akan menghasilkan contoh response seperti ini
{"responseData": {"translatedText":"ciao a tutti"}, "responseDetails": null, "responseStatus": 200}
Nah saya split dengan karakter " (tanda kutip dua), hasil translate itu saya dapat di indeks ke-5 setelah di-split, kemudian saya buang karakter "-nya dengan replace dengan karakter kosong (\0)
Kemudian fungsi ConvertLanguage untuk konvert nama kultur, seperti bahasa Chinese ternyata kodenya berbeda dgn yg ada di google translate.

        private String ConvertLanguage(String strfrom)
        {
            if (strfrom == "zh-CHT")
                return "zh-TW";
            else if (strfrom == "zh-CHS")
                return "zh-CN";
            else
                return strfrom;
        }

Di event page_load taruh kode seperti ini

        private void Form1_Load(object sender, EventArgs e)
        {
            cultureList = ConvertArrayToList<CultureInfo>(CultureInfo.GetCultures(CultureTypes.NeutralCultures));
        //Urutkan berdasarkan nama, yg dapat diurutkan harus dalam bentuk List<T>
            cultureList.Sort(delegate(CultureInfo a, CultureInfo b)
            {
                return a.DisplayName.CompareTo(b.DisplayName);
            });

            cmbDest.Items.Clear();
            cmbSource.Items.Clear();

            foreach (CultureInfo culture in cultureList)
            {
                cmbDest.Items.Add(culture.DisplayName);
                cmbSource.Items.Add(culture.DisplayName);
            }

            cmbDest.SelectedIndex = 0;
            cmbSource.SelectedIndex = 0;

        }

Diatas ada saya sebutkan 2 combobox, cmbDest untuk Destination Language dan cmbSource untuk Source Language. Bahasa akan diterjemahkan dari bahasa sumber ke bahasa tujuan.
cultureList saya deklarasikan sebagai variabel global bertipe List<CultureInfo>. Agar CultureInfo dikenal, jangan lupa untuk cantumkan "Using System.Globalization". Fungsi HttpWebRequest dan HttpWebResponse itu berasal dari "using System.Net", untuk encode HTML perlu mencantumkan "using System.Web;" (di add reference tambahkan System.Web). Method GetCultures me-return dalam bentuk array, sedangkan kita perlu untuk mengurutkannya (biasa berdasarkan nama). Untuk mengkonversi dari Array menjadi List<T> menggunakan fungsi ini:

        public List<T> ConvertArrayToList<T>(T[] myArray)
        {
            if (myArray == null)
                return null;

            List<T> myList = new List<T>();

            for (int i = 0; i < myArray.Length; i++)
            {
                myList.Add(myArrayIdea);
            }
            return myList;
        }


Yah dengan begini jadi deh tiruan transtool, krn ini ada pemanggilan httprequest berarti harus ada koneksi internet untuk menggunakannya. Kode ini dapat dimodifikasi agar berlaku untuk web-based, web-mobiled, bahkan windows mobile-based (di OS Windows Mobile). Untuk mobile-based jelas harus ada koneksi GPRS atau wifi yg terhubung internet. Di mana pun asal hp menggunakan gprs, orang terbiasa buka facebook, nah buka kamus online juga kadang butuh juga. Google.Translate.com itu sndiri kalau dibuka di hp pasti susah, krn ada javascriptnya. Bisa saja buat versi ASP.NET yg dipublish ke suatu web hosting lalu buka di hp deh

Share this post: | | | |
Mini SMS Gateway on Your Windows Mobile Phone
Saya ingin sekedar share mengenai Mini SMS Gateway, maksudnya adalah handphone Anda sendiri pun bisa memiliki sms gateway sendiri. Fungsinya adalah menerima sms, kemudian akan mem-parsing sms yang diterima untuk diproses setelah itu mengirimkan sms balasan otomatis kepada sang pengirim. Sebelumnya harus pasang terlebih dahulu SDK untuk windows mobile dengan mendownloadnya pada http://www.microsoft.com/DownLoads/details.aspx?familyid=06111A3A-A651-4745-88EF-3D48091A390B&displaylang=en
Setelah didownload dan kemudian diinstal, maka akan didapat juga Celullar Emulator untuk mengetes sms tanpa harus keluar pulsa. Sebelumnya baca terlebih dahulu artikel yang saya dapat di http://netindonesia.net/blogs/meidianto/archive/2009/04/23/menggunakan-cellular-emulator-pada-windows-mobile-6-sdk.aspx yang disumbangkan oleh Mas Ferry dan PDF yang saya dapat di http://mti.ugm.ac.id/~ridi/self/MOBDEV-WM6-0208-Published.pdf

Library yg perlu di-add ke reference adalah Microsoft.WindowsMobile.
PocketOutlook;
Headernya jadi cukup seperti ini:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Microsoft.WindowsMobile.PocketOutlook.MessageInterception;
using Microsoft.WindowsMobile.PocketOutlook;

Untuk menerima sms adalah menggunakan kelas Message Interceptor, jadi pada saat form di-load jangan lupa sertakan kode berikut:

    MessageInterceptor  msgInterceptor = new MessageInterceptor(
InterceptionAction.Notify, true); //pada option ini pesan yg diterima tidak dihapus, selain notify juga ada yang langsung delete message begitu diterima

            msgInterceptor.MessageReceived += new MessageInterceptorEventHandler(msgInterceptor_MessageReceived);
        }


Method event handlernya:

        void msgInterceptor_MessageReceived(object sender, MessageInterceptorEventArgs e)
        {
            if (e.Message is SmsMessage)
            {
                SmsMessage pesansms = (SmsMessage)e.Message;
                processSMS(pesansms);
               
            }
          
        }

Nah setelah itu method processSMS-nya yang tinggal dimainkan saja, bisa menggunakan regular expression atau fungsi string split biasa. Perintah sms itu biasanya dipisahkan oleh spasi, tetapi ada juga yang menggunakan pagar (#). Fungsi sendSMS cukup sederhana dengan seperti ini saja:

        private void sendSMS(String kepada, String pesan)
        {
try {
            SmsMessage sms = new SmsMessage(kepada, pesan);
            sms.Send();
}
catch (Exception ex) {
MessageBox.Show("Error sending sms: "+ex.Message);
}
        }

        private void processSMS(SmsMessage pesansms)
        {
            String smsbody = pesansms.Body;
            String perintah[] = smsbody.Split(' '); //perintah sms dipisahkan oleh spasi
            if (perintah.Length<2) //periksa apakah parameter kurang dari 2
               sendSMS(pesansms.From.Address.ToString(), "Maaf parameter kurang, HELP: angka1 angka2");
            else
{
try {
int op1 = Conver.toInt32(perintah[1]);
int op2 = Conver.toInt32(perintah[2]);

int hasil=op1+op2;
sendSMS(pesansms.From.Address.ToString(), "Hasil jumlah: " + hasil.toString());

}
catch (Exception ex)
{
sendSMS(pesansms.From.Address.ToString(), "Tipe data harus integer");
}

}
        }


Setelah program dijalankan, maka program akan menunggu sms. Jika sms yg masuk adalah
1 2
maka sms balasan yang diterima
Hasil jumlah: 3

Tetapi jika parameter kurang akan mengeluarkan pesan:
Maaf parameter kurang, HELP: angka1 angka2

Jika parameter tidak kurang tetapi input tidak sesuai tipe datanya:
Tipe data harus integer

Sebenarnya cukup simple konsep programnya, selanjutnya tinggal dikembangkan sendiri sesuai kebutuhan. Mungkin bisa saja jika iseng2 ingin menambahkan voting lewat sms dengan penyimpanan menggunakan teks atau sms autoreply. Yang perlu diubah adalah di bagian processSMS saja.
Share this post: | | | |
Isu-Isu Winform App dan Tips Mengatasinya
Desktop based application adalah suatu aplikasi yang dapat berjalan sendiri atau independen tanpa menggunakan browser atau koneksi Internet di suatu komputer otonom, dengan operating system atau platfom tertentu. Contoh: Microsoft Office Word 2007 dan aplikasi office lainnya, Windows Media Player, dll.
Keunggulan desktop based application dibandingkan dengan web based application adalah:
Dapat berjalan dengan independen, tanpa perlu menggunakan browser.
Tidak perlu koneksi Internet, karena semua file yang diperlukan untuk menjalankan aplikasinya sudah terinstall sebelumnya.
Dapat dengan mudah memodifikasi settingannya.
Prosesnya lebih cepat.
Desktop Application adalah pilihan yang tepat untuk pengguna yang ingin bekerja dengan interaksi antar mesin dengan response time cepat yang dapat membuat pengguna nyaman dalam menggunakan system itu. Dalam mengembangkan Desktop Application, terutama yang berbasis Client-Server, ada sejumlah isu yang perlu diperhatikan. Yaitu:
Culture
Culture berhubungan dengan pengaturan Regional Settings pada suatu komputer. Aplikasi desktop berbeda dengan aplikasi web, Culture pada aplikasi web mengikuti Culture yang ada pada server apapun Culture dari client-nya. Misalkan ada server X menggunakan Culture English (US), kemudian ada client bernama A dengan Culture=Indonesia, client B = Arabic (Saudi Arabia), client C = French (Perancis). Pada aplikasi web, client A, B dan C akan tetap menggunakan Culture English (US), tetapi pada Desktop Application secara default akan menggunakan Culture dari client. Akibat perbedaan Culture ini, maka hasil komputasi/operasi dari aplikasi akan menjadi salah, kacau atau bahkan fatal.
Ada dua hal yang sering digunakan berhubungan dengan Culture, yaitu:
Penanggalan: sistem penanggalan pada tiap Cultur dapat saja sama, tetapi dapat juga berbeda. Sistem penanggalan US English menggunakan format mm/dd/yyyy, pada Indonesia=dd/mm/yyyy, pada Saudi Arabia menggunakan dd/mm/yyyy. Sistem penanggalan Saudi Arabia menggunakan kalender Qomariah dengan jumlah hari=354, berbeda dengan kalender Masehi yang secara umum digunakan orang di dunia. Nama bulan di kalender Qomariah bukan menggunakan Januari – Desember, tetapi Muharam – Dzulhijah, tahun 2009 di Masehi tidak sama dengan tahun 2009 di Qomariah. Tahun 2009 di Masehi sekarang ekivalen dengan tahun 1430 di Qomariah. Ada sebuah tanggal tertulis “01/02/2009”, pada Indonesia dikenal sebagai 1 Februari 2009, pada English US menjadi 2 Januari 2009, pada Arab Saudi dikenal sebagai 1 Shafar 2009 (di Masehi ekivalen dengan tanggal 1 November 2570).
Currency: sistem currency format pada tiap Cultur dapat saja sama, tetapi dapat juga berbeda.Untuk US English, karakter pemisah ribuan menggunakan koma dan karakter decimal menggunakan titik; sedangkan pada Indonesia adalah kebalikannya. Misalnya ada suatu angka tertulis “2.500”, pada US English dikenal sebagai dua setengah, sedangkan pada Indonesia dikenal sebagai dua ribu lima ratus.
Dengan perbedaan Culture tersebut, maka akan mempengaruhi hasil komputasi. Contohnya adalah program untuk menghitung jumlah sewa barang dengan memasukkan tanggal. Jika biaya sewa perhari adalah 5000 (limaribu) per hari untuk tiap item. Input “10/02/2009” sebagai awal sewa dan “12/02/2009” sebagai tanggal pengembalian sewa, untuk biaya sewa diformat dengan “5.000”. Antara Culture US English dengan Indonesia akan memiliki hasil yang berbeda, pada US English dianggap sebagai 2 bulan (31+30 hari=61 hari, angka dianggap sebagai lima. Biaya = 5x61 = 305), sedangkan pada Indonesia dianggap sebagai 2 hari=5000x2=10000. Dapat dibayangkan bahwa perusahaan yang menggunakan aplikasi tersebut akan merugi, seharusnya dibayarkan 10000 per item, tetapi hanya 305 yang dibayarkan.
Suatu aplikasi dapat men-trigger suatu action tergantung dari tanggal. Contoh aplikasinya adalah notifikasi/reminder dari suatu penagihan, kontrak habis, janji dengan client. Ada suatu eksekutif memiliki janji dengan client pada tanggal yang tertulis “12/05/2009”, pada Culture Indonesia dikenali sebagai 12 Mei 2009, sedangkan pada US English dikenali sebagai 5 Desember 2009.Jika penanggalan kacau, maka seorang eksekutif akan telat bertemu dengan client karena tidak ada notifikasi/reminder tersebut.
Aplikasi yang digunakan oleh client harus ditetapkan Culture dasar yang akan digunakan agar setiap client menjadi seragam. Ada control tertentu yang tidak terpengaruh oleh Culture global yang telah ditetapkan aplikasi, yaitu DateTimePicker. Culture asal pada client harus disimpan terlebih dahulu di suatu variable global, kemudian dapat mengubah Culture dari aplikasi tersebut. Kode-nya adalah sebagai berikut pada Program.cs, anggap lah Culture dasar yang digunakan adalah US English.

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace XXXApp_UI
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-US");

            System.Globalization.CultureInfo cultureInfo = new System.Globalization.CultureInfo("en-US");

            Global.kulturasal = System.Threading.Thread.CurrentThread.CurrentCulture; //Culture dari client disimpan di suatu variable global bernama Global.kulturasal
            
            cultureInfo.DateTimeFormat.ShortDatePattern = "dd-MMM-yyyy"; //penetapan format tanggal untuk shortdate
            Application.CurrentCulture = cultureInfo; //assignment Culture ke aplikasi yang sedang berjalan
            
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new frmMain());
        }
    }
}
Culture UI yang terdisplay pada DateTimePicker akan menggunakan Culture dari PC Client, untuk mengkonversi ke tanggal yang ekivalen maka caranya adalah:
DateTime tanggalku = Convert.toDateTime(dateTimePicker1.Text, Global.kulturasal)”;
Pewaktuan
Tanggal dan jam yang tertera pada komputer client dapat berbeda-beda, mungkin selisih beberapa menit atau beberapa detik. Suatu aplikasi dapat membutuhkan pewaktuan untuk men-trigger suatu aksi tertentu, tidak hanya baca dari tanggal saja, tetapi juga dari jam/menit/detik. Pengguna aplikasi dapat saja iseng mengubah tanggal di komputernya agar aplikasinya dapat mengeluarkan suatu aksi tertentu atau sistem penanggalan di komputer client dapat saja kacau karena komputer habis diformat atau batere BIOS/laptop diganti. Ketidakseragaman waktu dapat menyebabkan suatu aplikasi kacau. Untuk aplikasi web, biasanya sistem pewaktuan mengikuti tanggal server tetapi untuk aplikasi desktop secara default mengambil tanggal dari client.
Untuk mengatasi masalah pewaktuan agar seragam, maka tanggal yang dijadikan patokan adalah tanggal dari server. Statement yang mengembalikan hasil berupa waktu hari ini biasa digunakan “DateTime tanggal = DateTime.Now”. Statement tersebut seharusnya diganti dengan query basisdata yang mengembalikan tanggal dari server. Pada SQL Server yaitu dengan perintah “getDate()”. Hasil query ditampung di suatu variable bertipe DateTime.
private DateTime getTanggalServer() {
String sql="getDate()";
DateTime tanggal = eksekusiQueryScalar(sql); //fungsi eksekusiQueryScalar dapat disesuaikan sendiri oleh programmer
return tanggal;
}
Pernyataan
DateTime tanggal = DateTime.Now;
diubah menjadi
DateTime tanggal = getTanggalServer();

Sistem Variabel Global
Aplikasi web memiliki yang disebut Cookies atau Session untuk menyimpan suatu variable yang dapat dikenali umum di semua form. Untuk aplikasi desktop menggunakan yang disebut variable Global, caranya yaitu dengan membuat sebuah kelas yang terdapat variable yang bersifat public dan static. Selama program itu masih hidup, variable global akan tetap terjaga.

Contoh:
public static String username;
Dari kelas/form lain dapat memanggil variable itu atau memodifikasi nilai variable username
Form A
Global.username = “Sonny”;
//kemudian panggil form B

Form B
Label1.Text = Global.username; //yang terdisplay di label adalah “Sonny”
If (Global.username == “Sonny”) {
//boleh buka form C
}
else
{
//tidak boleh buka form C
}
Share this post: | | | |
Otomatis format textbox currency

 Pada bagian ini akan saya tunjukkan suatu cara untuk otomatis formatting suatu textbox yg inputnya berupa currrency, formatting ini tergantung dari isian currency (USD,IDR,HKD,dll).

Untuk USD biasanya pemisah ribuan menggunakan koma dan untuk desimal menggunakan titik, untuk IDR sebaliknya menggunakan titik untuk pemisah ribuan dan menggunakan koma untuk pemisah desimal.

Tambahkan fungsi ini pada suatu file yg dapat diakses global, misalkan GlobalVar.



        public static CultureInfo getCulturInfoByCurr(String curr)
        {
            if (curr=="USD")
                return (new CultureInfo("en-US",false));
                //bisa ditambahkan else if jika masih ada curr lain,misalnya HKD
            else
                return (new CultureInfo("id-ID",false));

        }

        public static String currFormat(String strnilai,String curr)
        {
            String s;
            if (strnilai == "")
                return "";

            Decimal d = Convert.ToDecimal(strnilai);
            CultureInfo kultur = getCulturInfoByCurr(curr);

            kultur.NumberFormat.CurrencySymbol = "";

            s = String.Format(kultur, "{0:c4}", d); //4 angka di belakang koma


            return s;

        }

        public static String changeCurrFormat(String strnilai, String currawal, String currakhir)
        {
            String s;

            if (strnilai == "")
                return "";

            Decimal d = Decimal.Parse(strnilai, getCulturInfoByCurr(currawal));

            s = currFormat(d.ToString(), currakhir);

            return s;


        }

Jangan lupa sertakan using System.Globalization;

Kemudian untuk menggunakannya pada suatu form:

Buatlah textbox bernama txtNilai, dimana pada textbox tersebut setelah kita mengetikkan angka, maka otomatis angka tersebut akan diformat otomatis berdasarkan format currency. Setelah itu buatlah combobox currency, misnya bernama cmbCurrency. Sbg contoh,saya kasih 2 currency saja "IDR" dan "USD".

Buat variabel global bernama _curr, pada event form load tambahkan ini:

            cmbCurr.SelectedIndex = 0;
            _curr = cmbCurr.Text;

Artinya pilihan pada combobox tersebut diinisialisasi agar memilih indeks pertama dan nilai _curr langsung diambil dari combobox.

Tambahkan kode tersebut pada event jika textboxt divalidasi

        private void textboxCurrency_Validated(object sender, EventArgs e)
        {
            String strnilai = ((TextBox)(sender)).Text;

            strnilai = GlobalVar.currFormat(strnilai, cmbCurr.Text);


            ((TextBox)(sender)).Text = strnilai;



        }

private void txtNilai_Validated(object sender, EventArgs e) {
textboxCurrency_Validated(sender,e);
}

untuk textbox lainnya jika ada, maka dapat tambahkan

textboxCurrency_Validated(sender,e);

Jika combobox diubah nilainya, maka semua textbox akan secara otomatis mengubah format penulisannya, kodenya adalah sbb:


        private void cmbCurr_SelectedIndexChanged(object sender, EventArgs e)
        {
            txtnilai.Text = GlobalVar.changeCurrFormat(txtnilai.Text, _curr, cmbCurr.Text);

            //textbox1.text = GlobalVar.changeCurrFormat(textbox1.Text, _curr, cmbCurr.Text);
            //textbox2.text = GlobalVar.changeCurrFormat(textbox2.Text, _curr, cmbCurr.Text);
            //textbox_n.text = GlobalVar.changeCurrFormat(textbox_n.Text, _curr, cmbCurr.Text);

            _curr = cmbCurr.Text;



        }


lalu untuk mengambil nilai desimalnya (tanpa separator ribuan dan koma untuk desimal)

Decimal dNilai = Decimal.Parse(txtnilai.Text, GlobalVar.getCulturInfoByCurr(cmbCurr.Text)); //contohnya untuk mengambil nilai desimal dari textbox bernama txtnilai.Text

Share this post: | | | |
Membuat paging dari suatu query di SQL Server (bisa juga yg menggunakan join dan melibatkan tabel lain)

Misalnya saya memiliki query

Select colA1, colA2, colA3 from tabelA

Untuk dibuat paging, harus dipilih suatu kolom untuk dasar pengurutannya (misalkan colA1) maka menjadi

      With PagingList as

      (SELECT ROW_NUMBER() OVER (ORDER BY List.colA1 ASC

      ) as [Number],[List].* FROM

      (Select colA1, colA2, colA3 from tabelA

) as List

      )

      Select colA1, colA2, colA3 from PagingList

      where [Number] between #range1# and #range2#

Jika melibatkan tabel lain juga bisa, bentuknya menjadi seperti ini: (misalkan dasar urut berdasarkan colA1)

With PagingList as (ROW_NUMBER() OVER (ORDER BY List.colA1 ASC

) as [Number], [List].* from

( select colA1, colB1, colC1 from tabelA,tabelB,tabelC where colA2=colB2 and colB3=colC2

) as Gabungan

Select colA1, colB1, colC1 from Gabungan

Nah #range1# dan #range2# nanti diisi dengan angka, misalkan kita ingin menampilkan record dari row 1 sampai 10, 11 sampai 20, 21 sampai 30. #range1# dan #range2# disini akan menjadi parameter nantinya di SQL. Dalam paging kita mengenal yg namanya pageindex dan pagesize. Row 1 sampai 10 pageindex-nya adalah 1 (halaman pertama) dan pagesizenya=10.

Nilai pagepointer (disebut pageindex) dan pagesize akan dikirim melalui parameter, untuk menentukannya, maka coding di C#-nya menjadi:

            int range1, range2;

            range1 = ((pagepointer - 1) * pagesize) + 1;

            range2 = (pagepointer * pagesize);

 

 

Share this post: | | | |
Membuat Windows Form Utama dengan form lain dipanggil seolah2 seperti Web

Misalnya saya memiliki 3 buah form. Form pertama adalah form utama, sebut saja frmMain. 2 form lain adalah form anak, misnya bernama frmAnak1, frmAnak2. Coding utk frmAnak1 dgn frmAnak2 tetap di form masing2. Tampilan halaman pada frmAnak1 akan terlihat di frmMain (form utama). Pada frmUtama dapat melihat tampilan form anak frmAnak1 dan frmAnak2, nah jadi seolah2 seperti bentuk web dimaan frmMain adalah Master.Pages-nya, form laen adalah anak2nya.

Saya akan beritahu caranya, pada form utama dipasang sebuah panel misalkan bernama panel1. Jadi begitu ada suatu perintah, maka form anak akan terlihat pada panel tersebut. Event pada form anak pertama juga dapat memanggil form kedua (atau form lainnya) dan form laennya akan tampil pada panel itu juga.

Pada tiap-tiap form anak, tambahkan field tersebut dibawah:

private Panel _mainPanel;

Kemudian tambahkan setter method untuk field tersebut

        public void setPanel(Panel pnl)

        {

            this._mainPanel = pnl;

        }

 

Untuk konstruktornya tambahkan overloading method seperti ini,

        public frmAnak1(Panel mainPanel)

        {

            InitializeComponent();

            _mainPanel = mainPanel;

        }

 

Lalu ini adalah method untuk memanggil frmAnak2 dari frmAnak1, misalkan suatu tombol ditekan akan memanggil method ini.

 

        private void closeFormAndBackToForm2() {

            if (_mainPanel != null)

            {

                frmAnak2 f = new frmAnak2(_mainPanel);

                f.TopLevel = false;

                f.Dock = DockStyle.Fill;

                _mainPanel.Controls.Clear();

                _mainPanel.Controls.Add(f);

                f.Show();

            }

        }

 

Lalu property pada form itu sendiri harus disetting khusus, klik pada badan utama form. Lihat bagian property. AutoScroll=True, FormBorderStyle=None.

 

Nah kemudian dari form induk (frmUtama) kita dapat panggil form mana yg akan diload ke panel-nya, misalnya frmAnak1 akan dipanggil duluan ke panel pada saat form_Load atau ditekannya suatu tombol.

 

       private void openfrmAnak1()

        {

            frmAnak1 f = new frmAnak1();

            f.setPanel(panel1);

            f.TopLevel = false;

            f.Dock = DockStyle.Fill;

            this.panel1.Controls.Clear();

            this.panel1.Controls.Add(f);

            f.Show();

        }

 

       private void openfrmAnak2()

        {

            frmAnak2 f = new frmAnak2();

            f.setPanel(panel1);

            f.TopLevel = false;

            f.Dock = DockStyle.Fill;

            this.panel1.Controls.Clear();

            this.panel1.Controls.Add(f);

            f.Show();

        }

 

Pada form utama bisa saja terdapat sejumlah panel khusus untuk membuka form lain. Panel itu di web menjadi seperti frame, jadi ada suatu event khusus akan membuka form lain di dalam frame itu. Contoh form diatas itu hanya 2 form, bisa saja lebih dari 2 form bahkan puluhan form dapat bertukar tempat dengan form yang lain dengan menyebutkan nama form untuk dibuat konstruktornya, setelah itu mengeset panel dengan nama panel di form utama.

Share this post: | | | |
Membuat textbox dan DataGridView cells hanya boleh diinput dengan angka

 

ini khusus Windows Form, qlo di web form kan sudah ada kontrol khusus untuk validator.


Khusus tipe double yg hanya boleh pake angka trus titik, karakter titik pun cuma boleh sekali saja dan biasa diletakkan setelah angka. Ini diletakkan pada event textbox bernama _KeyPress. misalkan txtTotalCost adalah textbox. Maka methodnya adalah seperti ini

 private void txtTotalCost_KeyPress(object sender, KeyPressEventArgs e)
        {

  if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar) && e.KeyChar != '.')
            {
                e.Handled = true;
            }

            if (e.KeyChar == '.' && txtTotalCost.Text.Contains("."))
            {
                e.Handled = true;
            }

            if (e.KeyChar == '.' && this.Text.Length < 1)
            {
                e.Handled = true;
            }

 }

 

lalu jika hanya boleh integer saja (untuk quantity misalnya), maka akan menjadi seperti ini saja isinya:

            if ((e.KeyChar < '0' || e.KeyChar > '9') && Convert.ToInt16(e.KeyChar) != 8)
                {
                    e.Handled = true;
                }

 Itu semua hanya untuk textbox, lalu untuk suatu cells di datagridview maka yang perlu dilakukan adalah menambahkan kode pada event DataGridview _EditingControlShowing

 Misalnya myDGV adalah nama DataGridView, lalu tambahkan kode ini

  private void myDGV_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {

e.Control.KeyPress +=
        new KeyPressEventHandler(Control_KeyPress);

  }

 Setelah itu buat isi method Control_KeyPress

         private void Control_KeyPress(object sender, KeyPressEventArgs e)
        {

            String kolomditunjuk=gvConAssetContract.CurrentCell.OwningColumn.Name;
            String nilaicell;
            if (gvConAssetContract.CurrentCell.EditedFormattedValue == null)
            
                nilaicell = "";
             else
                nilaicell = gvConAssetContract.CurrentCell.EditedFormattedValue.ToString();

 //misalnya kolom BiayaSewa, HargaPerUnit adalah kolom yg bertipe double/money

  if (kolomditunjuk == "BiayaSewa" || kolomditunjuk == "HargaPerUnit ") //jika masih ada kolom laen, tambahkan || kolomditunjuk="..."

 { //hanya boleh angka+backspace+titik (.)
                if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar) && e.KeyChar != '.')
                {
                    e.Handled = true;
                }

                if (e.KeyChar == '.' && nilaicell.Contains("."))
                {
                    e.Handled = true;
                }

                if (e.KeyChar == '.' && nilaicell.Length < 1)
                {
                    e.Handled = true;
                }

            }

 else if (kolomditunjuk=="Stock" || kolomditunjuk="UnitYangDiminta") 
            { //misalkan stock dan unityang diminta hanya boleh diinput dengan tipe data integer

 

 if ((e.KeyChar < '0' || e.KeyChar > '9') && Convert.ToInt16(e.KeyChar) != 8)
                {
                    e.Handled = true;
                }
            }

            
            }

 

Share this post: | | | |