Memakai Quick Repot Secara Pemrograman

Ketika belajar membuat laporan pertama kali dengan Quick Report. Saya lebih suka drag VCL dari tempatnya, kemudian melakukan pengaturan dari property yang terpampang di Object Inspector. Seiring dengan berjalannya waktu, laporan yang dibuat semakin komplek dan berjumlah banyak. Memrogram satu buah TQuickReport memang tidak masalah, tetapi jika satu form mempunyai banyak report, dan masing-masing laporan mempunyai banyak variasi, hal ini menjadi masalah besar.

Akhirnya, memrogram TQuickReport secara obyek menjadi pemecahan yang lebih baik. Untuk mengganti property, saya tidak perlu mencari-cari halamannya di form-form, namun tinggal melihat ke dalam source code. Postingan saya kali ini, akan membahas: Bagaimana membuat laporan melalui pemrograman obyek.

Target belajar kali ini adalah seperti gambar berikut ini:

GAMBAR 1

Dalam penjelasan disini, diasumsikan kita akan melakukan query ke database untuk mendapatkan data dan memakai Quick report untuk menampilkan/mencetak. Query tersebut di dapat dalam unit AdoDB, dan deklarasikan dengan:

uses AdoDB;

var
    qry : TAdoQuery;
begin
    qry := TAdoQuery.Create();
    qry.Connection = Connection1;


Hal pertama yang kita lakukan adalah menambahkan QuickRpt pada bagian Uses. Setelah itu, deklarasikan variabel obyek dan instan-kan TQuickReport dengan kode berikut:

   uses QuickRpt;
   ................................
    var
      qrLapor : TQuickRep;
    begin
       qrLapor := TQuickRep.Create(self);
       qrLapor.Parent := self;
    ...........................
qrLapor kita buat menjadi milik form pemanggil, sehingga property parent kita set ke Self. Sampai bagian ini, obyek sudah tercipta di memori. Langkah selanjutnya menambahkan obyek Judul yang bertipe TQrBand.

Kode program akan menjadi:

   uses QuickRpt;
   ................................

   var
      qrLapor : TQuickRep;
      bdJudul : TQrBand;
    begin       
        qrLapor := TQuickRep.Create(self);
        qrLapor.Parent := self; 

Hal yang perlu diingat, bdJudul adalah milik obyek TQuickRep, jadi pada property Parent kita set ke qrLapor.


       bdJudul := TQrBand.Create(qrLapor);
       bdJudul.Parent := qrLapor;
       bdJudul.BandType := rbTitle;
       bdJudul.Height := 75;

rbTitle ada di unit QrPrnTr, sehingga kita perlu menambahkannya pada bagian Uses sehingga bagian Uses sekarang menjadi:

uses QuickRpt, QrPrnTr;
   ................................
Tempat untuk menulis judul sudah ada, tetapi tulisan judulnya sendiri masih belum ada. Sekarang saatnya. 
Label yang akan dibuat, adalah dari class TQrLabel. Class ini dideklarasikan di unit QrCtrls. Dengan demikian unit QrCtrls harus dideklarasikan di Uses . Kode berikut ini akan membuat label pada bdJudul dengan tulisan 'DAFTAR PRODUSEN'.

   uses ........,QrCtrls;
   ................................

    var
        ......................................................
        qrlJudul : TQrLabel;
    begin       
        .......................................................
        qrlJudul := TQrLabel.Create(self);
        qrlJudul.Parent := bdJudul;
        qrlJudul.Caption := 'DAFTAR PRODUSEN';
        qrlJudul.Top := 1;
        qrlJudul.Left := 1;
        qrlJudul.Font.Name := 'TAHOMA';

Kolom header adalah tempat untuk memberikan judul pada kolom laporan. Kolom header menggunakan class TQrBand dengan tipe: rbColumnHeader yang ada di unit QrPrnTr;

   uses ........,QrPrnTr;
   ................................

    var
        ......................................................

        bdKolomHeader: TQrBand;
    begin       
        .......................................................

        bdKolomHeader.Parent := qrLapor;
        bdKolomHeader.BandType := rbColumnHeader;
        bdKolomHeader.Height := 25;
       //membuat garis diatas
        bdKolomHeader.Frame.DrawTop := true;
       //membuat garis dibawah
        bdKolomHeader.Frame.DrawBottom := true;
      

