Wednesday, July 27, 2011

Multiple Rows to Single Row


Maksud dari judul ini adalah misalkan kita ingin menjadikan isi dari beberapa baris menjadi satu baris, deretean baris tersebut menjadi kolom-kolom.
contoh data:

Misal kita namakan tabel ini tabel: T_ORDER

order_id              product_order
--------                   ------------
SO201101            MOUSE
SO201101            KEYBOARD
SO201101            SOFTWARE

nah kita ingin menjadikan data tersebut menjadi:

order_id              ORDER PRODUK
--------                   -------------
SO201101            MOUSE, KEYBORAD, SOFTWARE


terus bagaimana caranya menggunakan sintax SQL

SELECT pm.fk,
                (
                SELECT
                                P.[product_order] + ','
                FROM
                                T_ORDER P
                WHERE
                                P.fk = PM.fk
                ORDER BY P.[product_order] FOR XML PATH('')
) as [ORDER PRODUK]
FROM T_ORDER
AS PM group by pm.fk

PM => Alias/Nama lain dari tabel T_ORDER

Friday, July 22, 2011

Menampilkan data di GridView dengan CSqlDataProvider

Di Yii ada 2 class data provider yang disediakan untuk bisa menjadi sumber data pada grid view / list view. Bedanya adalah asal data itu dihasilkan. Jika CSqlDataProvider data yang kita perolah kita proses dari Sintax SQL (String), sedangkan CActiveDataProvider kita peroleh dari Class (Object) ActiveRecord.

Pada artikel ini akan di bahas tentang pengunakan CSqlDataProvider sebagai sumber data dalam Sebuah Gridview.

1. Kita anggap kita sudah belajar Yii sebelumnya, jadi untuk cara-cara pembuatan file controller, view sudah kita pahami.
2. Pada controller kita buat fungsi untuk mengambil data.
public function getCustomerList(){

// Ambil data Customer list
$sql ="SELECT a.*,b.name as groupname
FROM `customer` as a
left join customer_group as b
on a.customer_group_id = b.customer_group_id";

//menentukan jumlah baris yang ada(ini akan berhubungan dengan pagination)
$count = Yii::app()->db->createCommand('select COUNT(*) from customer')->queryScalar();

//buat sql data provider
$dprov = new CSqlDataProvider($sql,array(
'totalItemCount'=>$count,
'keyField'=>'customer_id',
'pagination'=>array('pageSize'=>20),
'sort'=>array(
'attributes'=>array(
// kode ini jika adalah menempatkan atribut yang bisa di sorting/urutkan.
'firstname','lastname','groupname','email','date_added','status','telephone'
),
),
)
);
return $dprov;

}

public function actionGridViewList(){
$model = $this->getCustomerList();

$this->render('/account/admin',array('model'=>$model));
}
3. kita buat kode di bagian viewnya (untuk menampilkan data di CGridView).

$this->widget('zii.widgets.grid.CGridView', array(
'id'=>'gridcust',
'dataProvider'=>$model,
'enableSorting'=>true,
'columns'=>array(


array(
'header'=>'Nama Customer'),
'value'=>'$data[firstname]." ".$data[lastname]',
'name'=>'firstname',
),
array(
'header'=>Yii::t('MGlobal', 'tbl.email'),
'name'=>'email',
),


array( // display a column with "view", "update" and "delete" buttons
'class'=>'CButtonColumn',
),


),
));

4. dan jika anda berhasil makan hasilnya akan tampil seperi gambar dibawah ini


reference:
* www.yiiframework.com

Monday, July 18, 2011

Membuat Store Procedure di SQL Server.

Pada pembuatan aplikasi database kita mengunakan database server sebagai sebagai media untuk menyimpan data, contoh SQLServer & MySQL ada beberapa contoh aplikasi database server yang lainnya.

Pada database server biasanya ada fasilitas Store Procedure. Untuk MySQL server baru ada fasilitas ini sejak versi 5.x.x keatas (yang terbaru).

