Recently I have developed an integration module between JDEdwards (IBM DB2) database and Oracle Database using .NET Web service. Core objective of the module is to read the Payments data from JDEdwards Database and update to Oracle Database.
It was quite challenging and interesting task to work with. Being a beginner to JDEdwards Database, I had come across with some hurdles especially while reading JDEdwards Data during my implementation process. So I just would like to share this article with a hope that it could really be useful to someone who are on the same boat .
Download Integrating DB2 Universal Database for iSeries with Microsoft ADO.NET Book :
http://www.redbooks.ibm.com/redbooks/pdfs/sg246440.pdf
PC setup:Before we begin, the following software components must be installed onto your development PC:
Install available Service Packs (Fixes) from the iSeries Access for Windows Web site at:
http://www.ibm.com/servers/eserver/iseries/access/windows/
Note: The IBM DB2 UDB for iSeries .NET provider is also referred to by the namespace it defines, IBM.Data.DB2.iSeries. The two terms are used interchangeably.
IBM.Data.DB2.iSeries provider object model:
Adding an assembly reference to the provider:
- Solution Explorer (Figure 4-8), right-click References and select Add Reference
- Select IBM DB2 UDB for iSeries .NET provider and click Select.
IBM.Data.DB2.iSeries Namespace will allow applications using Microsoft's .NET framework to access iSeries databases using ADO.NET.
Imports IBM.Data.DB2.iSeries
Accessing JDEdwards Data using .NET:
Configure your JDEdwards connection parameters in Web.Config file:
You could always use Encryption and Decryption of this connection strings in Web.Config file.
-- Development Server configuration -->
<add key="JDE_IP" value="xxx.xxx.xxx.xxx" />
<add key="JDE_UserName" value="username" />
<add key="JDE_Password" value="password" />
Protected Friend Function JDEConnection()
As iDB2Connection
'Open JDE Connection
Try
Dim JDEConn
As iDB2Connection =
New iDB2Connection
Dim JDEConnString
As String =
String.Empty
Dim JDE_Ip
As String = ConfigurationSettings.AppSettings("JDE_Ip")
Dim JDE_UserName
As String = ConfigurationSettings.AppSettings("JDE_UserName")
Dim JDE_Password
As String = ConfigurationSettings.AppSettings("JDE_Password ")
JDEConnString = "DataSource=" & JDE_Ip & ";UserID=" & JDE_UserName &
";Password=" & JDE_Password & ";EnablePreFetch=false;"
JDEConn.ConnectionString = JDEConnString
JDEConn.Open()
Return JDEConn
Catch ex
As Exception
'Handle the exceptions
End Try
End Function
Using Kerberos authentication
Before opening a connection using Kerberos, you must use iSeries Navigator to define the connection and configure the connection for Kerberos. In your ConnectionString, do not specify either the
UserID or the Password property; the connection will use the configured default of Kerberos.
For more information about using Kerberos with iSeries Access for Windows, see the IBM Redbook iSeries Access for Windows V5R2 Hot Topics.
Connection pooling
The IBM.Data.DB2.iSeries .NET provider supports connection pooling. This support is on by default.
Use the Pooling property to turn connection pooling on or off.
Example 4-12 Specifying the Pooling property in the ConnectionString:
iDB2Connection cn = new iDB2Connection();
cn.ConnectionString = "DataSource=myiSeries; Pooling=false;";
Some Important Notes:
DataAdapter with the
iDB2CharBitData and
iDB2VarCharBitData data type of column results array of bytes to Dataset.
So, Alter your SQL SELECT statement to explicitly cast the data.
Example :CAST(COL1 AS VARCHAR(10) CCSID 037)
sSQL = "SELECT CAST(COL1 AS VARCHAR(10) CCSID 037) AS COL1, COL2, COL2 FROM <Table> <Where clause>"
All numeric columns in JDE always hold a negative value, so you must convert the data to a proper numeric value. Following ConvertAmount function will do the job for you.
Private Function ConvertAmount(ByVal Amount As Double) As Double
Dim dReturn As
Double = Amount
If dReturn < 0 Then
dReturn = CDbl((Amount * -1) / 100)
End If
Return dReturn
End Function
JDEdwards stores the date values in Julian date format which is a numeric value.
0 --> represents no date.
So you must convert the Julian date from to Oracle Date format (Or human readable format). Use the following function to Convert Julian Date to Normal Date format.
Private Function Julian2Date(ByVal pDate As String) As String
'Julian date in JDE database is in number format. 0 represents no date
Try
Dim sReturn As String = String.Empty
Dim jDate As Integer
Dim dtIn As Date
If Not IsDBNull(pDate.Trim) AndAlso pDate.Trim.Length > 0 Then
jDate = CInt(pDate)
'jDate = 0 means the invoice
If jDate > 0 Then
dtIn = DateSerial(CInt(1900 + jDate / 1000), 1, CInt(jDate Mod 1000))
sReturn = dtIn.ToString("yyyyMMdd")
End If
End If
Return sReturn
Catch ex As Exception
'Handle the exceptions
End Try
End Function
Public Function Date2Julian(ByVal lstrDate As String) As Long
Dim lstrDt As Date
Dim lintYear As Integer
Dim lintDays As Integer
lstrDt = System.DateTime.ParseExact(lstrDate, "yyyyMMdd", Nothing)
lintDays = lstrDt.DayOfYear
lintYear = CInt(Mid(lstrDate, 1, 4))
Date2Julian = (lintYear - 1900) * 1000 + lintDays
End Function
Injucting JDEdwards Data into a DataSet:
Public Function GetJDEPaymentInfo As DataSet
Dim _JDEConnection As iDB2Connection
Dim daJDEPayments As New iDB2DataAdapter
Dim dsJDEPayments As DataSet = Nothing 'traditional ADO.NET Dataset Object
Try
_JDEConnection = JDEConnection() 'Open JDE Connection
If Not _JDEConnection Is Nothing Then
dsJDEPayments = New DataSet("dsJDEPayments")
daJDEPayments = New iDB2DataAdapter(<SQLString>, _JDEConnection)
daJDEPayments.Fill(dsJDEPayments, "tbJDEData")
End If
Catch ex As Exception
Throw ex
Finally
If Not _JDEConnection Is Nothing AndAlso _JDEConnection.State <> onnectionState.Closed Then
_JDEConnection.Close()
_JDEConnection.Dispose()
End If
End Try
Return dsJDEPayments
End Function