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

Popular posts from this blog

Execute D365 F&O SSRS report with parameter and upload report output on Azure blob storage using X++

Microsoft D365 F&O: Remove custom models from deployable package

Generate Text/CSV/DAT file using X++ and upload on Azure blob storage