<paulus />

Another .NET newbie
See also: Other Geeks@INDC
SQL Server 2008 Express with Tools & Advanced Services

After a few weeks waiting, finally, Microsoft released SQL Server 2008 Express with Tools and SQL Server 2008 Express with Advanced Services

It's time to start digging the power of these tools.

Share this post: | | | |

Posted Friday, September 05, 2008 1:29 PM by paulus | with no comments

Filed under:

Make second level rank

Andaikan saya mempunyai sebuah table yang mempunyai struktur sebagai berikut:


CREATE TABLE MyTable
(
nama_barang varchar(100),
nama_supplier varchar(100),
tgl_kirim datetime
)

Lalu diberikan data awal sebagai berikut:

nama_barang|nama_supplier| tgl_kirim
--------------------------------------------------
Pencil | John | 2007-01-30 00:00:00.000
Eraser | Billy | 2007-02-14 00:00:00.000
Notebook | Nancy | 2007-02-13 00:00:00.000
Wallet | John | 2007-02-18 00:00:00.000
Bag | Billy | 2007-02-15 00:00:00.000
Spidol | Billy | 2007-02-16 00:00:00.000

Bagaimana membuat data di table tersebut menjadi seperti berikut ini:

nama_barang|nama_supplier | tgl_kirim |rank
----------------------------------------------------------
Eraser | Billy | 2007-02-14 00:00:00.000 | 1
Bag | Billy | 2007-02-15 00:00:00.000 | 2
Spidol | Billy | 2007-02-16 00:00:00.000 | 3
Pencil | John | 2007-01-30 00:00:00.000 | 1
Wallet | John | 2007-02-18 00:00:00.000 | 2
Notebook | Nancy | 2007-02-13 00:00:00.000 | 1
Saya berusaha untuk menghindari penggunaan cursor dan looping yang sangat diharamkan di SQL Server, alasan utamanya adalah performance. Saya coba ingat-ingat lagi tentang buku Advanced Transact-SQL for SQL Server 2000 yang pernah saya baca waktu kuliah dulu. Ga percuma, baca buku setebal itu...hehehehe. Kalau dilihat lebih seksama, hasil table tersebut diurutkan berdasarkan nama_supplier dan tgl_kirim. Untuk nama_supplier yang sama, tgl_kirim harus diurutkan. Intinya adalah, menghitung jumlah row dari setiap baris pada table tersebut sedemikian rupa sehingga tgl_kirim pada row pertama lebih tua daripada tgl_kirim di row kedua dan seterusnya, sehingga statement SQL yang dapat digunakan untuk menghasilkan table seperti di atas adalah:
select nama_barang, nama_supplier, tgl_kirim,
(select count(*)
from MyTable a
where a.nama_supplier=b.nama_supplier and
a.tgl_kirim <= b.tgl_kirim) rank
from MyTable b
order by nama_supplier, tgl_kirim

Keterbatasan: Trik ini dapat digunakan jika tanggal pada tgl_kirim tidak ada yang sama, atau dengan kata lain, tidak ada satu pun row yang mempunyai tgl_kirim yang sama dengan row lain.
Share this post: | | | |

Posted Friday, August 29, 2008 3:50 PM by paulus | with no comments

Disable button on submit

Pada sebuah halaman web form, seringkali user karena tidak sabar menunggu menekan tombol submit atau save berkali-kali. Salah satu cara yang biasanya dipakai developer (walaupun ada yang kontra dengan cara ini) adalah melakukan disable semua button ketika form di-submit, sehingga user tidak bisa lagi melakukan submit form.

