- Offizieller Beitrag
Ich habe eine kleine GUI zum Filtern von PLZ nach PLZ oder Ort oder Bundesland oder Landkreis erstellt.
Bei PLZ und ORT ist die Sortierung: PLZ/Ort-Ort/PLZ-Bundesland-Landkreis.
Über die Radio-Ctrl wird die Filterung und bei Bundesland und Landkreis zusätzlich die Sortierung gewählt. Anhand dieser Auswahl wird in Verbindung mit der Usereingabe eine SQL-Abfrage durchgeführt und das Ergebnis in das Listview geladen.
Bei der PLZ-Filterung passt auch alles. Wähle ich aber eine andere Variante, ist zwar die Spalten-Namen-Reihenfolge des Ergebnisarrays identisch mit der Abfrage, aber der Zeileninhalt ist falsch zugeordnet und auch die Sortierung findet nicht statt.
Ich habe mich jetzt 1 Tag damit rumgequält ohne einen Fehler zu finden. Habt ihr eine Ahnung?
Btw.: Führe ich die SQL-Statements im SQLiteDatabaseBrowser aus, erhalte ich die Ergebnisse, wie gewünscht.
Die Datenbank SQLite3.dll und das Skript im Anhang.
;-- TIME_STAMP 2017-09-02 16:24:24
#include <SQLite.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <EditConstants.au3>
#include <GuiListView.au3>
Opt('GUIOnEventMode', 1)
_SQLite_Startup()
Global $DB = @ScriptDir & '\plz_brd.db'
Global $hSQL = _SQLite_Open($DB)
Global $sUserSearchField = 'plz', $sUserValue
Global $hGui = GUICreate('PLZ der BRD', 480, 300)
GUISetOnEvent(-3, '_Exit')
GUIStartGroup()
Global $rPLZ = GUICtrlCreateRadio(' PLZ', 10, 15, 80)
GUICtrlSetState(-1, $GUI_CHECKED)
Global $rORT = GUICtrlCreateRadio(' Ort', 133, 15, 80)
Global $rBULA = GUICtrlCreateRadio(' Bundesland', 256, 15, 80)
Global $rKREIS = GUICtrlCreateRadio(' Landreis', 379, 15, 80)
GUIStartGroup()
Global $lbOrder = GUICtrlCreateLabel('Sortierung nach:', 155, 43)
GUICtrlSetState(-1, $GUI_DISABLE)
Global $rOrderPlz = GUICtrlCreateRadio(' PLZ', 256, 40, 80)
GUICtrlSetState(-1, $GUI_CHECKED)
GUICtrlSetState(-1, $GUI_DISABLE)
Global $rOrderOrt = GUICtrlCreateRadio(' Ort', 379, 40, 80)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlSetOnEvent($rPLZ, '_RadioClick')
GUICtrlSetOnEvent($rORT, '_RadioClick')
GUICtrlSetOnEvent($rBULA, '_RadioClick')
GUICtrlSetOnEvent($rKREIS, '_RadioClick')
GUICtrlSetOnEvent($rOrderPlz, '_SubRadioClick')
GUICtrlSetOnEvent($rOrderOrt, '_SubRadioClick')
GUICtrlCreateLabel('Suchbegriff', 32, 73)
Global $inSearchWord = GUICtrlCreateInput('', 133, 70, 330)
Global $hListview = GuiCtrlCreateListView('PLZ|Ort|Bundesland|Landkreis', 10, 100, 460, 190, -1, BitOR($LVS_EX_DOUBLEBUFFER,$LVS_EX_GRIDLINES))
_GUICtrlListView_SetColumnWidth($hListview, 0, 60)
_GUICtrlListView_SetColumnWidth($hListview, 1, 135)
_GUICtrlListView_SetColumnWidth($hListview, 2, 135)
_GUICtrlListView_SetColumnWidth($hListview, 3, $LVSCW_AUTOSIZE_USEHEADER)
GUISetState()
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
While True
Sleep(50)
WEnd
Func _Exit()
_ExitSQLite()
Exit
EndFunc
Func _RadioClick()
_ClearListview()
Switch @GUI_CtrlId
Case $rPLZ
_EnDisAbleSortOrder($GUI_DISABLE)
$sUserSearchField = 'plz'
_GUICtrlListView_SetColumnOrder($hListview, '0|1|2|3')
Case $rORT
_EnDisAbleSortOrder($GUI_DISABLE)
$sUserSearchField = 'ort'
_GUICtrlListView_SetColumnOrder($hListview, '1|0|2|3')
Case $rKREIS, $rBULA
_EnDisAbleSortOrder($GUI_ENABLE)
$sUserSearchField = @GUI_CtrlId = $rKREIS ? 'kreis' : 'bula'
$sUserSearchField &= (BitAND(GUICtrlRead($rOrderPlz),$GUI_CHECKED) ? '-plz-ort' : '-ort-plz')
If BitAND(GUICtrlRead($rOrderPlz),$GUI_CHECKED) Then
_SetColumnOrder(@GUI_CtrlId, $rOrderPlz)
Else
_SetColumnOrder(@GUI_CtrlId, $rOrderOrt)
EndIf
EndSwitch
EndFunc
Func _SubRadioClick()
_ClearListview()
$sUserSearchField = BitAND(GUICtrlRead($rKREIS),$GUI_CHECKED) ? 'kreis' : 'bula'
$sUserSearchField &= (BitAND(GUICtrlRead($rOrderPlz),$GUI_CHECKED) ? '-plz-ort' : '-ort-plz')
If BitAND(GUICtrlRead($rKREIS),$GUI_CHECKED) Then
_SetColumnOrder($rKREIS, @GUI_CtrlId)
Else
_SetColumnOrder($rBULA, @GUI_CtrlId)
EndIf
EndFunc
Func _SetColumnOrder($rMain, $rSub)
If $rMain = $rKREIS And BitAND(GUICtrlRead($rOrderPlz),$GUI_CHECKED) Then ; 'kreis-plz-ort-bula'
_GUICtrlListView_SetColumnOrder($hListview, '3|0|1|2')
ElseIf $rMain = $rKREIS And BitAND(GUICtrlRead($rOrderOrt),$GUI_CHECKED) Then ; 'kreis-ort-plz-bula'
_GUICtrlListView_SetColumnOrder($hListview, '3|1|0|2')
ElseIf $rMain = $rBULA And BitAND(GUICtrlRead($rOrderPlz),$GUI_CHECKED) Then ; 'bula-plz-ort-kreis'
_GUICtrlListView_SetColumnOrder($hListview, '2|0|1|3')
ElseIf $rMain = $rBULA And BitAND(GUICtrlRead($rOrderOrt),$GUI_CHECKED) Then ; 'bula-ort-plz-kreis'
_GUICtrlListView_SetColumnOrder($hListview, '2|1|0|3')
EndIf
EndFunc
Func _EnDisAbleSortOrder($iState)
GUICtrlSetState($lbOrder,$iState)
GUICtrlSetState($rOrderOrt,$iState)
GUICtrlSetState($rOrderPlz,$iState)
GUICtrlSetData($inSearchWord, '')
EndFunc
Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
Local $iIDFrom, $iCode, $hWndEdit, $sRead, $index
$hWndEdit = GUICtrlGetHandle($inSearchWord)
$iIDFrom = BitAND($iwParam, 0xFFFF) ; Low Word
$iCode = BitShift($iwParam, 16) ; Hi Word
Switch $ilParam
Case $hWndEdit
Switch $iCode
Case $EN_CHANGE
_ClearListview()
$sUserValue = GUICtrlRead($iIDFrom)
If ($sUserValue = '') Or _
($sUserSearchField = 'ort' And StringLen($sUserValue) < 3) Then Return $GUI_RUNDEFMSG
_PLZSearch_CreateLVItem($sUserValue, $sUserSearchField)
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND
Func _ClearListview()
_GUICtrlListView_DeleteAllItems($hListview)
EndFunc
Func _FillListview(ByRef $aItem)
Local $iUbound = UBound($aItem)
If $iUbound = 1 Then Return
_GUICtrlListView_BeginUpdate($hListview)
For $i = 1 To $iUbound -1
GUICtrlCreateListViewItem(StringFormat('%s|%s|%s|%s', $aItem[$i][0], $aItem[$i][1], $aItem[$i][2], $aItem[$i][3]), $hListview)
Next
_GUICtrlListView_EndUpdate($hListview)
EndFunc
Func _PLZSearch_CreateLVItem($sSearch, $sFieldOrder)
Local $sQuery = ''
Switch $sFieldOrder
Case 'plz'
$sQuery = "SELECT plz,ort,bula,kreis FROM plz WHERE plz LIKE '" & $sSearch & "%' ORDER BY plz,ort,bula,kreis;"
Case 'ort'
$sQuery = "SELECT ort,plz,bula,kreis FROM plz WHERE ort LIKE '" & $sSearch & "%' ORDER BY ort,plz,bula,kreis;"
Case 'bula-plz-ort'
$sQuery = "SELECT bula,plz,ort,kreis FROM plz WHERE bula LIKE '" & $sSearch & "%' ORDER BY bula,plz,ort,kreis;"
Case 'bula-ort-plz'
$sQuery = "SELECT bula,ort,plz,kreis FROM plz WHERE bula LIKE '" & $sSearch & "%' ORDER BY bula,ort,plz,kreis;"
Case 'kreis-plz-ort'
$sQuery = "SELECT kreis,plz,ort,bula FROM plz WHERE kreis LIKE '" & $sSearch & "%' ORDER BY kreis,plz,ort,bula;"
Case 'kreis-ort-plz'
$sQuery = "SELECT kreis,ort,plz,bula FROM plz WHERE kreis LIKE '" & $sSearch & "%' ORDER BY kreis,ort,plz,bula;"
EndSwitch
_GUICtrlListView_BeginUpdate($hListview)
Local $hQuery, $aRow, $aColumns
_SQLite_Query($hSQL, $sQuery, $hQuery)
#region - DEGUG Spaltenreihenfolge
_SQLite_FetchNames($hQuery, $aColumns)
Local $sCol = StringFormat('%s-%s-%s-%s', $aColumns[0], $aColumns[1], $aColumns[2], $aColumns[3])
ConsoleWrite("@@ DEBUG Spaltenreihenfolge Ergebnisarray: " & @TAB & $sCol & @LF)
;~ GUICtrlCreateListViewItem(StringFormat('%s|%s|%s|%s', $aColumns[0], $aColumns[1], $aColumns[2], $aColumns[3]), $hListview)
#endregion - DEGUG Spaltenreihenfolge
While _SQLite_FetchData($hQuery, $aRow, False, False) = $SQLITE_OK
GUICtrlCreateListViewItem(StringFormat('%s|%s|%s|%s', $aRow[0], $aRow[1], $aRow[2], $aRow[3]), $hListview)
WEnd
_SQLite_QueryFinalize($hQuery)
_GUICtrlListView_EndUpdate($hListview)
EndFunc
Func _ExitSQLite()
_SQLite_Close()
_SQLite_Shutdown()
EndFunc
Alles anzeigen