Beberapa manfaat yang bisa kita dapatkan (ini manfaat yang saya rasakan saja) :
* kita bisa membuat perintah/manipulasi data, sebelum data di proses ke database (update, delete, insert, select).
* performance lebih cepat ketimbang query langsung (tergantung juga dari query yang dibuat).
* ringkas


cara pembuatan store procedure pada database SQL SERVER:

CREATE PROCEDURE SP_SIMPANCUSTOMER
---- variable untuk input parameter
@KODE VARCHAR(5),
@NAMA VARCHAR(50)
@FLAG VARCHAR(1)
AS
BEGIN
declare @sf varchar(20);

if(@FLAG == 1)
--- awal untuk sebuah kondisi
BEGIN
@sf = "ONLINE"
end

else
begin
@sf = "OFFLINE"
end

insert into tbl_customer
(kode,nama,asal)
values
(@KODE,@NAMA,@sf)

END
GO


kemudian untuk memanggil/mengunakan prosedurnya:

exec SP_SIMPANCUSTOMER 'A001','PT. INDO INDO AJA','1'

keterangan:
* varibel di awali dengan simbol @.
* pada pengalan code SQL diatas dapat diartikan bahwa kita akan membuat store procedure dengan nama SP_SIMPANCUSTOMER dengan data masukan KODE,NAMA & FLAG dengan tipe varchar.
* kemudian store procedure akan memproses terhadap nilai @FLAG jika nilai itu 1 maka akan membuat data "ONLINE" dan selain itu "OFFLINE".
* kemudian lakukan penyimpanan data ke tabel tbl_customer.

referance:
* msdn.microsoft.com

Sunday, July 17, 2011

Mengaktifkan button First / Last Pada GridView (Paging)

Saat kita mengunakan CGridView Control dari Yii, tampilan standar pagernya adalah First dan Last tidak tampil. yang tampil hanya Previous dan Next. Seperti yang terlihat pada gambar dibawah ini:




pada gambar diatas posisi pager saat ini adalah 3, berarti ada 4 kemugkinan yang bisa dipilih, First,Previous,Next atau Last, sedangkan yang tampil hanya dua pilihan Previous & Next.
misalkan saja code untuk menampilkan data di CGridView seperti ini:

$this->widget('zii.widgets.grid.CGridView', array(
'dataProvider'=>$model,
'pager'=>array('class'=>'CLinkPager'),
'enableSorting'=>true,
'columns'=>array(
'firstname', // display the 'title' attribute
'lastname', // display the 'name' attribute of the 'category' relation
array(
'name'=>'E-mail',
'value'=>$data->email,
),
array( // display a column with "view", "update" and "delete" buttons
'class'=>'CButtonColumn',
),
),
));


karena pada artikel ini kita membahas pager maka attributes selain pager kita diamkan dulu / tidak dibahas. Kita coba bahas di pager saja:

'pager'=>array('class'=>'CLinkPager')

kode diatas dimaksudkan bahwa pager yang di pakai CGridView itu diturunkan (extended) dari class CLinkPager, karena default dari pager adalah CPagination.
mengapa memilih CLinkPager ?
Karena pada class ini kita bisa mengatur Nama label dari First, Next, Previous dan Last sesuai dengan keinginan kita.

ok, balik lagi ke topik sebelumnya soal tombol page First & Last. Bagaimana nampilkannya ? karna di propertis dari CGridView sendiri tidak ada ?
jawabannya terletak pada pager.css yang ada di directory framework(framework/web/widgets/pagers/pager.css).
coba perhatikan class dari css ini:

/**
* Hide first and last buttons by default.
*/
ul.yiiPager .first,
ul.yiiPager .last
{
display:none;
}


jika kita tidak ingin tombol First & Last tidak tampil biarkan css class diatas seperti itu. tapi kalau mau kita munculkan ubah seperti ini:

