Tuesday, March 31, 2015

Converting SAP IDoc XML date and time to a database date value

In one of my last blog entries, I descriped how to convert a xsd:string date and time value from SAP IDoc into the more appropriate xsd:dateTime value. While for most cases, specifying the required date and time parameters of xsd:dateTime is sufficient, it might not for database writes. Databases often require the precision of the optional milliseconds and especially timezone parameters of xsd:dateTime when writing the a DATE field.

The following POC will show how to extend the XSL Transformation to add entirely specify all parameters of xsd:dateTime. The POC is realizing a database adapter service to write a new empoyee to the well-known HR schema. Therefore, a BPEL process is exposing a SOAP-based web service endpoint to provide input data in a SAP IDoc like style ... hence all data are defined as xsd:string, no matter their contents' meaning.

SCA composite of the POC
The input data require firstname, lastname and hire date and time. The web service returns the hire date formated as xsd:dateTime after successful insert to the database.
XML Schema Definition of input and output data
The BPEL process itselfs stores the received input to an input variable. The following XSL transformation we focus on maps the input data to the database write variable. After successful write to the database by invocation of the endpoint reference of the database adapter, the returned data are mapped to the output data of the process.

BPEL Process "AddEmployee"
Let's have a detailed look at the XSL transformation that is "building" our xsd:dateTime datatype. The graphical representation already shows the usage of the xp20:implicit-timezone() function from XPath 2.0 (green icon).

XSL transformation to "build" an xsd:dateTime value
While the date and time concatination is known from my previous poc, we will focus on the milliseconds and timezone parameters. The milliseconds are simply set to zero (.000) while we make use of the service engines' timezone setting to specify the timezone. In the end, we end up with a pattern of yyyy-mm-ddThh:mm:ss.s+zzzzzz instead of the less precise pattern yyyy-mm-ddThh:ss:mm from the previous POC. A detailed description of the pattern can be found in the W3C recommendation of XSD.

<top:hireDate>
  <xsl:value-of select='concat(
    substring(/client:request/client:hireDay,1.0,4.0),"-",
    substring(/client:request/client:hireDay,5.0,2.0),"-",
    substring(/client:request/client:hireDay,7.0,2.0),"T",
    substring(/client:request/client:hireTime,1.0,2.0),":",
    substring(/client:request/client:hireTime,3.0,2.0),":",
    substring(/client:request/client:hireTime,5.0,2.0),".000",
    xp20:implicit-timezone())'/>
</top:hireDate>

Testing the XSL transformation in the XSLT tester in JDeveloper, everything is working as expected.

Local testing in JDevelopers' XSLT tester

Testing the POC in Oracle Enterprise Manager shows everything working as expected.

Testing the POC in Oracle Enterprise Manager with sample data

An xsd:dateTime value with full precision is returned

References:

No comments:

Post a Comment