Saturday, 28 June 2014

Mengurutkan data pada MySQL (2)


Tulisan ini merupakan lanjutan dari:
Mengurutkan data pada MySQL

Masih seputar mengurutkan data. Sebelumnya dengan menggunakan queri hasil yang didapat sesuai gambar berikut :
Gambar 1. Queri masih belum sempurna


Dapat dilihat bahwa urutan masih belum sempurna, seperti 2.80 lebih dulu dibanding 2.9. Dengan mengabaikan angka 2 didepannya, seharusnya angka 9 memperoleh posisi lebih dulu. Belum lagi pada id berkepala 2 (mudah-mudahan nggak serem kata-katanya :P ) seperti nomor 2.80.3, 2.80.25, dan 2.80.50 yang seharusnya urut seperti ini, bukan 25,3,50 yang masih berdasarkan karakter. Untuk itu kita akan menyempurnakannya.

Pertama kita ambil nilai sebelum titik atau keselurahan pada id yang tidak ada titik. Selanjutnya nilai pertama ini dibuat dua tipe, yaitu char dan integer. Sehingga tampak seperti gambar berikut :
Gambar 2. Pemisahan nilai pertama menjadi 2 tipe (id_c, id_i)

Perhatikan gambar diatas, terdapat 2 field yaitu id_c (char) dan id_i (integer). id_c, merupakan hasil dari pemotongan nilai sebelum titik pertama atau nilai keseluruhan pada yang tidak bertitik. id_i, sama seperti id_c hanya saja nilainya dikonversi ke integer. Lalu selanjutnya adalah nilai setelah titik pertama dan titik kedua. Lalu bagaimana prosesnya? Yang kita perlukan adalah posisi titik pertama dan kedua. Untuk mendapatkannya kita pergunakan fungsi LOCATE() :
.

  locate('.',idnomor) as pos1,
  locate('.',idnomor,locate('.',idnomor)+1) as pos2,
  length(idnomor) as fLen
   
.

Perhatikan kode diatas terdapat beberapa field baru lagi yaitu pos1, pos2, dan fLen (singkatan dari fix length, atau panjang yang tetap untuk keperluan selanjutnya). Parameter pertama pada fungsi locate diisi dengan string yang akan dicari. Parameter kedua adalah field atau string utama, sedangkan parameter ketiga adalah posisi yang akan dimulai untuk proses pencarian (dapat diisi atau tidak). Pos1 untuk titik pertama, dan pada pos2 kita mulai pencarian setelah posisi titik pertama (parameter ketiga). Jika tidak ditemukan nilainya akan 0. Setelah posisi titik atau pemisah ini diketahui, selanjutnya menampilkan mengambil nilai kedua dan ketiga dengan fungsi MID(), disertai dengan fungsi IF() agar nilai yang didapat sesuai. Dan pada contoh ini juga menggunakan subquery agar mendapatkan hasil yang diinginkan dengan kode yang lebih rapi. Selain itu subquery juga berguna untuk proses selanjutnya, yaitu penggunaan fungsi MID(). Kode untuk mengambil nilai kedua dan ketiga :
.

SELECT m.*,
  mid(idnomor,if( pos1>0, pos1+1,0),if(pos2>0,pos2-pos1-1,fLen)) as id2_c,
  mid(idnomor,if( pos2>0, pos2+1,fLen+1)) as id3_c