Berikut ini adalah contoh code untuk melakukan disable semua button yang ada di sebuah web form ketika form tersebut di-submit.

    public static void InjectSubmitScript(
           System.Web.UI.Page page,
           string confirmMessage,
           string processingMessage,
           System.Web.UI.WebControls.Button submitButton,
           bool validate)
    {
        System.Text.StringBuilder sb = new System.Text.StringBuilder();

        sb.Append("if (confirm('" + confirmMessage + "') == false)");
        sb.Append("  { return false; } ");
        if (validate)
        {
            sb.Append("if (typeof(Page_ClientValidate) == 'function') { ");
            sb.Append("if (Page_ClientValidate() == false) { return false; }} ");
        }
        sb.Append("this.value = '" + processingMessage + "';");
        sb.Append("this.disabled = true;");
        sb.Append("var i=0;");
        sb.Append("var length=document.forms[0].elements.length;");
        sb.Append("do { ");
        sb.Append("  var el = document.forms[0].elements[ i ] ;");
        sb.Append("  if(el.type.toLowerCase()=='button' || ");
        sb.Append("     el.type.toLowerCase()=='submit')");
        sb.Append("     {");
        sb.Append("    el.disabled = true;");
        sb.Append("  }");
        sb.Append("  i++;");
        sb.Append("} while( i != length - 1);");
        sb.Append(page.ClientScript.GetPostBackEventReference(submitButton, String.Empty));
        sb.Append(";");
        submitButton.Attributes.Add("onclick", sb.ToString());
    }

Parameter pertama adalah instance dari System.Web.UI.Page
Parameter kedua adalah pesan yang ingin ditampilkan sebagai javascript alert ketika button di-click
Parameter ketiga adalah pesan yang ingin ditampilkan ketika button sudah di-click
Parameter keempat adalah objek dari web control button
Parameter kelima adalah menentukan apakah melakukan client validation terlebih dahulu sebelum melakukan disable semua button

Berikut contoh pemakaian method di atas melalui web form:

InjectSubmitScript(this, "Create payment transaction now ?", "Please wait...", btnCreatePayment, true);

Share this post: | | | |

Posted Friday, August 29, 2008 3:20 PM by paulus | with no comments

Filed under: , ,

jQuery

Malam minggu ini saya mencoba sebuah framework di lingkungan client scripting yaitu jQuery. Tadinya saya menebak jQuery adalah framework atau tool di lingkungan Java karena ada embel-embel huruf J di depannya (walaupun bukan huruf J kapital), seperti JUnit, JPedal, JRoller, dan sebagainya. Ternyata jQuery adalah framework yang dapat digunakan di JavaScript. Dilihat dari fungsi teknisnya, jQuery mirip dengan ASP.NET AJAX Client Library yang dapat digunakan bukan hanya untuk membangun aplikasi dengan ASP.NET, yaitu memperluas fungsionalitas JavaScript sehingga developer dapat membangun code JavaScript dengan relatif lebih cepat karena code JavaScript yang perlu dituliskan lebih sedikit dan lebih memfokuskan pada fungsi apa yang ingin dilakukan oleh code JavaScript tersebut.

jQuery didistribusikan secara gratis dengan lisensi MIT dan GPL dan dapat di download di http://www.jquery.com

Sebenarnya jQuery hanyalah sebuah file JavaScript yang harus disertakan dalam sebuah halaman HTML (atau XHTML) melalui tag script seperti berikut :

<script language="JavaScript" type="text/javascript" src="path/to/jquery.js"></script>

Setelah itu kemudian saya bisa menggunakan semua kekuatan dari jQuery. Misalkan saya ingin membuat alert yang bertuliskan "Hello jQuery" menggunakan HTML button:

Code HTML:

<input type="button" id="btnHello" value="Hello jQuery" />


Code jQuery:

  $(function() {
    $("input#btnHello").click( function() { alert('Hello jQuery'); });
  });

 

Penggunaan tanda $ di sini sangat mengingatkan saya dengan ASP.NET AJAX Client Library, walaupun dengan jQuery saya bisa mengganti $ dengan token lain, misalnya dengan $jquery.

Contoh yang lebih rumit: Saya ingin membuat sebuah efek tulisan fade in dan fade out secara bergantian.

Misalnya untuk code HTML berikut ini:        

<h5>YOU'LL NEVER WALK ALONE</h5>
       
<p id="verse">
   When you walk through a storm,<br/>
   Hold your head up high,<br/>
   And don't be afraid of the dark.<br/>
   At the end of a storm,<br/>
   There's a golden sky,<br/>
   And the sweet silver song of a lark.<br/>
   Walk on through the wind, Walk on through the rain,<br/>
   Though your dreams be tossed and blown..
</p>
       
