Selasa, 24 Desember 2019

Mengenal Penggunaan Properti “Range” Untuk Menentukan Halaman Report Yang Di Cetak ~Tutorial Gambas (Report Manual)


Sebagaimana yang disebutkan pada judul diatas, bahwa properti Range pada Report (Report.Range) digunakan untuk menentukan/memilih halaman Report yang akan dicetak. Misal pada Report terdapat 10 halaman, bisa memilih halaman berapa yang akan dicetak.
Gambas hanya mengenal 3 cara pemilihan halaman yang akan dicetak, yakni:
  • Cetak Seluruhnya, Jika Range tidak ditentukan atau tulisan range tidak dikenali seperti “1-”, “-1”, “A”, maka Printer akan mencetak semua halaman.
  • Cetak satu-satu, Range hanya ditentukan satu halaman saja, misal halaman 4 (saja).
  • Cetak beberapa tapi berurutan, misal Range “2-5” (halaman dua sampai halaman lima).
Gambas tidak menerima Range yang tidak berurutan seperti “5-2”, jika diisi urutan terbalik seperti itu maka gambas akan mencetak semua halaman (tidak berdasar halaman yang dipilih). Format ini juga tidak bisa “2,4,7” (Cetak halaman 2 dan 4 dan tujuh), maka otomatis mencetak semua halaman.

Ok, langsung pelajari/praktekkan contoh berikut:
Buat Form (Lebar= 714, Tinggi=518) yang terdiri dari Object:
ReportView = ReportView1
TextBox = HalamanCetak
Button = Cetak



Open Code:

' Gambas class file

Private Report1 As New Report
Private Printer1 As New Printer As "Printer1"
Private obj As Object[]


Public Sub Form_Open()

   Dim n As Short
  ‘Membuat 500 Object ReportLabel. Dengan ukuran kertas
  ‘Default(Custom: 215,9 x 279,4 mm) menjadi 7 halaman.
   obj = New Object[500]
   For n = 0 To obj.Max
      obj[n] = New ReportLabel(Report1)
      obj[n].Text = n
   Next
   'Menampilkan Report ke ReportView1
   ReportView1.Report = Report1

End

Public Sub HalamanCetak_Change()


  ReportView1.Range = HalamanCetak.Text
  If ReportView1.RangePages.Count > 0 Then
     Printer1.FirstPage = ReportView1.RangePages[0] + 1
     Printer1.LastPage = ReportView1.RangePages[ReportView1.RangePages.Max] + 1
   Else
     Printer1.FirstPage = 0
     Printer1.LastPage = Report1.PageCount
   Endif

End

Public Sub Cetak_Click()

   Dim n As Byte
   'Outputnya dicetak sebagai file .pdf
   Printer1.OutputFile = "~/Tespdfooo"
   ReportView1.Report.Print(Printer1)

End

Keterangan:
Perintah “ReportView1.Range = HalamanCetak.Text” pada Event HalamanCetak_Change akan menampilkan perubahan tampilan ReportView setiap inputan pada HalamanCetak (untuk memilih halaman yang akan dicetak).

“ReportView1.RangePages” berkaitan langsung dengan “ReportView1.Range”, Saat nilai “ReportView1.Range” di tentukan maka otomatis terindex di “ReportView1.RangePages”. “RangePages” sebagai index halaman, nilainy dimulai dari angka 0, sedangkan Page nilainya dimulai dari angka 1 (halaman). Misal saat nilai Range = “3-4” (halaman 3 sampai halaman 4) maka pada ReportView1 akan menampilkan 2 halaman, yakni halaman dari Report ke 3 dan ke 4. Jika di index akan terbaca halaman 1 (RangePage) sebagai index ke 0 , sedangkan halaman 2 (RangePage) sebagai index ke 1 (N-1).
Artinya RangePage[0] (halaman Report ke 3) berada pada index ke 2 halaman Report. Sedangkan RangePage[1] (halaman Report ke 4) berada pada index ke 3 halaman Report. Itulah kenapa pada nilai “Printer1.FirstPage” diisi dengan nilai “ ReportView1.RangePages[0] + 1” karena FirsPage mengacu pada halaman Report sedangkan RangePages pada index.
Ribet ya?? sudah,, sudah,,, dipelajari pelan-pelan aja dengan otak-atik itu skrip code.

Yang terakhir, untuk “Printer1.FirstPage” dan “Printer1.LastPage” sebaiknya jangan di set dalam satu event /proses pada tombol cetak ( ReportView1.Report.Print(Printer1) ), misal pada event Cetak_Click(), karena pada tombol pertama tidak akan berfungsi seperti yang diharapkan, sedangkan tombol yang keduakalinya maka akan berfungsi. Itulah kenapa sebaiknya “Printer1.FirstPage” dan “Printer1.LastPage” diatur secara terpisah pada event CetakHalaman_Change().

Tampilan hasil program diatas: