Arsip Bulanan: Januari 2008

Menampilkan CheckBox di DBGrid

type
TForm1 = class(TForm)
DBGrid1: TDBGrid;
procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
procedure DBGrid1CellClick(Column: TColumn);
procedure DBGrid1ColEnter(Sender: TObject);
procedure DBGrid1ColExit(Sender: TObject);
procedure SaveBoolean;
private
{ Private declarations }
FOriginalOptions : TDBGridOptions;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.SaveBoolean;
begin
DBGrid1.SelectedField.Dataset.Edit;
DBGrid1.SelectedField.AsBoolean := not Self.DBGrid1.SelectedField.AsBoolean;
end;
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
Const
CtrlState : array[Boolean] of Integer = (DFCS_BUTTONCHECK,
DFCS_BUTTONCHECK or DFCS_CHECKED);
var
CheckBoxRectangle : TRect;
begin
if Column.Field.DataType = ftBoolean then
begin
DBGrid1.Canvas.FillRect(Rect);
CheckBoxRectangle.Left := Rect.Left + 2;
CheckBoxRectangle.Right := Rect.Right – 2;
CheckBoxRectangle.Top := Rect.Top + 2;
CheckBoxRectangle.Bottom := Rect.Bottom – 2;
DrawFrameControl(DBGrid1.Canvas.Handle,
CheckBoxRectangle,
DFC_BUTTON,
CtrlState[Column.Field.AsBoolean]);
end;
end;
procedure TForm1.DBGrid1ColEnter(Sender: TObject);
begin
if DBGrid1.SelectedField.DataType = ftBoolean then
begin
Self.FOriginalOptions := DBGrid1.Options;
DBGrid1.Options := DBGrid1.Options – [dgEditing];
end;
end;

procedure TForm1.DBGrid1ColExit(Sender: TObject);
begin
if DBGrid1.SelectedField.DataType = ftBoolean then
DBGrid1.Options := Self.FOriginalOptions;
end;

procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
if DBGrid1.SelectedField.DataType = ftBoolean then
SaveBoolean();
end;

Merubah backgroung pada Form MDI Parent

Caranya yaitu dengan menggunakan intersepsi dari messages WM_ERASEBKGND, WM_VSCROLL dan
WM_HSCROLL dan dibawa pada penggambaran area oleh prosedur DrawImage atau procedure InValidateRect.
Pada procedure CreateWnd digunakan prosedur SetWindowLong untuk instalasi prosedur baru pada window.
Jangan lupa untuk menghilangkan baris :

Application.CreateForm(TForm2, Form2)

dari file proyek dan baris :

var Form2: TForm2

dari file unit2.pas

type
TForm1 = class(TForm)
//  …
private
{ Private declarations }
public
procedure ClientWndProc(var Message: TMessage);
procedure DrawImage;
{ Public declarations }
protected
procedure CreateWnd; override;
end;

var
Form1: TForm1;
NewClient, OldClient: TFarProc;
MyDC: hDC;

implementation

uses unit2;

{$R *.DFM}

procedure TForm1.CreateWnd;
begin
inherited CreateWnd;
NewClient:=MakeObjectInstance(ClientWndProc);
OldClient:=Pointer(GetWindowLong(ClientHandle, GWL_WNDPROC));
SetWindowLong(ClientHandle, GWL_WNDPROC, LongInt(NewClient));
end;

procedure TForm1.DrawImage;
{ Membuat tile image pada daerah form client }
var
i, j: Integer;
WndRect, ImageRect: TRect;
Rows, Cols: Integer;
begin
GetWindowRect(ClientHandle, WndRect);
ImageRect:=Image1.ClientRect;
Rows:=WndRect.Bottom div ImageRect.Bottom;
Cols:=WndRect.Right div ImageRect.Right;
with Image1 do
for i:=0 to Rows+1 do
for j:=0 to Cols+1  do
BitBlt(MyDC,j*Picture.Width,i*Picture.Height,Picture.Width,
Picture.Height,Picture.Bitmap.Canvas.Handle,0,0,SRCCOPY);
end;

procedure TForm1.ClientWndProc(var Message: TMessage);
begin
case Message.Msg of
WM_ERASEBKGND:
begin
CallWindowProc(
OldClient,
ClientHandle,
Message.Msg,
Message.wParam,
Message.lParam);
MyDC:=TWMEraseBkGnd(Message).DC;
DrawImage;
Message.Result:=1;
end;
WM_VSCROLL,WM_HSCROLL:
begin
Message.Result:=
CallWindowProc(
OldClient,
ClientHandle,
Message.Msg,
Message.wParam,
Message.lParam);
InvalidateRect(ClientHandle,nil,True);
end;
else
Message.Result:=
CallWindowProc(
OldClient,
ClientHandle,
Message.Msg,
Message.wParam,
Message.lParam);
end;
end;

