Search code examples
peoplesoftbi-publisher

BI Publisher conditional field masking


I have the following code on a field in a Peoplesoft BI Publisher RTF template where it is masking the last 4 digits of the Bank Account number.

<?xdofx:lpad('',length(Bank_Account__)-4,'*')?> 
<?xdoxslt:rtrim(xdoxslt:right(Bank_Account__,4))?>

The problem is that sometimes the total Bank Account number length is less than 4 digits and when this happens it causes an negative array error on the lpad function to occur.

Can I wrap some kind of conditional IF statement around this where it will check the length of the bank account number and if it is longer than 5 digits than mask the last 4 digits, else (for Bank Account numbers less than 5 digits) just mask the last 2 digits. What would this look like?

Thanks in advance!

EDIT:

I should add that the existing code above is already wrapped in the following IF statement:

<?if@inlines:Bank_Account__!=''?>

So the entire statement is:

<?if@inlines:Bank_Account__!=''?>
    <?xdofx:lpad('',length(Bank_Account__)-4,'*')?> 
    <?xdoxslt:rtrim(xdoxslt:right(Bank_Account__,4))?>
<?end if?>

I would just like to add in the conditional logic to check the bank account length and subsequently perform either of the above masking.

EDIT 2: Here is my setup with your suggested changes, but I don't think I have the logic nested right, and the syntax may also be an issue.

enter image description here

Edit 3:

Here is the modified code, and the resulting error message:

enter image description here

enter image description here


Solution

  • The if statements can be nested, but since BIP does not have an else clause, the second if conditions has to check for the negative case.

    Maybe this might work:

    <?if@inlines:Bank_Account__!=''?>
        <?if@inlines:string-length(Bank_Account__)>4?>
            <?xdofx:lpad('',length(Bank_Account__)-4,'*')?><?xdoxslt:rtrim(xdoxslt:right(Bank_Account__,4))?>
        <?end if?>
        <?if@inlines:string-length(Bank_Account__)<=4?>
            <?xdofx:lpad('','2','*')?><?xdoxslt:rtrim(xdoxslt:right(Bank_Account__,string-length(Bank_Account__)-2))?>
        <?end if?>
    <?end if?>
    

    Update: Here is a screenshot of what I got:

    enter image description here

    Here is the xml snippet I used.

    <?xml version="1.0"?>
    <root>
      <record>
        <Bank_Account__>123456</Bank_Account__>
      </record>
        <record>
        <Bank_Account__>12345</Bank_Account__>
      </record>
        <record>
        <Bank_Account__>1234</Bank_Account__>
      </record>
        <record>
        <Bank_Account__>123</Bank_Account__>
      </record>
        <record>
        <Bank_Account__>12</Bank_Account__>
      </record>
    </root>
    

    Download working files from here

    There are some more functions available for other ways to implement this requirement.