From 5a00b63de1114ee8045f3505e81c2fad7124d69b Mon Sep 17 00:00:00 2001 From: Digital Data Date: Tue, 25 Apr 2017 16:47:40 +0200 Subject: [PATCH] jj 25.04 CURRENCY $$$ --- .../ClassControlBuilder.vb | 58 ++++++++++--------- app/DD-Record-Organizer/ClassControlLoader.vb | 20 +++++-- .../ClassControlMetadata.vb | 1 + app/DD-Record-Organizer/ClassGridFormatter.vb | 49 ++++++++++++++++ app/DD-Record-Organizer/ClassHelper.vb | 22 ++++++- 5 files changed, 114 insertions(+), 36 deletions(-) diff --git a/app/DD-Record-Organizer/ClassControlBuilder.vb b/app/DD-Record-Organizer/ClassControlBuilder.vb index 0ae806b..3ef0283 100644 --- a/app/DD-Record-Organizer/ClassControlBuilder.vb +++ b/app/DD-Record-Organizer/ClassControlBuilder.vb @@ -1166,44 +1166,45 @@ Public Class ClassControlBuilder End Function Private Sub Textbox_Currency_Handler(sender As Object, e As EventArgs) Dim control As TextBox = DirectCast(sender, TextBox) + If control.Text <> "" Then + Dim GermanCulture = Globalization.CultureInfo.GetCultureInfo("de-DE") Dim controlvalue = control.Text - If controlvalue.Contains(".") Then - controlvalue = controlvalue.Replace(".", ",") - End If Dim value As Double - If Double.TryParse(controlvalue, Globalization.NumberStyles.Currency, Nothing, value) Then - 'Valid. - control.Text = value.ToString("c"c) - Else + + ' Tausenderzeichen entfernen + controlvalue = controlvalue.Replace(".", "") + + If Not Double.TryParse(controlvalue, Globalization.NumberStyles.Currency, GermanCulture, value) Then 'Invalid. - MessageBox.Show("Please enter a valid curreny amount.") + MessageBox.Show("Please enter a valid curreny amount.", "Invalid Format", MessageBoxButtons.OK, MessageBoxIcon.Warning) control.Focus() - control.SelectAll() + 'control.SelectAll() + Else + 'Alles gut, convertierung erfolgreich, wieder als currency anzeigen + control.Text = ClassHelper.Format_Currency(value.ToString(), USER_LANGUAGE) End If - End If - - 'Dim i = IsValidCurrency(control.Text) - 'If IsValidCurrency(control.Text) = False Then - ' MsgBox("Sorry but some input characters are invalid for the format currency!", MsgBoxStyle.Exclamation) - ' control.Focus() - ' control.SelectAll() - 'End If - 'Dim currencyRegex = New System.Text.RegularExpressions.Regex("[0-9,\.]*") - 'Dim match = currencyRegex.Match(control.Text) - 'If match.Success Then - - 'End If + End If - 'If Decimal.TryParse(control.Text.Trim(), value) Then - ' 'control.Text = value.ToString("c") - ' 'control.SelectionStart = control.SelectionStart + 1 - ' 'control.Text = FormatCurrency(control.Text) - ' 'value = FormatNumber(value, -1, TriState.UseDefault, TriState.UseDefault, TriState.True) - ' 'control.Text = value.ToString("n") + 'ALT + 'If control.Text <> "" Then + ' Dim controlvalue = control.Text + ' If controlvalue.Contains(".") Then + ' controlvalue = controlvalue.Replace(".", ",") + ' End If + ' Dim value As Double + ' If Double.TryParse(controlvalue, Globalization.NumberStyles.Currency, Nothing, value) Then + ' 'Valid. + ' control.Text = value.ToString("c"c) + ' Else + ' 'Invalid. + ' MessageBox.Show("Please enter a valid curreny amount.") + ' control.Focus() + ' control.SelectAll() + ' End If 'End If End Sub @@ -1479,6 +1480,7 @@ Public Class ClassControlBuilder metadata.Id = id metadata.Name = name metadata.Required = required + metadata.Format = format control.Tag = metadata control.Name = name diff --git a/app/DD-Record-Organizer/ClassControlLoader.vb b/app/DD-Record-Organizer/ClassControlLoader.vb index c230bed..983eee8 100644 --- a/app/DD-Record-Organizer/ClassControlLoader.vb +++ b/app/DD-Record-Organizer/ClassControlLoader.vb @@ -297,15 +297,23 @@ Public Shared Sub LoadValue(control As System.Windows.Forms.TextBox, recordId As Integer, parentRecordId As Integer, value As String, entity_ID As Integer, Optional VARIABLE_VALUE As Boolean = False) Try - Dim ControlId As Integer = DirectCast(control.Tag, ClassControlMetadata).Id - If ControlId = 272 Then - Console.WriteLine("272") - End If + Dim ControlMeta As ClassControlMetadata = DirectCast(control.Tag, ClassControlMetadata) + Dim ControlId As Integer = ControlMeta.Id + Dim ControlFormat As String = ControlMeta.Format + If CURRENT_RECORD_ENABLED = False Then - control.Text = value + If ControlFormat = "Currency" Then + control.Text = ClassHelper.Format_Currency(value, USER_LANGUAGE) + Else + control.Text = value + End If Else If VARIABLE_VALUE = True Then - control.Text = value + If ControlFormat = "Currency" Then + control.Text = ClassHelper.Format_Currency(value, USER_LANGUAGE) + Else + control.Text = value + End If Else Dim drarray() As DataRow = CURRENT_SQL_AUTO_VALUES_DT.Select("CONTROL_ID = " & ControlId) If drarray.Length > 0 Then diff --git a/app/DD-Record-Organizer/ClassControlMetadata.vb b/app/DD-Record-Organizer/ClassControlMetadata.vb index e33a93b..e1db91a 100644 --- a/app/DD-Record-Organizer/ClassControlMetadata.vb +++ b/app/DD-Record-Organizer/ClassControlMetadata.vb @@ -2,4 +2,5 @@ Public Property Id As Integer Public Property Name As String Public Property Required As Boolean + Public Property Format As String End Structure diff --git a/app/DD-Record-Organizer/ClassGridFormatter.vb b/app/DD-Record-Organizer/ClassGridFormatter.vb index 8b905b4..f64b194 100644 --- a/app/DD-Record-Organizer/ClassGridFormatter.vb +++ b/app/DD-Record-Organizer/ClassGridFormatter.vb @@ -32,6 +32,7 @@ Public Class ClassGridFormatter Public checkboxColumns As New List(Of String) Public dateColumns As New List(Of String) + Public currencyColumns As New List(Of String) Public Sub New(DT As DataTable, EntityId As Integer) Me.EntityId = EntityId @@ -115,8 +116,56 @@ Public Class ClassGridFormatter End If Next + currencyColumns = GetCurrencyColumns() + + For Each columnName As String In currencyColumns + Dim column As GridColumn = gridView.Columns(columnName) + + If Not IsNothing(column) Then + column.DisplayFormat.FormatType = FormatType.Numeric + column.DisplayFormat.FormatString = "C" + column.DisplayFormat.Format = New CurrencyFormatter() + End If + Next + End Sub + Class CurrencyFormatter + Implements IFormatProvider, ICustomFormatter + + Public Function GetFormat(formatType As Type) As Object Implements IFormatProvider.GetFormat + Return Me + End Function + + Public Function Format(formatString As String, arg As Object, formatProvider As IFormatProvider) As String Implements ICustomFormatter.Format + Dim formatValue As String = arg.ToString() + + If (formatValue.Count > 0 And formatString.ToUpper() = "C") Then + Return ClassHelper.Format_Currency(formatValue, USER_LANGUAGE) + Else + Return formatValue + End If + End Function + End Class + + Private Function GetCurrencyColumns() As List(Of String) + Try + Dim list As New List(Of String) + ' Alle Currency Felder für aktuelle Ansicht heraussuchen + Dim sql As String = "SELECT COL_NAME FROM TBPMO_CONTROL WHERE CONTROL_TYPE_ID = 2 AND FORMAT_TYPE = 'Currency' AND SHOW_COLUMN = 1 AND FORM_ID = " & Me.EntityId + Dim dt As DataTable = ClassDatabase.Return_Datatable(sql, True) + + For Each row As DataRow In dt.Rows + list.Add(row.Item("COL_NAME")) + Next + + Return list + Catch ex As Exception + ClassLogger.Add("Unexpected Error in GetCurrencyColumns: " & ex.Message, True) + Return Nothing + End Try + End Function + Private Function GetCheckboxColumns() Try Dim listcheck As New List(Of String) diff --git a/app/DD-Record-Organizer/ClassHelper.vb b/app/DD-Record-Organizer/ClassHelper.vb index f031a1a..33fcb64 100644 --- a/app/DD-Record-Organizer/ClassHelper.vb +++ b/app/DD-Record-Organizer/ClassHelper.vb @@ -2,6 +2,24 @@ Imports System.Globalization Imports DD_LIB_Standards Public Class ClassHelper + Public Shared Function Format_Currency(value As String, language As String) + Try + If language <> "de-DE" Then + value = value.Replace(",", ".") + End If + + Dim dValue = Double.Parse(value) + + Dim ci = Threading.Thread.CurrentThread.CurrentCulture + Dim nfi As NumberFormatInfo = ci.NumberFormat.Clone() + nfi.CurrencySymbol = "" ' KEIN Currency Symbol + + Return dValue.ToString("C", nfi) + Catch ex As Exception + Return value.ToString() + End Try + End Function + Public Shared Function Convert_Date(input As String, format As String) Try Dim dt As Date = CDate(input) @@ -107,11 +125,11 @@ Public Class ClassHelper ''' Dateiname ohne Pfadangabe ''' Ersatzzeichen für alle unzulässigen Zeichen ''' im Dateinamen - Public Shared Function CleanFilename(ByVal sFilename As String, _ + Public Shared Function CleanFilename(ByVal sFilename As String, Optional ByVal REPLACEChar As String = "") As String ' alle nicht zulässigen Zeichen ersetzen - Return System.Text.RegularExpressions.Regex.Replace( _ + Return System.Text.RegularExpressions.Regex.Replace( sFilename, "[?*^""<>|]", REPLACEChar) End Function Public Shared Sub File_open(RESULT_DOC_PATH As Object, DocID As String)