2016-06-08 3 views
4

Я знаю, что здесь есть аналогичная тема, но это не работает для меня.Сортировка в столбце сортировки столбцов/строк группы с порядком по выражению

фона: Jaspersoft Studio 6

У меня есть набор данных, как это:

enter image description here

Создано перекрестный, как это на этом наборе:

enter image description here

Как отсортировать группу столбцов для prod c, prod a, p стержень b вместо тока?

Я попытался поместить это выражение в порядке, выражая группу столбцов.

enter image description here

$F{product}.equals("prod c")? 1 : $F{product}.equals("prod a")? 2:3 

Но это говорит

enter image description here

изменения: добавлен источник, это версия без сортировки, и она работает нормально без ошибок, но без сортировки конечно.

<?xml version="1.0" encoding="UTF-8"?> 
<!-- Created with Jaspersoft Studio version 6.2.0.final using JasperReports Library version 6.2.0 --> 
<!-- 2016-06-08T14:14:48 --> 
<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="test3" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="0a3345e5-7859-4366-9ccf-b215cf60a3b0"> 
    <property name="com.jaspersoft.studio.data.sql.tables" value=""/> 
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="vha"/> 
    <style name="Crosstab_CH" mode="Opaque" backcolor="#F0F8FF"> 
     <box> 
      <pen lineWidth="0.5" lineColor="#000000"/> 
      <topPen lineWidth="0.5" lineColor="#000000"/> 
      <leftPen lineWidth="0.5" lineColor="#000000"/> 
      <bottomPen lineWidth="0.5" lineColor="#000000"/> 
      <rightPen lineWidth="0.5" lineColor="#000000"/> 
     </box> 
    </style> 
    <style name="Crosstab_CG" mode="Opaque" backcolor="#BFE1FF"> 
     <box> 
      <pen lineWidth="0.5" lineColor="#000000"/> 
      <topPen lineWidth="0.5" lineColor="#000000"/> 
      <leftPen lineWidth="0.5" lineColor="#000000"/> 
      <bottomPen lineWidth="0.5" lineColor="#000000"/> 
      <rightPen lineWidth="0.5" lineColor="#000000"/> 
     </box> 
    </style> 
    <style name="Crosstab_CT" mode="Opaque" backcolor="#005FB3"> 
     <box> 
      <pen lineWidth="0.5" lineColor="#000000"/> 
      <topPen lineWidth="0.5" lineColor="#000000"/> 
      <leftPen lineWidth="0.5" lineColor="#000000"/> 
      <bottomPen lineWidth="0.5" lineColor="#000000"/> 
      <rightPen lineWidth="0.5" lineColor="#000000"/> 
     </box> 
    </style> 
    <style name="Crosstab_CD" mode="Opaque" backcolor="#FFFFFF"> 
     <box> 
      <pen lineWidth="0.5" lineColor="#000000"/> 
      <topPen lineWidth="0.5" lineColor="#000000"/> 
      <leftPen lineWidth="0.5" lineColor="#000000"/> 
      <bottomPen lineWidth="0.5" lineColor="#000000"/> 
      <rightPen lineWidth="0.5" lineColor="#000000"/> 
     </box> 
    </style> 
    <queryString> 
     <![CDATA[select 'channel a' as "sales channel", 'prod a' as product, 1 as amount 
union all select 'channel a' as salesChannel, 'prod b' as product, 1 as amount 
union all select 'channel a' as salesChannel, 'prod c' as product, 1 as amount 
union all select 'channel b' as salesChannel, 'prod a' as product, 1 as amount 
union all select 'channel b' as salesChannel, 'prod b' as product, 1 as amount 
union all select 'channel b' as salesChannel, 'prod c' as product, 1 as amount]]> 
    </queryString> 
    <field name="sales channel" class="java.lang.String"/> 
    <field name="product" class="java.lang.String"/> 
    <field name="amount" class="java.lang.Integer"/> 
    <background> 
     <band splitType="Stretch"/> 
    </background> 
    <summary> 
     <band height="224" splitType="Stretch"> 
      <crosstab> 
       <reportElement x="91" y="24" width="459" height="200" uuid="66af64fd-5d36-48a9-9356-f1c2cd55f6a0"> 
        <property name="com.jaspersoft.studio.layout" value="com.jaspersoft.studio.editor.layout.VerticalRowLayout"/> 
       </reportElement> 
       <rowGroup name="sales channel1" width="60" totalPosition="End"> 
        <bucket class="java.lang.String"> 
         <bucketExpression><![CDATA[$F{sales channel}]]></bucketExpression> 
        </bucket> 
        <crosstabRowHeader> 
         <cellContents mode="Opaque" style="Crosstab_CH"> 
          <textField> 
           <reportElement x="0" y="0" width="60" height="20" uuid="27883596-a403-4b9a-a3d5-d18adced1ec1"/> 
           <textFieldExpression><![CDATA[$V{sales channel1}]]></textFieldExpression> 
          </textField> 
         </cellContents> 
        </crosstabRowHeader> 
        <crosstabTotalRowHeader> 
         <cellContents mode="Opaque" style="Crosstab_CT"> 
          <staticText> 
           <reportElement x="0" y="0" width="60" height="20" forecolor="#FFFFFF" uuid="7e48fc9b-d619-4b04-8b50-4fbd6174509e"/> 
           <text><![CDATA[Total sales channel1]]></text> 
          </staticText> 
         </cellContents> 
        </crosstabTotalRowHeader> 
       </rowGroup> 
       <columnGroup name="product1" height="20" totalPosition="End"> 
        <bucket class="java.lang.String"> 
         <bucketExpression><![CDATA[$F{product}]]></bucketExpression> 
        </bucket> 
        <crosstabColumnHeader> 
         <cellContents mode="Opaque" style="Crosstab_CH"> 
          <textField> 
           <reportElement x="0" y="0" width="60" height="20" uuid="81d54f8e-11ab-4841-9aef-ef224899c337"/> 
           <textFieldExpression><![CDATA[$V{product1}]]></textFieldExpression> 
          </textField> 
         </cellContents> 
        </crosstabColumnHeader> 
        <crosstabTotalColumnHeader> 
         <cellContents mode="Opaque" style="Crosstab_CT"> 
          <staticText> 
           <reportElement x="0" y="0" width="60" height="20" forecolor="#FFFFFF" uuid="0925adf9-e1d5-4b68-a7c5-0650b7e72721"/> 
           <text><![CDATA[Total product1]]></text> 
          </staticText> 
         </cellContents> 
        </crosstabTotalColumnHeader> 
       </columnGroup> 
       <measure name="amount_MEASURE1" class="java.lang.Integer" calculation="Count"> 
        <measureExpression><![CDATA[$F{amount}]]></measureExpression> 
       </measure> 
       <crosstabCell width="60" height="20"> 
        <cellContents mode="Opaque" style="Crosstab_CD"> 
         <textField> 
          <reportElement x="0" y="0" width="60" height="20" uuid="cdbc8bf6-e55f-4e69-9505-d40d01870add"/> 
          <textFieldExpression><![CDATA[$V{amount_MEASURE1}]]></textFieldExpression> 
         </textField> 
        </cellContents> 
       </crosstabCell> 
       <crosstabCell width="60" height="20" columnTotalGroup="product1"> 
        <cellContents mode="Opaque" style="Crosstab_CT"> 
         <textField> 
          <reportElement x="0" y="0" width="60" height="20" forecolor="#FFFFFF" uuid="3543f652-7dee-43fd-84ba-514613b8ac03"/> 
          <textFieldExpression><![CDATA[$V{amount_MEASURE1}]]></textFieldExpression> 
         </textField> 
        </cellContents> 
       </crosstabCell> 
       <crosstabCell width="60" height="20" rowTotalGroup="sales channel1"> 
        <cellContents mode="Opaque" style="Crosstab_CT"> 
         <textField> 
          <reportElement x="0" y="0" width="60" height="20" forecolor="#FFFFFF" uuid="9657bd6f-c862-4462-b88f-6ea0e049a3ad"/> 
          <textFieldExpression><![CDATA[$V{amount_MEASURE1}]]></textFieldExpression> 
         </textField> 
        </cellContents> 
       </crosstabCell> 
       <crosstabCell width="60" height="20" rowTotalGroup="sales channel1" columnTotalGroup="product1"> 
        <cellContents mode="Opaque" style="Crosstab_CT"> 
         <textField> 
          <reportElement x="0" y="0" width="60" height="20" forecolor="#FFFFFF" uuid="8311db87-f185-447a-b692-ce878b7fdff5"/> 
          <textFieldExpression><![CDATA[$V{amount_MEASURE1}]]></textFieldExpression> 
         </textField> 
        </cellContents> 
       </crosstabCell> 
      </crosstab> 
     </band> 
    </summary> 
