Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to create multiple tables in jasper report using json as a datasource?

I need to make report like this:

Product Name : Product XYZ

---------------------------------
| Item Name | Quantity | Price |
---------------------------------
| Item ABC  | 10       | 10 $  |
| Item BCD  | 10       | 1  $  |

Product Name : Product XYZ2

---------------------------------
| Item Name | Quantity | Price |
---------------------------------
| Item DEF  | 15       | 10 $  |
| Item HIJ  | 11       | 1  $  |

Summary Report 
---------------------------------
| Product Name | Total Quantity | 
---------------------------------
| Product XYZ  | 20             | 
| Product XYZ2 | 26             | 

The first problem is "product" can 1 to many.

The second problem is i need "Summary Report" in the bottom

The third problem is ,this raw data report come from json, not from query to database.

What that i already try :

  • Create many table for product. But this failed because jasper create empty space for unused table. And the summary table in other page with many empty space.

  • Subreports , same like above.

Can you tell me please, how to make dynamically multiple table's?

EDIT : sample JSON

{"produkList": {
"items":[ 
    {
        "nameProduct": "Product XYZ",
        "itemList": [{
            "itemName": "XXXXXXX",
            "quantity": 50,
            "price": 50
        },
        {
            "itemName": "YYYYYYY",
            "quantity": 50,
            "price": 50
        },
        {
            "itemName": "ZZZZZZZZ",
            "quantity": 50,
            "price": 50
        }]
    },
    {
        "nameProduct": "Product XYZ2",
        "itemList": [{
            "itemName": "AAAAAAAA",
            "quantity": 50,
            "price": 50
        },
        {
            "itemName": "BBBBBBB",
            "quantity": 50,
            "price": 50
        },
        {
            "itemName": "CCCCCCC",
            "quantity": 50,
            "price": 50
        }]
    }
  ],
  "summary":[
  {
        "title": "Summary Report",
        "summaryReportDetailList": [{
            "nameProduct": "Product XYZ",
            "quantity": 150
        },
        {
            "nameProduct": "Product XYZ2",
            "quantity": 150
        }]
    }
    ]
  }
}
like image 896
user2571094 Avatar asked Jan 05 '16 03:01

user2571094


People also ask

How do I add a database table to Jasper report?

To create a table in a report, drag the Table element from the Elements palette inside any band of the report. The Table Wizard opens with a choice of creating a table from a new or existing dataset. If you choose to create an empty table, a new dataset is created and bound to the table.

How do I group data in Jasper report?

right click on the report in the report inspector and choose Add Report Group. Follow the wizard, set as group name PledgeType and choose Group by the following report object where you select the field PledgeType. Click next. Check Add the group header and click Finish.

How do I write multiple queries in Jasper report?

It is possible to use execute multiple queries from a single report by using a subDataset and datasetRun . The behaviour is like having one or more subreports embedded into a single report file. Subdatasets can have parameters, fields, variables and groups just like a report can.


1 Answers

The structure will be

  1. Main report with query produkList.items that display's Product Name
  2. Subreport in detail band with <dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("itemList")]]></dataSourceExpression> to display the item table
  3. Subreport in summary band with query produkList.summary.summaryReportDetailList to display the summary table

This is the result

PDF Result

Below you will find the 3 jrxml producing this result, you need to adjust the path to the json source and path to subreport's, don't forget that subreport's need to be compiled in .jasper before main report can be run.

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="multitable" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="1c6dc1c9-67af-43d5-bf1e-9243557c8048">
<property name="net.sf.jasperreports.json.source" value="C:/jdd/projects/StackTrace/jasper/multitable.json"/>
<parameter name="SUBREPORT_DIR" class="java.lang.String" isForPrompting="false">
    <defaultValueExpression><![CDATA["C:\\jdd\\projects\\StackTrace\\jasper\\"]]></defaultValueExpression>
</parameter>
<queryString language="json">
    <![CDATA[produkList.items]]>
