Jadi pertama ya buat dulu scriplet class via NetBean. Caranya? Gampang, buat aja new class dengan extends
net.sf.jasperreports.engine.JRAbstractScriptlet
Nah ini yang beda dari iReport sebelumnya. Pada iReport yang saya pake biasanya extends nya ke
it.businesslogic.ireport.IReportScriptlet
. Pantas saja scriplet hasil compilan sebelumnya ga bisa di gunakan. Untuk referencenya gunakan file [Install-Folder]\iReport-nb-3.5.3\ireport\modules\com-jaspersoft-ireport.jarSetelah scriplet di compile dan di jadikan jar, maka gunakan di report anda. Tambah classpath di iReport (Add Jar). Kemudian buka property report. Isikan nama class secara lengkap dengan package nya jika ada di property "Scriplet Class"
Compile untuk mengetahui error yang terjadi. Biasanya error yang muncul adalah class not found, yang muncul akibat masalah classpath. Setelah tidak ada error maka scriplet siap digunakan. Penggunaan scriplet bisa di lihat di posting saya ini.
Nah PR selanjutnya, saya ingin tau cara integrasi NetBean dan iReport ini.
17 komentar:
Mas, saya lagi liat2 lagi artikel mas yg lain dan saya tertarik sama artikel mas yg ini. Saya masi nubie nh sama java. Jd, maaf mas klo pertanyaannya agak2 dudul. ^^"
Yg buat class dl itu dan buat jar-nya, itu new java class library bukan mas?
Lalu, saya ga ngerti di bagian ini mas:
"Setelah scriplet di compile dan di jadikan jar, maka gunakan di report anda. Tambah classpath di iReport (Add Jar)."
Nambah classpath di iReport itu seperti apa ya mas?
Thx buat jawabannya. :)
-angel-
Maksudnya add classpath itu di menu classpath...saya lupa dimana itu (dah lama ga buka juga). Pokoknya biar jar yang baru kita buat itu bisa di panggil oleh iReport.
Sedang buad jar itu bener buat aja new class library
saya ud ketemu mas u/ nambahin classpathnya. Tp kok masi java.lang.ClassNotFoundException ya? Scriplet Class di report properties diisi dengan nama class yg saya buat kan? Dan saya tdk menggunakan package, jd seharusnya nama class aja kan? atau ada tambahan lainnya?
Kalau sebelum nambah classpath, jar yg akan ditambahkan saya copy ke folder lain (dan saya add classpath dari jar yg sudah saya copy), apakah itu mempengaruhi?
-angel-
Wah klo error nya class not found ya pastinya masalah di class path nya. Coba liat di scriptlet class nya, dia imports apa aja. Itu dimasukkan dalam classpath jg
Scriptlet class memang nama class aja. Klo ga pake package ya langsung aja.
Saya uda tau mas salah di mana. Saya coba copy file scriplet yang .class ke directory yang ada file report yg saya buat (.jrxml) dan error itu uda ga muncul lg. Tp muncul error baru mas ketika saya jalankan report :(. Ini errornya:
Error filling print... Error evaluating expression : Source text : $P{REPORT_SCRIPTLET}.terbilang("1234")
net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression : Source text : $P{REPORT_SCRIPTLET}.terbilang("1234") at net.sf.jasperreports.engine.fill.JREvaluator.evaluateEstimated(JREvaluator.java:257) at net.sf.jasperreports.engine.fill.JRCalculator.evaluateEstimated(JRCalculator.java:565) at net.sf.jasperreports.engine.fill.JRCalculator.estimateVariables(JRCalculator.java:169) at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:788) at net.sf.jasperreports.engine.fill.JRBaseFiller.next(JRBaseFiller.java:1425) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:112) at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:911) at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:814) at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:63) at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:421) at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:251) at com.jaspersoft.ireport.designer.compiler.IReportCompiler.run(IReportCompiler.java:898) at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:561) at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:986) Caused by: java.lang.NoSuchMethodError: TerbilangScriplet.terbilang(Ljava/lang/String;)Ljava/lang/String; at report32name_1269412354158_474589.evaluateEstimated(report32name_1269412354158_474589:576) at net.sf.jasperreports.engine.fill.JREvaluator.evaluateEstimated(JREvaluator.java:246) ... 13 more
Itu kira2 error kenapa ya mas?
-angel-
Error utamanya:
Caused by: java.lang.NoSuchMethodError: TerbilangScriplet.terbilang(Ljava/lang/String;)Ljava/lang/String; at report32name_1269412354158_474589.evaluateEstimated(report32name_1269412354158_474589:576)
coba cek di class scriptletnya
Hmm..saya coba jalanin method yang saya buat di class scriplet ini dan bisa jalan sih mas. Kira2 salah di mana ya mas? Ini coding class scriplet saya:
public class TerbilangScriplet extends net.sf.jasperreports.engine.JRDefaultScriptlet{
public String terbilang(String bilangan){
String kalimat = "";
String subkalimat = "";
String kata1 = "";
String kata2 = "";
String kata3 = "";
int[] angka = new int[16];
String[] kata = {"nol", "satu", "dua", "tiga", "empat", "lima", "enam", "tujuh", "delapan", "sembilan"};
String[] tingkat = {"", "ribu", "juta", "milyar", "triliun"};
for (int i = 1; i <16; i++){
angka[i] = 0;
}
// bil1 = bilangan.toString().split(",");
int panjang_bilangan = bilangan.length();
/* pengujian panjang bilangan */
if (panjang_bilangan > 15) {
kalimat = "Angka diluar batas";
}
/* mengambil angka-angka yang ada dalam bilangan,
dimasukkan ke dalam array */
for (int i = 1; i <= panjang_bilangan; i++) {
angka[panjang_bilangan - i + 1] = Integer.parseInt(bilangan.substring(i-1, i));
System.out.println("angka[" + i + "]: " + angka[panjang_bilangan - i + 1] + "");
}
int i = 1;
int j = 0;
// kalimat = "";
/* mengambil angka-angka yang ada dalam bilangan,
/* mulai proses iterasi terhadap array angka */
while (i <= panjang_bilangan) {
subkalimat = "";
kata1 = "";
kata2 = "";
kata3 = "";
/* untuk ratusan */
if (angka[i+2] != 0) {
if (angka[i+2] == 1) {
kata1 = " seratus";
} else {
kata1 = kata[angka[i+2]] + " ratus";
}
}
/* untuk puluhan atau belasan */
if (angka[i+1] != 0) {
if (angka[i+1] == 1) {
if (angka[i] == 0) {
kata2 = " sepuluh";
} else if (angka[i] == 1) {
kata2 = " sebelas";
} else {
kata2 = kata[angka[i]] + " belas";
}
} else {
kata2 = kata[angka[i+1]] + " puluh";
}
}
/* untuk satuan */
if (angka[i] != 0) {
if (angka[i+1] != 1) {
kata3 = kata[angka[i]];
}
}
/* pengujian angka apakah tidak nol semua,
lalu ditambahkan tingkat */
if ((angka[i] != 0) || (angka[i+1] != 0) || (angka[i+2] != 0)) {
subkalimat = kata1 + " " + kata2 + " " + kata3 + " " + tingkat[j] + " ";
}
/* gabungkan variabe sub kalimat (untuk satu blok 3 angka)
ke variabel kalimat */
kalimat = subkalimat + kalimat;
i = i + 3;
j = j + 1;
/* mengganti satu ribu jadi seribu jika diperlukan */
if ((angka[5] == 0) && (angka[6] == 0)) {
kalimat = kalimat.replace("satu ribu", "seribu");
}
}
return kalimat;
}
}
dari codingnya sih bener, tp koq aneh nya bilang java.lang.NoSuchMethodError
bingung juga jadinya, mungkin scriptlet yg di input di report salah?
iya mas. td waktu pertama kali saya kasi parameternya double. terus akhirnya saya ganti jadi string. tp di i-report belom refresh gitu. jd saya close i-reportnya dan saya buka lg, uda bisa jalan. :)
Thx mas ud mau bantuin. ^^
Btw, klo mau saya panggil reportnya dari program, kok jd error ya mas? class scripletny not found. gmn caranya u/ menjalankan dr program?
Coding saya kn seperti ini:
String path = System.getProperty("user.dir");
JasperReport report = JasperCompileManager.compileReport(path + "/dist/report/"
+ reportName + ".jrxml");
JasperPrint JPrint = JasperFillManager.fillReport(report, prs, conn);
Sepertinya ada yang harus ditambahkan ya kalau ada scriplet?
Nah ini dia...
saya malah belum pernah mengintegrasikan di aplikasi.
Kemungkinan ya harus tambah referensi object scriptletnya. Saya pake ireport di JasperServer. Caranya upload reportnya, trus di upload jar nya. Klo buat aplikasi desktop mungkin seperti itu juga, harus tambah referensi scriptletnya.
bisa mas!! kek yg mas bilang, tinggal tambahin library yg jar scriplet itu. Makasih banget ya mas! Jd belajar hal baru lg. Keep blogging mas! ^o^
-angel-
Ya kita sama2 belajar. thx atas tambahan ilmu nya
mas saya pake coding ini untuk pemanggilan report dari netbeans:
//Pemanggilan REPORT
private void cmdCetakActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
Data data = new Data();
String SQL;
SQL = "SELECT * from mahasiswa";
try
{
DBConnection getCn = new DBConnection();
Connection cn = getCn.getConnection();
Statement st = cn.createStatement();
ResultSet rs = st.executeQuery(SQL);
Report rpt = new Report();
rpt.loadReport("mahasiswa.jrxml", rs, null);
rpt = null;
}
catch(SQLException e)
{
System.out.println(e.toString());
}
}
//Buatlah Kelas dengan nama Report.java
/**
* @author Pri
*/
import java.sql.*;
import java.io.*;
import java.util.*;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.view.JasperViewer.*;
import net.sf.jasperreports.view.JRViewer;
import javax.swing.*;
import java.awt.*;
public class Report extends javax.swing.JDialog{
public void loadReport(String fileName, ResultSet rs, HashMap hm)
{
try
{
File file = new File(".");
String absolutePath = file.getAbsolutePath();
String temp = absolutePath.replace(".","");
temp = temp.replace("\\", "/");
String reportFile = temp + "reports/" + fileName;
JasperPrint jasperPrint;
JRResultSetDataSource jrRS = new JRResultSetDataSource (rs);
JasperReport jasperReport = JasperCompileManager.compileReport(reportFile);
if(hm != null)
{
jasperPrint = JasperFillManager.fillReport (jasperReport, hm, jrRS);
}
else
{
jasperPrint = JasperFillManager.fillReport(jasperReport, null, jrRS);
}
JRViewer aViewer = new JRViewer(jasperPrint);
JDialog viewer = new JDialog();
viewer.setTitle(".: Jasper Report :.");
viewer.setAlwaysOnTop(true);
viewer.getContentPane().add(aViewer);
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
viewer.setBounds(0,0,screenSize.width, screenSize.height);
viewer.setVisible(true);
}
catch(JRException e)
{
JOptionPane.showMessageDialog(null, e.toString(),"Warning",JOptionPane.OK_OPTION);
}
}
public Report()
{
}
}
tapi gag kluar n kluarnya seperti ini :
20 Jul 10 9:34:45 org.apache.commons.digester.Digester error
SEVERE: Parse Error at line 2 column 408: Document root element "jasperReport", must match DOCTYPE root "null".
org.xml.sax.SAXParseException: Document root element "jasperReport", must match DOCTYPE root "null".
ini kira2 apanya yang salah???
Rasanya itu error di struktur JRXML nya.Jadi mencoba parse JRXML gagal. Coba test di buka di iReport bisa ga?
mas kalo munculnya pesan "error creating sax parser"
itu kenapa ya?
nih email saya mas
punten, lagi mendesak banget
maulana.azis@gmail.com
mohon bantuannya, makasih
@rumah TI
Dicoba link dibawah ini
http://www.jasperassistant.com/forum/topic/13586/error_creating_sax_parser?p3
nice information
Elemen solder uap
Posting Komentar