</jasperReport> 
+0

@AlexK да, он работает без сортировки. – thotwielder

+0

Обновлен, добавлен источник. – thotwielder

+0

@ tobi6 нет, это просто простой отчет. – thotwielder

ответ

3

Как уже упоминалось @ tobi6 в своем посте вы можете использовать меры в orderByExpression (можно дополнительно использовать Ведра с $ V {} выражения, но это может быть трудный путь)

В вашем случае Самый простой способ - добавить новый Измерение с правилами сортировки.

<measure name="productForSort" class="java.lang.Integer"> 
    <measureExpression><![CDATA[$F{product}.equals("prod b") ? 1 : $F{product}.equals("prod c") ? 2 : 3]]></measureExpression> 
</measure> 

После этого вы можете использовать этот Меру в orderByExpression выражение:

<bucket class="java.lang.String"> 
    <bucketExpression><![CDATA[$F{product}]]></bucketExpression> 
    <orderByExpression><![CDATA[$V{productForSort}]]></orderByExpression> 
</bucket> 

Для моего теста Csv DataSource:

sales channel, product, amount 
channel a, prod c, 5 
channel a, prod a, 1 
channel b, prod a, 3 
channel a, prod b, 1 
channel b, prod b, 1 

результат был таким:

enter image description here

Как вы видите "продукт б" будет первым.


