Saturday, 30 March 2013

SQL : Date Range Query



Salah satu tipe data yang paling banyak dijumpai pada database adalah tipe data DATE. Untuk itu kita akan membahasa sedikit query yang menggunakan tipe data Date. Kita hanya akan membahas untuk Database (DB) Access dan MySQL. Dan berikut ini query-query untuk mengambil data dalam jarak waktu tertentu (Penulisan query SQL tidak case sensitive, jadi dapat ditulis dengan huruf besar atau kecil) :


1. Jika ingin mengambil data pada tanggal tertentu , misal 1-Januari 2012 sampai 15-Juli-2012 pada DB Access:
SELECT * FROM myTable WHERE CDATE(Tanggal) BETWEEN #01/01/2012# AND #07/15/2012#
Dengan format # Bulan / Hari / Tahun # . Pada MySQL :
SELECT * FROM myTable WHERE DATE(Tanggal) BETWEEN '2012-01-01' AND '2012-07-15'
Sedikit berbeda untuk fungsi yang digunakan yaitu Date() dan format tanggal yang digunakan 'Tahun - Bulan - Hari' .


2. Jika ingin mengambil data sesuai bulan tertentu dan tahun tertentu, misal bulan Desember 2012 pada DB Access dan juga MySQL:
SELECT * FROM myTable WHERE MONTH(Tanggal) = 12 AND YEAR(Tanggal) = 2012
Dapat juga mencari pada bulan tertentu tanpa memperdulikan tahun dengan menghapus pencarian pada fungsi Year(). Untuk pencarian hari gunakan fungsi Day(), contoh :
SELECT * FROM myTable WHERE DAY(Tanggal) = 5 AND MONTH(Tanggal) = 12 AND YEAR(Tanggal) = 2012
Pencarian untuk tanggal 5.


3. Jika ingin mencari dari bulan tertentu contoh dari Februari sampai Agustus pada tahun 2011, dapat menggunakan query berikut:
SELECT * FROM myTable WHERE MONTH(Tanggal) >= 2 AND MONTH(Tanggal) <= 8 AND YEAR(Tanggal) = 2011
Bagaimana jika ingin mencari dari bulan Agustus 2011 sampai Februari 2013? Apakah kode berikut berfungsi?
SELECT * FROM myTable WHERE MONTH(Tanggal) >= 2 AND MONTH(Tanggal) <= 8 AND YEAR(Tanggal) >= 2011 AND YEAR(Tanggal) <= 2013
Query diatas memang berjalan tetapi tidak akan menampilkan data pada bulan 1 (Jan), dan 9 (Sep) sampai 12 (Des). Jika menggunakan BETWEEN jarak tanggal yang dicari harus sesuai, contoh pada MySQL:
SELECT * FROM myTable WHERE DATE(Tanggal) BETWEEN '2011-08-01' AND '2013-02-28'
Untuk tanggal awal (contoh diatas 2011-08-01), kita dapat menginisialisasi 1 pada hari. Dan untuk tanggal akhir pencarian, terkadang kita bingung menentukan hari akhirnya , contoh tanggal 30 atau 31. Jika terdapat data pada tanggal 31 dan kita mengatur hanya sampai tanggal 30 tentu hasilnya tidak sesuai dengan yang kita inginkan. Untuk itu kita perlu memodifikasinya menjadi seperti berikut :
SELECT * FROM myTable WHERE (DATE(Tanggal) BETWEEN '2011-08-01' AND '2013-02-28') or (MONTH(Tanggal) = 2 AND YEAR(Tanggal) = 2013)


Semoga saja nanti bisa membuat game dengan memanfaatkan database seperti ini, hehehehe. :D ~

- krofz

Thursday, 7 March 2013

DirectX 9 : Program Sederhana (Part II)



Tulisan ini merupakan lanjutan dari:
DirectX 9 : Program Sederhana (Part I)


Ada sedikit ralat untuk pengaturan pada bagian Search Directories -> Linker . Jika sistem yang digunakan berbasis 32bit maka gunakan folder 'x86' sedangkan pada sistem 64bit gunakan folder 'x64' . Menambahkan keduanya tidak masalah yang penting posisi folder yang dicari sesuai, misal pada sistem 32bit posisi folder 'x86' berada di posisi paling atas. Pada dasarnya kita menunjuk kompiler untuk mencari file library (.lib) yang sesuai.

Gambar 1. Pengaturan pada sistem 32 bit (x86)

