JasperReports একটি অত্যন্ত শক্তিশালী রিপোর্টিং টুল যা Java-এ রিপোর্ট তৈরি, কাস্টমাইজ এবং এক্সপোর্ট করতে ব্যবহৃত হয়। এক্ষেত্রে, User-driven Reports তৈরি করার জন্য, ব্যবহারকারীরা dynamic input প্রদান করতে পারে, যা রিপোর্টের আউটপুট পরিবর্তন করবে। ব্যবহারকারীর ইনপুট নেওয়ার জন্য সাধারণত Custom Input Forms ব্যবহৃত হয়, যার মাধ্যমে ব্যবহারকারী নির্দিষ্ট parameters প্রদান করতে পারে, যেমন date range, product type, location, ইত্যাদি।
এই নিবন্ধে, আমরা JasperReports-এ Custom Input Form তৈরি এবং User-driven Reports তৈরি করার জন্য parameters ব্যবহার সম্পর্কে আলোচনা করব।
1. Parameters in JasperReports: Concept and Usage
Parameters হল সেই ডেটা, যা রিপোর্টের সময় ব্যবহারকারী বা অ্যাপ্লিকেশন থেকে আসা ইনপুট হিসাবে রিপোর্টে প্রেরিত হয়। JasperReports-এ parameters ব্যবহার করে আপনি dynamic reports তৈরি করতে পারেন, যেখানে ব্যবহারকারীর ইনপুট অনুযায়ী ডেটা পরিবর্তন হয়।
Common Use Cases for Parameters:
- Date Range: ব্যবহারকারী যদি নির্দিষ্ট সময়সীমা নির্ধারণ করতে চান, যেমন start date এবং end date।
- Category or Region Filter: ব্যবহারকারী যদি নির্দিষ্ট বিভাগ বা অঞ্চল নির্বাচন করতে চান।
- Custom Queries: রিপোর্টে dynamic queries ব্যবহার করা যাতে ব্যবহারকারীর ইনপুটের উপর ভিত্তি করে ডেটা আনা হয়।
Parameter Declaration in JRXML:
Parameters সাধারণত JRXML ফাইলে ডিফাইন করা হয়।
<parameter name="StartDate" class="java.util.Date"/>
<parameter name="EndDate" class="java.util.Date"/>
<parameter name="Region" class="java.lang.String"/>
এখানে, StartDate, EndDate, এবং Region হলো প্যারামিটার যেগুলি রিপোর্টের জন্য ইনপুট হিসাবে ব্যবহৃত হবে।
2. Custom Input Form for User-Driven Reports
একটি Custom Input Form তৈরি করতে হলে আপনাকে একটি UI তৈরি করতে হবে যা ব্যবহারকারীকে ইনপুট প্রদান করার সুযোগ দেবে। সাধারণত Swing, JavaFX, বা Servlet/JSP ব্যবহার করে এমন ইনপুট ফর্ম তৈরি করা হয়।
Swing Input Form Example:
এখানে একটি সহজ Swing ফর্ম উদাহরণ দেওয়া হলো যা ব্যবহারকারীর কাছ থেকে date range এবং region ইনপুট নেবে এবং সেই অনুযায়ী রিপোর্ট তৈরি করবে।
import javax.swing.*;
import java.awt.*;
import java.util.Date;
import net.sf.jasperreports.engine.*;
import java.util.*;
public class ReportInputForm extends JFrame {
private JTextField startDateField;
private JTextField endDateField;
private JTextField regionField;
public ReportInputForm() {
setTitle("User Input Form for Report");
setLayout(new FlowLayout());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Add components to the form
add(new JLabel("Start Date (YYYY-MM-DD):"));
startDateField = new JTextField(10);
add(startDateField);
add(new JLabel("End Date (YYYY-MM-DD):"));
endDateField = new JTextField(10);
add(endDateField);
add(new JLabel("Region:"));
regionField = new JTextField(10);
add(regionField);
JButton generateButton = new JButton("Generate Report");
generateButton.addActionListener(e -> generateReport());
add(generateButton);
pack();
setVisible(true);
}
private void generateReport() {
try {
// Get input values from the form
Date startDate = new SimpleDateFormat("yyyy-MM-dd").parse(startDateField.getText());
Date endDate = new SimpleDateFormat("yyyy-MM-dd").parse(endDateField.getText());
String region = regionField.getText();
// Define parameters
Map<String, Object> parameters = new HashMap<>();
parameters.put("StartDate", startDate);
parameters.put("EndDate", endDate);
parameters.put("Region", region);
// Compile the report
JasperReport jasperReport = JasperCompileManager.compileReport("path/to/your_report.jrxml");
// Fill the report with data
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, new JREmptyDataSource());
// Export the report to PDF
JasperExportManager.exportReportToPdfFile(jasperPrint, "output/report.pdf");
JOptionPane.showMessageDialog(this, "Report Generated Successfully!");
} catch (Exception e) {
JOptionPane.showMessageDialog(this, "Error generating report: " + e.getMessage());
}
}
public static void main(String[] args) {
new ReportInputForm();
}
}
Explanation:
- Swing Input Form: এখানে একটি Swing ফর্ম তৈরি করা হয়েছে, যেখানে ব্যবহারকারী start date, end date, এবং region ইনপুট হিসেবে দিতে পারবেন।
- Generate Report Button: ব্যবহারকারী Generate Report বাটন ক্লিক করলে, রিপোর্ট তৈরির জন্য ইনপুট প্যারামিটারগুলি JasperReport ফাইলে পাঠানো হবে।
3. Dynamic Query Generation Using Parameters
JasperReports-এ dynamic queries তৈরি করতে, আপনি parameters ব্যবহার করে SQL প্রশ্নে পরিবর্তনশীল মান যোগ করতে পারেন। উদাহরণস্বরূপ, ব্যবহারকারীর পছন্দ অনুযায়ী date range বা region এর উপর ভিত্তি করে ডেটা ফিল্টার করা যাবে।
Dynamic Query Example:
ধরা যাক, আপনি একটি JDBC রিপোর্ট তৈরি করছেন, যেখানে StartDate, EndDate, এবং Region প্যারামিটারগুলো ব্যবহার করা হবে SQL query তে।
<queryString>
<![CDATA[
SELECT * FROM employee
WHERE hire_date BETWEEN $P{StartDate} AND $P{EndDate}
AND region = $P{Region}
]]>
</queryString>
এখানে, $P{StartDate}, $P{EndDate}, এবং $P{Region} হল প্যারামিটার যা রিপোর্টের সময় ব্যবহারকারীর ইনপুট অনুযায়ী পরিবর্তিত হবে। $P এর মাধ্যমে আপনি প্যারামিটার রেফারেন্স করেন, যা SQL প্রশ্নে পরিবর্তনশীল মান হিসেবে ব্যবহৃত হয়।
Example of Passing Parameters to the Report:
Map<String, Object> parameters = new HashMap<>();
parameters.put("StartDate", startDate); // date from user input
parameters.put("EndDate", endDate); // date from user input
parameters.put("Region", region); // region from user input
JasperReport jasperReport = JasperCompileManager.compileReport("path/to/your_report.jrxml");
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, connection);
এখানে, JasperFillManager.fillReport() মেথডের মাধ্যমে প্যারামিটার পাঠানো হচ্ছে এবং JDBC connection ব্যবহার করা হচ্ছে ডেটা ফেচ করার জন্য।
4. User-driven Reports in Web Applications (Using JSP/Servlet)
যদি আপনি JasperReports কে web applications (যেমন JSP বা Servlet) এর মাধ্যমে ব্যবহার করতে চান, তখনও আপনি user-driven reports তৈরি করতে পারেন। ব্যবহারকারী ইনপুট ফর্মের মাধ্যমে প্যারামিটার প্রদান করবে এবং সেই অনুযায়ী রিপোর্ট তৈরি করা হবে।
JSP Example for User-driven Reports:
<form action="GenerateReport" method="post">
Start Date: <input type="text" name="startDate" />
End Date: <input type="text" name="endDate" />
Region: <input type="text" name="region" />
<input type="submit" value="Generate Report" />
</form>
Servlet Example to Handle Report Generation:
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import net.sf.jasperreports.engine.*;
import java.util.*;
public class ReportGeneratorServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
String startDate = request.getParameter("startDate");
String endDate = request.getParameter("endDate");
String region = request.getParameter("region");
Map<String, Object> parameters = new HashMap<>();
parameters.put("StartDate", startDate);
parameters.put("EndDate", endDate);
parameters.put("Region", region);
JasperReport jasperReport = JasperCompileManager.compileReport("path/to/your_report.jrxml");
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, new JREmptyDataSource());
response.setContentType("application/pdf");
ServletOutputStream outputStream = response.getOutputStream();
JasperExportManager.exportReportToPdfStream(jasperPrint, outputStream);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Explanation:
- JSP ফর্মে ব্যবহারকারী ইনপুট প্রদান করে, যা POST রিকোয়েস্ট হিসেবে Servlet-এ পাঠানো হয়।
- Servlet প্যারামিটার গ্রহণ করে JasperReports-এ রিপোর্ট তৈরি করে এবং PDF ফরম্যাটে ক্লায়েন্ট ব্রাউজারে পাঠিয়ে দেয়।
- JasperReports-এ parameters ব্যবহার করে আপনি dynamic reports তৈরি করতে পারেন, যেখানে ব্যবহারকারীর ইনপুট অনুযায়ী ডেটা বা রিপোর্ট কাস্টমাইজ করা হয়।
- Custom Input Forms ব্যবহার করে আপনি date range, region, category ইত্যাদি প্যারামিটার ব্যবহারকারী থেকে ইনপুট হিসেবে নিতে পারেন এবং রিপোর্টের আউটপুট পরিবর্তন করতে পারেন।
- Dynamic Query Generation এবং User-driven Reports তৈরির জন্য প্যারামিটার ব্যবহার করা খুবই কার্যকর, এবং এটি আপনার রিপোর্ট তৈরির প্রক্রিয়াকে আরও ফ্লেক্সিবল ও ইন্টারঅ্যাকটিভ করে তোলে।
Read more