Примечание:

вопрос похож (дублирует) действительно отличный пост Jasper Reports crosstab sorting with comparatorExpression. Вы можете найти дополнительную информацию в этом сообщении.

Мой ответ аналогичен solution by @PetterFriberg. Но в этом случае мы можем ommit использование Компаратор

Еще два ответа также хороши, специально R & D по @AndreasDietrich

+0

Спасибо за ответ. На самом деле я видел этот пост, но не мог понять, как это сделать с помощью выражения-компаратора. Это сообщение, по крайней мере, не доказывает, что никакого сравнения не требуется. – thotwielder

+0

Добро пожаловать :) –

+0

FYI, в моем случае переменная измерения не была доступна в графическом интерфейсе, поэтому мне пришлось добавить строку в исходный код в классе класса. Super easy, просто не понял, что переменная меры недоступна в GUI. – dharol

1

При использовании Order By Expression, не Поля$F{} не могут быть доступны, только переменные меру (от here):

Выражение вычисляется в контексте crosstab group и может ссылаться на переменные измерения, которые вычисляют до итогов группы.

EDIT

Измерение переменных предопределены при создании кросс-таблицы. Они следуют образцу (от here, «Понимание Перекрестный Всего переменных»):

При наличии нескольких строк или столбцов группы, которые можно использовать кросс общие переменные для объединения данных на разных уровнях агрегации (например, для расчета в процентах). Доступны следующие встроенные переменные:

<Measure>_<Column Group>_ALL: общее количество всех записей в указанной группе столбцов и текущей строке.

<Measure>_<Row Group>_ALL: общее количество всех записей в указанной группе строк и текущего столбца.

<Measure>_<Row Group>_<Column Group>_ALL: Общее количество всех записей в указанных группах строк и столбцов.

Вы также можете выбрать эти переменные из редактора выражений для поля «Выражение» на вкладке «Текстовое поле» в представлении «Свойства» для измерения.

Насколько я понимаю, вы можете использовать эти переменные для группировки и заказа своих результатов. Эти переменные отображаются в редакторе выражений для кросс-таблицы (в источнике есть скриншот).

+0

@AlexK это говорит: Поле не найдено: product1 – thotwielder

+0

@ tobi6 Но что я должен делать? – thotwielder

0

FYI, есть багги для меня, где я не смог (в Jasper Studio 6.4), чтобы выбрать «Меры в графическом интерфейсе» в раскрывающемся списке «Порядок по расписанию», но он работает, когда я вручную набираю его либо в поле выражения GUI, либо непосредственно в xml.

  1. Создано переменную для вычисления условной сортировки

    <variable name="Data_Sort" class="java.lang.Double"> 
        <variableExpression><![CDATA[($P{Variance}=="Positive" ? $V{Vol_Diff}:(($P{Variance}=="Negative") ? $V{Vol_DiffInverse} :$V{Vol_AbsDiff}))]]> 
        </variableExpression> 
    </variable> 
    
  2. Создано Меру в кросс-таблице, чтобы получить доступ к сортировки переменной

    <measure name="DataSort_Measure" class="java.lang.Double"> 
        <measureExpression><![CDATA[$V{Data_Sort}]]></measureExpression> 
    </measure> 
    
  3. используется переменная Measure в выражении OrderBy из ведро моей спортивной группы

    <rowGroup name="Well.WellName" width="150"> 
        <bucket order="Descending" class="java.lang.String"> 
         <bucketExpression><![CDATA[$F{Well.WellName}]]></bucketExpression> 
          <orderByExpression><![CDATA[$V{DataSort_Measure}]]> 
          </orderByExpression> 
         </bucket>