在 BI Publisher RTF 模板中引用子重复部分中的父组项

Referencing a parent group item in a child repeating section in BI Publisher RTF Template

我的项目需要能够在子组的重复部分中引用父组中的字段。 Here's the setup. 我已经标记了每个位置:AB 和 C 是为了我自己的测试目的。 D 是实际需要打印的那个。 A 是唯一实际会打印的。令人困惑的部分是 'for-each-check' 组在每个 Q_P58W1 上循环,其中 P58WCHCK 是一个成员,但它只在该分组之外打印。

郑重声明,实际文档中并不存在每个 for-each 组之后的代码,我只是将其粘贴到此处以阐明分组结构的工作原理。

这是我正在使用的 xml 的副本(已编辑以删除敏感信息):

<?xml version="1.0" encoding="UTF-8"?>
<!--Generated by Oracle BI Publisher 12.2.1.3.0 -Dataengine, datamodel:_ICIM_DM_P58R01_DM_xdm -->
<DATA_DS><P_JNO_IN>271720364</P_JNO_IN>
<Q_A01F>
<A01SEQ>1</A01SEQ><VOID_LINE1>VOID     VOID     VOID     VOID     VOID</VOID_LINE1><VOID_LINE2>    VOID     VOID     VOID     VOID</VOID_LINE2><LOCATION_IN>0005</LOCATION_IN><AHL1>03</AHL1><ACCOUNT_IN>290</ACCOUNT_IN>
<Q_P58W1>
<P58WCHCK>09077475</P58WCHCK>
<G_1>
<P58WVENNO>93373</P58WVENNO><P58WNAME1>FASTSIGNS</P58WNAME1><P58WADR1></P58WADR1><P58WCSZ></P58WCSZ><P58WPAYN>.00</P58WPAYN><P58WPAYW1>Twelve Dollars and 00 Cents*****</P58WPAYW1><P58WGAMT>12</P58WGAMT><P58WDAMT>0</P58WDAMT><P58WNAMT>12</P58WNAMT><P58WCDATE>11 21 19</P58WCDATE><C_PRT_CHK></C_PRT_CHK><PAY_WORDS1>Twelve Dollars and 00 Cents*****</PAY_WORDS1><ADR_LINE1>FASTSIGNS</ADR_LINE1><ADR_LINE3></ADR_LINE3><ADR_LINE6></ADR_LINE6><ACCOUNT_NAME></ACCOUNT_NAME><COUNTRY></COUNTRY><ADDRESS1></ADDRESS1><ADDRESS2></ADDRESS2><ADDRESS3>VOID VOID VOID</ADDRESS3><CITY></CITY><STATE></STATE><ZIP></ZIP><DUMMY_FLAG>DUMMY</DUMMY_FLAG><LOGO_FLAG></LOGO_FLAG><ADR_LINES>FASTSIGNS


</ADR_LINES>
<Q_P58W2>
<P58WINVNO>12</P58WINVNO><P58WVOUCH>637866</P58WVOUCH><P58WIDATE>2019-11-22T00:00:00.000-06:00</P58WIDATE><P58WGAMT>12</P58WGAMT><P58WDAMT>0</P58WDAMT><P58WNAMT>12</P58WNAMT><C_PRT_DATE>11/22/19</C_PRT_DATE>
</Q_P58W2>
<C_PRT_PAY_TOT>.00</C_PRT_PAY_TOT>
<CS_NUM_VOUCHERS>1</CS_NUM_VOUCHERS>
</G_1>
<G_1>
<P58WVENNO>93373</P58WVENNO><P58WNAME1>FASTSIGNS</P58WNAME1><P58WADR1></P58WADR1><P58WCSZ></P58WCSZ><P58WPAYN>.00</P58WPAYN><P58WPAYW1>Twelve Dollars and 00 Cents*****</P58WPAYW1><P58WGAMT>12</P58WGAMT><P58WDAMT>0</P58WDAMT><P58WNAMT>12</P58WNAMT><P58WCDATE>11 21 19</P58WCDATE><C_PRT_CHK></C_PRT_CHK><PAY_WORDS1>Twelve Dollars and 00 Cents*****</PAY_WORDS1><ADR_LINE1>FASTSIGNS</ADR_LINE1><ADR_LINE3></ADR_LINE3><ADR_LINE6></ADR_LINE6><ACCOUNT_NAME></ACCOUNT_NAME><ACCOUNT_NUMBER></ACCOUNT_NUMBER><ROUTING_NUMBER></ROUTING_NUMBER><COUNTRY></COUNTRY><ADDRESS1></ADDRESS1><ADDRESS2></ADDRESS2><ADDRESS3>VOID VOID VOID</ADDRESS3><CITY></CITY><STATE></STATE><ZIP></ZIP><DUMMY_FLAG>NORMAL</DUMMY_FLAG><LOGO_FLAG></LOGO_FLAG><ADR_LINES>FASTSIGNS