<a href="#" id="linkChorus">Hide Chorus</a>
<p id="chorus">
   Walk on, walk on, with hope in your heart,<br/>
   And you'll never walk alone.......<br/>
   You'll never walk alone. <br/><br/>
   Walk on, walk on, with hope in your heart,<br/>
   And you'll never walk alone.......<br/>
   You'll never walk alone.
</p>

Code jQuery:        

$(function() {
   $("a#linkChorus").click( function() {            
       if($("a#linkChorus").get(0).innerText == "Hide Chorus")
       {                   
          $("#chorus").hide("slow");
          $("a#linkChorus")[0].innerText = "Show Chorus";
       }
       else if($("a#linkChorus")[0].innerText == "Show Chorus")
       {                   
          $("#chorus").show("slow");
          $("a#linkChorus")[0].innerText = "Hide Chorus";                   
       }
   } );
});

Di sinilah kelebihan jQuery. Saya tidak perlu mendeteksi browser apa yang digunakan, karena framework jQuery yang nantinya akan berusaha mengenali browser dan menyesuaikan code JavaScript yang digunakan sesuai dengan fungsi yang saya inginkan. Code yang saya tulispun jauh lebih singkat daripada saya harus menuliskan code JavaScript secara keseluruhan.

Dan yang terpenting: jQuery menyediakan akses ke DOM yang lebih baik yaitu memungkinkan developer memfokuskan diri pada fungsionalitas yang ingin dibangun, persis seperti kalimat yang dituliskan di website jQuery: jQuery is designed to change the way that you write JavaScript.

jQuery: The Write Less, Do More, JavaScript Library

Share this post: | | | |

Posted Sunday, May 18, 2008 1:57 AM by paulus | 4 comment(s)

Filed under:

Failed to install .NET Framework 2.0

Tadi siang asisten bos laptopnya minta diinstall .NET Framework 2.0 (hanya runtime bukan SDK) karena ada aplikasi yang menggunakan .NET Framework. Namun entah kenapa selalu saja failed saat installer baru mulai dan muncul pesan:

"Error opening installation log file. Verify that the specified log file location exists and is writable."

Hmmm.....mungkin hanya perlu restart Windows, tapi setelah restart pun hasilnya sama.

Coba install .NET Framework 3.5, gagal juga saat installer baru mulai.

Coba tanya uncle Google, ternyata ada beberapa kemungkinan:

  1. Space hard disk tinggal sedikit: Ini ga mungkin, free space hard disk masih di kisaran 70 GB.
  2. Temporary directory harus dibersihkan: Semua file di temporary sudah dihapus, tapi pesan error di atas tetap muncul.

Udah hampir nyerah, tapi masih ada waktu, si pemilik laptop mau meeting pukul 2 siang, sekarang masih pukul 13.30.

Saya coba masuk ke Command Prompt, lalu semua isi environment ditampilkan dengan perintah set, ternyata ada keanehan. Value dari variabel TEMP dan TMP isinya aneh.

TEMP=%USERPROFILE%\User\LOCALS~1\Temp
TMP=%USERPROFILE%\User\LOCALS~1\Temp

Lalu saya coba lakukan hal yang sama di komputer saya, hasilnya:

TEMP=C:\DOCUME~1\Paul\LOCALS~1\Temp
TMP=C:\DOCUME~1\Paul\LOCALS~1\Temp

Tampak variabel %USERPROFILE% diterjemahkan menjadi value variabel. Tapi yang di laptop ini kenapa variabel %USERPROFILE% tidak diterjemahkan menjadi value variabelnya? Padahal beberapa baris di bawahnya saya lihat variabel %USERPROFILE% juga ada:

USERPROFILE=C:\Documents and Settings\User

Wah, kayaknya ga sempat lagi untuk mencari tahu kenapa ini bisa terjadi, saya coba hapus variabel TMP dan TEMP dari environment di System Properties - Advanced - User Variables, lalu coba install lagi .NET Framework 2.0. Ternyata, pesan error tidak muncul lagi, instalasi berhasil. Variabel TMP dan TEMP saya kembalikan ke kondisi semula dan laptop harus segera dikembalikan ke pemiliknya karena sudah pukul 13.50.

Whew....Koq bisa begitu ya?

Share this post: | | | |

Posted Tuesday, March 25, 2008 5:00 PM by paulus | 1 comment(s)