ul.yiiPager .first,
ul.yiiPager .last
{

}

maka kita akan mendapatkan paging seperti ini:




referensi:
* www.yiiframework.com
* http://www.yiiframework.com/search/?type=api-suggest&q=clinkpager

Thursday, July 14, 2011

Debugging di Visual Studio 2010

Debugging sering kita lakukan untuk menguji program / melihat alur proses yang ada di program, dengan mengecek satu persatu / langkah demi langkah, untuk mengatasi bug dari program.

berikut ini adalah proses mendebug program pada Visual Studio 2010.

Memulai Mendebug [F5]
Untuk memulai proses debug anda bisa pilih menu "Start Debugging" atau dengan cara tekan tombol "F5"

Breakpoints [F9]
Digunakan untuk menandai baris kode yang akan di debug.
untuk membuat breakapoints anda tinggal klik pada side bar code atau bisa juga tekan "F9" pada baris kode yang akan anda beri tanda breakapoints.
dengan memberikan breakapoints berarti ketika anda masuk kedalam kode yang telah diberitanda program akan berhenti dan program akan membawa anda ke baris kode tersebut.

Debug dengan Breakpoints
Misalkan anda telah menandai kode dengan breakpoints yang mana anda ingin menghentikan proses dan ingin mengecek baris perbaris dari kode yang telah anda buat. Jalankan proses debug dengan tekan 'F5' dan program akan di hentikan pada kode program yang telah anda berikan breakpoints.
ada beberapa tool yang digunakan untuk melakukan debug program antara lain :


Step Over [F10]
ini digunakan untuk mendebug kode baris demi baris, anda bisa melakukannya dengan menekan tombol 'F10'

Step Into [F11]
digunakan untuk mendebug kode dan akan mendebug sampai ke sub methodnya.
untuk melakukannya tekan tombol 'F11'

Step Out [Shift - F11]
Digunakan jika anda ingin keluar dari debug di dalam suatu method.

Continue
gunakan perintah ini untuk melanjutkan proses program, anda bisa klik key 'F5' untuk menjalankan proses ini.

Set Next Statement
ini mengijinkan anda untuk memindah posisi dari debug anda. shortcut dari kontrol ini adalah 'Ctrl + Shift + F10'

VB.NET: String

String.Length


Digunakan untuk mendapatkan jumlah karakater pada sebuah String.

System.String.Length() As Integer


Mengembalikan nilai Integer, berarti mengembalikan jumlah karakater.
contoh:
"test".Length()



nilai yang akan dihasilkan adalah: 4, merupakan jumlah karakater pada String "test".

Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
StringLength()
End Sub

Sub StringLength()
Dim sNama As String

sNama = "Visual Basic"
MsgBox(sNama.Length)

End Sub
End Class

kode diatas akan menghasilkan nilai: 12, karena variable sNama terdapat 12 karakater.

String.Insert
digunakan untuk menyisipkan String pada posisi index yang ditentukan pada sebuah instance dari String.

System.String.Insert(Integer ind, String str) as String


Parameters:

- ind -> Index dari string yang akan disisipkan.
- str -> Nilai yang akan disisipkan

Return:
String - nilai yang dihasilkan dari fungsi ini adalah string.

Exceptions:

System.ArgumentOutOfRangeException: Jika posisi index negatif atau posisi index lebih dari total karakater.

System.ArgumentNullException : jika arguman Null


Sub StringInsert()
Dim sn As String
sn = "VB.NET"
Dim sNilai As String = sn.Insert(6, " 2010")
MsgBox(sNilai.ToString)
End Sub

kode diatas akan menghasilkan nilai : VB.NET 2010

String.IndexOf()
digunakan untuk mendapatkan posisi(index) dari sebuah karakater. nilai dihasilkan adalah Number. jika tidak ditemukan nilai yang dihasilkan adalah -1.

System.String.IndexOf(String str) As Integer