</queryString>
<field name="nameProduct" class="java.lang.String"/>
<detail>
    <band height="48" splitType="Stretch">
        <textField>
            <reportElement x="0" y="1" width="555" height="20" uuid="4dfdf5e5-436e-4538-b302-620ea945c6e7"/>
            <textElement verticalAlignment="Middle"/>
            <textFieldExpression><![CDATA["Product Name : " + $F{nameProduct}]]></textFieldExpression>
        </textField>
        <subreport>
            <reportElement x="0" y="21" width="555" height="20" uuid="48a7bbe4-b8ce-4a0d-a6e1-6ddd288e5602"/>
            <dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("itemList")]]></dataSourceExpression>
            <subreportExpression><![CDATA[$P{SUBREPORT_DIR} + "multitable_subreport.jasper"]]></subreportExpression>
        </subreport>
    </band>
</detail>
<summary>
    <band height="52" splitType="Stretch">
        <subreport>
            <reportElement x="0" y="10" width="555" height="32" uuid="780a1f25-065e-494a-ba1d-86a33b464343"/>
            <subreportParameter name="net.sf.jasperreports.json.source">
                <subreportParameterExpression><![CDATA["C:/jdd/projects/StackTrace/jasper/multitable.json"]]></subreportParameterExpression>
            </subreportParameter>
            <subreportExpression><![CDATA[$P{SUBREPORT_DIR} + "multitable_summary.jasper"]]></subreportExpression>
        </subreport>
    </band>
</summary>
</jasperReport>

Subreport in detail band multitable_subreport.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="multitable_subreport" pageWidth="555" pageHeight="802" columnWidth="555" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0" uuid="678bf408-397f-4797-bb50-84262b9df76b">
<field name="itemName" class="java.lang.String"/>
<field name="quantity" class="java.lang.Double"/>
<field name="price" class="java.lang.Double"/>
<columnHeader>
    <band height="20" splitType="Stretch">
        <staticText>
            <reportElement mode="Opaque" x="0" y="0" width="100" height="20" backcolor="#CCCCCC" uuid="af654b95-0a60-40fc-80c6-df38cc28061c"/>
            <box>
                <pen lineWidth="0.25"/>
                <topPen lineWidth="0.25"/>
                <leftPen lineWidth="0.25"/>
                <bottomPen lineWidth="0.25"/>
                <rightPen lineWidth="0.25"/>
            </box>
            <textElement verticalAlignment="Middle"/>
            <text><![CDATA[itemName]]></text>
        </staticText>
        <staticText>
            <reportElement mode="Opaque" x="100" y="0" width="100" height="20" backcolor="#CCCCCC" uuid="7969463f-0569-4863-bbc3-a87364369a0f"/>
            <box>
                <pen lineWidth="0.25"/>
                <topPen lineWidth="0.25"/>
                <leftPen lineWidth="0.25"/>
                <bottomPen lineWidth="0.25"/>
                <rightPen lineWidth="0.25"/>
            </box>
            <textElement textAlignment="Center" verticalAlignment="Middle"/>
            <text><![CDATA[quantity]]></text>
        </staticText>
        <staticText>
            <reportElement mode="Opaque" x="200" y="0" width="100" height="20" backcolor="#CCCCCC" uuid="86942d20-9a68-4409-8907-8abcfef1c82e"/>
            <box>
                <pen lineWidth="0.25"/>
                <topPen lineWidth="0.25"/>
                <leftPen lineWidth="0.25"/>
                <bottomPen lineWidth="0.25"/>
                <rightPen lineWidth="0.25"/>
            </box>
            <textElement textAlignment="Center" verticalAlignment="Middle"/>
            <text><![CDATA[price]]></text>
        </staticText>
    </band>
</columnHeader>
<detail>
    <band height="20" splitType="Stretch">
        <textField>
            <reportElement x="0" y="0" width="100" height="20" uuid="2b991eb1-6e24-4e74-8ee2-cd90fe07f60a"/>
            <box>
                <pen lineWidth="0.25"/>
                <topPen lineWidth="0.25"/>
                <leftPen lineWidth="0.25"/>
                <bottomPen lineWidth="0.25"/>
                <rightPen lineWidth="0.25"/>
            </box>
            <textElement verticalAlignment="Middle"/>
            <textFieldExpression><![CDATA[$F{itemName}]]></textFieldExpression>
        </textField>
        <textField pattern="###0.##">
            <reportElement x="100" y="0" width="100" height="20" uuid="71929061-2351-477c-8d2d-431c846f8a06"/>
            <box>
                <pen lineWidth="0.25"/>
                <topPen lineWidth="0.25"/>
                <leftPen lineWidth="0.25"/>
                <bottomPen lineWidth="0.25"/>
                <rightPen lineWidth="0.25"/>
            </box>
            <textElement textAlignment="Center" verticalAlignment="Middle"/>
            <textFieldExpression><![CDATA[$F{quantity}]]></textFieldExpression>
        </textField>
        <textField pattern="¤ #,##0.00">
            <reportElement x="200" y="0" width="100" height="20" uuid="16b99246-d1f5-4c96-90db-34ea5f3141db"/>
            <box>
                <pen lineWidth="0.25"/>
                <topPen lineWidth="0.25"/>
                <leftPen lineWidth="0.25"/>
                <bottomPen lineWidth="0.25"/>
                <rightPen lineWidth="0.25"/>
            </box>
            <textElement textAlignment="Center" verticalAlignment="Middle"/>
            <textFieldExpression><![CDATA[$F{price}]]></textFieldExpression>
        </textField>
    </band>
