JasperReports-এ multiple database sources থেকে ডেটা ফেচ করা একটি সাধারণ এবং শক্তিশালী ফিচার। এটি আপনাকে একাধিক ডেটাবেস, টেবিল বা JDBC সোর্স থেকে ডেটা একত্রিত করতে সাহায্য করে। আপনি বিভিন্ন ডেটাবেস বা ডেটাসোর্সে কোয়েরি চালিয়ে সেগুলোর ফলাফল রিপোর্টে মিশিয়ে দেখাতে পারেন।
Multiple Data Sources এর উদ্দেশ্য:
- একাধিক ডেটাবেস সংযোগ থেকে ডেটা প্রাপ্তি।
- Joins করতে না পারলে আলাদা আলাদা ডেটাসোর্স থেকে ডেটা ফেচ করা।
- একাধিক টেবিল বা ভিউ থেকে রিপোর্ট তৈরি করা।
- কোডের মাধ্যমে বিভিন্ন সোর্স থেকে ডেটা একত্রিত করা।
এই উদাহরণে, আমরা দুটি আলাদা ডেটাবেস থেকে ডেটা ফেচ করব এবং সেগুলোর সাথে JasperReports ব্যবহার করে রিপোর্ট তৈরি করব।
ধাপ ১: Multiple Data Sources তৈরি করা
আমরা দুটি ডেটাবেস সিমুলেট করব: একটি Employee Database এবং একটি Department Database। এই ডেটাবেসগুলো থেকে আমরা ডেটা JDBC এর মাধ্যমে জিজ্ঞাসা করব।
1.1. Employee Database
ডেটাবেসের জন্য একটি টেবিল হতে পারে যা কর্মচারীদের তথ্য সংরক্ষণ করে:
| EmployeeID | Name | DepartmentID |
|---|---|---|
| 1 | John Doe | 101 |
| 2 | Jane Doe | 102 |
1.2. Department Database
একটি আলাদা ডেটাবেস হতে পারে যেখানে Department তথ্য রাখা হবে:
| DepartmentID | DepartmentName |
|---|---|
| 101 | HR |
| 102 | Finance |
ধাপ ২: JDBC DataSource ব্যবহার করা
আমরা JDBC ব্যবহার করে Employee এবং Department ডেটাবেসের জন্য ডেটা সোর্স তৈরি করব।
2.1. DataSource Configuration
import javax.sql.DataSource;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
public class DataSourceConfig {
public static DataSource getEmployeeDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/employee_db");
dataSource.setUsername("root");
dataSource.setPassword("password");
return dataSource;
}
public static DataSource getDepartmentDataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/department_db");
dataSource.setUsername("root");
dataSource.setPassword("password");
return dataSource;
}
}
এখানে আমরা Employee Database এবং Department Database এর জন্য দুটি আলাদা DataSource তৈরি করেছি।
ধাপ ৩: JasperReports Configuration
এখন, আমরা JasperReports এর মাধ্যমে দুটি আলাদা ডেটাবেস থেকে ডেটা একত্রিত করব এবং সেগুলো রিপোর্টে প্রক্রিয়া করব।
3.1. Report Design (JRXML)
আমরা Employee এবং Department এর ডেটাকে একত্রিত করতে চাই, যেখানে Employee এর জন্য EmployeeID, Name, এবং DepartmentID থাকবে এবং Department এর জন্য DepartmentID এবং DepartmentName থাকবে।
<?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="EmployeeDepartmentReport" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
<!-- Employee Fields -->
<field name="EmployeeID" class="java.lang.Integer"/>
<field name="Name" class="java.lang.String"/>
<field name="DepartmentID" class="java.lang.Integer"/>
<field name="DepartmentName" class="java.lang.String"/>
<!-- SQL Query for Employee Data -->
<queryString>
<![CDATA[SELECT EmployeeID, Name, DepartmentID FROM Employees]]>
</queryString>
<!-- SQL Query for Department Data -->
<subDataset name="DepartmentData">
<queryString>
<![CDATA[SELECT DepartmentID, DepartmentName FROM Departments]]>
</queryString>
</subDataset>
<detail>
<band height="20">
<textField>
<reportElement x="0" y="0" width="50" height="20"/>
<textFieldExpression><![CDATA[$F{EmployeeID}]]></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="100" height="20"/>
<textFieldExpression><![CDATA[$F{DepartmentID}]]></textFieldExpression>
</textField>
<!-- Subreport for Department Name -->
<subreport>
<reportElement x="380" y="0" width="150" height="20"/>
<subreportExpression><![CDATA["DepartmentReport.jasper"]]></subreportExpression>
<dataSourceExpression><![CDATA[$F{DepartmentID}]]></dataSourceExpression>
</subreport>
</band>
</detail>
</jasperReport>
ব্যাখ্যা:
- Main Query: Employee ডেটাবেস থেকে কর্মচারীদের তথ্য নিয়ে আসছে।
- Subreport (Department): Department ডেটাবেসের ডেটা subreport এর মাধ্যমে অন্তর্ভুক্ত করা হচ্ছে।
ধাপ ৪: Java কোড দিয়ে Multiple DataSources থেকে Data Fetch এবং Report Generate করা
Java কোডের মাধ্যমে আমরা দুইটি ডেটাবেস সোর্সের ডেটা ফেচ করব এবং সেই ডেটার ভিত্তিতে রিপোর্ট তৈরি করবো।
4.1. Java কোড
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import java.util.*;
public class MultipleDatabaseSourceReport {
public static void main(String[] args) {
try {
// Employee and Department Data Fetch (Simulated)
List<Employee> employeeList = fetchEmployeeData();
List<Department> departmentList = fetchDepartmentData();
// JRBeanCollectionDataSource for Employee and Department Data
JRBeanCollectionDataSource employeeDataSource = new JRBeanCollectionDataSource(employeeList);
JRBeanCollectionDataSource departmentDataSource = new JRBeanCollectionDataSource(departmentList);
// Compile the main report and subreport
JasperReport mainReport = JasperCompileManager.compileReport("EmployeeDepartmentReport.jrxml");
// Parameters for the report
Map<String, Object> parameters = new HashMap<>();
parameters.put("EmployeeDataSource", employeeDataSource);
parameters.put("DepartmentDataSource", departmentDataSource);
// Fill the report
JasperPrint jasperPrint = JasperFillManager.fillReport(mainReport, parameters, new JREmptyDataSource());
// Export the report to PDF
JasperExportManager.exportReportToPdfFile(jasperPrint, "EmployeeDepartmentReport.pdf");
System.out.println("Report Generated Successfully!");
} catch (JRException e) {
e.printStackTrace();
}
}
// Simulate fetching Employee data from the Employee Database
private static List<Employee> fetchEmployeeData() {
List<Employee> employees = new ArrayList<>();
employees.add(new Employee(1, "John Doe", 101));
employees.add(new Employee(2, "Jane Smith", 102));
return employees;
}
// Simulate fetching Department data from the Department Database
private static List<Department> fetchDepartmentData() {
List<Department> departments = new ArrayList<>();
departments.add(new Department(101, "HR"));
departments.add(new Department(102, "Finance"));
return departments;
}
}
Explanation:
- Data Fetching: এখানে আমরা Employee এবং Department ডেটা ফেচ করেছি।
- JRBeanCollectionDataSource:
EmployeeএবংDepartmentডেটার জন্য আলাদা আলাদাJRBeanCollectionDataSourceতৈরি করা হয়েছে। - Report Compilation and Filling: রিপোর্টের কম্পাইল এবং পূর্ণকরণের মাধ্যমে মূল রিপোর্ট এবং subreport এর ডেটা মাপা হয়েছে।
- Report Export: রিপোর্টটি PDF ফরম্যাটে এক্সপোর্ট করা হয়েছে।
- JasperReports আপনাকে multiple database sources থেকে ডেটা ফেচ করতে এবং subreports ব্যবহার করে ডেটা একত্রিত করতে সহায়তা করে।
- আপনি multiple datasets ব্যবহার করে একাধিক ডেটাবেস বা ডেটা সোর্স থেকে রিপোর্ট তৈরি করতে পারেন।
- JasperReports এ JRXML ফাইল তৈরি করতে এবং JDBC বা JRBeanCollectionDataSource এর মাধ্যমে ডেটা ফেচ করা যায়।
এটি একটি প্রাথমিক উদাহরণ ছিল যেখানে multiple database sources থেকে ডেটা একত্রিত করে JasperReports রিপোর্ট তৈরি করা হয়েছে।
Read more