Gerando Report com Ireport - Usando Old(List) New(Table) - [Resolvido]

Tenho uma classe que recebe uma List data, sendo uma lista com requisição.
Porém preciso passar os itens desta lista que estão em outra tabela usa a chave estrangeira idRequest e idCompany.
Andei pesquisando e não consegui achar algo para passar as duas List para o Report. segue a classe abaixo:
Qualquer ajuda é bem vinda :heart:

package br.com.Controllers;

import br.com.Global.FormatAllTypeDatesAndHours;
import br.com.Models.Request;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.view.JasperViewer;

/**
 *
 * @author Vin4h
 */
public class RequestReportController {

    String caminho = System.getProperty("user.dir");
    FormatAllTypeDatesAndHours format = new FormatAllTypeDatesAndHours();

    public Connect c = new Connect();

    public RequestReportController() {
        this.c = new Connect();
    }

    public void generateReportRequest(List<Request> data) {
        RequestController rc = new RequestController();

        InputStream font;

        if (data.size() > 0) {
            try {

                for (Request d : data) {
                    d.setRequestDate(format.formatDateUsDataBase(d.getRequestDate()));
                }

                if (data.get(0).getType().equals("SC")) {
                    font = new FileInputStream(caminho + "/Files/RequestReportSupply.jrxml");
                    JasperReport report = JasperCompileManager.compileReport(font);
                    //Neste local que passo os dados
                    JasperPrint print = JasperFillManager.fillReport(report, null,
                            new JRBeanCollectionDataSource(data));

                    JasperViewer.viewReport(print, false);
                } else if (data.get(0).getType().equals("FU")) {
                    font = new FileInputStream(caminho + "/Files/RequestReportFuel.jrxml");
                    JasperReport report = JasperCompileManager.compileReport(font);

                    JasperPrint print = JasperFillManager.fillReport(report, null,
                            new JRBeanCollectionDataSource(data));

                    JasperViewer.viewReport(print, false);
                } else {
                    font = new FileInputStream(caminho + "/Files/RequestReportParts.jrxml");
                    JasperReport report = JasperCompileManager.compileReport(font);

                    JasperPrint print = JasperFillManager.fillReport(report, null,
                            new JRBeanCollectionDataSource(data));

                    JasperViewer.viewReport(print, false);
                }

            } catch (Exception e) {
                showJOptionPane("Relatorio Requisição", e.getMessage());
            }

        } else {
            showJOptionPane("Erro na impressão", "Requisição ou empresa não existem");
        }
    }

    public void showJOptionPane(String header, String text) {
        JOptionPane.showMessageDialog(null, text, header, JOptionPane.ERROR_MESSAGE);
    }
}

Ainda preciso de ajuda :neutral_face:

Depois de 1 semana frenética de estudo, consegui finalizar, primeiramente irei repassar os bugs ocorridos

OBS: Empresa usa Firebird 2.0 (Sim horrendo, mas paga meu salário :frowning: ), usando um MAP para passar parâmetros.

1º Tentei colocar subreport porém sempre emitia erro de ‘Unable get next record’, pesquisei diversas vezes no fórum porém sem resultado para o meu caso, esta ocasião estava passando uma connection e fazendo a query direto no Ireport, porém continuava o erro.

2º Tentei usar List, passando connection pois até o momento ainda não conseguia mandar 2 JRBeanCollectionDataSource no mesmo report (anotem isto vai fazer diferença).

3º Fui para a table, sim essa deu certo, acabei estudando diversos jeitos e vi que dava para passar JRBeanCollectionDataSource por map, passei ele por map, coloquei o nome da chave nos parâmetros do Ireport, na tabela troquei o campo padrão e coloquei o nome da variável que estava sendo recebida. (Imagem)
image

Tabela gera um DataSource, defini os nomes dos campos do meu objeto passado, rodei e funcionou, segue a algumas imagens e classe abaixo.
image
image
image

package br.com..Controllers;

import br.com.Global.FormatAllTypeDatesAndHours;
import br.com.Models.ProductItem;
import br.com.Models.Request;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import javax.swing.JOptionPane;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.view.JasperViewer;

/**
 *
 * @author Vin4h
 */
public class RequestReportController {

    String caminho = System.getProperty("user.dir");
    FormatAllTypeDatesAndHours format = new FormatAllTypeDatesAndHours();

    public Connect c = new Connect();

    public RequestReportController() {
        this.c = new Connect();
    }

    public void generateReportRequest(int idRequest, int idCompany, String type) {
        RequestController rc = new RequestController();
        ProductItemController pic = new ProductItemController();

        HashMap<String, Object> mapItem = new HashMap<String, Object>();

        List<Request> data = new ArrayList<>();

        List<ProductItem> list = new ArrayList<>();

        data.add(rc.findByIdRequestIdComapany(idRequest, idCompany, type));

        list = pic.getProductItemByIdRequest(idRequest, idCompany);

        JRBeanCollectionDataSource itemsJRBean = new JRBeanCollectionDataSource(list);

        InputStream font;

        if (data != null) {
            mapItem.put("list", itemsJRBean);
            try {
                JasperReport report;

                JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(data);

                data.get(0).setRequestDate(format.formatDateUsDataBase(data.get(0).getRequestDate()));
                if (data.get(0).getType().equals("Insumos")) {
                    font = new FileInputStream(caminho + "/Files/Files_RequestReportSupply.jrxml");

                    report = JasperCompileManager.compileReport(font);

                    JasperPrint print = JasperFillManager.fillReport(report, mapItem, ds);

                    JasperViewer.viewReport(print, false);
                } else if (data.get(0).getType().equals("Combustiveis")) {
                    font = new FileInputStream(caminho + "/Files/RequestReportFuel.jrxml");
                    report = JasperCompileManager.compileReport(font);

                    JasperPrint print = JasperFillManager.fillReport(report, mapItem, ds);

                    JasperViewer.viewReport(print, false);
                } else {
                    font = new FileInputStream(caminho + "/Files/RequestReportParts.jrxml");
                    
                    report = JasperCompileManager.compileReport(font);

                    JasperPrint print = JasperFillManager.fillReport(report, mapItem, ds);

                    JasperViewer view = new JasperViewer(print, false);

                    view.setExtendedState(JasperViewer.MAXIMIZED_BOTH);

                    view.setVisible(true);

                }

            } catch (Exception e) {
                showJOptionPane("Relatorio Requisição", e.getMessage());
            }

        } else {
            showJOptionPane("Erro na impressão", "Requisição ou empresa não existem");
        }
    }

    public void showJOptionPane(String header, String text) {
        JOptionPane.showMessageDialog(null, text, header, JOptionPane.ERROR_MESSAGE);
    }
}