Kamis, 04 Februari 2016

Expand Grid, DBGrid di dalam DBGrid Delphi

Expand Grid, DBGrid di dalam DBGrid Delphi

Melihat gambar diatas, saya kira anda sudah paham apa maksud saya. Entah dengan kata apa saya harus membahasakan, yang jelas saya juga bingung dengan istilahnya. Haha. Namun belakangan saya baru tahu kalau ternyata namanya adalah Expand Grid. Istilahnya DB Grid didalam DBGrid atau Tabel didalam tabel. Terkadang teknik semacam ini juga diperlukan dalam membangun aplikasi untuk memberikan informasi spesifik pada sebuah tabel. mari perhatikan relasi tabel berikut ini.

Expand Grid, DBGrid di dalam DBGrid Delphi

Terdapat dua buah tabel pada gambar diatas yaitu tabel siswa dan tabel orang tua siswa dimana kedua tabel tersebut saling berelasi dengan field no_kk. Suatu misal saya bisa saja menampilkan semua isi tabel siswa dalam sebuah DBGrid. Mudah saja. Masalah yang muncul adalah bagaimana jika hendak melihat informasi orang tua siswa? tentu akan menjadi tidak efektif dan efisien jika menampilkannya dalam DBGrid yang berbeda. 

Seorang pengguna bisa saja bingung jika harus bolak balik melihat ke Tabel siswa atau tabel guru dengan mengacu pada field no_kk. Akan lebih efektif jika kita membuat Expand Grid dengan cara menampilkan informasi orang tua siswa didalam DBGrid Siswa itu sendiri berdasarkan no_kk tersebut. Lalu bagaimana melakukannya?

1. Hal Pertama yang harus anda ketahui bahwa DBGrid yang digunakan untuk membuat Expand Grid tersebut tidak tersedia secara default oleh Delphi oleh karena kita perlu menginstallnya silahkan download komponen EhLib pada postingan saya sebelumnya disini.

2. Kedua, Silahkan Install Komponen tersebut. Cara installnya sangat mudah. Tutup Delphi Anda terlebih dahulu. Terdapat file ehlibinstaller didalam folder installer.

3. Silahkan Download Source Code lengkap dan Databasenya disini. Mohon Maaf karena saya tidak bisa menjelaskan cara penggunaannya secara langsung. anda dapat mempelajarinya dari source code projek tersebut. terima kasih. Keep Coding. :)

Rabu, 03 Februari 2016

Contoh Penggunaan Try Except di Delphi

Salah satu teknik yang penting dalam membuat aplikasi adalah kemampuan dalam melakukan exception handling atau error handling alias penanganan kesalahan. Hal ini dapat dikatakan menjadi inti jika seorang programmer hendak membangun sebuah aplikasi. Programmer harus mampu memikirkan kemungkinan-kemungkinan yang akan terjadi seperti aksi-aksi yang akan dilakukan oleh pengguna aplikasi, kesalahan atau error yang bahkan belum terjadi. hal inilah yang harus dipelajari oleh seorang programmer tentunya.

Dalam memprogram aplikasi tidak hanya sampai aplikasi dapat berjalan tapi tentu saja harus tetap dilakukan perbaikan dan perbaikan karena sebuah program tidak mungkin akan langsung sempurna. perlu terus diperbarui untuk memberbaiki kekurangan dan kesalahan-kesalahan yang ada.

Error dalam program terjadi karena adanya bug, bug terjadi karena adanya kesalahan dalam memprogram suatu aplikasi. kesalahan tersebut tidak selalu dalam penulisan coding tapi dapat juga dalam logika seorang programmer.

Dalam bahasa pemrograman objek pascal, ada sebuah utilitas yang dapat kita manfaatkan paling tidak untuk mengurangi kemungkinan terjadinya error dalam aplikasi. Dalam delphi kita dapat menggunakan Try Except. Teknik ini adalah dengan memberikan pengecualian jika terjadi error pada aksi yang akan dilakukan maka akan dilempar ke aksi yang lain. Analoginya seperti berikut :

try 
begin
aksi_utama_yang_akan_dijalankan;
end 
except
aksi_jika_terjadi_kesalahan_atau_error_pada_aksi_utama
end;