FROM
  (SELECT idnomor, 
  ...

.

Dengan fungsi MID dan field pos1, pos2, dan fLen serta fungsi IF kita memperoleh nilai-nilai kedua dan ketiga. Selanjutnya kita lakukan subquery lagi agar nilai dari id2_c dan id3_c dapat dikonversi menjadi id2_i dan id3_i. Tanpa subquery tetap dapat nilai yang diinginkan hanya saja kita akan memanggil kode untuk mencari nilai id2_c sebanyak dua kali lalu mengkonversi-nya. Jika sudah semua selanjutnya lakukan pengurutan seperti berikut :
.

ORDER BY
  id_i,  id_c,
  id2_i, id2_c,
  id3_i, id3_c

.

Berikut hasil yang akan diperoleh :
Gambar 3. Hasil akhir

Akhir kata, Happy Coding! :D

- krofz

Friday, 6 June 2014

Mengurutkan data pada MySQL


Dalam program database mengurutkan data adalah sesuatu yang wajib. Dalam bahasa SQL , kata kunci yang digunakan adalah "ORDER BY". Contoh :
.

/*queri 1*/
SELECT * FROM mytable m ORDER BY idnomor ASC

/*queri 2*/
SELECT * FROM mytable m ORDER BY idnomor DESC

.
Pada contoh ini data type untuk field idnomor adalah integer. Queri 1 akan mengurutkan secara Ascending (ASC) yaitu dimulai dari yang terkecil. Sedangkan Descending (DESC) kebalikannya ASC dimulai dari yang terbesar. Secara default jika kita tidak menambahkan ASC atau DESC maka pengurutan akan secara ascending. Pada contoh diatas field idnomor bertipe INTEGER yaitu bilangan bulat, lalu bagaimana jika bertipe string (VARCHAR)? Perhatikan contoh berikut :
.

data pada idnomor

id nomor
--------
1
2
3
4
5
6
7
8
9
10

selanjutnya kita urutkan dengan menggunakan queri 1 diatas. Hasilnya akan seperti berikut :

1
10
2
3
4
5
6
7
8
9

.

Gambar 1. Pengurutan pada tipe data string (VARCHAR)

Perhatikan bahwa ID dengan nomor 10 menempati nomor urut kedua setelah angka 1. Ini karena pengurutan berdasarkan string atau karakter dimana 10 lebih dulu dari 2. Program membaca karakter pertama terlebih dahulu lalu dilanjutkan dengan karakter selanjutnya. Untuk itu kita perlu perbaiki queri kita agar didapat hasil yang diinginkan. Dalam hal ini kita perlu mengkonversi string menjadi integer, berikut querinya :
.

SELECT idnomor, CAST(idnomor as signed) as nourut
FROM mytable m order by nourut ASC

.

Gambar 2. Konversi tipe data untuk pengurutan

Fungsi CAST akan mengubah tipe data idnomor sesuai tipe yang diinginkan, dalam hal ini adalah signed integer (signed = bilangan bulat dengan nilai negatif dan positif). Berikut ini tipe yang didukung oleh MySQL :
  • BINARY[(N)]
  • CHAR[(N)]
  • DATE
  • DATETIME
  • DECIMAL[(M[,D])]
  • SIGNED [INTEGER]
  • TIME
  • UNSIGNED [INTEGER]
Sekarang kita ubah sedikit data pada table kita menjadi :
.

1
10
2
2a
2c
22d
6
2h
8
9

hasil yang akan diperoleh dengan queri : 
SELECT idnomor, cast(idnomor as signed) as nourut
FROM mytable m order by nourut ASC

1
2h
2c
2a
2
6
8
9
10
22d

.

Perhatikan bahwa 2h lebih dulu daripada 2c atau 2a. Hal ini terjadi karena saat konversi tipe data dari string ke integer, MySQL mengabaikan karakter selanjutnya jika menemukan karakter selain angka (0-9). Sehingga 2h, 2c, dan 2a dianggap memiliki nomor urut 2, hasil yang ditampilkan mungkin memiliki nomor urut yang berbeda misal 2c dulu atau 2a terlebih dahulu. Untuk memperbaiki queri kita tambahkan urutan order menjadi :
.

SELECT idnomor, cast(idnomor as signed) as nourut
FROM mytable m order by nourut DESC, idnomor ASC

.

Gambar 3. Mengurut 2 field

Kita juga dapat mengurutkan dengan masing-masing ketentuan, contoh urutan field pertama secara ascending lalu yang kedua descending dst. Selanjutnya kita lanjutkan pengurutan untuk data dengan format tertentu, contoh data yang ada :
.

data dalam field idnomor, table myTable :

2.8.3
10
2.24
22d
2.1a
2.10c
2h
2.8
2.8.50
2.8.25

hasil yang diperoleh jika menggunakan queri sebelumnya : 

2.10c
2.1a
2.24
2.8
2.8.25
2.8.3
2.8.50
2h
10
22d

.

Gambar 4. Pengurutan pada format data tertentu


Hal ini terjadi karena setelah konversi string ke angka, pengurutan selanjutnya berdasarkan string. Untuk mengakali-nya kita perlu string setelah titik sebagai urutan selanjutnya. Berikut querinya :
.

SELECT idnomor, cast(idnomor as signed) as nourut,
substring_index(substring_index(idnomor,'.',2),'.',-1) as nourut2
FROM mytable m order by nourut, idnomor, nourut2

.

Substring_index akan mengambil nilai pada parameter pertama (idnomor), lalu mencari karakter/string yang diinginkan pada parameter kedua ('.'), selanjutnya pada parameter ketiga diisi dengan berapa banyak kata yang diinginkan, dalam hal ini 2 kata yaitu sebelum dan sesudah titik. Akhir kata, Happy Coding! :D

- krofz

Tuesday, 22 April 2014

Download Code Blocks v13.12

Logo Code::Blocks v13.12

Code::Blocks versi 13.12 telah hadir sejak Desember 2013 , berikut ini link download dari situs resminya :
  1. Download Page (Binary and Source Code)
  2. Download Binary Only (All System)
  3. Download Binary (Setup) for Windows 2000 / XP / Vista / 7 
  4. Download Binary (Setup) for Linux & Mac
Bagi anda pengguna sistem operasi Windows silahkan download melalui link nomor 3. Untuk fitur standar silahkan download dengan bundling compiler MinGW , yaitu file codeblocks-13.12mingw-setup.exe , ukuran 97.9 MB. Untuk log perubahan yang terjadi pada versi ini dari versi sebelumnya dapat dilihat melalui link berikut Changelog. Untuk para pengguna Linux atau Mac dapat mengklik link nomor 4.

* Catatan : link diatas akan mengarahkan kesitus resmi Code::Blocks, jika terdapat versi terbaru maka di link diatas akan menampilkan versi terbaru tersebut selain v13.12

Jika website resmi CB bermasalah atau anda ingin mendownload versi 13.12 dapat melalui link MediaFire yang telah saya upload (bebas virus :D ). Catatan : file tersebut dikompres dengan format (.7z), anda dapat mengekstrak dengan aplikasi arsip seperti 7zip atau sejenisnya.

- Krofz

Friday, 4 April 2014

Kedalaman dua atau lebih jenis Objek (2)



Yang perlu diperhatikan adalah saat pengambilan koordinat pada sumbu Y, perhatikan gambar berikut :
Gambar. A) urutan bermasalah, B) urutan yang benar.