Konversi Desimal ke Biner

Sekarang kita akan menyajikan suatu fungsi sederhana yaitu mengkonversi dari bilangan desimal ke ke bilangan biner dengan menggunakan Borland Delphi. Silakan lihat fungsi di DecToBinStr berikut ini.

function TForm1.DecToBinStr(bil: integer): string;
var
str : string;
i : integer;
negative: Boolean;
begin
if bil < 0 then
negative := true;
bil:= abs(bil);
for i:= 1 to SizeOf(bil) * 8 do
begin
if bil < 0 then
str := str + ’1′
else
str := str + ’0′;
bil := bil shl 1;
end;
delete(str,1,pos(’1′,str)-1);
if negative then str := ‘-’ + str;
result := str;
end;

Konversi dari ShortDate String ke LongDate String Format

Bila saya mempunyai format tanggal pendek (ShortDate) dalam tipe String (mis: 02/05/2006), maka saya akan menggunakan function berikut untuk mengkonversinya ke format tanggal panjang (LongDate) dalam tipe String:

function LongDate(sDate: String): String;
var
tTanggal: TDateTime;
wTgl, wBln, wThn: Word;
begin
ShortDateFormat := ‘dd/mm/yyyy’;
tTanggal := StrToDate(sDate);
DecodeDate(tTanggal,wThn,wBln,wTgl);
tTanggal := EncodeDate(wThn, wBln, wTgl);
Result := FormatDateTime(‘dddd, d mmmm yyyy’, tTanggal);
end;

Sehingga dari “02/05/2006″ setelah dikonversi akan menghasilkan bentuk tanggal seperti: “Selasa, 2 Mei 2006″.

Fungsi untuk menghapus separator ribuan

// fungsi untuk menghapus separator ribuan
// sebelum data diconvert menjadi angka, pastikan
// sudah tidak ada separator ribuan
function RemSeparator(const Text: string;
Separator: Char): string;
var
i: integer;
s: string;
begin
s := Text;
for i := 1 to Length(Text) do
if s[i] = Separator then Delete(s, i, 1);
Result := s;
end;

