2017-10-02 9 views
1

Je souhaite créer une liste d'éléments de commande; Pour chaque élément, je souhaite afficher une liste de tous les éléments enfants. Dans la liste des éléments enfants, je souhaite afficher des informations sur l'élément et ses liens -> les éléments enfants peuvent contenir des liens vers des éléments enfants des frères et sœurs du parent (l'élément itemId des éléments liés est fourni dans le champRapport JasperReports pour la source de données XML: Comment récupérer les données par ID à partir de l'élément frère d'un parent dans la liste des éléments imbriqués

.. J'espère que je peux obtenir ce résultat en passant la itemId des parents à la liste imbriquée, cependant, je suis venu bref, je vais vous donner un exemple ci-dessous exemple XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<order> 
    <items> 
     <itemId>1</itemId> 
     <name>Item1</name> 
     <offeringRef>offering1</offeringRef> 
     <children> 
      <items> 
       <itemId>2</itemId> 
       <name>Item2</name> 
       <offeringRef>offering2</offeringRef> 
       <links> 
        <linkName>toOffering4</linkName> 
        <itemId>9</itemId> 
       </links> 
       <links> 
        <linkName>toOffering3</linkName> 
        <itemId>3</itemId> 
       </links> 
      </items> 
      <items> 
       <itemId>3</itemId> 
       <name>Item3</name> 
       <offeringRef>offering2</offeringRef> 
       <links> 
        <linkName>toOffering4</linkName> 
        <itemId>8</itemId> 
       </links> 
      </items> 
     </children> 
    </items> 
    <items> 
     <itemId>4</itemId> 
     <name>Item4</name> 
     <offeringRef>offering1</offeringRef> 
     <children> 
      <items> 
       <itemId>5</itemId> 
       <name>Item5</name> 
       <offeringRef>offering2</offeringRef> 
       <links> 
        <linkName>toOffering4</linkName> 
        <itemId>10</itemId> 
       </links> 
      </items> 
      <items> 
       <itemId>6</itemId> 
       <name>Item6</name> 
       <offeringRef>offering2</offeringRef> 
      </items> 
     </children> 
    </items> 
    <items> 
     <itemId>7</itemId> 
     <name>Item7</name> 
     <offeringRef>offering3</offeringRef> 
     <children> 
      <items> 
       <itemId>8</itemId> 
       <name>Item8</name> 
       <offeringRef>offering4</offeringRef> 
      </items> 
      <items> 
       <itemId>9</itemId> 
       <name>Item9</name> 
       <offeringRef>offering4</offeringRef> 
      </items> 
      <items> 
       <itemId>10</itemId> 
       <name>Item10</name> 
       <offeringRef>offering4</offeringRef> 
      </items> 
      <items> 
       <itemId>11</itemId> 
       <name>Item11</name> 
       <offeringRef>offering5</offeringRef> 
      </items> 
     </children> 
    </items> 
</order> 

exemple 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="OrderReport-Links" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="b748b258-915c-41ff-842c-9deb952cf667"> 
    <subDataset name="Offering1List" uuid="97b9effb-88fa-431e-83ef-1c4f48f43b2a"> 
     <property name="com.jaspersoft.studio.data.defaultdataadapter" value="OrderWithLinks"/> 
     <parameter name="CURRENT_ITEM_ID" class="java.lang.String" evaluationTime="Late"> 
      <parameterDescription><![CDATA[]]></parameterDescription> 
      <defaultValueExpression><![CDATA["/order/items[offeringRef='offering1']"]]></defaultValueExpression> 
     </parameter> 
     <parameter name="PATH_TO_OFFERING2" class="java.lang.String" evaluationTime="Late"> 
      <parameterDescription><![CDATA[]]></parameterDescription> 
      <defaultValueExpression><![CDATA["/order/items[offeringRef='offering1']/children/items[offeringRef='offering2']"]]></defaultValueExpression> 
     </parameter> 
     <queryString language="xPath"> 
      <![CDATA[/order/items[offeringRef='offering1']]]> 
     </queryString> 
     <field name="itemId_1" class="java.lang.String"> 
      <fieldDescription><![CDATA[itemId]]></fieldDescription> 
     </field> 
     <field name="name_1" class="java.lang.String"> 
      <fieldDescription><![CDATA[name]]></fieldDescription> 
     </field> 
     <field name="offeringRef_1" class="java.lang.String"> 
      <fieldDescription><![CDATA[offeringRef]]></fieldDescription> 
     </field> 
     <variable name="V_CURRENT_ITEM_ID" class="java.lang.String"> 
      <variableExpression><![CDATA[((org.w3c.dom.Node)((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE}).getSelectObject(((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE}).getCurrentNode() , "itemId/text()")).getNodeValue().toString()]]></variableExpression> 
     </variable> 
     <variable name="V_PARENT_OF_CURRENT_NODE" class="java.lang.String"> 
      <variableExpression><![CDATA[((org.w3c.dom.Node)((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE}).getSelectObject(((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE}).getCurrentNode() , "../../itemId/text()")).getNodeValue().toString()]]></variableExpression> 
     </variable> 
     <variable name="V_ITEM_ID" class="java.lang.String"> 
      <variableExpression><![CDATA[((org.w3c.dom.Node)((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE}).getSelectObject(((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE}).getCurrentNode() , "itemId/text()")).getNodeValue().toString()]]></variableExpression> 
     </variable> 
    </subDataset> 
    <subDataset name="Offering2List" uuid="76bc8192-4801-4f2c-8e03-89f8a38a588b"> 
     <property name="com.jaspersoft.studio.data.defaultdataadapter" value="OrderWithLinks"/> 
     <parameter name="PATH_TO_OFFERING2" class="java.lang.String" evaluationTime="Late"> 
      <defaultValueExpression><![CDATA["/order/items[offeringRef='offering1']/children/items[offeringRef='offering2']"]]></defaultValueExpression> 
     </parameter> 
     <queryString language="xPath"> 
      <![CDATA[/order/items[offeringRef='offering1']/children/items[offeringRef='offering2']]]> 
     </queryString> 
     <field name="itemId_1" class="java.lang.String"> 
      <fieldDescription><![CDATA[itemId]]></fieldDescription> 
     </field> 
     <field name="name_1" class="java.lang.String"> 
      <fieldDescription><![CDATA[name]]></fieldDescription> 
     </field> 
     <field name="offeringRef_1" class="java.lang.String"> 
      <fieldDescription><![CDATA[offeringRef]]></fieldDescription> 
     </field> 
     <field name="parentItemId" class="java.lang.String"> 
      <fieldDescription><![CDATA[../../itemId]]></fieldDescription> 
     </field> 
     <field name="Offering4ItemName" class="java.lang.String"> 
      <fieldDescription><![CDATA[../../../items[offeringRef='offering3']/children/items[offeringRef='offering4' and itemId=current()/links[linkName='toOffering4']/itemId]/name]]></fieldDescription> 
     </field> 
     <variable name="V_CURRENT_ITEM_ID" class="java.lang.String"> 
      <variableExpression><![CDATA[((org.w3c.dom.Node)((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE}).getSelectObject(((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE}).getCurrentNode() , "itemId/text()")).getNodeValue().toString()]]></variableExpression> 
     </variable> 
     <variable name="V_PARENT_OF_CURRENT_NODE" class="java.lang.String"> 
      <variableExpression><![CDATA[$V{V_PARENT_OF_CURRENT_NODE}]]></variableExpression> 
     </variable> 
     <variable name="ITEM_ID" class="java.lang.String"> 
      <variableExpression><![CDATA[$V{ITEM_ID}]]></variableExpression> 
     </variable> 
    </subDataset> 
    <parameter name="CURRENT_ITEM_ID" class="java.lang.String" isForPrompting="false" evaluationTime="Late"> 
     <defaultValueExpression><![CDATA["/order/items[offeringRef='offering1']"]]></defaultValueExpression> 
    </parameter> 
    <parameter name="PATH_TO_OFFERING2" class="java.lang.String" isForPrompting="false" evaluationTime="Late"> 
     <defaultValueExpression><![CDATA["/order/items[offeringRef='offering1']/children/items[offeringRef='offering2']"]]></defaultValueExpression> 
    </parameter> 
    <queryString language="xPath"> 
     <![CDATA[/order]]> 
    </queryString> 
    <field name="itemId" class="java.lang.String"> 
     <fieldDescription><![CDATA[itemId]]></fieldDescription> 
    </field> 
    <field name="name" class="java.lang.String"> 
     <fieldDescription><![CDATA[name]]></fieldDescription> 
    </field> 
    <field name="offeringRef" class="java.lang.String"> 
     <fieldDescription><![CDATA[offeringRef]]></fieldDescription> 
    </field> 
    <variable name="V_MAIN_CURRENT_ITEM_ID" class="java.lang.String"> 
     <variableExpression><![CDATA[((org.w3c.dom.Node)((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE}).getSelectObject(((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE}).getCurrentNode() , "itemId/text()")).getNodeValue().toString()]]></variableExpression> 
    </variable> 
    <detail> 
     <band height="125" splitType="Stretch"> 
      <componentElement> 
       <reportElement x="0" y="10" width="560" height="60" uuid="021a30b2-8d3f-4962-b222-1cc61c257058"/> 
       <jr:list xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" printOrder="Vertical"> 
        <datasetRun subDataset="Offering1List" uuid="1b1d83bc-81d3-4694-8ec5-ee68916237e9"> 
         <dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE}).dataSource("/order/items[offeringRef='offering1']")]]></dataSourceExpression> 
        </datasetRun> 
        <jr:listContents height="60" width="560"> 
         <frame> 
          <reportElement x="0" y="0" width="560" height="60" uuid="6eb14281-c6c6-41a3-9579-5d2a9a8a52cb"/> 
          <box> 
           <topPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> 
           <leftPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> 
           <bottomPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> 
           <rightPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> 
          </box> 
          <textField> 
           <reportElement x="0" y="0" width="140" height="15" uuid="3a0d8007-ac1e-4686-99b3-8efe2db3e948"> 
           </reportElement> 
           <textFieldExpression><![CDATA["Offering: "+$F{offeringRef_1}]]></textFieldExpression> 
          </textField> 
          <textField> 
           <reportElement x="140" y="0" width="100" height="15" uuid="ec93e06d-4e71-42c6-97b9-73e2fe37c557"> 
           </reportElement> 
           <textFieldExpression><![CDATA["Item Name: " + $F{name_1}]]></textFieldExpression> 
          </textField> 
          <textField> 
           <reportElement x="240" y="0" width="100" height="15" uuid="f6ea5cbc-3708-42b1-bede-9d13cffdf7c2"> 
           </reportElement> 
           <textFieldExpression><![CDATA["Item ID: "+$F{itemId_1}]]></textFieldExpression> 
          </textField> 
          <componentElement> 
           <reportElement x="41" y="31" width="519" height="30" uuid="70a6f387-6b4f-4346-8d0c-ecd65dd4cd05"/> 
           <jr:list printOrder="Vertical"> 
            <datasetRun subDataset="Offering2List" uuid="e41844dc-e580-4395-858f-2e9231c6de72"> 
             <datasetParameter name="PATH_TO_OFFERING2"> 
              <datasetParameterExpression><![CDATA["/order/items[offeringRef='offering1' and itemId=" + $V{V_PARENT_OF_CURRENT_NODE}+ "]/children/items[offeringRef='offering2' and itemId=" + $V{V_CURRENT_ITEM_ID} + "]"]]></datasetParameterExpression> 
             </datasetParameter> 
             <dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE}).dataSource($P{PATH_TO_OFFERING2})]]></dataSourceExpression> 
            </datasetRun> 
            <jr:listContents height="30" width="519"> 
             <frame> 
              <reportElement x="0" y="0" width="519" height="30" uuid="b2cfd080-c19c-439b-8b18-9c6fe74879b5"/> 
              <box> 
               <topPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> 
               <leftPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> 
               <bottomPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> 
               <rightPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> 
              </box> 
              <textField> 
               <reportElement x="100" y="0" width="70" height="30" uuid="881df01d-4f99-44f7-8e2e-bbdd8a39be2f"/> 
               <textFieldExpression><![CDATA["Item ID: "+ $V{V_CURRENT_ITEM_ID}]]></textFieldExpression> 
              </textField> 
              <textField> 
               <reportElement x="170" y="0" width="100" height="30" uuid="174cbad9-4171-4ec8-aa6d-1f022f340d5b"/> 
               <textFieldExpression><![CDATA["Item Name: "+ $F{name_1}]]></textFieldExpression> 
              </textField> 
              <textField> 
               <reportElement x="0" y="0" width="100" height="30" uuid="d57ace7b-f0ef-499d-ba2b-893c1110750b"/> 
               <textFieldExpression><![CDATA["Offering: "+$F{offeringRef_1}]]></textFieldExpression> 
              </textField> 
              <textField> 
               <reportElement x="400" y="0" width="100" height="30" uuid="d43d3271-c481-4128-8647-feb198f32b68"/> 
               <textFieldExpression><![CDATA["Parent Item ID: "+ $F{parentItemId} + " : " + $V{ITEM_ID}]]></textFieldExpression> 
              </textField> 
              <textField> 
               <reportElement x="270" y="0" width="130" height="30" uuid="66324252-49fd-4d78-9830-d5ef7ec66600"/> 
               <textFieldExpression><![CDATA["Offering 4 Name: "+ $F{Offering4ItemName}]]></textFieldExpression> 
              </textField> 
             </frame> 
            </jr:listContents> 
           </jr:list> 
          </componentElement> 
          <textField> 
           <reportElement x="340" y="0" width="220" height="15" uuid="82201018-17ef-4eb7-91bb-d6ba4f86b13c"> 
           </reportElement> 
           <textFieldExpression><![CDATA["Current Item ID (Variable): " + $V{V_ITEM_ID}]]></textFieldExpression> 
          </textField> 
          <frame> 
           <reportElement x="40" y="15" width="520" height="15" uuid="7dc8c9ce-a511-4e13-bb6b-647f05c1785a"> 
           </reportElement> 
           <box> 
            <topPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> 
            <leftPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> 
            <bottomPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> 
            <rightPen lineWidth="1.0" lineStyle="Solid" lineColor="#000000"/> 
           </box> 
           <staticText> 
            <reportElement x="0" y="0" width="100" height="15" uuid="860a6ae0-798b-4e16-a920-3223d602eebb"> 
            </reportElement> 
            <text><![CDATA[Childs Items:]]></text> 
           </staticText> 
          </frame> 
         </frame> 
        </jr:listContents> 
       </jr:list> 
      </componentElement> 
     </band> 
    </detail> 
