diff --git a/MultiTool.Common/Constants.vb b/MultiTool.Common/Constants.vb index f533c84..e03cc55 100644 --- a/MultiTool.Common/Constants.vb +++ b/MultiTool.Common/Constants.vb @@ -10,6 +10,9 @@ Public Const FUNCTION_FIELD = "FIELD" Public Const FUNCTION_RUNNINGNUMBER = "RUNNINGNUMBER" + Public Const PLACEHOLDER_CONST = "CONST" + Public Const PLACEHOLDER_FIELD = "FIELD" + Public Const TEMPLATE_TYPE_DATE = "xs:date" Public Const TEMPLATE_TYPE_INTEGER = "xs:integer" Public Const TEMPLATE_TYPE_DECIMAL = "xs:decimal" diff --git a/MultiTool.Common/Documents/Document.vb b/MultiTool.Common/Documents/Document.vb index 11af63e..acb9889 100644 --- a/MultiTool.Common/Documents/Document.vb +++ b/MultiTool.Common/Documents/Document.vb @@ -43,6 +43,7 @@ Namespace Documents Dim oDocumentErrors As List(Of String) = DocumentErrors. Select(Function(err) err.ToString()). ToList() + Return oDocumentErrors. Concat(oRowErrors). ToList() diff --git a/MultiTool.Common/Patterns.vb b/MultiTool.Common/Patterns.vb index 4347709..bf6449e 100644 --- a/MultiTool.Common/Patterns.vb +++ b/MultiTool.Common/Patterns.vb @@ -2,21 +2,29 @@ Imports DigitalData.Modules.Logging Imports MultiTool.Common.Documents Imports MultiTool.Common.Templates +Imports MultiTool.Common.Constants Imports MultiTool.Common.Winline.Entities Public Class Patterns Inherits BaseClass Private ReadOnly GeneralConfig As GeneralConfig + Private ReadOnly Regex As New Regex("{#(\w+)#([\w\s_-]+)}+") Public Sub New(pLogConfig As LogConfig, pGeneralConfig As GeneralConfig) MyBase.New(pLogConfig) GeneralConfig = pGeneralConfig End Sub - Public Function ReplaceForImport(pDocument As Documents.Document, pRow As DocumentRow, pReportFileName As String, oString As String) - Dim oRegex = New Regex("{#(\w+)#([\w\s_-]+)}+") - Dim oMatches As MatchCollection = oRegex.Matches(oString) + ''' + ''' Replaces placeholders in an sql marked as final sql in the template. + ''' + ''' + ''' This SQL does not replace field-value placeholders! + ''' This is a globally applied function! + ''' + Public Function ReplaceForImportFinalSQL(pDocument As Document, pReportFileName As String, pString As String) As String + Dim oMatches As MatchCollection = Regex.Matches(pString) For Each oMatch As Match In oMatches Dim oPlaceholderString As String = oMatch.Groups.Item(0)?.Value @@ -24,56 +32,39 @@ Public Class Patterns Dim oPlaceholderValue As String = oMatch.Groups.Item(2)?.Value Select Case oPlaceholderType.ToUpper - Case "FIELD" - Dim oFieldName = oPlaceholderValue - Dim oTargetField = pRow.Fields. - Where(Function(field) field.Key = oFieldName). - SingleOrDefault() - - oString = oString.Replace(oPlaceholderString, oTargetField.Value.Final) - - Case "CONST" + Case PLACEHOLDER_CONST Dim oValue = "" Select Case oPlaceholderValue.ToUpper - Case "MESOYEAR" - oValue = GeneralConfig.GetWinLineYear() - - Case "MESOCOMP" - oValue = pDocument.Mandator.Id - - Case "USERNAME" - oValue = Environment.UserName - - Case "CURRENTDATE" - oValue = Now.ToString() - Case "FILENAME" oValue = pDocument.FileName Case "FILENAME_REPORT" oValue = pReportFileName - Case "MANDATORDB" - oValue = pDocument.Mandator.Database - Case Else - oValue = "" + oValue = ReplaceBasicValues(oPlaceholderValue, pDocument.Mandator) End Select If oValue <> "" Then - oString = oString.Replace(oPlaceholderString, oValue) + pString = pString.Replace(oPlaceholderString, oValue) End If End Select Next - Return oString + Return pString End Function - Public Function ReplaceForExport(pDocument As ExportDocument, pMandator As Mandator, oString As String) - Dim oRegex = New Regex("{#(\w+)#([\w\s_-]+)}+") - Dim oMatches As MatchCollection = oRegex.Matches(oString) + ''' + ''' + ''' + ''' + ''' + ''' + ''' + Public Function ReplaceForImport(pDocument As Document, pRow As DocumentRow, pString As String) + Dim oMatches As MatchCollection = Regex.Matches(pString) For Each oMatch As Match In oMatches Dim oPlaceholderString As String = oMatch.Groups.Item(0)?.Value @@ -81,22 +72,48 @@ Public Class Patterns Dim oPlaceholderValue As String = oMatch.Groups.Item(2)?.Value Select Case oPlaceholderType.ToUpper - Case "CONST" + Case PLACEHOLDER_FIELD + Dim oFieldName = oPlaceholderValue + Dim oTargetField = pRow.Fields. + Where(Function(field) field.Key = oFieldName). + SingleOrDefault() + + pString = pString.Replace(oPlaceholderString, oTargetField.Value.Final) + + Case PLACEHOLDER_CONST Dim oValue = "" Select Case oPlaceholderValue.ToUpper - Case "MESOYEAR" - oValue = GeneralConfig.GetWinLineYear() + Case "FILENAME" + oValue = pDocument.FileName - Case "MESOCOMP" - oValue = pMandator.Id + Case Else + oValue = ReplaceBasicValues(oPlaceholderValue, pDocument.Mandator) - Case "USERNAME" - oValue = Environment.UserName + End Select - Case "CURRENTDATE" - oValue = Now.ToString() + If oValue <> "" Then + pString = pString.Replace(oPlaceholderString, oValue) + End If + End Select + Next + Return pString + End Function + + Public Function ReplaceForExport(pDocument As ExportDocument, pMandator As Mandator, oString As String) + Dim oMatches As MatchCollection = Regex.Matches(oString) + + For Each oMatch As Match In oMatches + Dim oPlaceholderString As String = oMatch.Groups.Item(0)?.Value + Dim oPlaceholderType As String = oMatch.Groups.Item(1)?.Value + Dim oPlaceholderValue As String = oMatch.Groups.Item(2)?.Value + + Select Case oPlaceholderType.ToUpper + Case PLACEHOLDER_CONST + Dim oValue = "" + + Select Case oPlaceholderValue.ToUpper Case "FILENAME" oValue = pDocument.FilenameExport @@ -106,11 +123,9 @@ Public Class Patterns Case "RUNNINGNUMBER" oValue = pDocument.RunningNumber - Case "MANDATORDB" - oValue = pMandator.Database Case Else - oValue = "" + oValue = ReplaceBasicValues(oPlaceholderValue, pMandator) End Select @@ -122,4 +137,31 @@ Public Class Patterns Return oString End Function + + ''' + ''' Replaces basic values in the CONST namespace that only depend on the current mandator + ''' + ''' Value that will be used to replaced the placeholder + Public Function ReplaceBasicValues(pPlaceholderValue As String, pMandator As Mandator) As String + Select Case pPlaceholderValue.ToUpper + Case "MESOYEAR" + Return GeneralConfig.GetWinLineYear() + + Case "MESOCOMP" + Return pMandator.Id + + Case "USERNAME" + Return Environment.UserName + + Case "MANDATORDB" + Return pMandator.Database + + Case "CURRENTDATE" + Return Now.ToString() + + Case Else + Return String.Empty + + End Select + End Function End Class diff --git a/MultiTool.Common/Winline/WinlineData.vb b/MultiTool.Common/Winline/WinlineData.vb index 8086969..f640336 100644 --- a/MultiTool.Common/Winline/WinlineData.vb +++ b/MultiTool.Common/Winline/WinlineData.vb @@ -965,7 +965,7 @@ Namespace Winline End If End Function - Public Async Function ExecuteFinalSQL(pDocument As ExportDocument, pTemplate As Template, pMandator As Mandator) As Task(Of Boolean) + Public Async Function ExecuteFinalSQLForExport(pDocument As ExportDocument, pTemplate As Template, pMandator As Mandator) As Task(Of Boolean) Try Dim oSql As String = Patterns.ReplaceForExport(pDocument, pMandator, pTemplate.FinalSQL) Return Await Database.ExecuteNonQueryAsync(oSql) @@ -976,6 +976,17 @@ Namespace Winline End Try End Function + Public Async Function ExecuteFinalSQLForImport(pDocument As Document, pTemplate As Template, pReportFilename As String) As Task(Of Boolean) + Try + Dim oSql As String = Patterns.ReplaceForImportFinalSQL(pDocument, pReportFilename, pTemplate.FinalSQL) + Return Await Database.ExecuteNonQueryAsync(oSql) + + Catch ex As Exception + Logger.Error(ex) + Return False + End Try + End Function + Private Function GetDocumentFromDataRow(pDataRow As DataRow) As ExportDocument Dim oAccountNumber = pDataRow.Item("ACCOUNT_NUMBER") Dim oRunningNumber As String = pDataRow.Item("RUNNING_NUMBER") diff --git a/MultiTool.Form/frmExportMain.vb b/MultiTool.Form/frmExportMain.vb index f5e303e..b65bc80 100644 --- a/MultiTool.Form/frmExportMain.vb +++ b/MultiTool.Form/frmExportMain.vb @@ -245,7 +245,7 @@ Public Class frmExportMain SplashScreenManager.SetWaitFormDescription(oMessage) Await WebService.ExportDocumentFromWinline(oDocument, CurrentTemplate, oMandator) - Dim oFinalSqlResult = Await Winline.ExecuteFinalSQL(oDocument, CurrentTemplate, oMandator) + Dim oFinalSqlResult = Await Winline.ExecuteFinalSQLForExport(oDocument, CurrentTemplate, oMandator) If oFinalSqlResult = False Then Throw New DatabaseException("FinalSQL was not executed successfully!")