Transfer Files from Local FileShare

You can use a Data Management job to move files Smart Integration Connector from a local FileShare. To do this, you build an extender business rule and call it through a data management job. This extender business rule will call a Smart Integration Function (remote function) and obtain the results.

Step 1 - Setup the Remote Server / Remote Share

To get started, setup the Smart Integration Function:

  1. Navigate to Application > Tools > Business Rules.

  2. Open the Smart Integration Function folder.

  3. Create a new business rule (for example, TestFileRead).

  4. Copy and paste the following business rule code snippet.

Copy
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Globalization;
using System.IO;
using System.Linq;
namespace OneStream.BusinessRule.SmartIntegrationFunction.TestFileRead
{
 public class MainClass
 { 
 public byte[] RunOperation(string year)
 {
 string fname = @"c:\temp\hw_" + year + ".csv";
 byte[] buffer = System.IO.File.ReadAllBytes(fname); 
 return buffer;
 }
 public byte[] GetOtherFileData(string year)
 {
 string fname = @"c:\temp\zw_" + year + ".csv";
 byte[] buffer = System.IO.File.ReadAllBytes(fname); 
 return buffer;
 }
 public bool DeleteOldFileData(string year)
 {
 string fname = @"c:\temp\zw_" + year + ".csv";
 try
 {
 System.IO.File.Delete(fname);
 return true;
 }
 catch (IOException)
 {
 return false;
 }
 } 
 }
}