procedure TFFormatDuit.Edit1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
// ubah data dari teks menjadi float, dan ubah kembali dari float dengan
// teks yang udah berformat
procedure ConvertData;
begin
if Edit1.Text = ” then Edit1.Text := ’0′;
Edit1.Text := FormatFloat(‘#,##0.00′, StrToFloat(RemSeparator(Edit1.Text,’,’)));
end;
var
i: Integer;
begin
// ubah data, dan kemudian letakkan data pada sel paling akhir
// dari kotak edit sehingga pengisian berupa right align
if Key in [96..105,110] then begin
ConvertData;
i := Pos(decimalseparator,Edit1.Text);
if (i>0) then
if Key = 110 then
Edit1.SelStart := i else
Edit1.SelStart := i – 1;
end;
end;

procedure TFFormatDuit.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
// pastikan data yang dimasukkan selalu benar
// tidak boleh huruf
case Key of
’0′..’9′  : Next;
‘,’       : Next;
else
Key := #0
end;
end;

Cetak Struk

Procedure Cetak(Const line: string );
Var
BytesWritten: DWORD;
hPrinter, DevMod: THandle;
DocInfo: TDocInfo1; //tipe data record dalam unit WinSpool
Device, Drv, Port:Array[0..255] of char;
Begin
Printer.PrinterIndex:=-1;
Printer.GetPrinter(Device, Drv, Port, DevMod);
If not WinSpool.OpenPrinter(@Device, hPrinter, nil) Then //tidak pake @ juga bisa
raise exception.create(‘Printer tidak ada…’);
Try
DocInfo.pDocName := ‘Struk Penjualan’;
DocInfo.pOutputFile := Nil;
DocInfo.pDatatype := ‘RAW’;
If StartDocPrinter(hPrinter, 1, @DocInfo) = 0 Then
Abort;
Try
If not StartPagePrinter(hPrinter) Then
Abort;
try
//pertimbangkan untuk mencetak dengan Printer.Canvas agar font bisa diganti
If not WritePrinter(hPrinter, @line[1], Length(line), BytesWritten)
Then
Abort;
Finally
EndPagePrinter(hPrinter);
End;
Finally
EndDocPrinter(hPrinter);
End;
Finally
WinSpool.ClosePrinter(hPrinter);
End;
End;

{Penggunaan}
Procedure CetakSlip;
Const Enter = #13+#10;
begin
with DM do begin
Cetak(Modul.tCompanyNama.AsString+Enter);
Cetak(Modul.tCompanyBisnis.AsString+Enter+Enter);
tJualBeliDetil.First;
While not tJualBeliDetil.Eof do begin
Cetak(tJualBeliDetilluNama.AsString+Enter);
Cetak(tJualBeliDetilQty.AsString+’ x ‘+
tJualBeliDetilHarga.AsString+’ = ‘+
tJualBeliDetilclJumlah.AsString+Enter);
tJualBeliDetil.Next;
end;
Cetak(‘————————–’);
Cetak(‘Jumlah       ‘+tJualBeliJumlah.AsString+Enter+Enter);
Cetak(‘Terima kasih atas kunjungan Anda’);
end;
end;

{Rata Kanan}
function FormatString(const VField, VItem : String; const VLength: Integer; const VSpace: Char): String;
Var
__SStart : String;
__SStop : String;
__Length : LongInt;
Begin
__SStart:=VField;
__SStop:=VItem;
__Length:=Length(__SStart)+Length(__SStop);
Result:=”;
While __Length+Length(Result)<VLength Do
Result:=Result+vspace;
Result:=__SStart+Result+__SStop;
end;

Backup-Restore Data di MySQL

Sebagai seorang DBA, backup merupakan pekerjaan wajib yang harus dilakukan sewaktu-waktu untuk menjaga keberadaan dan keamanan (dalam hal ini keutuhan) data-data yang tersimpan dalam database. Hal ini tentu dilakukan untuk menghindari kejadian-kejadian yang tidak diinginkan; yang mungkin tidak dapat kita prediksikan sebelumnya. Seberapa sering kita harus melakukan backup tentu tergantung dari kebutuhan database yang kita olah. Sebagai contoh, apabila kita mengolah database untuk kepentingan pemberitaan, mungkin kita perlu melakukan backup data per hari (sering disebut dengan backup harian atau daily backup). Namun untuk kebutuhan data-data tertentu yang perubahan datanya tidak terlalu sering, mungkin juga kita hanya perlu untuk melakukan backup secara rutin pada setiap pekan, atau bahkan setiap bulan.

Bila dibandingkan dengan proses backup dan restore data di Oracle, proses backup dan restore di MySQL ‘mungkin’ dapat dikatakan jauh lebih sederhana. Pasalnya, di sini kita tidak perlu direpotkan dengan melakukan hal-hal lain yang biasa kita lakukan di dalam Oracle, seperti: melakukan penyalinan (copy) datafile, control file, dan redo log file.

Dalam MySQL sendiri, terdapat beberapa cara yang dapat digunakan untuk melakukan roses backup dan restore, diantaranya adalah sebagai berikut:

  • · Untuk proses Backup
  1. Menggunakan perintah BACKUP
  2. Menggunakan statemen SELECT INTO
  3. Menggunakan tool MYSQLDUMP
  4. Menggunakan tool MYSQLHOTCOPY
  5. Melakukan penyalinan file secara langsung
  • Untuk proses Restore
  1. Menggunakan perintah RESTORE
  2. Menggunakan statemen LOAD DATA INFILE

Melalui artikel yang saya peroleh ini saya ingin menunjukkan kepada Anda apa saja langkah-langkah yang diperlukan untuk melakukan pekerjaan backup dan restore data di dalam MySQL. Adapun cara yang akan saya gunakan di sini hanya BACKUP dan SELECT INTO (untuk proses backup) serta RESTORE dan LOAD DATA (untuk proses restore). Artikel ini sengaja saya susun dengan logat tutorial, dengan harapan Anda dapat langsung mempraktekannya secara mudah dan cepat.

Untuk memudahkan Anda dalam memahami artikel ini, coba Anda buat terlebih dahulu sebuah database baru dengan menggunakan perintah CREATE DATABASE. Selanjutnya buatlah dua buah tabel contoh dan masukkan data-data dummy ke dalamnya. Berikut ini langkah-langkah awal yang perlu dilakukan:

  • Aktifkan direktori BIN di mana software MySQL Anda di-install
  • Tuliskan perintah berikut pada command-prompt yang tersedia

C:\MySQL\bin\mysql –u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3 to server version: 4.0.15-nt
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the buffer.
mysql> create database latihdb;
Query OK, 1 row affected (0.11 sec)
mysql> use latihdb;
Database changed
mysql>

Perintah di atas akan membuat sebuah database baru dengan nama LATIHDB serta mengaktifkannya dengan perintah USE.

  • Buatlah dua buah tabel contoh (misalnya PEGAWAI dan JABATAN) dengan menggunakan perintah SQL di bawah ini.

mysql> create table jabatan (
-> kode_jabatan char(4) not null,
-> nama_jabatan varchar(25) not null,
-> constraint pk_jabatan primary key(kode_jabatan)
-> );
Query OK, 0 rows affected (0.02 sec)
mysql> create table pegawai (
-> nip char(6) not null,
-> nama varchar(25) not null,
-> kode_jabatan char(4),
-> constraint pk_pegawai primary key(nip),
-> constraint fk_pegawai_jabatan foreign key(kode_jabatan)
-> references jabatan(kode_jabatan)
-> );
Query OK, 0 rows affected (0.03 sec)
mysql>

  • Isikan data-data dummy ke dalam kedua buah tabel tersebut, misalnya dengan menggunakan perintah di bawah ini.

mysql> insert into jabatan values(‘J-01′, ‘Manager’);
Query OK, 1 row affected (0.08 sec)
mysql> insert into jabatan values(‘J-02′, ‘Sales Marketing’);
Query OK, 1 row affected (0.00 sec)mysql> insert into jabatan values(‘J-03′, ‘Pimpinan Proyek’);
Query OK, 1 row affected (0.00 sec)
mysql> insert into jabatan values(‘J-04′, ‘Analis Sistem’);
Query OK, 1 row affected (0.00 sec)
mysql> insert into jabatan values(‘J-05′, ‘Programmer’);
Query OK, 1 row affected (0.00 sec)
mysql> insert into pegawai values(’000001′,’Imam’,’J-01′);
Query OK, 1 row affected (0.03 sec)
mysql> insert into pegawai values(’000002′,’Dewi’,’J-02′);
Query OK, 1 row affected (0.00 sec)
mysql> insert into pegawai values(’000003′,’Arif’,’J-03′);
Query OK, 1 row affected (0.00 sec)
mysql> insert into pegawai values(’000004′,’Camelia’,’J-04′);
Query OK, 1 row affected (0.00 sec)
mysql> insert into pegawai values(’000005′,’Made’,’J-05′);
Query OK, 1 row affected (0.00 sec)
mysql> insert into pegawai values(’000006′,’Tatang’,’J-05′);
Query OK, 1 row affected (0.00 sec)
mysql> quit
bye

Menggunakan Perintah BACKUP
Salah satu cara termudah untuk melakukan backup data di MySQL adalah dengan menggunakan perintah BACKUP. Namun hal terpenting yang perlu dicatat adalah bahwa perintah ini hanya berlaku untuk tabel-tabel tipe MyISAM.
Berikut ini sintak umum yang digunakan untuk melakukannya.

BACKUP TABLE namatabel TO ‘path_tujuan’;

path_tujuan harus dituliskan secara lengkap, namun tidak perlu disebutkan nama file-nya. Proses ini akan membuat sebuah salinan dari file .frm (definisi) and .MYD (data), tetapi tidak memasukkan file .MYI (index).
Berikut ini langkah-langkah yang diperlukan untuk menggunakan perintah BACKUP.

  • Buatlah path_tujuan, misalnya dengan nama DB_BACKUP di dalam drive C.
  • Tuliskan perintah BACKUP, seperti yang tampak pada kode di bawah ini.

mysql> backup table pegawai, jabatan to ‘c:\db_backup’;
+—————–+——–+———-+————————————-+
| Table | Op | Msg_type | Msg_text |
+—————–+——–+———-+————————————-+
| latihdb.pegawai | backup | error | Failed copying .frm file (errno: 2) |
| latihdb.pegawai | backup | status | Operation failed |
| latihdb.jabatan | backup | error | Failed copying .frm file (errno: 2) |
| latihdb.jabatan | backup | status | Operation failed |
+—————–+——–+———-+————————————-+
4 rows in set (0.03 sec)
mysql>

Kenapa proses backup di atas tidak berhasil? Masalahnya adalah kita harus menggunakan double backslash (\\) pada saat menuliskan path tujuan. Perhatikan perintah di bawah ini yang merupakan perbaikan dari kode di atas.

mysql> backup table pegawai, jabatan to ‘c:\\db_backup’;
+—————–+——–+———-+———-+
| Table | Op | Msg_type | Msg_text |
+—————–+——–+———-+———-+
| latihdb.pegawai | backup | status | OK |
| latihdb.jabatan | backup | status | OK |
+—————–+——–+———-+———-+
2 rows in set (0.03 sec)
mysql>

Menggunakan Statemen SELECT INTO
Perintah ini sama mudahnya dengan cara yang pertama (dengan menggunakan perintah BACKUP). Hanya yang perlu untuk diperhatikan di sini adalah bahwa perintah ini hanya berlaku untuk melakukan backup per tabel. Berikut ini sintak umum dari penggunaan statemen SELECT INTO.

SELECT daftar_kolom FROM nama_tabel INTO OUTFILE nama_file;

Berikut ini contoh yang akan menunjukkan bagaimana cara melakukan backup terhadap tabel PEGAWAI.

mysql> select * from pegawai into outfile ‘c:\\db_backup\\peg.dmp’;
Query OK, 6 rows affected (0.02 sec)
Perintah di atas akan membentuk sebuah file baru dengan nama PEG.DMP di dalam
direktori C:\DB_BACKUP, yang merupakan file hasil dari proses backup.

Menggunakan Perintah RESTORE
Perintah ini merupakan kebalikan dari perintah BACKUP. Fungsi dari perintah RESTORE adalah untuk melakukan restore terhadap data-data yang sebelumnya telah dibackup dengan menggunakan perintah BACKUP. Berikut ini bentuk umum dari penggunaan perintah RESTORE.

RESTORE TABLE nama_tabel FROM ‘path_tujuan’;

Penting sekali untuk diperhatikan bahwa perintah di atas tidak akan bekerja bila tabel tujuan masih ada di dalam database. Perhatikan contoh perintah di bawah ini.

mysql> restore table pegawai from ‘c:\\db_backup’;
+———+———+———-+———————————————+
| Table | Op | Msg_type | Msg_text |
+———+———+———-+———————————————+
| pegawai | restore | error | table exists, will not overwrite on restore |
+———+———+———-+———————————————+
1 row in set (0.00 sec)
mysql>

Error yang dimunculkan di atas disebabkan tabel pegawai masih terdapat di dalam database. Dan untuk mengatasi hal ini, maka kita harus menghapus tabel tersebut terlebih dahulu, yaitu dengan menggunakan perintah DROP TABLE, seperti berikut:

mysql> drop table pegawai;
Query OK, 0 rows affected (0.00 sec)
mysql> restore table pegawai from ‘c:\\db_backup’;
+—————–+———+———-+———-+
| Table | Op | Msg_type | Msg_text |
+—————–+———+———-+———-+
| latihdb.pegawai | restore | status | OK |
+—————–+———+———-+———-+
1 row in set (0.01 sec)
mysql>

Menggunakan Perintah LOAD DATA
Perintah ini merupakan kebalikan dari perintah SELECT INTO. Artinya, bila kita melakukan backup dengan perintah SELECT INTO, maka proses restore-nya perlu menggunakan LOAD DATA. Berikut ini bentuk umum untuk melakukan restore data dengan menggunakan perintah LOAD DATA.

LOAD DATA INFILE nama_file INTO TABLE nama_tabel;

Contoh:

mysql> load data infile ‘c:\\db_backup\\peg.dmp’ into table pegawai;
ERROR 1062: Duplicate entry ’000001′ for key 1

Kesalahan di atas disebabkan dalam database masih mengandung data yang sama dengan data yang terdapat dalam file backup. Untuk mengatasi hal ini kita seharusnya menggunakan klausa IGNORE atau REPLACE, sehingga perintahnya akan tampak seperti berikut:

mysql> load data infile ‘c:\\db_backup\\peg.dmp’ ignore into table pegawai;
Query OK, 0 rows affected (0.00 sec)
Records: 6 Deleted: 0 Skipped: 6 Warnings: 0
mysql> load data infile ‘c:\\db_backup\\peg.dmp’ replace into table pegawai;
Query OK, 12 rows affected (0.00 sec)
Records: 6 Deleted: 6 Skipped: 0 Warnings: 0
mysql> select * from pegawai;
+——–+———+————–+
| nip | nama | kode_jabatan |
+——–+———+————–+
| 000001 | Imam | J-01 |
| 000002 | Dewi | J-02 |
| 000003 | Arif | J-03 |
| 000004 | Camelia | J-04 |
| 000005 | Made | J-05 |
| 000006 | Tatang | J-05 |
+——–+———+————–+
6 rows in set (0.00 sec)
mysql>

Belajar Query (II)

select version();
+———————+
| version()           |
+———————+
| 5.0.22-community-nt |
+———————+

SELECT * FROM Opname JOIN Periode ON Opname.datum BETWEEN Periode.begindatum AND Periode.einddatum WHERE Opname.datum <= (SELECT MIN(datum) FROM Opname);
+——-+————+————+——–+————+————+————+
| rolnr | negatiefnr | datum      | prijs  | begindatum | einddatum  | plaatsnaam |
+——-+————+————+——–+————+————+————+
|   115 |          4 | 1980-07-17 | 500.00 | 1975-03-23 | 1981-01-02 | Parijs    |
|   115 |          5 | 1980-07-17 | 600.00 | 1975-03-23 | 1981-01-02 | Parijs    |
+——-+————+————+——–+————+————+————+

SELECT * FROM Opname JOIN Periode ON Opname.datum BETWEEN Periode.begindatum AND Periode.einddatum WHERE Opname.datum = (SELECT MIN(datum) FROM Opname);
+——-+————+————+——–+————+————+————+
| rolnr | negatiefnr | datum      | prijs  | begindatum | einddatum  | plaatsnaam |
+——-+————+————+——–+————+————+————+
|   115 |          4 | 1980-07-17 | 500.00 | 1975-03-23 | 1981-01-02 | Parijs    |
|   115 |          5 | 1980-07-17 | 600.00 | 1975-03-23 | 1981-01-02 | Parijs    |
+——-+————+————+——–+————+————+————+

SELECT * FROM Opname JOIN Periode ON Opname.datum BETWEEN Periode.begindatum AND Periode.einddatum WHERE Opname.datum <= (SELECT MIN(datum) FROM Opname);
+——-+————+————+——–+————+————+————+
| rolnr | negatiefnr | datum      | prijs  | begindatum | einddatum  | plaatsnaam |
+——-+————+————+——–+————+————+————+
|   115 |          4 | 1980-07-17 | 500.00 | 1975-03-23 | 1981-01-02 | Parijs    |
|   115 |          5 | 1980-07-17 | 600.00 | 1975-03-23 | 1981-01-02 | Parijs    |
+——-+————+————+——–+————+————+————+

SELECT * FROM Opname JOIN Periode ON Opname.datum BETWEEN Periode.begindatum AND Periode.einddatum WHERE Opname.datum = (SELECT MIN(datum) FROM Opname);
+——-+————+————+——–+————+————+————+
| rolnr | negatiefnr | datum      | prijs  | begindatum | einddatum  | plaatsnaam |
+——-+————+————+——–+————+————+————+
|   115 |          4 | 1980-07-17 | 500.00 | 1975-03-23 | 1981-01-02 | Parijs    |
|   115 |          5 | 1980-07-17 | 600.00 | 1975-03-23 | 1981-01-02 | Parijs    |
+——-+————+————+——–+————+————+————+

SELECT * FROM Opname JOIN Periode ON Opname.datum BETWEEN Periode.begindatum AND Periode.einddatum WHERE Opname.datum = (SELECT MIN(datum) FROM Opname);
+——-+————+————+——–+————+————+————+
| rolnr | negatiefnr | datum      | prijs  | begindatum | einddatum  | plaatsnaam |
+——-+————+————+——–+————+————+————+
|   115 |          4 | 1980-07-17 | 500.00 | 1975-03-23 | 1981-01-02 | Parijs    |
|   115 |          5 | 1980-07-17 | 600.00 | 1975-03-23 | 1981-01-02 | Parijs    |
+——-+————+————+——–+————+————+————+

Belajar Query (I)

  • MENAMPILKAN DATA

Use northwind

  • Tampilkan data seluruh karyawan

Select * From Employees

  • Tampilkan Nama dan Title karyawan

Select LastName, FirstName, Title From Employees

  • Tampilkan nama dan title karyawan dengan judul yang berbeda

Select LastName As NamaBelakang, FirstName As NamaDepan, Title As Gelar From Employees

  • Tampilkan Nama depan dengan nama belakang digabungkan

Select FirstName+ ‘ ‘+LastName As Nama, Title From Employees

  • Tampilkan Nama pegawai yang dimulai dengan huruf A

Select * From Employees Where FirstName Like ‘A%’

  • Tampilkan Nama pegawai yang mengandung Huruf C

Select * From Employees Where FirstName Like ‘%C%’

  • Tampilkan Nama pegawai yang huruf awalnya A atau M

Select * From Employees Where Left(FirstName,1) in(’A’,’M’)

  • Tampilkan Nama dan Title karyawan berikut dengan tempat wilayah tinggal

Select LastName, FirstName, Title, City, Region From Employees

  • Tampilkan Nama dan Title karyawan, yang tempat wilayah tinggal bernilai kosong (NULL)

Select LastName, FirstName, Title, City, Region From Employees Where Region Is NULL

  • Tampilkan Nama dan Title karyawan, yang tempat wilayah tinggal bernilai tidak kosong (NULL)

Select LastName, FirstName, Title, City, Region From Employees Where Region Is NOT NULL

  • Tampilkan Urutkan data nama karyawan mulai A – Z

Select FirstName, LastName, Title From Employees Order By FirstName

  • Tampilkan Urutkan data nama karyawan mulai Z – A

Select FirstName, LastName, Title From Employees Order By FirstName DESC

  • Tampilkan 3 record karyawan teratas

Select Top 3 FirstName, LastName, Title From Employees

  • Tampilkan 5 record barang teratas

Select Top 5 * From Products

  • Tampilkan 2 record stok barang terbanyak

Select Top 2 * From Products Order By UnitsinStock DESC

  • Tampilkan berapa jumlah produk yang berasal dari supplierID no 2

Select Count(SupplierID) As [Jumlah Product] From Products Where SupplierID = 2

  • Buktikan dengan datanya :-)

