JasperReports: как определить, будет ли поле перенесено на следующую страницу - PullRequest
4 голосов
/ 31 января 2012

Я создаю отчет с контактами, которые охватывают разные страницы.

Ранее для меня было установлено значение isSplitAllowed, равное "true".Но я не хочу, чтобы контакт распределялся по разным страницам.Поэтому я установил значение «false», макет отчета выглядел намного лучше.Однако это привело к появлению новой проблемы:

В моем заголовке я печатаю имя первого и последнего лица страницы.Когда контакт перемещается на следующую страницу, он все еще обрабатывается на текущей странице.Допустим, Боб должен был быть внизу первой страницы.Но чтобы предотвратить его расщепление, Боб теперь является первым элементом на второй странице.Однако в заголовке моей первой страницы у меня все еще есть Алиса ... Боб (где Алиса - первая персона первой страницы).И на моей второй странице у меня все еще есть Бренда ... Даг (где Бренда теперь 2-й человек 2-й страницы, а Дуг - последний человек 2-й страницы).

Мой вывод в заголовке - [$ V{pageFirstItem} + "..." + $ V {pageLastItem}]]> *

, где pageFirstItem:

 <variable name="pageFirstItem" class="java.lang.String" resetType="Page" calculation="First">
        <variableExpression><![CDATA[$F{lastName}]]></variableExpression>
        <initialValueExpression><![CDATA[$F{lastName}]]></initialValueExpression>
    </variable>

, а pageLastItem:

<variable name="pageLastItem" class="java.lang.String" resetType="Report" calculation="Nothing">
  <variableExpression><![CDATA[$F{lastName}]]></variableExpression>

1 Ответ

1 голос
/ 04 мая 2012

Ниже приведен рабочий пример обхода проблемы на основе iReport 3.0.5. Вы можете проверить это, запустив его с isSplitAllowed включенным и отключенным. Проблема в том, что на странице i обрабатывается подробная запись, даже если isSplitAllowed="false" вынуждает печатать запись на странице i + 1.