Dapat dilihat pada gambar diatas bahwa pada huruf A, bola berwarna biru berada didepan bola berwarna hijau. Itu berarti bola hijau ditampilkan lebih dahulu lalu dilanjutkan dengan bola biru. Pada gambar diatas bola biru berada pada koordinat Y = 75 dan bola hijau = 50. Hal ini wajar karena program menampilkan objek dimulai dengan sumbu Y terkecil. Perlu diperhatikan! semakin kebawah nilai sumbu Y semakin bertambah (positif) berbeda dengan Koordinat Kartesius pada Matematika . Karena pada kode kita sebelumnya, pengurutan dimulai dari yang terkecil, sehingga perlu perbaikan agar tampak seperti kondisi B pada gambar diatas. Eitss tenang dulu kita tidak menampilkannya dari yang terbesar dahulu, lalu? lihat solusi berikut.

Solusinya dengan menambahkan tinggi objek tersebut saat pengambilan nilai Y untuk variabel LowY atau Y terendah (penamaannya hanya istilah dengan pandangan semakin kebawah objeknya semakin rendah Y-nya walaupun pada program nilai Y bertambah :P). Sehingga didapat pada contoh diatas koordinat Y bola biru = 120, dan koordinat Y bola hijau = 140. Atau dapat juga menampilkan objek dengan menggunakan koordinat sebenarnya saat pengambilan nilai Y tanpa menambahkan tinggi, tetapi saat menampilkan objek posisi gambar diletakkan pada sumbu Y dikurang tinggi. Akhir kata, happy coding! :D