Select ProductName, SupplierID From Products Where SupplierID = 2

  • Tampilkan berapa jumlah produk ID no 1 yang telah dijual

Select SUM(Quantity) As [Jumlah Dijual] From [Order Details] Where ProductID=1

  • Buktikan dengan datanya

Select ProductID, Quantity From [Order Details] Where ProductID=1

  • Tampilkan SupplierID dan jumlah produk dan urutkan dari jumlah produk terbanyak

Select SupplierID, Count(SupplierID) As [Jumlah Product] From Products Group By SUPPLIERID ORDER BY [Jumlah Product] DESC

  • Tampilkan jumlah penjualan yang dilakukan karyawan diurutkan mulai dari yang terbanyak

Select EmployeeID, Count(OrderID) As [Jumlah Order] From [Orders] Group By EmployeeID Order By [Jumlah Order] DESC

  • Tampilkan data customer yang melakukan pembelian

Select O.CustomerID, CompanyName, OrderID, Orderdate From Orders O, Customers C Where O.CustomerID = C.CustomerID

  • Adalah operator untuk menggabungkan dua buah table yang mempunyai nilai yang sama –melihat dari 2 sisi, sisi kiri sama dengan sisi kanan

Select O.CustomerID, CompanyName, OrderID, Orderdate From Orders O Inner Join Customers C On O.CustomerID = C.CustomerID

  • Tampilkan data customer dengan ID=ALFKI yang melakukan pembelian

