Как получить строковые значения для суммирования как Big.Decimal, когда отрицательные числа содержат круглые скобки? - PullRequest
0 голосов
/ 03 октября 2019

У меня есть отчет, в котором мне нужно суммировать все значения данного столбца. Значения были преобразованы в char (строку) из-за необходимости рассматривать отрицательное число как «(123.45)» и нули как «-».

Поскольку оно написано в SQL, я попытался привести случайв качестве десятичного или числового значения, но оно дает недопустимому значению ошибки, так что переменные, которые я создал для суммирования десятичных чисел, будут работать, сейчас эти суммирующие переменные установлены для строки и не будут выполнять работу.

Например, когдапри предварительном просмотре отчета есть столбец / поле со значениями:

504.22
(179)
311.67
-
1,345.78

Я не могу в сводной полосе суммировать эти значения, (179) отрицательно -179.

1 Ответ

1 голос
/ 04 октября 2019

Для анализа строки, содержащей отрицательные числа в скобках, вы можете, например, использовать java.text.DecimalFormat с шаблоном "#,##0.00;(#,##0.00)", однако это не может проанализировать "-" как 0.

Вам нужно будет обработать этот особый случай, используя троичное выражение, поэтому, если "-" return 0, иначе анализируйте (предполагая, что поле вашего строкового числа называется number).

$F{number}.equals("-")?0:new java.text.DecimalFormat("#,##0.00;(#,##0.00)").parse($F{number})

Теперь просто вставьте это в выражение переменной

<variable name="SumStringNumber" class="java.math.BigDecimal" calculation="Sum">
    <variableExpression><![CDATA[$F{number}.equals("-")?0:new java.text.DecimalFormat("#,##0.00;(#,##0.00)").parse($F{number})]]></variableExpression>
    <initialValueExpression><![CDATA[0]]></initialValueExpression>
</variable>

Полный пример 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="SumStringNumber" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="afa29477-d3db-4d2a-921d-fded6f024c27">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="StringNumbers"/>
    <queryString language="csv">
        <![CDATA[]]>
    </queryString>
    <field name="number" class="java.lang.String"/>
    <variable name="SumStringNumber" class="java.math.BigDecimal" calculation="Sum">
        <variableExpression><![CDATA[$F{number}.equals("-")?0:new java.text.DecimalFormat("#,##0.00;(#,##0.00)").parse($F{number})]]></variableExpression>
        <initialValueExpression><![CDATA[0]]></initialValueExpression>
    </variable>
    <detail>
        <band height="20" splitType="Stretch">
            <property name="com.jaspersoft.studio.unit.height" value="px"/>
            <textField>
                <reportElement x="0" y="0" width="100" height="20" uuid="472295d5-70de-43d6-b03f-df0452614a39">
                    <property name="com.jaspersoft.studio.unit.height" value="px"/>
                </reportElement>
                <textElement textAlignment="Right" verticalAlignment="Middle"/>
                <textFieldExpression><![CDATA[$F{number}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="100" y="0" width="100" height="20" uuid="20854419-7c55-43bd-86bf-b9dc98c5d51d"/>
                <textElement textAlignment="Right" verticalAlignment="Middle"/>
                <textFieldExpression><![CDATA[$F{number}.equals("-")?0:new java.text.DecimalFormat("#,##0.00;(#,##0.00)").parse($F{number})]]></textFieldExpression>
            </textField>
        </band>
    </detail>
    <summary>
        <band height="20" splitType="Stretch">
            <property name="com.jaspersoft.studio.unit.height" value="px"/>
            <textField pattern="#,##0.###;(#,##0.###)">
                <reportElement x="100" y="0" width="100" height="20" uuid="9851d330-1be1-423d-9d01-1a9972ce6a3b">
                    <property name="com.jaspersoft.studio.unit.height" value="px"/>
                </reportElement>
                <textElement textAlignment="Right" verticalAlignment="Middle">
                    <font isBold="true"/>
                </textElement>
                <textFieldExpression><![CDATA[$V{SumStringNumber}]]></textFieldExpression>
            </textField>
            <line>
                <reportElement x="0" y="0" width="200" height="1" uuid="2089772d-98f5-4906-b026-69211dfd0e99"/>
            </line>
        </band>
    </summary>
</jasperReport>

Вывод (с моими произвольными данными)

result

В общем случае лучше передать данные в правильном формате в отчет яшмы, следовательно, в вашем случае они должны быть переданы как число, а не как строка, а затем выполнитьформатирование в отчете jasper (см. пример выше, как шаблон применяется к общей сумме). Это обеспечит правильный тип данных при экспорте, например, в Excel и т. Д.

...