Резюме:

  1. Для firstItem расчет не требуется. Просто поместите поле Имя в заголовок.
  2. Для lastItem необходимо сохранить имя, обработанное с использованием переменной prop, типа java.util.Property. Это делается путем помещения фиктивного элемента textField (высота 0) в раздел детализации со следующим значением prop.setProperty("lastSavedName", $F{Name}). Этот textField гарантирует, что имя сохраняется только после его печати. ​​
  3. Затем поместите значение из реквизита prop.getProperty("lastSavedName") в заголовок с помощью evaluationTime="Page".

    <?xml version="1.0" encoding="UTF-8"  ?>
    <!-- Created with iReport - A designer for JasperReports -->
    <!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN" "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
    <jasperReport
             name="Untitled_report_1"
             columnCount="1"
             printOrder="Vertical"
             orientation="Portrait"
             pageWidth="595"
             pageHeight="842"
             columnWidth="535"
             columnSpacing="0"
             leftMargin="30"
             rightMargin="30"
             topMargin="20"
             bottomMargin="20"
             whenNoDataType="NoPages"
             isFloatColumnFooter="true"
             isTitleNewPage="false"
             isSummaryNewPage="true">
        <property name="ireport.zoom" value="1.0" />
        <property name="ireport.x" value="0" />
        <property name="ireport.y" value="0" />
        <property name="ireport.scriptlethandling" value="0" />
        <property name="ireport.encoding" value="UTF-8" />
        <import value="java.util.*" />
        <import value="net.sf.jasperreports.engine.*" />
        <import value="net.sf.jasperreports.engine.data.*" />
    
        <queryString><![CDATA[select 1 as id, 'Name 1' as name from dual union all
    select 2 as id, 'Name 2' as name from dual union all
    select 3 as id, 'Name 3' as name from dual union all
    select 4 as id, 'Name 4' as name from dual union all
    select 5 as id, 'Name 5' as name from dual union all
    select 6 as id, 'Name 6' as name from dual union all
    select 7 as id, 'Name 7' as name from dual union all
    select 8 as id, 'Name 8' as name from dual union all
    select 9 as id, 'Name 9' as name from dual union all
    select 10 as id, 'Name 10' as name from dual union all
    select 11 as id, 'Name 11' as name from dual union all
    select 12 as id, 'Name 12' as name from dual union all
    select 13 as id, 'Name 13' as name from dual union all
    select 14 as id, 'Name 14' as name from dual union all
    select 15 as id, 'Name 15' as name from dual union all
    select 16 as id, 'Name 16' as name from dual union all
    select 17 as id, 'Name 17' as name from dual union all
    select 18 as id, 'Name 18' as name from dual union all
    select 19 as id, 'Name 19' as name from dual union all
    select 20 as id, 'Name 20' as name from dual union all
    select 21 as id, 'Name 21' as name from dual union all
    select 22 as id, 'Name 22' as name from dual union all
    select 23 as id, 'Name 23' as name from dual union all
    select 24 as id, 'Name 24' as name from dual union all
    select 25 as id, 'Name 25' as name from dual union all
    select 26 as id, 'Name 26' as name from dual union all
    select 27 as id, 'Name 27' as name from dual union all
    select 28 as id, 'Name 28' as name from dual]]></queryString>
    
        <field name="ID" class="java.math.BigDecimal"/>
        <field name="NAME" class="java.lang.String"/>
    
        <variable name="prop" class="java.util.Properties" resetType="Report" calculation="System">
            <initialValueExpression><![CDATA[new Properties()]]></initialValueExpression>
        </variable>
            <background>
                <band height="0"  isSplitAllowed="true" >
                </band>
            </background>
            <title>
                <band height="0"  isSplitAllowed="true" >
                </band>
            </title>
            <pageHeader>
                <band height="16"  isSplitAllowed="true" >
                    <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None"  hyperlinkTarget="Self" >
                        <reportElement
                            x="0"
                            y="0"
                            width="96"
                            height="16"
                            key="textField-3"/>
                        <box></box>
                        <textElement>
                            <font/>
                        </textElement>
                    <textFieldExpression   class="java.lang.String"><![CDATA["First  " + $F{ID}]]></textFieldExpression>
                    </textField>
                    <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Page" hyperlinkType="None"  hyperlinkTarget="Self" >
                        <reportElement
                            x="96"
                            y="0"
                            width="100"
                            height="16"
                            key="textField-4"/>
                        <box></box>
                        <textElement>
                            <font/>
                        </textElement>
                    <textFieldExpression   class="java.lang.String"><![CDATA["Last  " + $V{prop}.getProperty("abcd")]]></textFieldExpression>
                    </textField>
                </band>
            </pageHeader>
            <columnHeader>
                <band height="20"  isSplitAllowed="true" >
                    <staticText>
                        <reportElement
                            x="0"
                            y="0"
                            width="96"
                            height="20"
                            key="staticText-2"/>
                        <box></box>
                        <textElement>
                            <font/>
                        </textElement>
                    <text><![CDATA[CustomerName]]></text>
                    </staticText>
                    <staticText>
                        <reportElement
                            x="96"
                            y="0"
                            width="100"
                            height="20"
                            key="staticText-3"/>
                        <box></box>
                        <textElement>
                            <font/>
                        </textElement>
                    <text><![CDATA[Workorderid]]></text>
                    </staticText>
                </band>
            </columnHeader>
            <detail>
                <band height="18"  isSplitAllowed="true" >
                    <textField isStretchWithOverflow="true" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None"  hyperlinkTarget="Self" >
                        <reportElement
                            x="0"
                            y="0"
                            width="96"
                            height="18"
                            key="textField"/>
                        <box></box>
                        <textElement>
                            <font/>
                        </textElement>
                    <textFieldExpression   class="java.lang.String"><![CDATA[$F{NAME}+"This\nwill\ncause\na\nsplit."]]></textFieldExpression>
                    </textField>
                    <textField isStretchWithOverflow="false" pattern="##0.00" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None"  hyperlinkTarget="Self" >
                        <reportElement
                            x="96"
                            y="0"
                            width="100"
                            height="18"
                            key="textField"/>
                        <box></box>
                        <textElement>
                            <font/>
                        </textElement>
                    <textFieldExpression   class="java.math.BigDecimal"><![CDATA[$F{ID}]]></textFieldExpression>
                    </textField>
                    <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Band" hyperlinkType="None"  hyperlinkTarget="Self" >
                        <reportElement
                            x="196"
                            y="0"
                            width="339"
                            height="0"
                            key="textField-5"
                            isRemoveLineWhenBlank="true"/>
                        <box></box>
                        <textElement>
                            <font/>
                        </textElement>
                    <textFieldExpression   class="java.lang.String"><![CDATA[$V{prop}.setProperty("abcd", String.valueOf($F{ID}))]]></textFieldExpression>
                    </textField>
                </band>
            </detail>
            <columnFooter>
                <band height="0"  isSplitAllowed="true" >
                </band>
            </columnFooter>
            <pageFooter>
                <band height="0"  isSplitAllowed="true" >
                </band>
            </pageFooter>
            <summary>
                <band height="0"  isSplitAllowed="true" >
                </band>
            </summary>
    </jasperReport>
    
...