;==================================================================================================
; Function Name:   _Array2DSortFree($ARRAY, $sCOL_ASC [, $NUM=False])
; Description::    Sortierung von 1D/2D-Arrays nach freier Wahl
;                    1D       Sortierung Auf- oder Absteigend
;                    2D       mehrstufige Sortierung, Reihenfolge und Sortier-
;                             richtung (je Spalte) frei wählbar
;                             auch einzelne Spalte sortierbar
; Parameter(s):    $ARRAY     Das zu sortierende Array
;                  $sCOL_ASC  String mit Sortierangaben "Spalte|Richtung [, Spalte|Richtung]"
;                             zu sortierende Spalte (0-Index)|Richtung (0-Asc, 1-Desc)
;                             z.B. Spalte 2 aufsteigend und in 2 absteigend Spalte 1
;                             _Array2DSortFree($ar2Sort, '1|0,0|1')
;      optional    $NUM       "False" sortiert alphabetisch (Standard), "True" sortiert numerisch
; Return Value(s): Erfolg    0
;                  Fehler    1  Set Error  1 $ARRAY ist kein Array
;                                          2 1D-Array, aber Spaltenangabe für 2D
;                                          3 SQL-Fehler
;                                          4 Angaben für Spalte|Sortierrichtung fehlerhaft
; Requirements:    #include <SQLite.au3>
;                  #include <SQLite.dll.au3>
;                  #include <Array.au3>
;                  Note: Es ist dringend erforderlich, die SQLite-Includes am Beginn des aufrufenden
;                        Skriptes auszuführen. Anderenfalls schlägt die Initialisierung der SQLite.dll
;                        durch _SQLite_Startup() fehl.
; Version:         3.3.0.0
; Author(s):       BugFix (bugfix@autoit.de) | Parameter 4 hinzugefügt durch Tweaky
;==================================================================================================
#include-once
#include <SQLite.au3>
Func _Array2DSortFree(ByRef $ARRAY, $sCOL_ASC, $NUM = False, $iZeile_beginn = 0)
	If Not IsArray($ARRAY) Then Return SetError(1, 0, 1)

	;selbst hinzugefügt
	If $iZeile_beginn = 1 Then
		Local $sZeile0 = _ArrayToString($ARRAY, "|", 0, 1) ;nur Zeile 0 geht nicht, da sonst das komplette Array zurückgegeben wird >>> Zeile 0 und 1 wird später gesplittet
		_ArrayDelete($ARRAY, 0)
	EndIf

	Local $tableStr = "CREATE TABLE [tblTEST] ("
	Local $insertStr = '', $insertBase = "INSERT INTO tblTEST VALUES ("
	Local $sortOrder = '', $sortStr = "SELECT * FROM tblTEST ORDER BY "
	Local $aResult, $asc, $iRows, $iCol
	$sCOL_ASC = StringStripWS($sCOL_ASC, 8)
	Local $ub2nd = UBound($ARRAY, 2)
	If @error = 2 Then
		If (StringLen($sCOL_ASC) > 3) Or (StringLeft($sCOL_ASC, 1) <> '0') Then Return SetError(2, 0, 1)
		If StringRight($sCOL_ASC, 1) = 0 Then
			_ArraySort($ARRAY)
		Else
			_ArraySort($ARRAY, 1)
		EndIf
		Return 0
	Else
		Local $aOut[UBound($ARRAY)][$ub2nd]
	EndIf
	_SQLite_Startup()
	If @error > 0 Then Return SetError(3, 0, 1)
	Local $hSQL = _SQLite_Open()
	If @error > 0 Then
		_SQLite_Shutdown()
		Return SetError(3, 0, 1)
	EndIf
	For $i = 0 To UBound($ARRAY, 2) - 1
		$tableStr &= "'field" & $i & "',"
	Next
	$tableStr = StringTrimRight($tableStr, 1) & ");"
	For $i = 0 To UBound($ARRAY) - 1
		$insertStr &= $insertBase
		For $k = 0 To UBound($ARRAY, 2) - 1
			$insertStr &= "'" & $ARRAY[$i][$k] & "',"
		Next
		$insertStr = StringTrimRight($insertStr, 1) & ");"
	Next
	If _SQLite_Exec($hSQL, $tableStr & $insertStr) <> $SQLITE_OK Then
		_SQLite_Shutdown()
		Return SetError(3, 0, 1)
	EndIf
	If StringInStr($sCOL_ASC, ',') Then
		Local $aOrder = StringSplit($sCOL_ASC, ',')
		For $i = 1 To UBound($aOrder) - 1
			If StringInStr($sCOL_ASC, '|') Then
				Local $var = StringSplit($aOrder[$i], '|')
				$asc = ' ASC'
				If $var[2] = 1 Then $asc = ' DESC'
				If $NUM Then
					$sortOrder &= 'ABS(field' & $var[1] & ')' & $asc & ','
				Else
					$sortOrder &= 'field' & $var[1] & $asc & ','
				EndIf
			Else
				_SQLite_Shutdown()
				Return SetError(4, 0, 1)
			EndIf
		Next
		$sortOrder = StringTrimRight($sortOrder, 1) & ';'
	Else
		If (StringLen($sCOL_ASC) > 2) And (StringInStr($sCOL_ASC, '|')) Then
			Local $var = StringSplit($sCOL_ASC, '|')
			$asc = ' ASC'
			If $var[2] = 1 Then $asc = ' DESC'
			If $NUM Then
				$sortOrder &= 'ABS(field' & $var[1] & ')' & $asc
			Else
				$sortOrder &= 'field' & $var[1] & $asc
			EndIf
		Else
			_SQLite_Shutdown()
			Return SetError(4, 0, 1)
		EndIf
	EndIf
	If _SQLite_GetTable2d($hSQL, $sortStr & $sortOrder, $aResult, $iRows, $iCol) <> $SQLITE_OK Then
		_SQLite_Shutdown()
		Return SetError(3, 0, 1)
	EndIf
	For $i = 1 To UBound($aResult) - 1
		For $j = 0 To UBound($ARRAY, 2) - 1
			$ARRAY[$i - 1][$j] = $aResult[$i][$j]
		Next
	Next
	_SQLite_Exec($hSQL, "DROP TABLE tblTEST;")
	_SQLite_Close()
	_SQLite_Shutdown()

	;selbst hinzugefügt
	If $iZeile_beginn = 1 Then
		Local $aSplit_func = StringSplit($sZeile0, @CRLF, 1)
		_ArrayInsert($ARRAY, 0, $aSplit_func[1])
	EndIf

	Return 0
EndFunc   ;==>_Array2DSortFree