Kolom header masih kosong. Dia membutuhkan tulisan untuk judul kolom. Kode berikut adalah menciptakan obyek dua TQrLabel, yaitu: qrlKode dan qrlProdusen. Yang pertama untuk kode produsen, sedangkan yang kedua untuk nama produsen itu sendiri.


    qrlKode := TQrLabel.Create(Self);
    with qrlKode  do
    begin
        Parent := bdKolomHeader;
        Caption := 'KODE';
        Top := 1;
        Left := 1;
        Font.Name := 'TAHOMA';
    end;

    qrlProdusen := TQrLabel.Create(Self);
    with qrlProdusen  do
    begin
        Parent := bdKolomHeader;
        Caption := 'PRODUSEN';
        Top := 1;
        Left := qrlKode.Left + qrlKode.Width + 100;
        Font.Name := 'TAHOMA';
    end;

Baik obyek report, judul dan kolom selesai dibuat, namun tempat untuk menampilkan isi dari data yang didapat. Pada kode program dibawah ini, kita akan membuat Band detail.

    var
        ......................................................

        bdDetil: TQrBand;
    begin       
        ..........................................
        bdDetil := TQrBand.Create(self);
        with bdDetil do
        begin
            Parent := qrLapor;
            BandType := rbDetail;
           Height := 20;
        end;

        ..............................................

Band detail kita isi dengan obyek untuk menampilkan data yang berasal dari query. Sehingga dibutuhkan dua obyek TQrDbText: qrdbKode, qrdbProdusen.

var
     .....................................
     qrdbKode, qrdbProdusen : TQrDbText;

begin
..........................................................   
qrdbKode := TQrDbText.Create(self);
    with qrdbKode do
    begin
        Parent := bdDetil;
        Top := 2;
        left := 1;
        DataSet := qry;
        DataField := 'KODE';
        Font.Name := 'TAHOMA';
        AutoStretch := true;
    end;

    qrdbProdusen := TQrDbText.Create(self);
    with qrdbProdusen do
    begin
        Parent := bdDetil;
        Top := 2;
        left :=  qrdbKode.Left + qrdbKode.Width + 100;
        DataSet := qry;
        DataField := 'PRODUSEN';
        Font.Name := 'TAHOMA';
    end;
 


Membuat Master Detail dengan TQrSubDetail

Agar dapat mencetak data dengan hubungan master-detil, kita harus mengatur agar komponens query/tabel master dan query/tabel detil harus terhubung secara benar. Berikut ini, saya mengasumsikan kita mempunyai 1 TAdoQuery untuk mengambil data master, 1 TAdoQuery untuk menampung data detil dan satu datasource yang digunakan Query detil untuk berhubungan dengan Query master


Database <<= Query Master <<= Datasource <<= Query Detil

Jika program berikut adalah lanjutan dari program diatas, maka menghubungkan Query master dan Query detil sebagai berikut:
  • Bentuk obyek datasource
    dsMaster  := TDataSource.create(Self);
  • Hubungkan datasource dengan Query Master
    dsMaster.DataSet := qry;
  • Bentuk Query detil dan hubungkan dengan obyek Connection
    qryDetil := TAdoQuery.Create(self);
    qryDetil.Connection :=  Connection1;
  • Hubungkan Query detil dengan datasource
    qryDetil.DataSource := dsMaster;
Sekarang kita membentuk sub detail dari QuickReport memakai TQrSubDetail;

sd := TQrSubDetail.Create(self):


with sd do
begin
    BandType := rbSubDetail;
    Parent := qrLapor;
    Height := 20;
    Master := qrLapor;
    Dataset := qryDetil;

end;

Lihat pada bagian Dataset := qryDetil; Ini bagian paling penting. Bagian inilah yang menyebabkan hubungan master detil antara bdDetail dan sd.


Membuat Header untuk Sub detil

Header untuk sub detail harus dibuat terlebih dahulu sebelum dipasangkan ke SubDetail.

 

bdHeaderSubDetil := TQrBand.Create(self);
 
with bdHeaderSubDetil do
begin
         parent := qr;
         Height := 20;
         BandType := rbColumnHeader;
end;

Dibawah source code diatas, pasangkan bdHeaderSubDetil pada SubDetail di property HeaderBand

sd.HeaderBand := bdHeaderSubDetil;

Dengan demikian, selesai sudah tugas membuat report. Eksekusi terakhir tinggal dua pilihan. Untuk penampakan ke layar:

qrLapor. PreviewModal;


atau penampakan ke printer:

qrLapor.Print;

Memakai Quick Repot Secara Pemrograman Rating: 4.5 Diposkan Oleh: Good Dreamer

0 comments:

Posting Komentar

Diberdayakan oleh Blogger.