[gelöst] SQLite - Ergebniswerte entsprechen nicht den Spalten, keine Sortierung

    • 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.

  • Das Problem liegt beim _GUICtrlListView_SetColumnOrder.

    Entferne ich die beiden Aufrufe in Zeile 71, 75, 101, 103, 105 und 107 und ändere deine #region - DEGUG Spaltenreihenfolge folgendermaßen:

    AutoIt
    #region - DEGUG Spaltenreihenfolge
        _SQLite_FetchNames($hQuery, $aColumns)
        Local $sCol = StringFormat('%s|%s|%s|%s', $aColumns[0], $aColumns[1], $aColumns[2], $aColumns[3])
    
        GUICtrlSetData($hListview, $sCol)
    #endregion - DEGUG Spaltenreihenfolge

    dann klappt es bei mir.

    Übrigens: Wenn du User-Eingaben in SQl-Queries verwendest wie z. B. deinem $sSearch dann solltest du hierfür prinzipiell _SQLite_Escape verwenden damit keine SQL-Injections zu Problemen führen.

    Einmal editiert, zuletzt von AspirinJunkie (2. September 2017 um 18:22)

  • Das Problem liegt nicht beim SQL. Ich hab mal Testweise die Zeileninhalte ausgegeben und dabei war die Reihenfolge richtig.

    Dann hab ich beim ListView geschaut und dort getestet.

    Das Problem liegt bei _GUICtrlListView_SetColumnOrder. Das ändert die Reihenfolge der Spalten. Auch der Zeilen, die später hinzugefügt werden.

    Also entweder bei der Query nicht die Spaltenreihenfolge ändern, oder die Spaltennamen manuell ändern :)

    PS: Sieh dir mal den Befehl _SQLite_GetTable2d an, der spart dir bei SQL einige Zeilen ein ;)

    Was performence angeht aber vermutlich nicht ganz so schnell.

    MfG Kanashius

    • Offizieller Beitrag

    Ah, OK - Danke euch. Dann muss ich das etwas umbauen.

    Ich hatte auch zuerst mit _SQLite_GetTable2d gearbeitet. Aber die Zeit, die ich dabei spare, verliere ich anschliessend, weil ich durch das Array iterieren muss um die ListviewItem zu erstellen. Beim Fetchen mache ich das sofort.

    _SQLite_Escape zu verwenden ist ein guter Hinweis. Denke ich meist nicht dran, weil ich SQLite fast nur für mich nutze.

    • Offizieller Beitrag

    Nachtrag:

    Ich habe jetzt im Vorfeld für jede Abfragevariante ein eigenes Listview erstellt, das entsprechend eingeblendet wird. Nun läuft alles geschmeidig. :D

    So schaut's jetzt aus:

  • Warum nicht das _GUICtrlListView_SetColumnOrder durch ein GUICtrlSetData austauschen?
    Dann kannst du die Spaltenreihenfolge neu festlegen und hast immer noch das selbe ListView. Sollte meiner Meinung nach deutlich sauberer sein.

    • Offizieller Beitrag

    Dann kannst du die Spaltenreihenfolge neu festlegen und hast immer noch das selbe ListView.

    Ich habe diese Variante mal durchgespielt.

    Dann erfolgt die Spaltenumbenennung erst beim Befüllen mit Daten (finde ich dann nicht gelungen, die Feldnamen sind auch noch in die gewünschte Spaltenbezeichnung umzuwandeln), die Spaltenbreite muss auch noch angepasst werden. Insofern bevorzuge ich doch die Variante mit vordefinierten Listview.

  • Nur wenn du es so machst wie in meinem Beispiel oben.
    Wenn du stattdessen in deinem alten Aufbau die _GUICtrlListView_SetColumnOrder durch die GuiCtrlSetData ersetzt sollte sich die Spaltenreihenfolge in dem Moment ändern wenn du die umschaltest - und nicht erst sobald Suchergebnisse vorliegen.