Tambahkan kode berikut setelah header windows:
#include <windows.h> //header direct3d #include <d3d9.h> #include <d3dx9.h> #define SCREEN_LEBAR 640 #define SCREEN_TINGGI 480 const char gClassName[] = "myWindowClass"; //variabel device LPDIRECT3D9 d3d; //Long pointer (LP) Direct 3D (d3d) LPDIRECT3DDEVICE9 d3ddev; //d3ddev = Direct 3D Device //prototipe fungsi void aturDevice(HWND jendela); void prosesRender(); void Bersihin();
Pertama kita membuat long pointer (LPDIRECT3D9) untuk membuat class iDirect3D9. Selanjutnya variabel device yang menampung informasi tentang driver grafis, kartu video, dan segala sesuatu yang berkaitan dengan grafis pada sisi hardware. Karena menyimpan semua informasi, segala pengaturan (setup) dan rendering melalui variabel ini. Selanjutnya membuat prototipe fungsi yang memudahkan kita. Lalu tambahkan implementasi fungsi-fungsi tersebut dimanapun anda suka, yang penting rapi dan sesudah variabel dan fungsi global. Karena kalau diletakkan sebelum variabel dan fungsi global tersebut pasti error hahaha. Selanjutnya letakkan 'aturDevice' sebelum proses main loop untuk inisialisasi awal, 'prosesRender' di dalam main loop, dan fungsi 'Bersihin' setelah main loop :
... aturDevice(hWnd); // enter the main loop! while(TRUE) { while(PeekMessage(&msg, NULL,0,0, PM_REMOVE)) //PeekMessage(∓msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } if(msg.message == WM_QUIT) break; prosesRender(); } Bersihin(); ...
Berikut ini isi didalam fungsi tersebut :
void aturDevice(HWND jendela) { d3d = Direct3DCreate9( D3D_SDK_VERSION); D3DPRESENT_PARAMETERS dxpp; //pp = Present Paramater if( d3d == NULL){ ::MessageBox(jendela,"DirectX runtime library tidak diinstal dengan baik!", "System Error", MB_ICONEXCLAMATION | MB_OK); } ZeroMemory(&dxpp, sizeof(dxpp)); // clear out the struct for use dxpp.Windowed = TRUE; // program windowed, not fullscreen dxpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // hapus frames lama dxpp.hDeviceWindow = jendela; // mengatur agar jendela mengunakan Direct3D // membuat device class d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, jendela, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &dxpp, &d3ddev); } void prosesRender() { //membersihkan layar dan menutupinya dengan warna biru d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 40, 100), 1.0f, 0); //memulai proses rekam gambar d3ddev->BeginScene(); //mengakhiri proses rekam gambar d3ddev->EndScene(); //menampilkan semua proses yang telah selesai ke layar d3ddev->Present(NULL, NULL, NULL, NULL); } void Bersihin() { //menutup dan melepaskan memory yang //dipakai pada d3d dan d3ddev if (d3d){ d3d->Release(); d3d = NULL; } if (d3ddev){ d3ddev->Release(); d3ddev = NULL; } }
Agar program dapat berjalan dengan baik, kita harus menyertakan versi SDK yang sesuai melalui '3d = Direct3DCreate9(D3D_SDK_VERSION);' pada program kita. Tujuannya agar kompatibel pada mesin/komputer yang lain, jika komputer lain memiliki versi yg lebih tinggi, mereka akan mencoba mencari versi (sebelumnya) yg sesuai dengan versi SDK yang digunakan program kita. Bagaimana kalau versinya lebih rendah? kita harus menyertakan runtime directX terbaru, tetapi tentu dengan batasan sistem yang gunakan, misal DirectX 10 atau 11 tidak memungkinan untuk digunakan pada Windows XP apalagi Windows 98 . D3DPRESENT_PARAMETERS adalah struct yang akan berisi informasi tentang perangkat grafis. ZeroMemory akan menginisialisasi seluruh isi dxpp menjadi NULL. Lalu dxpp.Windowed = TRUE , berfungsi agar program kita tidak full screen. Masukkan FALSE jika ingin menjadi full screen. Tapi tunggu dulu, jika anda langsung merubahnya menjadi FALSE maka program akan crash atau gagal, dikarenakan pengaturan yang lain tidak sesuai untuk fullscreen. Sehingga perlu beberapa pengaturan tambahan, yaitu pada :
//di dalam fungsi aturdevice dxpp.hDeviceWindow = jendela; // mengatur agar jendela mengunakan Direct3D //tambahan untuk fullscreen dxpp.BackBufferFormat = D3DFMT_X8R8G8B8; // mengatur format back buffer menjadi 32-bit dxpp.BackBufferWidth = SCREEN_LEBAR; // mengatur lebar buffer dxpp.BackBufferHeight = SCREEN_TINGGI; // mengatur tinggi buffer ... //di dalam fungsi main //sembuyikan warna background pada jendela sebelumnya (Win32) //karena sudah ditutupi oleh directx (lihat fungsi 'prosesRender') //wc.hbrBackground = (HBRUSH)COLOR_WINDOW; //boleh dihapus hWnd = CreateWindowEx(NULL, gClassName, "Proses Belajar", //ubah pada bagian ini // fullscreen, tanpa adanya border program dan tombol X / silang WS_EX_TOPMOST | WS_POPUP, 0, 0, SCREEN_LEBAR, SCREEN_TINGGI, NULL, NULL, hInstance, NULL); ...
Salah satu fungsi yang sangat penting, yaitu CreateDevice(), prototipe fungsi : //prototipe HRESULT CreateDevice( UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow, DWORD BehaviorFlags, D3DPRESENT_PARAMETERS *pPresentationParameters, IDirect3DDevice9 **ppReturnedDeviceInterface); // membuat device class d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, jendela, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &dxpp, &d3ddev);
Fungsi ini akan membuat kelas baru yang akan menangani kebutuhan grafis dan menyediakan hampir seluruh fungsi yang akan digunakan pada Direct3D. Parameter pertama diisi dengan grafis adapter yang akan digunakan, dalam hal ini default grafis card kita, parameter kedua berfungsi agar program memproses dari sisi Hardware, jika tidak ada masalah. Parameter ketiga diisi dengan jendela hWnd, parameter keempat adalah metode pemrosesan 3D, kita menggunakan metode pemrosesan dengan software. Parameter kelima kita isi dengan dxpp, parameter keenam menunjuk pointer d3ddev. Pengaturan awal telah berjalan sempurna maka kita mulai proses renderingnya. Tekan tombol Escape untuk keluar dari program. Sebelum program benar-benar tertutup kita harus pastikan semuanya sudah dibersihkan. Untuk penjelasan kodenya silahkan lihat pada bagian komentar pada masing-masing kode .

Jika sudah semua compile dan jalankan, seharusnya program akan menampilkan jendela dengan warna biru gelap. Semakin seru, jadi tunggu artikel selanjutnya. Akhir kata Happy Coding!

- krofz
 

back to top

back to top