- krofz

Wednesday, 12 March 2014

Kedalaman dua atau lebih jenis Objek


Tulisan ini merupakan lanjutan dari:
Kedalaman sebuah Objek


Sebelumnya kita telah membuat proses untuk mengurutkan objek berdasarkan ketinggiannya (sumbu Y) bukan berdasarkan urutan indeks pada array. Dan proses tersebut hanya melibatkan 1 jenis class. Kali ini kita akan membuat untuk 2 class yang berbeda dan dapat diterapkan juga untuk 3 atau lebih class yang berbeda. Untuk mempermudah pengurutan kita harus mempersiapkan dahulu sebuah data struktur, berikut potongan kodenya :
struct sUrut
{
    //menyimpan nilai array
    int indeks;

    //koordinat terendah titik Y
    int lowY;

    int Jenis;
};


Dengan struktur diatas kita akan memperoleh nomor indeks array objek, lowY atau koordinat Y-nya, dan jenis objek tersebut contoh class Mobil diberi nomor jenis = 1, Gedung = 2, dst. Berbeda dengan kode sebelumnya (lihat artikel sebelumnya) yang hanya memanfaatkan array 2 dimensi. Selanjutnya untuk menggunakan tipe data sUrut ini caranya sangat mudah, perhatikan potongan kode berikut :
...
#define MAX_GEDUNG     60
#define MAX_MOBIL      20

#define OBJEK_MOBIL     1
#define OBJEK_GEDUNG    2

class cGedung
{
   ...
};

class cMobil
{
   ...
};

int main(){
   ...
   // start proses rendering gambar
   std::vector<sUrut> urutan;

   for(int i = 0; i < MAX_GEDUNG;i++)
   {
      sUrut temp_;
      temp_.indeks = i;
      temp_.Jenis = OBJEK_GEDUNG;
      temp_.lowY = Gedung[i].getY();
      urutan.push_back(temp_);
   }

   for(int i = 0; i < MAX_MOBIL;i++)
   {
      sUrut temp_;
      temp_.indeks = i;
      temp_.Jenis = OBJEK_MOBIL;
      temp_.lowY = Mobil[i].getY();
      urutan.push_back(temp_);
   }
   
   //melakukan pengurutan dengan Bubble Sort
   for(int i=0;i < urutan.size();i++)
   {
      for(int j=i;j < urutan.size();j++)
      {
         if( urutan[i].lowY > urutan[j].lowY)
         {
            //temp_ = temporary , variabel sementara
            int temp_;
            temp_ = urutan[i].indeks;
            urutan[i].indeks = urutan[j].indeks;
            urutan[j].indeks = temp_;

            temp_ = urutan[i].lowY;
            urutan[i].lowY = urutan[j].lowY;
            urutan[j].lowY = temp_;

            temp_ = urutan[i].Jenis;
            urutan[i].Jenis = urutan[j].Jenis;
            urutan[j].Jenis = temp_;
         }
      }
   }

   //tahap terakhir menampilkan objek sesuai nilai urutan.
   for(int i = 0; i < urutan.size();i++)
   {
      switch( urutan[i].Jenis)
      {
         case OBJEK_GEDUNG: Gedung[urutan[i].indeks].tampil(screen); break;
         case OBJEK_MOBIL: Mobil[urutan[i].indeks].tampil(screen); break;
         default:;
      }
   }
   // akhir proses rendering gambar 
   ...
}


Potongan kode diatas hanya menampilkan ilustrasi atau tampilan kode yang harus digunakan. Objek yang dipakai sesuai dengan program yang anda buat, contoh pada game yang anda buat terdapat Hewan, Dekorasi (Meja, dll) dapat disesuaikan dengan kode. Sementara pada contoh diatas menggunakan objek Gedung dan Mobil. Selanjutnya dengan pengunaan std::vector lebih mempermudah kita dalam menyimpan banyaknya objek dalam hal ini MAX_GEDUNG + MAX_MOBIL , yaitu 60 + 20 = 80. Sampai disini proses yang dibutuhkan telah selesai. Jika anda masih kesulitan dalam memahami kode diatas, artikel selanjutnya saya akan coba jelaskan setiap barisnya :D . Akhir kata Happy Coding!