Select O.CustomerID, CompanyName, OrderID, Orderdate From Orders O Inner Join Customers C On O.CustomerID = C.CustomerID AND O.CustomerID =’ALFKI’

  • Tampilkan data barang yang telah dijual yang quantity nya lebih dari 30

Select OD.ProductID, P.Productname, Quantity From [Order Details] OD Inner Join Products P On OD.ProductID = P.ProductID and Quantity >30

Membangun Software House

Dalam sebuah milis, muncul diskusi tentang perbandingan kerja di bidang IT atau bikin software house sendiri. Ada seseorang yang menyampaikan pandangan menarik tentang tips untuk memulai sebuah software house.Buatlah perusahaan real / legal / resmi, artinya anda harus mengurus SIUP, TDP, dan NPWP, karena dengan berbekal NPWP, anda bisa bersaing dengan perusahaan2 untuk mendapatkan tender2 yang dibuat oleh badan / instansi pemerintahan & Customer akan merasa lebih aman karena persh kita terdaftar di Dirjen Pajak. Saat ini buuaaannyyuuuaaakk sekali perusahaan fiktif yang promosi bahwa mereka bisa membuat program ini itu dan yang lainnya tapi mereka tidak akan bisa menembus badan / instansi pemerintahan ( kecuali dapat proyek sub dari perusahaan lain ).

