Subreports JasperReports-এ একটি অত্যন্ত গুরুত্বপূর্ণ ফিচার যা মূল রিপোর্টের ভিতরে অন্য একটি রিপোর্ট (যেমন একটি আলাদা রিপোর্ট ফাইল) এম্বেড বা ইনক্লুড করার সুযোগ দেয়। এটি মূল রিপোর্টের বাইরে আরও বিস্তারিত বা সম্পর্কিত ডেটা প্রদর্শন করতে ব্যবহৃত হয়। Subreports মূলত একটি কমপ্লেক্স রিপোর্টের অংশ হিসেবে কাজ করে, যেখানে একাধিক রিপোর্টের অংশ একত্রিত করা হয়।
Subreport ব্যবহারের সুবিধা
- Modularity:
- Subreports ব্যবহারের মাধ্যমে রিপোর্টের বিভিন্ন অংশ আলাদা আলাদা রাখা যায়। এতে কোডের পুনরাবৃত্তি কমে এবং রিপোর্টের ডিজাইন আরও মডুলার হয়।
- Reuse:
- Subreport-কে একাধিক রিপোর্টে পুনরায় ব্যবহার করা যেতে পারে। একবার একটি Subreport তৈরি করলে তা অন্য রিপোর্টের মধ্যে ব্যবহার করা সহজ হয়।
- Data Independence:
- মূল রিপোর্ট এবং Subreport দুটি আলাদা ডেটাসোর্স ব্যবহার করতে পারে, যার ফলে ডেটার সম্পূর্ণ স্বাধীনতা বজায় থাকে।
- Complex Data Structure:
- যখন রিপোর্টের মধ্যে জটিল ডেটা থাকে, যেমন একাধিক নেস্টেড টেবিল, তখন Subreport ব্যবহৃত হয়।
JasperReports-এ Subreport ব্যবস্থাপনা
JasperReports-এ Subreport ব্যবহারের জন্য মূলত দুটি প্রধান উপাদান থাকে:
- Main Report: যেখানে Subreport এম্বেড করা হয়।
- Subreport: এটি একটি আলাদা রিপোর্ট ফাইল যা মূল রিপোর্টে অন্তর্ভুক্ত করা হয়।
Subreport তৈরি এবং সংযুক্ত করার ধাপ
- Subreport ডিজাইন করা:
- প্রথমে একটি আলাদা JRXML ফাইল তৈরি করতে হবে, যা আপনার Subreport এর জন্য হবে।
- Main Report-এ Subreport এম্বেড করা:
- তারপর, মূল রিপোর্টে
<subreport>ট্যাগ ব্যবহার করে Subreport এম্বেড করতে হবে।
- তারপর, মূল রিপোর্টে
- Data Pass করা:
- ডেটা সোর্স থেকে ডেটা মূল রিপোর্ট থেকে Subreport-এ পাস করতে হবে। এর জন্য প্যারামিটার বা ফিল্ড ব্যবহার করা হয়।
Subreport তৈরি এবং এম্বেড করার উদাহরণ
ধাপ ১: Subreport তৈরি করা (JRXML ফাইল)
এখানে একটি Subreport তৈরি করা হচ্ছে, যা orders নামের একটি টেবিলের ডেটা প্রদর্শন করবে।
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports"
name="subreport_example" pageWidth="595" pageHeight="842">
<parameter name="order_id" class="java.lang.Integer"/>
<detail>
<band height="50">
<textField>
<reportElement x="0" y="0" width="300" height="30"/>
<textFieldExpression><![CDATA["Order ID: " + $P{order_id}]]></textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
এই Subreport ফাইলে order_id প্যারামিটার ব্যবহার করা হয়েছে, যা মূল রিপোর্ট থেকে পাস করা হবে।
ধাপ ২: Main Report-এ Subreport এম্বেড করা
এখন মূল রিপোর্টে Subreport এম্বেড করা হবে এবং order_id প্যারামিটার পাস করা হবে।
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports"
name="main_report" pageWidth="595" pageHeight="842">
<parameter name="customer_id" class="java.lang.Integer"/>
<detail>
<band height="50">
<subreport>
<reportElement x="0" y="0" width="300" height="100"/>
<subreportExpression><![CDATA["subreport_example.jasper"]]></subreportExpression>
<dataSourceExpression><![CDATA[$P{customer_id}]]></dataSourceExpression>
<parameter name="order_id" class="java.lang.Integer">
<parameterExpression><![CDATA[$P{customer_id}]]></parameterExpression>
</parameter>
</subreport>
</band>
</detail>
</jasperReport>
এখানে:
<subreport>ট্যাগ ব্যবহার করে Subreport এম্বেড করা হয়েছে।subreportExpressionএর মাধ্যমে Subreport ফাইলের নাম প্রদান করা হয়েছে, যা subreport_example.jasper ফাইলের মাধ্যমে ইনপুট হবে।parameterব্যবহার করেorder_idপ্যারামিটার মূল রিপোর্ট থেকে Subreport-এ পাস করা হয়েছে।
ধাপ ৩: Java কোডে Subreport ব্যবহার করা
এখন, Java কোডে JasperFillManager ব্যবহার করে মূল রিপোর্টে ডেটা ফিল্ড করা এবং Subreport-এ প্যারামিটার পাস করা হবে।
import net.sf.jasperreports.engine.*;
import java.util.HashMap;
import java.util.Map;
public class JasperSubreportExample {
public static void main(String[] args) throws Exception {
// Create parameter map
Map<String, Object> parameters = new HashMap<>();
parameters.put("customer_id", 101);
// Compile the main report
JasperReport jasperReport = JasperCompileManager.compileReport("main_report.jrxml");
// Fill the report
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, new JREmptyDataSource());
// Export the report to PDF
JasperExportManager.exportReportToPdfFile(jasperPrint, "main_report_output.pdf");
}
}
এখানে:
- parameters.put("customer_id", 101); -
customer_idপ্যারামিটারটি মূল রিপোর্টে পাস করা হয়েছে। - JasperFillManager.fillReport() ব্যবহার করে মূল রিপোর্টটি ডেটা সহ পূর্ণ করা হয়েছে এবং Subreport এর জন্য প্যারামিটার পাস করা হয়েছে।
Subreport ব্যবস্থাপনা সম্পর্কিত কিছু গুরুত্বপূর্ণ টিপস
- Separate Data Sources:
- মূল রিপোর্ট এবং Subreport-এর জন্য আলাদা ডেটা সোর্স ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ, মূল রিপোর্টে JDBC ডেটা সোর্স এবং Subreport-এ CSV ডেটা সোর্স থাকতে পারে।
- Performance Considerations:
- সাব রিপোর্টগুলির ব্যবহারে কর্মক্ষমতা কিছুটা প্রভাবিত হতে পারে, বিশেষত যখন একাধিক সাব রিপোর্ট বা জটিল ডেটা সোর্স ব্যবহৃত হয়। তাই সাব রিপোর্ট গুলোর সংখ্যা এবং জটিলতা নিয়ন্ত্রণ করা গুরুত্বপূর্ণ।
- Parameter Passing:
- প্যারামিটার পাস করার সময়, সাব রিপোর্টে ডেটা বা প্যারামিটার সঠিকভাবে পাস করতে নিশ্চিত হন। উপযুক্ত প্যারামিটার সেটিংস এবং এক্সপ্রেশন ব্যবহার করতে হবে।
- Error Handling:
- রিপোর্টে সাব রিপোর্টের ডেটা সঠিকভাবে না আসলে NullPointerException বা অন্য কোনো সমস্যা হতে পারে। এজন্য সাব রিপোর্টের ইনপুট ডেটা যাচাই করা প্রয়োজন।
Subreports JasperReports-এ একটি শক্তিশালী বৈশিষ্ট্য যা আপনাকে একটি রিপোর্টের মধ্যে অন্য একটি রিপোর্ট অন্তর্ভুক্ত করতে সাহায্য করে। এটি মূল রিপোর্টের বিভিন্ন অংশকে আলাদা করে এবং রিপোর্টের জটিলতা কমাতে সহায়তা করে। Subreport ব্যবহারের মাধ্যমে আপনি একাধিক ডেটা সোর্স থেকে ডেটা নিয়ে একত্রে একটি সম্পূর্ণ রিপোর্ট তৈরি করতে পারবেন।
Subreport হল একটি রিপোর্টের মধ্যে আরেকটি রিপোর্ট অন্তর্ভুক্ত করার একটি প্রক্রিয়া। JasperReports এ, আপনি একটি প্রধান রিপোর্টের মধ্যে Subreport ব্যবহার করে নির্দিষ্ট অংশ বা সেকশন হিসেবে অন্য রিপোর্ট যোগ করতে পারেন। এটি খুবই কার্যকরী যখন একটি জটিল রিপোর্টে ডেটার কয়েকটি ভিন্ন অংশ বা সাবসেকশন একসাথে প্রদর্শন করতে হয়।
JasperReports-এ Subreport সাধারণত Subreport Element ব্যবহার করে তৈরি করা হয়। এটি মূল রিপোর্টের অংশ হিসেবে এক্সিকিউট হতে পারে, এবং এটি ভিন্ন ডেটা সোর্স বা রিপোর্ট লজিক ব্যবহার করতে সক্ষম।
Subreport এর ধারণা
Subreport হল একটি রিপোর্টের অন্তর্গত রিপোর্ট। প্রধান রিপোর্টে ডেটার মূল অংশ প্রদর্শিত হয় এবং যেখানে প্রয়োজন সেখানে সাবরিপোর্ট অন্তর্ভুক্ত করা হয়। সাবরিপোর্ট তৈরি করা হয় একটি পৃথক JRXML ফাইল হিসেবে এবং এটি মূল রিপোর্টে subreport element ব্যবহার করে অন্তর্ভুক্ত করা হয়। এটি রিপোর্টের কন্টেন্টের মধ্যে একটি বিশেষ অংশ হিসেবে কাজ করে, যেমন কোনো গ্রুপের বিস্তারিত ডেটা, টেবিলের অন্য একটি অংশ, বা অন্য কোনো সাব-সেকশন।
JasperReports এ Subreport কেন ব্যবহার করা হয়?
- ডায়নামিক রিপোর্ট স্ট্রাকচার:
- Subreport ব্যবহার করে আপনি একটি রিপোর্টের মধ্যে বিভিন্ন অংশ বা সাবসেকশনকে একত্রিত করতে পারেন। এটি ডায়নামিক রিপোর্ট স্ট্রাকচার তৈরি করতে সাহায্য করে, যেখানে আপনি একাধিক সাবরিপোর্টের মাধ্যমে বিভিন্ন তথ্য একত্রিত করতে পারেন।
- কোড পুনরাবৃত্তি এড়ানো:
- একটি সাবরিপোর্ট তৈরি করে আপনি একই রিপোর্টের বিভিন্ন অংশের জন্য কোড বা লজিক পুনরাবৃত্তি এড়াতে পারেন। একবার সাবরিপোর্ট তৈরি করলে, তা বিভিন্ন রিপোর্টে ব্যবহৃত হতে পারে।
- কাস্টম রিপোর্ট এবং ডেটা লজিক:
- সাবরিপোর্ট ব্যবহার করে আপনি একাধিক ডেটা সোর্স থেকে রিপোর্ট তৈরি করতে পারেন। প্রধান রিপোর্টের জন্য এক ধরনের ডেটা এবং সাবরিপোর্টের জন্য আরেক ধরনের ডেটা সোর্স ব্যবহার করা যেতে পারে।
- প্রতিরূপ রিপোর্ট তৈরি:
- Subreports আপনাকে একই ধরণের রিপোর্টের বিভিন্ন সংস্করণ তৈরি করতে সাহায্য করে, যেমন: একাধিক বিভাগের জন্য বা একাধিক পণ্য ক্যাটেগরির জন্য আলাদা আলাদা সাবরিপোর্ট তৈরি করা।
- পরিসংখ্যান বা বিশ্লেষণ:
- প্রধান রিপোর্টের মধ্যে আপনি বিভিন্ন পরিসংখ্যান বা বিশ্লেষণ দেখতে চাইলে, সাবরিপোর্ট ব্যবহার করে আলাদা আলাদা টেবিল বা চার্ট যুক্ত করা যেতে পারে।
JasperReports এ Subreport এর উদাহরণ
ধরা যাক, আমাদের একটি প্রধান রিপোর্ট রয়েছে এবং আমরা সেখানে একটি সাবরিপোর্ট যোগ করতে চাই। এই সাবরিপোর্টে ডেটার বিস্তারিত দেখানো হবে।
Step 1: সাবরিপোর্ট রিপোর্ট (subreport.jrxml) তৈরি করা
প্রথমে, আমাদের একটি সাবরিপোর্ট তৈরি করতে হবে। এটি হতে পারে, উদাহরণস্বরূপ, পণ্যের একটি টেবিল।
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports
http://jasperreports.sourceforge.net/xsd/jasperreport.xsd"
name="subreport" language="java" pageWidth="595" pageHeight="842">
<queryString>
<![CDATA[SELECT product_name, price FROM products]]>
</queryString>
<field name="product_name" class="java.lang.String"/>
<field name="price" class="java.lang.Double"/>
<detail>
<band height="20">
<textField>
<reportElement x="0" y="0" width="200" height="20"/>
<textFieldExpression><![CDATA[$F{product_name}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="200" y="0" width="100" height="20"/>
<textFieldExpression><![CDATA[$F{price}]]></textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
Step 2: প্রধান রিপোর্টে সাবরিপোর্ট অন্তর্ভুক্ত করা
এখন, প্রধান রিপোর্টের মধ্যে আমরা সাবরিপোর্টটি অন্তর্ভুক্ত করব।
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports
http://jasperreports.sourceforge.net/xsd/jasperreport.xsd"
name="main_report" language="java" pageWidth="595" pageHeight="842">
<!-- অন্যান্য রিপোর্ট কনফিগারেশন -->
<subreport>
<reportElement x="0" y="100" width="515" height="150"/>
<subreportExpression><![CDATA["subreport.jasper"]]></subreportExpression>
</subreport>
</jasperReport>
এখানে, <subreport> এলিমেন্ট ব্যবহার করা হয়েছে, যা সাবরিপোর্টের ফাইলের পথ (উল্লেখিত subreport.jasper) এবং তার অবস্থান নির্ধারণ করে।
Step 3: Java কোড দিয়ে সাবরিপোর্টের সাথে প্রধান রিপোর্ট এক্সিকিউট করা
import net.sf.jasperreports.engine.*;
import java.util.HashMap;
public class JasperReportsSubreportExample {
public static void main(String[] args) throws JRException {
// প্রধান রিপোর্ট কম্পাইল করা
JasperReport jasperReport = JasperCompileManager.compileReport("path/to/main_report.jrxml");
// সাবরিপোর্ট ফাইল পাথ
HashMap<String, Object> parameters = new HashMap<>();
parameters.put("subreportFile", "path/to/subreport.jasper");
// রিপোর্ট ফিলিং
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters);
// রিপোর্ট এক্সপোর্ট করা (PDF হিসেবে)
JasperExportManager.exportReportToPdfFile(jasperPrint, "output_report.pdf");
}
}
Output:
- এটি
output_report.pdfনামক একটি PDF ফাইল তৈরি করবে যেখানে প্রধান রিপোর্ট এবং তার সাথে সাবরিপোর্টের বিস্তারিত তথ্য থাকবে।
Subreport এর বিভিন্ন ব্যবহার
- ডাইনামিক সেকশন তৈরি করা:
- সাবরিপোর্ট ব্যবহার করে আপনি রিপোর্টের বিভিন্ন অংশকে ডাইনামিকভাবে আলাদা করতে পারেন।
- বিভিন্ন ডেটা সোর্স:
- একসাথে একাধিক ডেটা সোর্স থেকে ডেটা নিয়ে একটি রিপোর্ট তৈরি করতে সাবরিপোর্ট সহায়ক।
- কাস্টম গ্রুপিং এবং রিপোর্টিং:
- আপনি সাবরিপোর্ট ব্যবহার করে গ্রুপ ভিত্তিক রিপোর্ট তৈরি করতে পারেন, যেমন বিভিন্ন বিভাগের জন্য আলাদা সাবরিপোর্ট।
- Subreport হল একটি শক্তিশালী ফিচার যা JasperReports ব্যবহার করে মূল রিপোর্টের মধ্যে অন্য একটি রিপোর্ট অন্তর্ভুক্ত করতে ব্যবহৃত হয়।
- এটি ডায়নামিক রিপোর্টিং, কাস্টম রিপোর্ট সেকশন, এবং বিভিন্ন ডেটা সোর্স ব্যবহারের জন্য উপকারী।
- Subreports একাধিক রিপোর্টের মধ্যে সম্পর্ক তৈরি করতে সহায়তা করে এবং ডেটা বিশ্লেষণ এবং উপস্থাপনাকে আরও গতিশীল করে তোলে।
JasperReports এর subreport ফিচার রিপোর্টিং প্রক্রিয়াকে আরও সংগঠিত এবং কার্যকরী করে, বিশেষত যখন রিপোর্টের মধ্যে ডেটার অনেক স্তর বা অংশ থাকে।
JasperReports এ subreports ব্যবহার করে আপনি মূল রিপোর্টের মধ্যে বিভিন্ন ছোট রিপোর্ট সংযুক্ত করতে পারেন। এটি বিশেষভাবে উপকারী যখন আপনার রিপোর্টের একটি অংশ আরেকটি রিপোর্টের মাধ্যমে প্রদর্শন করতে হয়। Subreport Integration মূল রিপোর্টের সাথে ডেটা এক্সচেঞ্জ করার জন্য ব্যবহার করা হয়, যাতে আপনি একটি বৃহত্তর রিপোর্টে ডাইনামিক উপাদান যোগ করতে পারেন।
Subreport Integration:
Subreport হল এমন একটি রিপোর্ট যা অন্য একটি রিপোর্টের ভিতরে অন্তর্ভুক্ত করা হয়। এটি nested reports তৈরিতে সহায়ক এবং অনেক ধরনের ডেটা সেগমেন্ট বা ডিজাইন কনটেন্ট দেখানোর জন্য ব্যবহৃত হয়।
Subreport Integration এর সুবিধা:
- Modular Design: Subreport ব্যবহারের মাধ্যমে আপনি একটি বড় রিপোর্টকে ছোট, রিসাইক্লেবল অংশে ভাগ করতে পারেন।
- Data Sharing: Main report এবং subreport একে অপরের সাথে ডেটা শেয়ার করতে পারে।
- Reusability: Subreports একাধিক মূল রিপোর্টে ব্যবহার করা যায়, ফলে কোড পুনরায় ব্যবহার সহজ হয়।
Subreport ব্যবহার করার প্রক্রিয়া:
- Subreport তৈরি: প্রথমে একটি subreport তৈরি করুন। এটি একাধিক ক্ষেত্র, ভেরিয়েবল, এবং ফিল্টার থাকতে পারে।
- Subreport Integration: মূল রিপোর্টে subreport ব্যবহার করুন এবং ডেটা বিনিময়ের জন্য parameters, fields বা data sources শেয়ার করুন।
Subreport তৈরি এবং ব্যবহার করা
Step 1: Subreport তৈরি করা:
ধরা যাক, আপনি একটি Employee রিপোর্ট তৈরি করছেন এবং এর মধ্যে আপনি Department সম্পর্কিত তথ্য দেখতে চান। আপনি EmployeeReport নামে একটি মূল রিপোর্ট তৈরি করবেন এবং DepartmentReport নামে একটি subreport তৈরি করবেন।
DepartmentReport.jrxml (Subreport):
<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports
http://jasperreports.sourceforge.net/xsd/jasperreport.xsd"
name="DepartmentReport" pageWidth="595" pageHeight="842" columnWidth="515" leftMargin="40"
rightMargin="40" topMargin="40" bottomMargin="40">
<field name="departmentId" class="java.lang.Integer"/>
<field name="departmentName" class="java.lang.String"/>
<detail>
<band height="20">
<textField>
<reportElement x="0" y="0" width="200" height="20"/>
<textFieldExpression><![CDATA[$F{departmentName}]]></textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
এখানে, DepartmentReport একটি subreport যেটি departmentName এবং departmentId ফিল্ড দেখাবে।
Step 2: Main Report তৈরি করা:
এখন, মূল রিপোর্টে subreport ব্যবহার করা হবে। EmployeeReport.jrxml নামক রিপোর্টে DepartmentReport subreport অন্তর্ভুক্ত করা হবে।
EmployeeReport.jrxml (Main Report):
<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports
http://jasperreports.sourceforge.net/xsd/jasperreport.xsd"
name="EmployeeReport" pageWidth="595" pageHeight="842" columnWidth="515" leftMargin="40"
rightMargin="40" topMargin="40" bottomMargin="40">
<field name="employeeId" class="java.lang.Integer"/>
<field name="employeeName" class="java.lang.String"/>
<field name="departmentId" class="java.lang.Integer"/>
<!-- Subreport Integration -->
<subreport>
<reportElement x="0" y="40" width="500" height="100"/>
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{departmentId})]]></dataSourceExpression>
<subreportExpression><![CDATA["DepartmentReport.jasper"]]></subreportExpression>
</subreport>
<detail>
<band height="40">
<textField>
<reportElement x="0" y="0" width="200" height="20"/>
<textFieldExpression><![CDATA[$F{employeeName}]]></textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
- Subreport Integration:
<subreport>ট্যাগের মধ্যে subreportExpression এবং dataSourceExpression ব্যবহার করে আপনি subreport যোগ করেছেন। - dataSourceExpression: এখানে $F{departmentId} এর মাধ্যমে মূল রিপোর্টের ডেটা departmentId এর সাথে subreport এর জন্য ডেটা পাঠানো হচ্ছে।
Step 3: Main Report এবং Subreport এর মধ্যে Data Exchange
JasperReports main report এবং subreport এর মধ্যে ডেটা শেয়ার করতে parameters, fields, এবং data sources ব্যবহার করে ডেটা এক্সচেঞ্জ করতে সাহায্য করে।
Parameters Exchange Example:
- Subreport প্যারামিটার প্রেরণ: আপনি মূল রিপোর্টের প্যারামিটারগুলো subreport এ পাঠাতে পারেন। উদাহরণস্বরূপ, employeeId এর ভিত্তিতে departmentId ফিল্ড দেখানো হবে।
<subreport>
<reportElement x="0" y="40" width="500" height="100"/>
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{departmentId})]]></dataSourceExpression>
<subreportExpression><![CDATA["DepartmentReport.jasper"]]></subreportExpression>
<subreportParameter>
<subreportParameterExpression><![CDATA[$P{employeeId}]]></subreportParameterExpression>
</subreportParameter>
</subreport>
- Main Report থেকে Subreport Parameters পাঠানো: যখন রিপোর্টটি পূর্ণ হবে, আপনি main report থেকে subreport এর প্যারামিটার হিসেবে employeeId পাঠাতে পারবেন, যা subreport এ ডেটা ফিল্টার করবে।
Step 4: রিপোর্ট কম্পাইল এবং জেনারেট করা
- JasperReport Compile: প্রথমে মূল রিপোর্ট এবং subreport কম্পাইল করতে হবে। এটি .jrxml ফাইল থেকে .jasper ফাইল তৈরি করবে।
JasperReport mainReport = JasperCompileManager.compileReport("EmployeeReport.jrxml");
JasperReport subReport = JasperCompileManager.compileReport("DepartmentReport.jrxml");
- Fill Report with Data: পরে মূল রিপোর্টে ডেটা যোগ করতে হবে এবং subreport সহ রিপোর্ট পূর্ণ করতে হবে।
Map<String, Object> parameters = new HashMap<>();
parameters.put("employeeId", 1);
parameters.put("departmentId", 101);
JasperPrint jasperPrint = JasperFillManager.fillReport(mainReport, parameters, dataSource);
- Export Report to PDF: রিপোর্ট তৈরি হলে, তা PDF, HTML, Excel বা অন্যান্য ফরম্যাটে এক্সপোর্ট করা যেতে পারে।
JasperExportManager.exportReportToPdfFile(jasperPrint, "EmployeeReport.pdf");
- Subreport Integration: JasperReports-এ subreport ব্যবহার করা অত্যন্ত সুবিধাজনক যখন মূল রিপোর্টের ভিতরে অন্য রিপোর্টের আউটপুট অন্তর্ভুক্ত করতে হয়।
- Data Exchange: মূল রিপোর্ট এবং subreport এর মধ্যে ডেটা শেয়ার করতে parameters, fields, এবং data sources ব্যবহার করা হয়।
- Modular Reports: Subreports ব্যবহার করে আপনি রিপোর্টের গঠনকে মডুলার করতে পারেন, যা পরবর্তীতে রিসাইক্লেবল ও ব্যবহারে সহজ হয়ে ওঠে।
JasperReports এর এই ক্ষমতা আপনাকে ডাইনামিক এবং কাস্টম রিপোর্ট তৈরি করতে সক্ষম করে, যেখানে রিপোর্টের ভিতরে একাধিক উপাদান এবং ডেটা মডিউল সহজভাবে একসাথে কাজ করতে পারে।
JasperReports একাধিক subreports তৈরি করার জন্য একটি শক্তিশালী রিপোর্টিং টুল। আপনি যখন মূল রিপোর্টে বিভিন্ন রিপোর্ট যোগ করতে চান, তখন আপনি subreports ব্যবহার করতে পারেন। এই subreports মূল রিপোর্টের অন্তর্ভুক্ত অংশ হিসাবে কাজ করে এবং প্রতিটি subreport এর নিজস্ব ডেটা সোর্স, ফিল্ড, এবং লেআউট থাকতে পারে।
এছাড়াও, আপনি nested subreports ব্যবহার করে একাধিক স্তরের রিপোর্ট তৈরি করতে পারেন। এটি তখন ব্যবহৃত হয় যখন একটি subreport অন্য একটি subreport-কে অন্তর্ভুক্ত করে।
এখানে আমরা দেখব multiple subreports এবং nested subreports কিভাবে JasperReports-এ তৈরি ও হ্যান্ডল করা যায়।
ধাপ ১: Multiple Subreports তৈরি করা
1.1. Subreport Model তৈরি করা
ধরা যাক, আমাদের মূল রিপোর্টে Employee তথ্য দেখানো হবে এবং প্রতিটি Employee এর জন্য একটি Project রিপোর্ট তৈরি করা হবে। প্রথমে একটি subreport তৈরি করি, যেখানে কর্মচারী প্রতি প্রকল্পের তথ্য থাকবে।
Employee Subreport (EmployeeReport.jrxml)
<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports
http://jasperreports.sourceforge.net/xsd/jasperreport.xsd"
name="EmployeeReport" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
<!-- Employee Fields -->
<field name="id" class="java.lang.Integer"/>
<field name="name" class="java.lang.String"/>
<field name="department" class="java.lang.String"/>
<detail>
<band height="20">
<textField>
<reportElement x="0" y="0" width="50" height="20"/>
<textFieldExpression><![CDATA[$F{id}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="60" y="0" width="200" height="20"/>
<textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="270" y="0" width="150" height="20"/>
<textFieldExpression><![CDATA[$F{department}]]></textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
এটি একটি সাধারণ Employee রিপোর্ট যেখানে id, name, এবং department ফিল্ড ব্যবহার করা হয়েছে।
1.2. Main Report-এ Subreport অন্তর্ভুক্ত করা
এখন, মূল রিপোর্টে EmployeeReport subreport অন্তর্ভুক্ত করা হবে। মূল রিপোর্টের জন্য subreport ফাইলের রেফারেন্স যোগ করতে হবে।
<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports
http://jasperreports.sourceforge.net/xsd/jasperreport.xsd"
name="MainReport" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
<parameter name="EmployeeDataSource" class="net.sf.jasperreports.engine.data.JRBeanCollectionDataSource"/>
<!-- Main Report Fields -->
<field name="id" class="java.lang.Integer"/>
<field name="name" class="java.lang.String"/>
<field name="department" class="java.lang.String"/>
<!-- Subreport Integration -->
<subreport>
<reportElement x="0" y="20" width="555" height="200"/>
<subreportExpression><![CDATA["EmployeeReport.jasper"]]></subreportExpression>
<dataSourceExpression><![CDATA[$P{EmployeeDataSource}]]></dataSourceExpression>
</subreport>
<detail>
<band height="20">
<textField>
<reportElement x="0" y="0" width="50" height="20"/>
<textFieldExpression><![CDATA[$F{id}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="60" y="0" width="200" height="20"/>
<textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="270" y="0" width="150" height="20"/>
<textFieldExpression><![CDATA[$F{department}]]></textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
এখানে, মূল রিপোর্টের মধ্যে subreportExpression ব্যবহার করা হয়েছে, যা আমাদের EmployeeReport.jasper ফাইলকে রেফারেন্স করবে। EmployeeDataSource প্যারামিটার দ্বারা subreport-এ ডেটা পাঠানো হবে।
1.3. Java কোডে Subreport Render করা
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class JasperReportsMultipleSubreportsExample {
public static void main(String[] args) {
try {
// Sample Employee Data
List<Employee> employees = new ArrayList<>();
employees.add(new Employee(1, "John Doe", "HR"));
employees.add(new Employee(2, "Jane Smith", "Finance"));
// JRBeanCollectionDataSource for Employee data
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(employees);
// Compile the main report and subreport
JasperReport mainReport = JasperCompileManager.compileReport("MainReport.jrxml");
JasperReport subReport = JasperCompileManager.compileReport("EmployeeReport.jrxml");
// Parameters for the main report
Map<String, Object> parameters = new HashMap<>();
parameters.put("EmployeeDataSource", dataSource);
// Fill the report
JasperPrint jasperPrint = JasperFillManager.fillReport(mainReport, parameters, new JREmptyDataSource());
// Export the report to PDF
JasperExportManager.exportReportToPdfFile(jasperPrint, "MainReportWithSubreports.pdf");
System.out.println("Report Generated with Multiple Subreports!");
} catch (JRException e) {
e.printStackTrace();
}
}
}
এখানে, JasperCompileManager.compileReport এর মাধ্যমে প্রধান রিপোর্ট এবং subreport কম্পাইল করা হয়, এবং পরে JasperFillManager.fillReport দ্বারা রিপোর্টটি পূর্ণ করা হয়। রিপোর্টটি PDF ফরম্যাটে এক্সপোর্ট করা হচ্ছে।
ধাপ ২: Nested Subreport তৈরি করা
Nested Subreport হল একটি subreport যা অন্য একটি subreport এর মধ্যে থাকে। উদাহরণস্বরূপ, প্রতিটি Employee এর জন্য আমরা একটি subreport তৈরি করতে পারি যা তাদের প্রকল্পের (Projects) তালিকা দেখাবে।
Nested Subreport উদাহরণ:
- Main Report: প্রধান রিপোর্ট যেখানে Employee রিপোর্ট এবং তার প্রকল্পের (Projects) রিপোর্ট অন্তর্ভুক্ত থাকবে।
- Project Subreport: Employee এর প্রকল্প সম্পর্কিত রিপোর্ট।
Nested Subreport: Employee Report (with Project Subreport)
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports
http://jasperreports.sourceforge.net/xsd/jasperreport.xsd"
name="EmployeeReport" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
<subreport>
<reportElement x="0" y="20" width="555" height="200"/>
<subreportExpression><![CDATA["ProjectReport.jasper"]]></subreportExpression>
<dataSourceExpression><![CDATA[$F{projectsDataSource}]]></dataSourceExpression>
</subreport>
<detail>
<band height="20">
<textField>
<reportElement x="0" y="0" width="50" height="20"/>
<textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
এখানে, subreportExpression এর মধ্যে একটি নতুন subreport যোগ করা হয়েছে, যা ProjectReport.jasper থেকে প্রকল্পের তথ্য দেখাবে।
- Multiple Subreports: আপনি একটি মূল রিপোর্টের মধ্যে একাধিক subreport অন্তর্ভুক্ত করতে পারেন, যেখানে প্রতিটি subreport নিজস্ব রিপোর্ট তৈরি করতে সক্ষম।
- Nested Subreports: আপনি nested subreports ব্যবহার করে একাধিক স্তরের রিপোর্ট তৈরি করতে পারেন। একটি subreport অন্য একটি subreport অন্তর্ভুক্ত করতে পারে, যা রিপোর্টের কাঠামোকে আরো জটিল এবং বিস্তারিত করতে সাহায্য করে।
- Java Integration: JasperReports এর সাথে Java অ্যাপ্লিকেশন ইন্টিগ্রেট করে আপনি ডায়নামিকভাবে ডেটা পাঠাতে এবং রিপোর্টগুলি প্রজেক্টে রেন্ডার করতে পারেন।
- Exporting: JasperReports-এর মাধ্যমে তৈরি রিপোর্টগুলো বিভিন্ন ফরম্যাটে এক্সপোর্ট করা যায়, যেমন PDF, HTML, Excel (XLS), CSV, ইত্যাদি।
JasperReports এর মাধ্যমে subreports এবং nested subreports তৈরি করা একটি শক্তিশালী টুল যা business reporting এবং data visualization কাজকে সহজতর করে।
JasperReports একটি শক্তিশালী reporting engine যা ডেটা সুত্র থেকে রিপোর্ট তৈরি করতে সক্ষম। এর একটি বিশেষ বৈশিষ্ট্য হল subreport integration, যা মূল রিপোর্টের মধ্যে ছোট রিপোর্ট অন্তর্ভুক্ত করার সুবিধা দেয়। এছাড়াও Data Source Management JasperReports-এ ডেটা সংগ্রহের প্রক্রিয়াকে সহজ এবং ফ্লেক্সিবল করে তোলে।
এখানে Subreport এবং Data Source Management ব্যবহার করে রিপোর্ট তৈরির প্রক্রিয়া এবং কনফিগারেশন সম্পর্কে বিস্তারিত আলোচনা করা হবে।
1. Subreport Integration in JasperReports
Subreport হল একটি রিপোর্ট যা মূল রিপোর্টের মধ্যে অন্তর্ভুক্ত থাকে। এটি তখন ব্যবহৃত হয় যখন আপনার মূল রিপোর্টের মধ্যে একটি অন্য রিপোর্ট থাকতে পারে, যেমন একটি one-to-many relationship রিপোর্ট, বা nested reports। JasperReports-এ Subreport ব্যবহার করে আপনি ছোট রিপোর্টগুলোর আউটপুট মূল রিপোর্টের মধ্যে অন্তর্ভুক্ত করতে পারেন।
Subreport এর জন্য প্রয়োজনীয় কনফিগারেশন
- Main Report তৈরি করুন, যেখানে Subreport যুক্ত করা হবে।
- Subreport File তৈরি করুন, যা মূল রিপোর্টে অন্তর্ভুক্ত হবে।
- Subreport-এ ডেটা পাঠানোর জন্য parameters এবং data sources কনফিগার করুন।
Subreport Example
ধরা যাক, আমাদের একটি Main Report রয়েছে, যেখানে একটি Subreport থাকবে যা সম্পর্কিত Order Details প্রদর্শন করবে।
Main Report (JRXML):
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports
http://jasperreports.sourceforge.net/xsd/jasperreports.xsd"
name="MainReport" pageWidth="595" pageHeight="842" columnWidth="515" leftMargin="40" rightMargin="40" topMargin="40" bottomMargin="40">
<!-- Main Report Header -->
<pageHeader>
<band height="40">
<textField>
<reportElement x="0" y="0" width="515" height="40"/>
<textFieldExpression><![CDATA["Main Report Title"]]></textFieldExpression>
</textField>
</band>
</pageHeader>
<!-- Main Report Detail with Subreport -->
<detail>
<band height="200">
<subreport>
<reportElement x="0" y="0" width="515" height="200"/>
<subreportExpression><![CDATA["Subreport.jasper"]]></subreportExpression>
<dataSourceExpression><![CDATA[$P{ReportDataSource}]]></dataSourceExpression>
<!-- Optional: Pass Parameters -->
<subreportParameter name="OrderId" class="java.lang.Integer">
<subreportParameterExpression><![CDATA[$F{orderId}]]></subreportParameterExpression>
</subreportParameter>
</subreport>
</band>
</detail>
</jasperReport>
এখানে, Main Report-এ একটি Subreport অন্তর্ভুক্ত করা হয়েছে। subreportExpression এর মাধ্যমে Subreport.jasper ফাইলটি উল্লেখ করা হয়েছে। subreportParameter এর মাধ্যমে OrderId প্যারামিটার মূল রিপোর্ট থেকে সাবরিপোর্টে পাঠানো হচ্ছে।
Subreport (JRXML):
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports
http://jasperreports.sourceforge.net/xsd/jasperreports.xsd"
name="Subreport" pageWidth="515" pageHeight="842" columnWidth="515" leftMargin="40" rightMargin="40" topMargin="40" bottomMargin="40">
<parameter name="OrderId" class="java.lang.Integer"/>
<!-- Subreport Detail -->
<detail>
<band height="50">
<textField>
<reportElement x="0" y="0" width="515" height="50"/>
<textFieldExpression><![CDATA["Order ID: " + $P{OrderId}]]></textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
এখানে Subreport-এ OrderId প্যারামিটার ব্যবহার করা হয়েছে এবং $P{OrderId} এর মাধ্যমে মূল রিপোর্ট থেকে আসা মানটি সাবরিপোর্টে প্রদর্শিত হচ্ছে।
2. Data Source Management in JasperReports
Data Source হল একটি উৎস যা থেকে JasperReports ডেটা সংগ্রহ করে রিপোর্ট তৈরি করে। JasperReports বিভিন্ন ধরনের ডেটা সোর্স সাপোর্ট করে, যেমন JDBC, JavaBeans, XML, CSV ইত্যাদি।
JasperReports-এর বিভিন্ন ধরনের DataSource
JDBC DataSource:
- JDBC ডেটাবেজ থেকে ডেটা এনে রিপোর্ট তৈরি করা হয়। JDBC ডেটা সোর্স ব্যবহারের জন্য JDBC connection ব্যবহার করা হয়।
String sqlQuery = "SELECT * FROM orders"; Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "username", "password"); JRResultSetDataSource jrDataSource = new JRResultSetDataSource(resultSet);JavaBeans DataSource:
- JavaBeans ক্লাসের প্রপার্টি ব্যবহার করে ডেটা সোর্স তৈরি করা হয়। আপনি JavaBeans ক্লাস ব্যবহার করে ডেটা সংগ্রহ করতে পারেন এবং তারপর সেই ডেটা রিপোর্টে ফিল্ড হিসেবে ব্যবহার করতে পারেন।
List<Employee> employees = employeeService.getEmployees(); JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(employees);CSV DataSource:
- CSV ফাইল থেকেও ডেটা সংগ্রহ করা যেতে পারে। এখানে আপনি CSV ফাইলের পাথ বা ডেটার প্রকার নির্ধারণ করে ডেটা সোর্স তৈরি করতে পারেন।
File csvFile = new File("data.csv"); CsvDataSource csvDataSource = new CsvDataSource(csvFile);XML DataSource:
- XML ফাইল থেকেও ডেটা সংগ্রহ করা যায়। এটি সাধারণত XML ফাইলের স্ট্রাকচার অনুযায়ী ডেটা নির্ধারণ করে।
File xmlFile = new File("data.xml"); JRXmlDataSource xmlDataSource = new JRXmlDataSource(xmlFile, "/orders/order");
DataSource Example in JasperReports:
import net.sf.jasperreports.engine.*;
import java.util.*;
public class ReportGenerator {
public static void generateReport() throws JRException {
// DataSource (Here we use a collection of JavaBeans)
List<Employee> employees = getEmployees(); // Assume this method fetches employee data
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(employees);
// JasperReport Compilation
JasperReport jasperReport = JasperCompileManager.compileReport("EmployeeReport.jrxml");
// Report Parameters (optional)
Map<String, Object> parameters = new HashMap<>();
parameters.put("ReportTitle", "Employee Report");
// Fill Report with Data and Parameters
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, dataSource);
// Export to PDF
JasperExportManager.exportReportToPdfFile(jasperPrint, "EmployeeReport.pdf");
}
// Example method to fetch employee data
private static List<Employee> getEmployees() {
List<Employee> employees = new ArrayList<>();
employees.add(new Employee(1, "John", "Doe"));
employees.add(new Employee(2, "Jane", "Smith"));
return employees;
}
}
এখানে:
- DataSource: JavaBeans (Employee) ব্যবহার করা হয়েছে।
- JasperCompileManager: JRXML ফাইল কম্পাইল করার জন্য ব্যবহৃত হয়েছে।
- JasperFillManager: রিপোর্টের জন্য ডেটা এবং প্যারামিটার যুক্ত করার জন্য ব্যবহৃত হয়েছে।
- JasperExportManager: রিপোর্টটি PDF ফরম্যাটে রেন্ডার করার জন্য ব্যবহৃত হয়েছে।
3. Subreport এবং Data Source Management এর মধ্যে সম্পর্ক
JasperReports-এ Subreport এবং Data Source একে অপরের সাথে সম্পর্কিত। Subreport সাধারণত মূল রিপোর্টের জন্য অতিরিক্ত ডেটা বা রিপোর্ট দেখানোর জন্য ব্যবহৃত হয় এবং এটি মূল রিপোর্টের ডেটা সোর্স ব্যবহার করতে পারে বা একটি নতুন ডেটা সোর্সের মাধ্যমে আলাদা ডেটা রিপোর্ট তৈরি করতে পারে।
Subreport এর DataSource পাস করা:
Map<String, Object> parameters = new HashMap<>();
parameters.put("ReportDataSource", new JRBeanCollectionDataSource(orderDetails)); // Pass DataSource to Subreport
এখানে, orderDetails এর মাধ্যমে Subreport-এ ডেটা পাঠানো হচ্ছে। Subreport JRBeanCollectionDataSource ব্যবহার করে এই ডেটাকে এক্সেস করবে এবং উপস্থাপন করবে।
- Subreport: JasperReports-এ Subreport ব্যবহার করে আপনি মূল রিপোর্টের অংশ হিসেবে ছোট রিপোর্ট অন্তর্ভুক্ত করতে পারেন। এটি
subreportExpression,subreportParameter, এবংdataSourceExpressionএর মাধ্যমে কনফিগার করা হয়। - Data Source Management: JasperReports বিভিন্ন ধরনের ডেটা সোর্স যেমন JDBC, JavaBeans, CSV, এবং XML সাপোর্ট করে, যা বিভিন্ন ডেটা সোর্স থেকে রিপোর্ট তৈরি করতে সাহায্য করে।
- Subreport এবং Data Source: Subreport-এ ডেটা সোর্স পাস করার জন্য, মূল রিপোর্টের ডেটা সোর্স ব্যবহার করা যেতে পারে বা একটি নতুন ডেটা সোর্স সেট করা যেতে পারে।
এই কনফিগারেশনগুলোর মাধ্যমে JasperReports-এর রিপোর্ট জেনারেশন এবং ডেটা ম্যানেজমেন্ট প্রক্রিয়া আরও কার্যকর এবং নমনীয় হতে পারে।
Read more