Parameters:

str - Nilai string yang akan dicari.

Returns:

Integer - Nilai number/posisi index, mengembalikan posisi karakater.
jika tidak ditemukan akan menghasilkan nilai : -1

Sub StringIndexOf()

Dim sn As String
sn = "Visual Basic 2010"
MsgBox(sn.IndexOf("2010"))

End Sub

kode diatas akan mengembalikan nilai: 13, merupakan posisi dari nilai "2010"

Event Enter pada Yii.

Bagaimana untuk membuat event enter pada sebuah textbox, misalkan kita mau pindah dari textbox 1 ke textbox yang berkutnya.
disini kita akan mengunakan JQuery sebagai pemrograman untuk memprosesnya, di Yii ada perintah sendiri untuk meng mnyisipkan printah (script) javascript

terdapat pada clss CClientScript dan method registerScript

http://www.yiiframework.com/doc/api/1.1/CClientScript#

ini digunakan untuk menyisipkan perintah javascript



Yii::app()->clientScript->registerScript('test', '
$(\'#textfield1\').keypress(function(e){
if(e.keyCode == 13) {
$(\'#textfield2\').focus();
}
});
');


kuncinya terdapat di pada script

if(e.keyCode == 13) {
$(\'#textfield2\').focus();
}

keycode 13 merupakan kode ASCII untuk tombol Enter

setelah itu kita bisa panggil programnya seperti di bawah ini dan bisa pindah ke textfield dengan tekan tombol Enter

echo CHtml::textField('textfield1', 'a', array('id' => 'textfield1'));
echo CHtml::textField('textfield2', 'b', array('id' => 'textfield2'));
Reference: www.yiiframework.com

Membuat Box Bahasa dan memanggilnya di setiap halaman web dibuka

Langkah pertama adalah kita mengubah baris kode pada configurasi pada main.php, menjadi


return array(
'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
'name'=>'Toko Onlineku',
'language'=>'id', // id jika ingin menjadikan default bahasa yang di pakai indonesia
// eg jika Bahasa inggris



dan nantinya kita bisa memanggilnya:


Yii::app()->language


Selanjutnya di kita buat komponent file pada directory component, sebut saja nama file controllernya LangBox.php


<?php
// controller untuk Language Box
class LangBox extends CWidget {
   
    public function run(){
        $currlang = Yii::app()->language; // ambil settingan bahasa yang ada sekarang
        $this->render('langBox',array('currentLang'=> $currlang)); // tampilkan di view
    }
   
}
?>
kemudian pada directory: components->view kita buat file langBox.php
<?php echo CHtml::form();
?>
    <div id="langdrop">
        <?php echo CHtml::dropDownList('_lang', $currentLang, array(
            'en' => 'English', 'id' => 'Indonesia','ru' => 'Rusia'), array('submit' => '')) ?>
    </div>
</form>

setelah itu kita buat class LayoutHandler agar bisa di panggil setiap halaman di buka:
<?php
// handle Layout initial request

// When Application started this the first step to do

class LayoutHandler extends CApplicationComponent {
   
    public function init(){

       parent::init();
           $app = Yii::app();
        if (isset($_POST['_lang']))
        {
            $app->language = $_POST['_lang'];
            $app->session['_lang'] = $app->language;
        }
        else if (isset($app->session['_lang']))
        {
            $app->language = $app->session['_lang'];
        }
}
?>


kemudian simpan di directory components.
dan selanjutnya kita modifikasi lagi bagian main.php (configation) menjadi:



return array(
    'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
    'name'=>'Toko Onlineku',
    'language'=>'id',

    // preloading 'log' component
    'preload'=>array('log','layoutHandler'),

    'components'=>array(
       
        'layoutHandler'=>array(
                'class'=>'LayoutHandler',
            ),



dan selanjutnya untuk menampilkan box language panggil dengan perintah:

<?php $this->widget('LangBox'); ?>