</detail>
</jasperReport>

Subreport in summary band multitable_summary.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="multitable_summary" pageWidth="555" pageHeight="802" columnWidth="555" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0" uuid="2a869c20-1e7d-4baa-92d7-c8d555f1f344">
<queryString language="json">
    <![CDATA[produkList.summary.summaryReportDetailList]]>
</queryString>
<field name="nameProduct" class="java.lang.String"/>
<field name="quantity" class="java.lang.Double"/>
<background>
    <band splitType="Stretch"/>
</background>
<title>
    <band height="23">
        <staticText>
            <reportElement x="0" y="0" width="100" height="20" uuid="a9730039-8418-4e58-a2eb-0babe8d2a380"/>
            <text><![CDATA[Summary Report]]></text>
        </staticText>
    </band>
</title>
<columnHeader>
    <band height="20">
        <staticText>
            <reportElement mode="Opaque" x="0" y="0" width="100" height="20" backcolor="#CCCCCC" uuid="a49b18ef-63c3-42bb-ae81-8d7d72ac9086"/>
            <box leftPadding="0">
                <pen lineWidth="0.25"/>
                <topPen lineWidth="0.25"/>
                <leftPen lineWidth="0.25"/>
                <bottomPen lineWidth="0.25"/>
                <rightPen lineWidth="0.25"/>
            </box>
            <textElement verticalAlignment="Middle"/>
            <text><![CDATA[Product Name]]></text>
        </staticText>
        <staticText>
            <reportElement mode="Opaque" x="100" y="0" width="100" height="20" backcolor="#CCCCCC" uuid="c1c70fed-d887-429f-a3b0-ed645517e41f"/>
            <box leftPadding="0">
                <pen lineWidth="0.25"/>
                <topPen lineWidth="0.25"/>
                <leftPen lineWidth="0.25"/>
                <bottomPen lineWidth="0.25"/>
                <rightPen lineWidth="0.25"/>
            </box>
            <textElement textAlignment="Center" verticalAlignment="Middle"/>
            <text><![CDATA[quantity]]></text>
        </staticText>
    </band>
</columnHeader>
<detail>
    <band height="20" splitType="Stretch">
        <textField>
            <reportElement x="0" y="0" width="100" height="20" uuid="401436b3-d9a1-40bd-8a1d-dfa3f162f842"/>
            <box leftPadding="0">
                <pen lineWidth="0.25"/>
                <topPen lineWidth="0.25"/>
                <leftPen lineWidth="0.25"/>
                <bottomPen lineWidth="0.25"/>
                <rightPen lineWidth="0.25"/>
            </box>
            <textElement verticalAlignment="Middle"/>
            <textFieldExpression><![CDATA[$F{nameProduct}]]></textFieldExpression>
        </textField>
        <textField pattern="###0">
            <reportElement x="100" y="0" width="100" height="20" uuid="4447d3b0-6d3e-4795-8b5f-6a09d620448b"/>
            <box leftPadding="0">
                <pen lineWidth="0.25"/>
                <topPen lineWidth="0.25"/>
                <leftPen lineWidth="0.25"/>
                <bottomPen lineWidth="0.25"/>
                <rightPen lineWidth="0.25"/>
            </box>
            <textElement textAlignment="Center" verticalAlignment="Middle"/>
            <textFieldExpression><![CDATA[$F{quantity}]]></textFieldExpression>
        </textField>
    </band>
</detail>
</jasperReport>
like image 185
Petter Friberg Avatar answered Nov 12 '22 02:11

Petter Friberg