Friday, January 1, 2010

BIP: Grouping and Parent Access

 

I found an interesting question on stackoverflow in the BI-Publisher tag. At first I thought BIP could not handle this requirement, but a little bit of trial and error taught me something. cleartext.blogspot.com

With this xml:

<root>
    <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> cleartext.blogspot.com
    </OrderEntry-Orders>
</root>

 

This BIP code :

<?for-each-group: OrderEntry-LineItems; CwaProductCode?>

<?CwaProductCode?>

<?if:../../CwaOrderType='UT Sales' and ../../CwaChannel='Customer Portal'?>

<?'True'?>

<?end if?>

<?../../CwaOrderType?>

<?count(current-group()/.)?>

<?end for-each-group?>

Produces this output:

001

True

UT Sales

1

005

True

UT Sales

3

The count function returns a value of 3, but it prints only one value of OrderType. So it looks like the if condition is not filtering at all and always returns True.

The count returning 3 gives us the clue that there are two more elements there which need to be processed.

This code:

<?for-each-group: OrderEntry-LineItems; CwaProductCode?>

<?CwaProductCode?>

<?for-each:current-group()?>

<?if:../../CwaOrderType='UT Sales' and ../../CwaChannel='Customer Portal'?>

<?'True'?>

<?end if?>

<?../../CwaOrderType?>

<?end for-each?>

<?count(current-group()/.)?>

<?end for-each-group?>

Returns the answer: cleartext.blogspot.com

001

True

UT Sales

1

005

True

UT Sales

True

UT Sales

UT Redemption

3

Here the second True is print only once, as it iterates through the parents of the grouped node. cleartext.blogspot.com

So when there is a grouping done, and you need to check if its parent satisfies a condition, one single if statement will not suffce. Instead one more “ for-each:current-group() “ is required to iterate through all the grouped elements , and then the if statement should be added after that.

 

So the original BIP code in the question: cleartext.blogspot.com

 

<?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')?>

Returns:

001

1

1

 

005

1

005

1

005

1

4

Can be re-written as

<?for-each-group: OrderEntry-LineItems; CwaProductCode?>

<?CwaProductCode?>

<?for-each: current-group()?>

<?if:../../CwaOrderType='UT Sales' and ../../CwaChannel='Customer Portal'?>

<?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?>

<?end for-each-group?>

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

 

Which returns: cleartext.blogspot.com

cleartext.blogspot.comcleartext.blogspot.com

001

1

005

1

1

3

Monday, December 28, 2009

Compact Calendar 2010 - From David Seah's Compact Calendar

I have been following and occasionnally using David Seah's compact calendar for project activities in the past. This time, I have created an separate version for India. The holildays should hold good in the IT industry, though there are lot of regional variations in other industries.
Download the india version here
Tell me how it was.
Go to http://davidseah.com/blog/comments/compact-calendar/ for the actual concept and US version template