</jasperReport> 

Le résultat attendu (sans les lignes qui sont barrées avec des lignes rouges) est donnée comme suit:

Expected output

Est-ce que quelqu'un sait comment je peux faire ce rapport?

NOTE: Ce ne peut pas être réalisé en utilisant la solution dans How to fetch data by id from parent's sibling element in JasperReports report items list (xml datasource) car elle repose sur l'utilisation d'un subDataSource et des listes imbriquées avec subDataSources n'ont pas accès aux nœuds frères du parent (Voilà pourquoi dans mon exemple, je me sers d'un dataSource dans la description du jeu de données de la liste imbriquée)

Ouput utilisant subDataSource /items/children/items[offeringRef='offering2'] (problèmes ont été encerclés): Example of the problem with using subDataSource

Répondre

0

Utilisez la source de données suivantes pour la liste imbriquée:

<dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE}).dataSource("/order/items[offeringRef='offering1' and itemId=" + $F{itemId_1}+ "]/children/items[offeringRef='offering2']")]]></dataSourceExpression> 

Voir the Javadoc of the class pour plus de détails.

+0

Merci pour le commentaire. Malheureusement, cela ne résout pas complètement le problème. Je l'ai d'abord essayé. Le problème avec l'utilisation de l'expression subDataSource que vous avez suggérée ci-dessus est que le champ intitulé «Offering 4 Name» est null alors qu'il ne devrait pas l'être. J'ai joint une photo dans le commentaire original qui montre à quoi ressemble le rapport lorsque subDataSource est utilisé (veuillez comparer avec le premier rapport). Le champ 'Offer 4 Name' devrait avoir les valeurs 9,8 et 10 pour les articles 2,3 et 5, respectivement. – Andy

+0

Bon, je n'ai pas complètement lu votre question. J'ai édité la réponse et posté une solution qui utilise dataSource(). – dada67

+0

La 'dataSourceExpression' que vous avez proposée fonctionne bien. Merci (problème résolu). – Andy