Create a customer list. Artinya setiap kesempatan yang menghampiri anda jangan pernah ditolak, entah itu proyek besar ataupun kecil ataupun cuma proyek perseorangan, karena promosi yang paling mujarab adalah promosi dari mulut ke mulut, mungkin anda sekarang dapat proyek kecil, tapi biasanya kalau customer tersebut suka dengan hasil yang anda tunjukkan, tidak tertutup kemungkinan dia akan merekomendasikan anda ke temannya yang bakal jadi customer anda selanjutnya untuk membuat suatu proyek besar. Semakin banyak customer anda semakin besar kepercayaan orang kepada anda.

Untuk pertama – tama, jika modal anda tidak mencukupi, buatlah program dengan developer yang free, contoh : database menggunakan firebird, postgreSQL atau MySQL atau SQL Server 2005 Express Edition atau Oracle Express Edition, atau PHP.
Selalu gunakan software licensed jika suatu saat ada sidak dari DepKomInfo anda tidak perlu takut dituntut.

Selalu bawa kartu nama anda di dompet & sebarkan kartu nama anda ke setiap orang yang anda temui, entah itu di terminal, airport, café, ataupun di seminar2 yang anda ikuti, karena anda tidak akan pernah bisa menduga kapan anda akan bertemu dengan calon customer anda. Sebuah kartu nama yang ideal adalah : Terdapat logo perusahaan yang mudah diingat oleh orang, buat sebaris slogan tentang perusahaan anda contoh : Sosro Ahlinya Teh, Coca Cola Segarnya Mantap, dll. Selalu sertakan website & email address anda disana. Pastikan tulisan di kartu nama anda terbaca dengan jelas sehingga orang tidak perlu memicingkan matanya hanya untuk membaca. Gunakan warna yang cerah atau foto, selalu gunakan kertas yang mengkilat dan tebal karena ada kemungkinan kartu anda dimasukkan ke dalam tumpukan kartu nama yang lain, orang akan lebih mudah tertarik kepada kartu nama anda, efek psikologis ini memungkinkan anda memperoleh project lebih banyak.