Bagaimana? Sudah ada gambaran? dengan teknik tersebut setidaknya kita dapat meminimalisir terjadinya error pada aplikasi. Berikut adalah contoh source code Try Except sederhana yang akan menjumlahkan angka yang diambil dari TEdit. Output akan ditulis di komponen Edit3, namun jika terjadi error sebuah pesan "Ops, terjadi kesalahan" yang akan ditampilkan.

  try
begin
Edit3.Text:=IntToStr(StrToInt(Edit1.Text)+StrToInt(Edit2.Text));
end
except
MessageDlg('Ops, Ada Kesalahan',mtWarning,[mbok],0);
end;


Mencetak Struk Ke Printer Kasir dengan Delphi

Dalam membangun aplikasi, seorang programmer selalu dituntut untuk bisa mengaplikasikan hal-hal yang terkadang tidak mereka ketahui kedalam program yang mereka bangun. Dalam hal ini adanya internet sebagai media komunikasi dapat menjadi solusi tersendiri untuk menjawab ketidakmengertian seseorang. Sebut saja Google, yang seolah dapat menjawab semua persoalan-persoalan yang kita hadapi. eh, kok malah ngelantur ya? haha

Baiklah, Kembali ke topik permasalahan. disini saya akan sedikit berbagi trik bagaimana mengintegrasikan aplikasi yang kita bangun dengan delphi dengan printer Dot Matrix atau yang akrab juga disebut printer kasir. Ini berdasarkan pengalaman pribadi saya sendiri. Hal ini tentu saja sedikit berbeda dengan mencetak dengan printer biasa seperti cannon, epson dsb.

Mencetak Struk Ke Printer Kasir dengan Delphi

Biar saya jelaskan sedikit, jadi printer kasir yang saya gunakan disini adalah merek Silicon RP76. Agar tidak ada masalah nantinya, pastikan printer dengan komputer sudah terhubung dengan baik dan tidak ada masalah. Oya, Hampir lupa, agar dapat berjalan dengan baik, anda perlu mensetup printer tersebut sebagai default diControl Panel.

Mencetak Struk Ke Printer Kasir dengan Delphi

Jika sudah tidak ada masalah dengan persiapan diatas, mari kita lanjutkan ke proses berikutnya. Pertama-tama buka delphi anda. terserah mau menggunakan delphi 7 atau yang lebih baru. Pada contoh ini kita akan menggunakan sebuah unit Cetak yang berisi prosedur dan fungsi untuk mencetak ke printer Kasir. unit tersebut perlu dipanggil dalam unit yang akan menggunakannya. contohnya sebagai berikut 

unit U_Cetak;

interface

uses
SysUtils, Printers, WinSpool;
procedure cetakFile(Const sFilename: string);
function RataKanan(const VField, VItem: String; const VLength: Integer;
const VSpace: Char): string;

implementation

