подсчитывать по группам в издателе xml bi

Так что я должен сделать отчет, который будет отображать и подсчитывать CwaProductCode на основе CwaChannel и CwaOrderType.

Вот мой xml:

 <OrderEntry-Orders>
            <CwaChannel>Customer Portal</CwaChannel>
            <CwaOrderType>UT Sales</CwaOrderType>
            <ListOfOrderEntry-LineItems>
                    <OrderEntry-LineItems>
                            <CwaLineTotalAmount2>1000</CwaLineTotalAmount2>
                            <CwaProductCode>001</CwaProductCode>
                    </OrderEntry-LineItems>
                    <OrderEntry-LineItems>
                            <CwaLineTotalAmount2>1000</CwaLineTotalAmount2>
                            <CwaProductCode>005</CwaProductCode>
                    </OrderEntry-LineItems>
            </ListOfOrderEntry-LineItems>
    </OrderEntry-Orders>
    <OrderEntry-Orders>
            <CwaChannel>Customer Portal</CwaChannel>
            <CwaOrderType>UT Sales</CwaOrderType>
            <ListOfOrderEntry-LineItems>
                    <OrderEntry-LineItems>
                            <CwaLineTotalAmount2>1000</CwaLineTotalAmount2>
                            <CwaProductCode>005</CwaProductCode>
                    </OrderEntry-LineItems>
            </ListOfOrderEntry-LineItems>
    </OrderEntry-Orders>
    <OrderEntry-Orders>
            <CwaChannel>Customer Portal</CwaChannel>
            <CwaOrderType>UT Redemption</CwaOrderType>
            <ListOfOrderEntry-LineItems>
                    <OrderEntry-LineItems>
                            <CwaLineTotalAmount2>1000</CwaLineTotalAmount2>
                            <CwaProductCode>005</CwaProductCode>
                    </OrderEntry-LineItems>
            </ListOfOrderEntry-LineItems>
    </OrderEntry-Orders>

Вот мой BIP-код:

<?for-each-group: OrderEntry-LineItems; CwaProductCode?>
<?if:../../CwaOrderType='UT Sales' and ../../CwaChannel='Customer Portal'?>
<?for-each: current-group()?>
<?CwaProductCode?>
<?xdoxslt:set_variable($_XDOCTX, 'countFund', xdoxslt:get_variable($_XDOCTX, 'countFund')+1)?>
<?xdoxslt:set_variable($_XDOCTX, 'TotalCount', xdoxslt:get_variable($_XDOCTX, 'TotalCount')+1)?>
<?xdoxslt:get_variable($_XDOCTX, 'countFund')?>
<?xdoxslt:set_variable($_XDOCTX, 'countFund', 0)?>
<?end if?>
<?end for-each-group?>
<?xdoxslt:get_variable($_XDOCTX, 'TotalCount')?>

Но результат вышел, как если бы не было условия if. Например, CwaProductCode отобразит правильный результат, но посчитает все вместе, как будто фильтрации вообще не было.

Не уверен, где пошло не так.


person Yan    schedule 16.06.2016    source источник


Ответы (1)


После того, как вы выполните группировку, доступ к любому родителю над этой группировкой возвращает неоднозначные данные. Он всегда может указывать на первый узел OrderEntry-Orders. Вы можете увидеть это, если измените порядок элементов в xml.

Если вам нужно сгруппировать только те узлы OrderEntry-LineItems, у которых есть CwaOrderType='UT Sales' и .CwaChannel='Customer Portal', вы можете дать этому фильтру право в группировке следующим образом:

<?for-each-group: OrderEntry-LineItems[../../CwaOrderType='UT Sales' and ../../CwaChannel='Customer Portal']; CwaProductCode?>

Попробуйте этот код:

<?for-each-group: OrderEntry-LineItems[../../CwaOrderType='UT Sales' and ../../CwaChannel='Customer Portal']; CwaProductCode?>
<?for-each: current-group()?>
<?CwaProductCode?>
<?xdoxslt:set_variable($_XDOCTX, 'countFund', xdoxslt:get_variable($_XDOCTX, 'countFund')+1)?>
<?xdoxslt:set_variable($_XDOCTX, 'TotalCount', xdoxslt:get_variable($_XDOCTX, 'TotalCount')+1)?>
<?xdoxslt:get_variable($_XDOCTX, 'countFund')?>
<?xdoxslt:set_variable($_XDOCTX, 'countFund', 0)?>
<?end for-each-group?>
<?xdoxslt:get_variable($_XDOCTX, 'TotalCount')?>

Дает этот результат:

001
1
1
005
1
005
1
3

<?for-each-group: OrderEntry-LineItems[../../CwaOrderType='UT Sales' and ../../CwaChannel='Customer Portal']; CwaProductCode?>
<?CwaProductCode?>
<?count(current-group()/.)?>
<?xdoxslt:set_variable($_XDOCTX, 'TotalCount', xdoxslt:get_variable($_XDOCTX, 'TotalCount')+ count(current-group()/.))?>
<?end for-each-group?>

<?xdoxslt:get_variable($_XDOCTX, 'TotalCount')?>

дает

001
1
005
2
3
person Ranjith R    schedule 16.06.2016
comment
Спасибо @RanjithR! Пытался немного подправить код, чтобы получить вывод 001 - 2 005 - 2, но я в тупике. Какие-либо предложения? - person Yan; 16.06.2016
comment
‹?для каждой группы: OrderEntry-LineItems[../../CwaOrderType='UT Sales' и ../../CwaChannel='Customer Portal']; CwaProductCode?› ‹?CwaProductCode?› ‹?count(current-group()/.)?› ‹?xdoxslt:set_variable($_XDOCTX, 'TotalCount', xdoxslt:get_variable($_XDOCTX, 'TotalCount')+ count(current -group()/.))?› ‹?end для каждой группы?› ‹?xdoxslt:get_variable($_XDOCTX, 'TotalCount')?› - person Ranjith R; 16.06.2016
comment
Привет @RanjithR. Скажем, если бы я хотел сгруппировать 2 поля и подсчитать их на основе того же значения, что и эти 2 поля. ‹?для каждой группы:OrderEntry-LineItem[../../CwaOrderType='Переключение UT' и ../../CwaChannel='Портал клиентов'];./CwaProductCode;./CwaSwitchInFundCode?› ?› ‹?variable@incontext:ProductCode;CwaProductCode?›‹?variable@incontext:SwitchIn;CwaSwitchInFundCode?› ‹?CwaProductCode?› ‹?CwaSwitchInFundCode?› ‹?count(current-group()./[../CwaProductCode=$ ProductCode][../CwaSwitchInFundCode=$SwitchIn])?› Это правильный способ написания xpath? - person Yan; 17.06.2016
comment
‹?count(current-group()./[../CwaProductCode=$ProductCode и ../CwaSwitchInFundCode‌​=$SwitchIn])?› должен работать. и/или и круглые скобки () могут использоваться в xpath для построения условий. - person Ranjith R; 17.06.2016