Buat website / minimal blog di internet, sehingga orang2 tahu bahwa ada nama perusahaan anda di dunia ini. Jika memungkinkan beli domain sendiri, saat ini harga domain sangat murah kok, bahkan ada yang cuma 100 ribuan setahun, di depan customer, anda akan terlihat lebih “keren”, meskipun kita yang di bidang IT sama – sama tahu bahwa itu adalah hal biasa, ya nggak ?….

Selalu update pengetahuan & wawasan anda tentang IT dan juga tentang yang lainnya, contoh : jika anda akan membuat program akuntansi, pastikan anda paham tentang akuntansi, jika akan membuat program tentang HRD / payroll, pastikan anda tahu tentang peraturan2 pemerintah & lainnya yang berhubungan. Karena saya percaya bahwa otak kita adalah satu-satunya “HARDDISK” yang tidak ada “MAXIMUM CAPACITY”-nya. Jangan sampai terlihat “o’on” di depan customer waktu mereka ngajak ngobrol kita.

Jika anda mendapatkan sub – proyek dari persh. Lain, pastikan anda boleh memasang nama Customer sebagai customer list kita, atau minimal nama perusahaan pemberi proyek tersebut.

Bersiap – siaplah mengetatkan ikat pinggang karena tidak ada perusahaan yang langsung besar di dunia ini, sesuaikan pengeluaran dengan pendapatan yang anda terima, contoh : William Dell dulunya juga jualan komputer dari rumah ke rumah sampai sekarang dia bisa bikin persh pembuat komputer berdasarkan pesanan yang besar di dunia ini.