function RataKanan(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;

procedure cetakFile(Const sFilename: string);
const
cBUFSIZE = 16385;
type
TDoc_Info_1 = record
pDocname: PChar;
pOutputFile: PChar;
pDataType: PChar;
end;
var
Count: Cardinal;
BytesWritten: Cardinal;
hPrinter: THandle;
hDeviceMode: THandle;
Device: Array [0 .. 255] Of Char;
Driver: Array [0 .. 255] Of Char;
Port: Array [0 .. 255] Of Char;
DocInfo: TDoc_Info_1;
f: File;
Buffer: Pointer;
begin
Printer.PrinterIndex := -1;
Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
If Not WinSpool.OpenPrinter(@Device, hPrinter, Nil) Then
Exit;
DocInfo.pDocname := 'Report';
DocInfo.pOutputFile := Nil;
DocInfo.pDataType := 'RAW';

If StartDocPrinter(hPrinter, 1, @DocInfo) = 0 Then
begin
WinSpool.ClosePrinter(hPrinter);
Exit;
end;

If Not StartPagePrinter(hPrinter) Then
begin
EndDocPrinter(hPrinter);
WinSpool.ClosePrinter(hPrinter);
Exit;
end;

System.Assign(f, sFilename);
try
Reset(f, 1);
GetMem(Buffer, cBUFSIZE);
While Not Eof(f) Do
begin
Blockread(f, Buffer^, cBUFSIZE, Count);
If Count > 0 Then
begin
If Not WritePrinter(hPrinter, Buffer, Count, BytesWritten) Then
begin
EndPagePrinter(hPrinter);
EndDocPrinter(hPrinter);
WinSpool.ClosePrinter(hPrinter);
FreeMem(Buffer, cBUFSIZE);
Exit;
end;
end;
end;
FreeMem(Buffer, cBUFSIZE);
EndDocPrinter(hPrinter);
WinSpool.ClosePrinter(hPrinter);
finally
System.CloseFile(f);
end;
end;

end.

Konsepnya adalah, membuat sebuah file *.txt kemudian mencetak file tersebut dengan fungsi cetakfile(). Lalu bagaimana cara menggunakannya?. Pertama, Copy paste unit tersebut dan simpan didalam folder projek anda dengan nama U_cetak.pas. Silahkan panggil unit tersebut (uses) didalam form/unit yang akan bertugas mencetak struk pembayaran. pada contoh ini suatu misal adalam form bayar. 
uses
...., U_Cetak;

Kemudian, Source code dibawah ini adalah source code contoh pada button cetak untuk mencetak ke printer Kasir Dot Matrix
procedure TBayar.BtnCetak(Sender: TObject);
var
Enter = #13 + #10;
txtFile: TextFile;
nmfile : string;
begin
// Buat File dengan Nama Struk.txt
nmfile := GetCurrentDir + '\struk.txt';
AssignFile(txtFile, nmfile);
Rewrite(txtFile);
WriteLn(txtFile, '========================================');
WriteLn(txtFile, ' '+'Judul Nota'+' ');
WriteLn(txtFile, ' '+'Alamat Toko'+' ');
WriteLn(txtFile, ' '+'No Telpon'+' ');
WriteLn(txtFile, '========================================');
WriteLn(txtFile, 'No. Nota : ' + 'No Faktur' );
WriteLn(txtFile, 'Tanggal : ' + FormatDateTime('dd-mm-yyyy hh:mm:ss', now));
WriteLn(txtFile, 'Kasir : ' + 'Nama Kasir');
WriteLn(txtFile, '========================================');
WriteLn(txtFile, 'Nama Barang');
WriteLn(txtFile, RataKanan(' QTY Harga Disc ', 'Sub Total', 35, ' '));
WriteLn(txtFile, '========================================');

WriteLn(txtFile, 'Nama Barang');
WriteLn(txtFile, RataKanan
(' ' + 'Jumlah Barang' + ' ' + 'X' +' '+'Harga Barang'+' '+'Diskon', 'Sub Total', 35, ' '));

WriteLn(txtFile, '========================================');
WriteLn(txtFile, RataKanan('Total : ', 'Total Bayar', 35,
' '));
WriteLn(txtFile, RataKanan('Bayar : ', 'Uang Bayar', 35,
' '));
WriteLn(txtFile, RataKanan('Kembali : ', 'Uang Kembali', 35,
' '));
WriteLn(txtFile, '========================================');
WriteLn(txtFile, ' Jumlah Item : Jumlah Item');
WriteLn(txtFile, '========================================');
WriteLn(txtFile, ' Ini Footer ');
WriteLn(txtFile, '========================================');
WriteLn(txtFile, Enter + Enter + Enter + Enter + Enter + Enter + Enter + Enter + Enter + Enter );
CloseFile(txtFile);
// Cetak File Struk.txt
cetakFile('struk.txt');
end;

Senin, 01 Februari 2016

Fungsi Terbilang dengan Koma Delphi

Fungsi terbilang dapat kita manfaatkan untuk menterjemah atau mengkonversi angka menjadi huruf. pada implementasinya dalam pembuatan aplikasi, khususnya aplikasi yang memerlukan perhitungan matematis seperti aplikasi penjualan dan aplikasi-aplikasi lain tentu terkadang diperlukan untuk melakukan konversi angka menjadi huruf. hal ini untuk menjadikan aplikasi menjadi lebih user friendly karena terkadang seorang user agak malas untuk membaca angka.

Fungsi Terbilang dengan Koma Delphi

pada postingan sebelumnya saya pernah membahas tentang fungsi terbilang rupiah yang dapat anda lihat disini. pada postingan tersebut terdapat kekurangan dalam source codenya yaitu tidak bisa melakukan konversi angka yang memiliki koma menjadi format huruf. oleh karenanya pada postingan ini saya ingin berbagi tentang fungsi terbilang rupiah yang dapat menkonversi angka pecahan atau koma. adapun contoh source code fungsinya dapat anda lihat dibawah ini.
// Fungsi Untuk Merubah Angka Menjadi Huruf/Terbilang
function Terbilang(sValue: string):string;
const
Angka : array [1..20] of string =
('', 'Satu', 'Dua', 'Tiga', 'Empat',
'Lima', 'Enam', 'Tujuh', 'Delapan',
'Sembilan', 'Sepuluh', 'Sebelas',
'Duabelas', 'Tigabelas', 'Empatbelas',
'Limabelas', 'Enambelas', 'Tujuhbelas',
'Delapanbelas', 'Sembilanbelas');
sPattern: string = '000000000000000';

var
S,kata : string;
Satu, Dua, Tiga, Belas, Gabung: string;
Sen, Sen1, Sen2: string;
Hitung : integer;
one, two, three: integer;

begin
One := 4;
Two := 5;
Three := 6;
Hitung := 1;
Kata := '';
S := copy(sPattern, 1, length(sPattern) - length(trim(sValue))) + sValue;
Sen1 := Copy(S, 14, 1);
Sen2 := Copy(S, 15, 1);
Sen := Sen1 + Sen2;
while Hitung < 5 do
begin
Satu := Copy(S, One, 1);
Dua := Copy(S, Two, 1);
Tiga := Copy(S, Three, 1);
Gabung := Satu + Dua + Tiga;

if StrToInt(Satu) = 1 then
Kata := Kata + 'Seratus '
else
if StrToInt(Satu) > 1 Then
Kata := Kata + Angka[StrToInt(satu)+1] + ' Ratus ';

if StrToInt(Dua) = 1 then
begin
Belas := Dua + Tiga;
Kata := Kata + Angka[StrToInt(Belas)+1];
end
else
if StrToInt(Dua) > 1 Then
Kata := Kata + Angka[StrToInt(Dua)+1] + ' Puluh ' +
Angka[StrToInt(Tiga)+1]
else
if (StrToInt(Dua) = 0) and (StrToInt(Tiga) > 0) Then
begin
if ((Hitung = 3) and (Gabung = '001')) or
((Hitung = 3) and (Gabung = ' 1')) then
Kata := Kata + 'Seribu '
else
Kata := Kata + Angka[StrToInt(Tiga)+1];
end;

if (hitung = 1) and (StrToInt(Gabung) > 0) then
Kata := Kata + ' Milyar '
else
if (Hitung = 2) and (StrToInt(Gabung) > 0) then
Kata := Kata + ' Juta '
else
if (Hitung = 3) and (StrToInt(Gabung) > 0) then
begin
if (Gabung = '001') or (Gabung = ' 1') then
Kata := Kata + ''
else
Kata := Kata + ' Ribu ';
end;
Hitung := Hitung + 1;
One := One + 3;
Two := Two + 3;
Three := Three + 3;
end;

if length(Kata) > 1 then Kata := Kata;

Result := Kata;
end;

// Fungsi Untuk Convert Angka Jadi Huruf
function ConvKeHuruf(inp: string): string;
var
a,b,c,Poskoma,PosTitik : integer;
temp,angka,dpnKoma,BlkKoma : string;
AdaKoma: boolean;

begin
PosKoma:= pos(',',Inp);
PosTitik:= pos('.',Inp);
if (Poskoma<>0) or (posTitik<> 0) then
begin
adaKoma:= true;
if PosKoma= 0 then posKoma:= PosTitik;
end else
begin
adakoma:= False;
DpnKoma:= inp;
end;

// Jika ada Koma
if adakoma then
begin
dpnkoma:= copy(inp,1,posKoma-1);
blkKoma:= Copy(inp,posKoma+1,length(inp)-posKoma);
if trim(DpnKoma)='0' then
temp:= 'Nol'+ ' Koma ' + terbilang(blkKoma)
else
temp:= Terbilang(dpnKoma)+ ' Koma ' + Terbilang(blkKoma);
// Jika Tidak ada Koma
end else begin
temp:=Terbilang(dpnKoma);
end;

Result:= temp;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption:=Terbilang(Edit1.Text);
end;

// Menggunakan
procedure TForm1.Button2Click(Sender: TObject);
begin
Label2.Caption:=ConvKeHuruf(Edit2.Text);
end;