Read complex SQL statement/Stored procedure and Insert SQL output to D365 table
If we have SQL based complex query/stored procedure and we wants to implement SQL statement but due to complex SQL statement its difficult us to implement into X++
Today, we will see how D365 FO read the SQL statement and its output; and insert SQL output columns value to D365 FO table. In my case I have SQL query which contains 400+ lines. public class XXXService extends SysOperationServiceBase { public void processOperation(Contract _contract) { ResultSet resultSet; ResultSetMetaData resultSetMetaData; XXX_Table xxxTable; boolean isFirstRow = true; int i; str sqlStatement; sqlStatement = strFmt( _contract.parmSQLStatement()); // get the SQL statement from parameter resultSet = this.getResultSet(sqlStatement); resultSetMetaData = resultSet.getMetaData(); while(resultSet.next()) // resultSet contains per record line { for ( i = 1; i <= resultSetMetaData.getColumnCount(); i++) // Irritate row one by one { if(i==1) xxxTable.SalesId = resultSet.getString(i); else if(i==2) xxxTable.CustomerPostalCode = resultSet.getInt(i); else if(i==3) xxxTable.InvoiceAmount = resultSet.getReal(i); else if(i==4) xxxTable.CustomerFullAddress= resultSet.getString(i); else if(i==5) xxxTable.InvoiceId = resultSet.getString(i); else if(i==6) xxxTable.DimensionValue = resultSet.getString(i); else if(i==7) xxxTable.TotalRequestQty = resultSet.getReal(i); else if(i==8) xxxTable.TotalShipQty = resultSet.getReal(i); // Other SQL statement column output assigned to xxxTable xxxTable.insert(); } } } private ResultSet getResultSet(str _strQuery) { SqlStatementExecutePermission permission; ResultSet resultSet; Connection connection = new Connection(); Statement statement = connection.createStatement(); permission = new SqlStatementExecutePermission(_strQuery); permission.assert(); resultSet = statement.executeQuery(_strQuery); return resultSet; } .
Sample SQL statement: Select ST.SalesId , Case When SubString(ST.SalesId, 1, 2) = 'IN' Then IsNull(ST.SalesId, '') Else '' End as ConvertedSalesId , Case When SubString(ST.SalesId, 1, 2) = 'IN' Then 'SalesOrder' When IsNumeric(IsNull(SL.ItemId, 'Item')) = 1 Then 'PurchaseOrder' Else 'TransferOrder' End as TransactionType , Cast(IsNull(Case When IsNumeric(IsNull(C.CustAccount, 'A')) = 1 Then C.CustAccount Else '0' End, '0') as decimal(10,0)) as convertedCustomerId, When IsNumeric(IsNull(SH.InvoiceId, 0)) = 1 Then IsNull(SH.InvoiceId, '0') Else Replace(Left(SubString(Replace(Replace(Replace(Replace(Replace(SH.InvoiceId,'(',''),')',''),'-',''),' ',''),',','') , PatIndex('%[^0-9.-]%', SubString(Replace(Replace(Replace(Replace(Replace(SH.InvoiceId,'(',''),')',''),'-',''),' ',''),',','') , PatIndex('%[0-9.-]%', Replace(Replace(Replace(Replace(Replace(SH.InvoiceId,'(',''),')',''),'-',''),' ',''),',','')), 10) + 'X') -1),'.','') End, 20), '0') as NewOrderNumber , Case When IsNull(SL.QtyReceived, 0) = 0 and IsNull(SL.QtyShipped, 0) > 0 Then 1 Else 0 End as Status , Cast( Cast(DatePart(yyyy, ST.CreatedDateTime) as varchar(6)) + Right('0' + Cast(DatePart(mm, ST.CreatedDateTime) as varchar(6)), 2) as decimal(6,0)) as CreatedYearMonth From Salestable ST Inner Join SALESLINE SL On // Some condition Inner Join InventDim K On // Some condition Where ST.CreatedDateTime >= (GetDate() - %1) // Dynamic value ) Select IsNull(M.InvoiceId, '0') as InvoiceId, // Other selected field From SalesTable_H H Left Outer Join ( // other nested join-1 Left Outer Join ( // other nested join-2 ))
Comments
Post a Comment