Saturday, March 30, 2019

BIP: Number to Text , complex version



Oracle never ceases to amaze me. I recently saw this question being asked again on stackoverflow.

Basically, this is an RTF template supposed to print a check. And the amount has to be converted to text, to be printed on the 'Amount' line on the check. BIP provides a function for this called xdofx:to_check_number.
It is documented over here. The function can print the output text in different locales, and decimal number settings. But the number to be printed has to be in an XML node. It only accepts simple XPATH notations, and the value itself cannot be a result of a sum() function, or the result of any mathematical operation.
Which means, if you have an XML like this:

<root>
     <amt>3243243</amt>
     <amt>6436464</amt>
     <amt>243</amt>
     <amt>445454</amt>
     <amt>67676</amt>
</root>


And you want to print the output as the sum of all the 'amt' elements, that cannot be done.

<?xdofx:to_check_number(sum(amt),'EUR')?>

Outputs:
Zero and xx/100



Which leads me to say: WTF Oracle ?

I had solved this problem years ago, but I couldn't remeber how. So I deep dived, again, into the same problem.


Using the RTF template, I exported the XSL-FO stylesheet out:




This extracts the intermediate XSL file BIP uses to generate the final report output.
Search for "to_check_number" in this XSL:



It can be seen that although there is a for-each loop there, the template itself is not called recursively.  It access the element 'amt' without a proper XPATH, and then does a stupid (.///)[1]  whatever that means.

But if you pass a string with the number into the function to_check_number, this works out perfectly.


For the foe-each loop to sum up all the values, it has to call itself recursively. Obviously, this function is broken.

But is there a way to fix this ?

Turns out, there is. Look two lines lower in the XSL file.



It can be seen that the XSL finally invokes another hidden function xdoxslt:toCheckNumber. This namespace is unique, I am guessing it is shared between the XSL and XDO name spaces.

So I tried using this 'hidden' function directly in the template.

Like this:



<?xdoxslt:toCheckNumber($_XDOLOCALE, sum(amt), ('EUR'))?>


Which produces the output:



Voila !!

So in case you have to convert a dynamically generated number to text, use the toCheckNumber function directly.


Which leads to the question, why have the xdo function in the first place ?

But do bear in mind, that this is an undocumented function, which works for now.


Monday, November 12, 2018

The awesome EAI Transaction Service

 

After I finally got to leave the ‘Siebel ecosystem’, I had to return as that was indeed my core competency. And because there are places were Siebel is still awesome.

Like, the concept of a Webservice transaction in Siebel session. I am yet to see other systems implement it.

Siebel provides an awesome business service called ‘EAI Transaction Service’.  It has two methods , BeginTransaction, and EndTransaction. Like the name denotes, you mark the beginning of the your webservice transaction , and then proceed to use ‘EAI Siebel Adapter’ to make your updates, and finally commit everyting with the EndTransaction method.

Nothing gets committed to the system until you End the transaction successfully.

On commit, the last updated date and time on the objects is correctly preserved.

Now, the truly awesome thing. Although the documentation mentions use of Siebel EAI services, any update can be done in the transaction, and they all will be treated the same way.

It works for scripting !

It works of Workflow updates as well.

So if you use a script to update a record, that update also will be commited only if the EndTransaction method is invoked successfully.

 

Otherwise, everything gets rolled back.

In other words, you don’t have to be doing EAI work in Siebel to use this BS. You can use it wherever you need to rollback changes in case something does not work out well. Doc ID 1293943.1

 

 

If only we could rollback our own mistakes in life like that .