Filed under: ,

Silverlight dan Nokia

Nokia akan mengimplementasikan Silverlight pada ponselnya. Baca selengkapnya di sini.

Share this post: | | | |

Posted Tuesday, March 11, 2008 6:11 PM by paulus | with no comments

Filed under:

Embedded web resource

Ini post saya yang pertama membahas tentang .NET, mohon maaf jika ada kesalahan (maklum langsung code di sini, ga pakai Visual Studio).

Ketika membuat aplikasi ASP.NET kadang saya membuat project Web Control Library yang isinya user controls yang tidak ingin saya expose code nya ke developer lain. User control tersebut membutuhkan code javascript yang ada pada file terpisah, atau file-file image. Jika user control ini digunakan dalam web form yang ada pada project terpisah atau pada solution yang lain, file-file javascript atau image tersebut harus diikutsertakan juga. Hal ini sepertinya agak merepotkan (setidaknya untuk saya).

Supaya yang dideploy hanya single file assembly, file javascript dan image tersebut dapat di-embed sebagai embedded resource ke dalam assembly.  Caranya adalah:

Untuk setiap file yang akan di-embed sebagai embedded resource, di Visual Studio ubah property Build Action dari file tersebut menjadi Embedded Resource.

Kemudian daftarkan file tersebut pada AssemblyInfo.cs supaya HTTP handler dapat mengaksesnya melalui WebResource.axd, dengan syntax:

[assembly:WebResource("namespace.filename", "content-type")]

Misalnya untuk namespace MyWebControl.Validator dan nama file javascript yang akan di-embed adalah LengthValidator.js, maka penulisannya menjadi:

[assembly:WebResource("MyWebControl.Validator.LengthValidator.js", "text/javascript")]

Sampai di sini, jika project web control library di-build akan menghasilkan satu file DLL yang di dalamnya sudah di-embed file javascript yang disebutkan tadi. Misalkan nama file DLL yang dihasilkan adalah LengthValidator.dll

Untuk meng-consume resource, dilakukan dengan cara seperti halnya meng-inject sebuah file javascript ke dalam web form dengan memanggil method Page.ClientScript.RegisterClientScriptInclude:

Page.ClientScript.RegisterClientScriptInclude(
     "LengthValidator",
     Page.ClientScript.GetWebResourceUrl(typeof(LengthValidator),
                                         "MyWebControl.Validator.LengthValidator.js"));

Kalau diperhatikan di atas, perbedaan antara meng-inject sebuah file javascript biasa dengan file javascript sebagai embedded resource adalah pada parameter kedua dari method RegisterClientScriptInclude. Biasanya untuk meng-inject sebuah file javascript, parameter ini diisi dengan nama file javascript, tetapi karena yang di-inject adalah embedded resource, maka gunakan method GetWebResourceUrl.

 

Jika file javascript yang akan di-embed berada dalam folder lain (bukan folder root project), sebutkan nama folder tersebut ketika file tersebut didaftarkan di AssemblyInfo.cs. Misalkan file javascript LengthValidator.js berada dalam folder bernama scripts:

[assembly: WebResource("LengthValidator.scripts.LengthValidator.js", "text/javascript")] 

Serupa dengan di atas, untuk mengambil javascript yang sudah di-embed tersebut dengan menyebutkan nama folder tadi:

Page.ClientScript.RegisterClientScriptInclude(
                "LengthValidator",
                Page.ClientScript.GetWebResourceUrl(this.GetType(),
                        "LengthValidator.scripts.LengthValidator.js"));


Share this post: | | | |

Posted Tuesday, March 11, 2008 4:51 PM by paulus | with no comments

Filed under:

{Hello:World}

Hello .NET-ers,

Sebenarnya udah lama punya blog di INDC tapi baru sekarang mau coba say hello untuk semua penghuni di sini. Kalau mau jujur, saya agak minder untuk posting tulisan karena setelah lihat judul-judul blog di sini ilmu .NET nya pasti sudah lebih tinggi dari saya.

Semoga kita bisa sharing ilmu di sini.

Maju terus komunitas developer .NET Indonesia !!

Share this post: | | | |

Posted Tuesday, March 11, 2008 4:43 PM by paulus | 4 comment(s)