Step 2 - Pull file from Extender Business Rule

  1. Navigate to Application > Tools > Business Rules.

  2. Open the Extensibility Rules folder.

  3. Create a new business rule (for example, ProcessRemoteFileData).

  4. Copy and paste the following business rule code snippet.

    Copy
    Imports System
    Imports System.Data
    Imports System.Data.Common
    Imports System.IO
    Imports System.Collections.Generic
    Imports System.Globalization
    Imports System.Linq
    Imports Microsoft.VisualBasic
    Imports System.Windows.Forms
    Imports OneStream.Shared.Common
    Imports OneStream.Shared.Wcf
    Imports OneStream.Shared.Engine
    Imports OneStream.Shared.Database
    Imports OneStream.Stage.Engine
    Imports OneStream.Stage.Database
    Imports OneStream.Finance.Engine
    Imports OneStream.Finance.Database
    Namespace OneStream.BusinessRule.Extender.ProcessRemoteFileData
        Public Class MainClass
            Public Function Main(ByVal si As SessionInfo, ByVal globals As BRGlobals, ByVal api As Object, ByVal args As ExtenderArgs) As Object
                Try
                    Dim stepNumber As String = "1"
                    
                    If (Not args.NameValuePairs Is Nothing) Then
                     ' Extracting the value from the parameters collection                 
                     If (args.NameValuePairs.Keys.Contains("step")) Then
                         stepNumber = args.NameValuePairs.Item("step")
                     End If 
                     BRApi.ErrorLog.LogMessage(si, "File Processing Step: " & stepNumber) 
                 End If 
                    
                    Select Case stepNumber
                        
                        Case Is = "1"
                            GetData(si)
                            Return Nothing
                        
                        Case Is = "2"
                            CleanupData(si)
                            Return Nothing 
                            
                                                 
                    End Select    
                    
                    
                Catch ex As Exception
                    Throw ErrorHandler.LogWrite(si, New XFException(si, ex))
                End Try
                
                Return Nothing
            End Function
                
            Public Sub CleanupData(ByVal si As SessionInfo)
                
                    Dim argTest(0) As Object                         
                    argTest(0) = "2023"
                    
                    ' Here we are telling it to specifically call 
                     Dim objRemoteRequestResultDto As RemoteRequestResultDto = BRApi.Utilities.ExecRemoteGatewayBusinessRule(si, "TestFileRead", argTest, "entergatewayname", "DeleteOldFileData")
                    If (objRemoteRequestResultDto.RemoteResultStatus = RemoteMessageResultType.RunOperationReturnObject) Then
                        
                        ' The delete method returns a true/false return type
                        Dim result As Boolean
                        ' ObjectResultValue introduced in v7.4 to simplify obtaining the return value from a method that doesn't return a 
                        ' Dataset/Datatable
                        result = objRemoteRequestResultDto.ObjectResultValue
                        
                        Dim objRemoteRequestResultDtoCached As RemoteRequestResultDto = BRApi.Utilities.ExecRemoteGatewayCachedBusinessRule(si, "TestFileReadCache", argTest, "entergatewayname", String.Empty)                    
                        
                        BRApi.ErrorLog.LogMessage(si, "File Deleted: " & result) 
                 Else
                     If (Not (objRemoteRequestResultDto.remoteException Is Nothing)) Then
                      Throw ErrorHandler.LogWrite(si, New XFException(si, objRemoteRequestResultDto.remoteException))
                     End If 
                 End If
            End Sub
            
            Public Sub GetData(ByVal si As SessionInfo)
                    
                    ' Demonstrating how to pass parameters
                    ' We create an object array that matches the number of parameters
                    ' To the remote function. In this case, we have 1 parameter that is a string
                    Dim argTest(0) As Object                         
                    argTest(0) = "2023"
                    
                    ' This is where you can allow caching of the remote function. We are passing in true at the end to force the cache to be updated
                    ' We are also allowing the function to run for 90 seconds.
                    ' String.empty means this will look for a remote function/method called "RunOperation"
                     Dim objRemoteRequestResultDto As RemoteRequestResultDto = BRApi.Utilities.ExecRemoteGatewayBusinessRule(si, "TestFileRead", argTest, "entertestconnection", String.Empty,"TestFileRead", True, 90)
                    If (objRemoteRequestResultDto.RemoteResultStatus = RemoteMessageResultType.RunOperationReturnObject) Then
                        Dim bytesFromFile As Byte()             
                        bytesFromFile = objRemoteRequestResultDto.ObjectResultValue
                        Dim valueAsString As String = System.Text.Encoding.UTF8.GetString(bytesFromFile)
                        Return valueAsString
                        bytesFromFile = Convert.FromBase64String(objRemoteRequestResultDto.ObjectResultValue)
                        'bytesFromFile = objRemoteRequestResultDto.ObjectResultValue
                        
                        
                        Dim valueAsString As String = System.Text.Encoding.UTF8.GetString(bytesFromFile)
                    
                         ' Do something with the files here....
                        BRApi.ErrorLog.LogMessage(si, "File Contents: " & Left(valueAsString,10)) 
                        ' We are saving the file into the OneStream Share here
                        ' This is an option to allow other OneStream functions to process the data
                     'Dim groupFolderPath As String = FileShareFolderHelper.GetGroupsFolderForApp(si, True, AppServerConfig.GetSettings(si).FileShareRootFolder, si.AppToken.AppName)
                        Dim groupFolderPath As String = BRAPi.Utilities.GetFileShareFolder(si, FileShareFolderTypes.BatchHarvest, Nothing)
                        Using sw As StreamWriter = New StreamWriter(groupFolderPath & "\outputfile.csv")
                         sw.Write(valueAsString)
                         sw.Close()
                        End Using
                 Else
                     If (Not (objRemoteRequestResultDto.remoteException Is Nothing)) Then
                      Throw ErrorHandler.LogWrite(si, New XFException(si, objRemoteRequestResultDto.remoteException))
                     End If 
                 End If
            End Sub    
            
        End Class
    End Namespace
  5. Test your Extender Business Rule via the Execute Extender button in the toolbar.

Step 3 - Automate from Data Management / Task Scheduler

After the Extensibility Rule has been created and tested you can automate from a Data Management Job and associate Task Schedule. See Task Scheduler for more information.