#include-once
#include <Array.au3>

Func _arraySort2D_MC(ByRef $avArray, $ColOrder, $iStart = 0, $iEnd = 0, $iDesc = 0, $bDelDuplictes = False)
	;Parameterübergabe
	;$avArray			zu sorterendes Array
	;$ColdOrder			String mit den Sortieranweisungen, getrennt mit "|" für jede Spalte
	;					zulässige Angaben:
	;										nur Spaltenindex = normale Sortierung
	;										Spaltenindex%N = numerische Sortierung
	;										Spaltenindex%D = Sortierung nach Datum JJJJ/MM/TT
	;										Spaltenindex%G = Sortierung nach Geburtstag MM/TT/JJJJ
	;					z.B.: "1|2%N|3%D|0" die Reihenfolge für die Sortierung ist 1.,2., 3. 0. (0 basierend)
	;					die 1. Spalte wird Standard von _ArraySort verwendet
	;					die 2. Spalte (%N) wird bei der Sortierun numerisch behnadelt
	;					die 3. Spalte (%D) wird als Datum behandelt
	;
	;					es müssen alle Spalten des Arrays in den Sortieranweisungen vorkommen
	;$iStart			Zeile bei der die Sortierung beginnt (OPTIONAL)
	;$iEnd				Zeile bei der die Sortierung endet (OPTIONAL)
	;$iDesc				Absteigend 1 = JA 0 = NEIN (OPTIONAL)
	;$bDelDuplictes		nur einmalige Zeilen zulassen	True = Jede Zeile ist einmalig
	;													False = Es werden alle Zeilen ausgegeben
	;					=====================================================================
	;Rückgabe:			0 Fehler (nicht alle Spalten in $ColOrder definert
	;					1 Erfolg
	;Autor:				AutoBert 2010 erweeitert 2012
	;==============================================================================================================
	Local $iDims = UBound($avArray, 0)
	If @error Or $iDims <> 2 Then
		MsgBox(16, "Fehler:", "kein 2D-Array")
		Return 0
	EndIf
	If $iEnd = 0 Then $iEnd = UBound($avArray) - 1
	If $iEnd > UBound($avArray) - 1 Then $iEnd = UBound($avArray) - 1
	$aCols = StringSplit($ColOrder, "|")
	;consolewrite($aCols[0] & " " & UBound($array, 2) & @CRLF)
	If $aCols[0] <> UBound($avArray, 2) Then
		MsgBox(16, "Fehler:", "unterschiedliche Spaltenanzahl!")
		Return 0
	EndIf
	Local Const $sLeer = "                                                                                                                                               "
	Local $aColformat = $aCols
	Local $sRow
	For $i = 1 To $aColformat[0]
		;$aColformat[$i] = StringRight($aColformat[$i], 1)
		$aCols[$i] = StringReplace($aCols[$i], "N", "")
		$aCols[$i] = StringReplace($aCols[$i], "D", "")
	Next
	_ArrayDelete($aColformat, 0)
	_ArrayDelete($aCols, 0)
	Local $iCols = UBound($aColformat)
	For $i = $iStart To $iEnd
		$sRow = ""
		For $j = 0 To $iCols - 1
			$iCol = $aCols[$j]
			Switch StringUpper(StringRight($aColformat[$j], 1))
				Case "N" ;numerisch
					$aNum = StringSplit($avArray[$i][$iCol], ",")
					If IsArray($aNum) Then
						If $aNum[0] = 1 Then _ArrayAdd($aNum, " ")
						$sRow &= StringRight($sLeer & $aNum[1] & "," & StringLeft($aNum[2]&$sLeer, 30), 99)
					Else
						$sRow &= StringRight($sLeer & $aNum[1], 99)
					EndIf
				Case "D" ;Datum JJJJ/MM/TT
					;consolewrite("D: " & $aColformat[$j] & " " &  $avArray[$i][$iCols])
					$aDate = StringSplit($avArray[$i][$iCol], ".")
					If IsArray($aDate) Then $sRow &= $aDate[3] & "." & StringRight("0" & $aDate[2], 2) & "." & StringRight("0" & $aDate[1], 2)
				Case "G" ;Geburtstags-Datum MM/TT/JJJJ
					;consolewrite("D: " & $aColformat[$j] & " " &  $avArray[$i][$iCols])
					$aDate = StringSplit($avArray[$i][$iCol], ".")
					If IsArray($aDate) Then $sRow &= StringRight("0" & $aDate[2], 2) & "." & StringRight("0" & $aDate[1], 2) & "." & $aDate[3]
				Case Else
					$sRow &= $avArray[$i][$iCol]
			EndSwitch
			If $j <> $iCols - 1 Then $sRow &= "|"
		Next
		$avArray[$i][0] = $sRow
		;consolewrite($sRow & @CRLF)
	Next
	_ArraySort($avArray, $iDesc, $iStart, $iEnd)
	If $bDelDuplictes Then
		For $i = $iEnd - 1 To $iStart Step -1
			If $avArray[$i][0] = $avArray[$i + 1][0] Then
				_ArrayDelete($avArray, $i + 1)
				$iEnd -= 1
			EndIf
		Next
	EndIf
	;_ArrayDisplay($avArray)
	;_ArrayDisplay($aColformat, "FormatStrings")
	;_ArrayDisplay($aCols, "Cols")
	;consolewrite($iCols & @CRLF)
	For $i = $iStart To $iEnd
		;consolewrite($avArray[$i][0] & @CRLF)
		$aSplit = StringSplit($avArray[$i][0], "|", 2)
		For $j = 0 To $iCols - 1
			$iCol = $aCols[$j]
			Switch StringRight($aColformat[$j], 1)
				;				Case "X"

				;#cs
				Case "N" ;numerisch
					$avArray[$i][$iCol] = StringReplace($aSplit[$j], " ", "")
					if StringRight($avArray[$i][$iCol],1)="," Then $avArray[$i][$iCol] = StringTrimRight($avArray[$i][$iCol], 1)
					;consolewrite(" N: " & $avArray[$i][$iCol])
				Case "D" ;Datum JJJJ/MM/TT
					$aDate = StringSplit($aSplit[$j], ".")
					$avArray[$i][$iCol] = StringReplace($aDate[3] & "." & $aDate[2] & "." & $aDate[1], "_", "")
					;consolewrite(" D: " & $avArray[$i][$iCol])
				Case "G" ;Geburtstags-Datum MM/TT/JJJJ
					$aDate = StringSplit($aSplit[$j], ".")
					$avArray[$i][$iCol] = StringReplace($aDate[2] & "." & $aDate[1] & "." & $aDate[3], "_", "")
					;consolewrite(" D: " & $avArray[$i][$iCol])
					;#ce
				Case Else
					$avArray[$i][$iCol] = $aSplit[$j]
					;consolewrite(" : " & $avArray[$i][$iCol])
			EndSwitch
		Next
		;consolewrite(@CRLF)
	Next
	Return 1
	;_ArrayDisplay($avArray)
EndFunc   ;==>_arraySort2D_MC