</ADR_LINES>
<Q_P58W2>
<P58WINVNO>12</P58WINVNO><P58WVOUCH>637866</P58WVOUCH><P58WIDATE>2019-11-22T00:00:00.000-06:00</P58WIDATE><P58WGAMT>12</P58WGAMT><P58WDAMT>0</P58WDAMT><P58WNAMT>12</P58WNAMT><C_PRT_DATE>11/22/19</C_PRT_DATE>
</Q_P58W2>
<C_PRT_PAY_TOT>.00</C_PRT_PAY_TOT>
<CS_NUM_VOUCHERS>1</CS_NUM_VOUCHERS>
</G_1>
</Q_P58W1>
</Q_A01F>
<CF_PROPERTIES>
<REPORT_NAME>P58R01</REPORT_NAME><REPORT_DESCRIPTION>Check Print And Update</REPORT_DESCRIPTION><VERSION_NUMBER>V11.0.001</VERSION_NUMBER><DATABASE_NAME>DEV</DATABASE_NAME><USER_NAME></USER_NAME><RUN_DATE>2019-11-22T10:39:20.000-06:00</RUN_DATE>
</CF_PROPERTIES>
</DATA_DS>

很难说清楚你想要什么,但我想我明白了。只需为您要升级的每个级别使用 ../

XML 示例:

<LIST_PARENT>
   <PARENT>
      <PARENT_NUMBER>1</PARENT_NUMBER>
      <PARENT_ATTRIBUTE>A</PARENT_ATTRIBUTE>
      <LIST_CHILD>
         <CHILD>
            <CHILD_NUMBER>1</CHILD_NUMBER>
            <CHILD_ATTRIBUTE>A</CHILD_ATTRIBUTE>
         </CHILD>
         <CHILD>
            <CHILD_NUMBER>2</CHILD_NUMBER>
            <CHILD_ATTRIBUTE>B</CHILD_ATTRIBUTE>
         </CHILD>
      </LIST_CHILD>
   </PARENT>
   <PARENT>
      <PARENT_NUMBER>2</PARENT_NUMBER>
      <PARENT_ATTRIBUTE>B</PARENT_ATTRIBUTE>
      <LIST_CHILD>
         <CHILD>
            <CHILD_NUMBER>1</CHILD_NUMBER>
            <CHILD_ATTRIBUTE>A</CHILD_ATTRIBUTE>
         </CHILD>
         <CHILD>
            <CHILD_NUMBER>2</CHILD_NUMBER>
            <CHILD_ATTRIBUTE>B</CHILD_ATTRIBUTE>
         </CHILD>
      </LIST_CHILD>
   </PARENT>
</LIST_PARENT>

RTF代码:

<for-each:PARENT>
   Parent Number: <PARENT_NUMBER>
   Parent Attribute: <PARENT_ATTRIBUTE>
   <for-each:CHILD>
      Child Number: <CHILD_NUMBER>
      Child Attribute: <CHILD_ATTRIBUTE>
      Parent Number: <../../PARENT_ATTRIBUTE>
   <end for-each>
<end for-each>

以下作品:

<?for-each:Q_P58W1?>
    <?P58WCHCK?>
<?end for-each?>

当您添加重复组 for-each-check 时,您已经在循环 Q_P58W1。 FOProcessor 只是将其解释为 <?for-each:Q_P58W1?>。然后您在文本中添加了另一个 <?for-each:Q_P58W1?>,但 FOProcessor 以相同的方式解释它。

这使得您的示例代码:

<?P58WCHCK?>
<?for-each:Q_P58W1?><?for-each:Q_P58W1?>
    <?P58WCHCK?>
    ...
<?end for-each?>

在您的示例中,您不清楚如何关闭 for-each 循环。如果您两次都没有关闭 for-each 循环,则您的语法不正确。如果你关闭它,你正在尝试打印 Q_P58W1/Q_P58W1/P58WCHCK,它不存在。

解决方案: 删除文本 <?for-each:Q_P58W1?><?for-each:G_1?>,如果适用,匹配结束 <?end for-each?>.

我在仔细查看之后找到了这个问题的答案。我想包含在子组中的元素 - Q_P58W1/P58WCHCK - 拒绝在 <?for-each:G_1?> 循环内打印,所以我只是更改了我的 BI Publisher 数据模型,以便查询两次选择支票号码,作为两个具有不同别名的不同元素。其中之一 P58WCHCK 仍然作为单个元素分组在 Q_P58W1 下,因为这是必需的功能。另一个只是成为子组每一行的一部分。 Here's a screenshot of the data model box for clarity.