Jika perlu, anda merangkap sebagai Direktur, Marketing, Sales, dan Programmer sekaligus dalam perusahaan yang anda pimpin untuk menghemat biaya pengeluaran. Jangan terburu-buru ambil karyawan banyak2 pada awal pendirian anda. Namun sekali lagi, dimata Customer, anda adalah Direktur, so … behave like a Leader.

Bersahabatlah dengan teman anda dan juga Cintailah musuh anda. Lihatlah kelebihan2 yang dimiliki oleh pesaing anda dan pastikan anda bisa membuat karya yang lebih baik, kebanyakan orang hanya melihat kekurangan orang lain dan berusaha membetulkannya, di dunia bisnis itu kurang, dan jika anda hanya berbuat seperti itu, maka anda hanya akan bisa “BERTAHAN” dan tidak bisa “MAJU”.

Jika anda merasa sudah telalu overcapacity karena terlalu banyak proyek, berikan kepada orang yang PALING ANDA PERCAYA dan sebisa mungkin freelancer yang tidak ada kerjaan serta jangan anda lepas 100%, dan selalu bertindaklah sebagai “Qualiti Assurance” yang cerewet dan detail, percuma jika anda memberikan kepada ORANG YANG PINTER tapi pada akhirnya projectnya tidak selesai. Sekali anda cacat dimata customer, selamanya dia akan mengumumkan ke teman2nya bahwa anda adalah orang yang tidak dapat dipercaya.

Ada pepatah Inggris : “We teach some by what we say. We teach more by what we are. We teach most by what we do. Everyone knows you – not by what you say or what you are. They know you by what you do

Pada awal2 pendirian akan banyak sekali masalah yang datang, entah itu dari keluarga, teman, atau bahkan saingan. Perkuat mental anda, bicarakan hal ini dengan keluarga, teman dan yang lain supaya mereka mengerti & minta dukungannya.

Jangan terburu-buru pinjam modal ke BANK, pengusaha yang baik selalu berusaha dari dompetnya sendiri karena anda tidak perlu dipusingkan dengan membayar cicilan hutang.

Ungkapan “PELANGGAN ADALAH RAJA” adalah salah. Anda harus selalu membiasakan diri untuk menganggap “PELANGGAN ADALAH ORANG BIASA” yang perlu kita jadikan mitra / partner / konsultan. Jangan takut untuk membetulkan usulan / pilihan dari customer yang kita anggap salah karena kita memiliki solusi yang lebih baik. Dengan menganggap customer sebagai orang biasa yang juga punya kekurangan baik dibidang informasi atau pengetahuan maka kita akan lebih berhati hati dalam melakukan transaksi dan kita akan dengan sabar mendampingi prospect atau calon customer dalam menentukan pilihan atas produk atau jasa yang sesuai dengan kebutuhannya bukan sekedar yang diinginkannya. Kita pun akan lebih terpanggil untuk tidak bosan menghubungi customer untuk menanyakan apakah dia puas dengan produk/jasa yang dibelinya.

Persiapkanlah administrasi & dokumen2 penunjang bagi perusahaan anda, contoh : template proposal, faktur pajak, company profile, dll. Jangan buang waktu anda percuma dengan mencari arsip yang tidak tertata secara rapi.

Last but not Least. Selalu minta tuntunan dari TUHAN. dalam bisnis ada banyak perkara yang tidak bisa selalu diputuskan oleh kepintaran & kerja keras. Misalnya: bagaimana memilih bisnis yang sesuai, bagaimana memilih investment yang tepat, bagaimana memilih orang orang yang tepat dalam berpartner, bagaimana tahu dan merasakan kalau kamu akan dicurangi pegawai, dan banyak keputusan bisnis penting lainnya. Orang umum bilang, asah saja intuisi kita, tapi saya percaya pertolongan Tuhan memampukan kita untuk lewati semua ini.

Ikuti

Get every new post delivered to your Inbox.