- Krofz

Tuesday, 18 February 2014

Kedalaman sebuah Objek

Hell yeah! sudah tahun 2014 aja, tepatnya udah bulan Februari 2014 wahahaha. Tak terasa memang waktu berjalan begitu cepat.

Nah, kali ini kita melakukan beberapa teknik dalam menampilkan sebuah objek, untuk itu perhatikan kedua gambar berikut :

Gambar. Kedalaman Objek

Yup, kedalaman (Depth) yang dimaksud adalah bagaimana objek diletakkan terlebih dahulu pada program 2D. Contoh kita memiliki 10 objek gedung yang akan kita letakkan pada layar. Umumnya jika objek disimpan pada array maka kita akan menampilkan dari 0-9 secara berurutan. Masalah akan timbul jika yang ditampilkan tidak beraturan posisi Y / ketinggiannya. Seperti pada gambar diatas pada gambar berhuruf A, dimana objek gedung (seolah-olah yah hahaha xD ) ditampilkan secara berurutan sesuai indeks array, sedangkan posisinya selanjutnya mungkin ada yang lebih atas atau lebih bawah tidak beraturan sehingga akan tampil acak-acakan.

Lalu perhatikan lagi gambar diatas pada gambar huruf B, dimana objek tampak lebih rapi dan mulai tampak perspektif sebuah perkotaan yang dilihat dari atas gunung (oh yeah! :P ). Jika biasanya kode yang digunakan seperti berikut (Potongan kode) :

#define MAX_BOX 50

int main( int argc, char** argv)
{
    std::vector<Kotak> A;
    for(int i = 0; i<MAX_BOX;i++)
    {
        //inisialisasi kotak A sebanyak MAX_BOX
    }
    
    //loop utama
    while(!done){
        ...
        //menampilkan kotak A sebanyak MAX_BOX
        for(int i = 0; i<MAX_BOX;i++)
        {
            A[i].tampil(screen);
        }
    }
}
Maka kita perlu menambahkan beberapa proses agar objek yang ditampilkan berurutan sesuai posisi ketinggian, yaitu yang lebih rendah ditampilkan lebih dahulu (dari atas lalu kebawah, karena semakin kebawah nilai y semakin besar). Variabel yang diperlukan array yang akan menampung urutan objek. Berikut ini potongan kodenya :

#define MAX_BOX 50

int main( int argc, char** argv)
{
    std::vector<Kotak> A;
    for(int i = 0; i<MAX_BOX;i++)
    {
        //inisialisasi kotak A sebanyak MAX_BOX
    }
    
    //loop utama
    while(!done){
        ...
        const int NO_ = 0, Y_ = 1;
        int Urutan[MAX_BOX][2];

        //mengumpulkan data posisi Y dan nomor urut
        for(int i = 0; i < MAX_BOX;i++)
        {
            Urutan[i][NO_] = i;
            Urutan[i][Y_] = A[i].getY();
        }

        //melakukan pengurutan dengan Bubble Sort
        for(int i=0;i < MAX_BOX;i++)
        {
            for(int j=i;j < MAX_BOX;j++)
            {
               if(Urutan[i][Y_] > Urutan[j][Y_])
               {
                   int temp_;
                   temp_ = Urutan[i][NO_];
                   Urutan[i][NO_] = Urutan[j][NO_];
                   Urutan[j][NO_] = temp_;

                   temp_ = Urutan[i][Y_];
                   Urutan[i][Y_] = Urutan[j][Y_];
                   Urutan[j][Y_] = temp_;
               }
            }
        }

        //tahap terakhir menampilkan objek sesuai nilai urutan.
        for(int i = 0; i < MAX_BOX;i++)
        {
            A[Urutan[i][NO_]].tampil(screen);
        }
    }
}


Akhirnya objek yang tampil lebih rapi. So, Happy Coding!

- Krofz
 

back to top

back to top