Schnellere Filterung einer ListView + Zuordung

  • Hallo AutoIt-Freunde,

    Folgendes Problem.

    das script liest aus einer excel-datei daten in ein array mit ca. 50 000 zeilen a 13 spalten
    In einer GUI gibt es

    - 3 checkboxen
    - 3 inputs
    - 1 combo

    eine listview in der zunächst alle daten der excel datei geschrieben werden.
    man kann durch anklicken der einzellnen checkboxen und/oder eingabe in inputs und/oder auswählen in einer combo die liste filtern.
    leider dauert meine lösung zu lange da so viele daten durchkemmt werden müssen.
    gibt es hierzu eine schnellere / elegantere lösung?

    zudem habe ich das problem, dass ich die listviewItems gerne dingfest machen möchte.
    also bsw $ListViewItem[12] = GUICtrlCreateListViewItem(...)

    ich möchte nach einer ausfilterung immer noch den bezug von der neuen listview zum array was den kompletten inhalt der excel-datein beinhaltet behalen.

    ich hoffe ihr versteht mich.
    wenn nicht bitte nachfragen.
    hier mein beispiel wie es aktuell ist:

    Spoiler anzeigen
    [autoit]


    ; einlesen der excel-datei
    $oExcel = _ExcelBookOpen(@ScriptDir & "\test.xls", 0, True)
    $Array = _Excel_RangeRead($oExcel, Default, Default, Default, 1)
    _ExcelBookClose($oExcel)
    ;.....
    ; schreibe daten in listview
    For $i = 1 To UBound($Array) -1
    GUICtrlCreateListViewItem($Array[$i][0]&"|"&$Array[$i][1]&"|"&$Array[$i][2]&"|"&$Array[$i][3]&"|"&$Array[$i][4]&"|"&$Array[$i][5]&"|"&$Array[$i][6], $ListView)
    Next
    ;..... wenn eines dieser kritierien zutrifft dann..
    If $filter_1 <> GUICtrlRead($checkbox1) Or $filter_2 <> GUICtrlRead($checkbox2) Or $filter_3 <> GUICtrlRead($checkbox3) Or GUICtrlRead($input1) <> $filter_4 Or GUICtrlRead($input2) <> $filter5 Or GUICtrlRead($input3) <> $filter6 Or GUICtrlRead($combo1) <> $filter7 Then
    _GUICtrlListView_BeginUpdate($ListView)
    $filter1 = GUICtrlRead($checkbox1)
    $filter2 = GUICtrlRead($checkbox2)
    $filter3 = GUICtrlRead($checkbox3)
    $filter4 = GUICtrlRead($input1)
    $filter5 = GUICtrlRead($input2)
    $filter6 = GUICtrlRead($input3)
    $filter7 = GUICtrlRead($combo1)

    [/autoit] [autoit][/autoit] [autoit]

    If GUICtrlRead($checkbox1) = $GUI_CHECKED Then
    $checkbox1_data = "suchstring checkbox 1"
    Else
    $checkbox1_data = ""
    EndIf
    If GUICtrlRead($checkbox2) = $GUI_CHECKED Then
    $checkbox2_data = "suchstring checkbox 2"
    Else
    $checkbox2_data = ""
    EndIf
    If GUICtrlRead($checkbox3) = $GUI_CHECKED Then
    $checkbox3_data = "suchstring checkbox 3"
    Else
    $checkbox3_data = ""
    EndIf
    _GUICtrlListView_DeleteAllItems($ListView)

    [/autoit] [autoit][/autoit] [autoit]

    ; ..schreibe ListeView mit selektierten Filtern
    For $i = 1 To UBound($Array) - 1
    If StringInStr($Array[$i][0], $checkbox1_data, 2) Or StringInStr($Array[$i][1], $checkbox2_data, 2) Or StringInStr($Array[$i][2], $checkbox3_data, 2) And (StringInStr($Array[$i][3], $filter4, 2) = 0 Or $filter4 = "") And (StringInStr($Array[$i][4], $filter5, 2) = 0 Or $filter5 = "") And (StringInStr($Array[$i][5], $filter6, 2) = 0 Or $filter6 = "") And (StringInStr($Array[$i][6], $filter7, 2) = 0 Or $filter7 = "") Then
    GUICtrlCreateListViewItem($Array[$i][0]&"|"&$Array[$i][1]&"|"&$Array[$i][2]&"|"&$Array[$i][3]&"|"&$Array[$i][4]&"|"&$Array[$i][5]&"|"&$Array[$i][6], $ListView)
    EndIf
    Next
    _GUICtrlListView_EndUpdate($ListView)
    EndIf

    [/autoit]


    MfG Inferior

    2 Mal editiert, zuletzt von Inferior (20. März 2013 um 11:22)

  • Also ich versuch die Frage nochmal anders zu stellen:

    Gibt es eine schnelle "Live-Search"-Suche, bei der man bei einer Eingabe (egal ob Inputs, ect.) ein Array ausfiltern kann, die dem eingegebenen Suchmuster entsprechen?

    Die Ergebnisse sollen in einer ListView angezeigt werden.

    • Offizieller Beitrag

    Lies aus der Exceldatei in eine StringVariable in der Form:

    Code
    Zeile1-Spalte1 & "|" & Zeile1-Spalte2 & "|" & ....Zeile1-letzteSpalte & @CRLF
    Zeile2-Spalte1 & "|" & Zeile2-Spalte2 & "|" & ....Zeile2-letzteSpalte & @CRLF
    .....
    .....
    Zeile_n-Spalte1 & "|" & Zeile_n-Spalte2 & "|" & ....Zeile_n-letzteSpalte & @CRLF

    Dann kannst du den Filter mit einem RegEx-Pattern auf diese Variable anwenden und nur die erforderlichen Ereignisse selektieren und dann im Listview anzeigen.
    Das kannst du ja beim Start gleich für alle Filtervarianten durchführen und dann nur das entsprechende Ergebnisarray des gewünschten Filters zur Anzeige bringen. Geht dann fix beim Umschalten. Um es noch mehr zu beschleunigen kannst du ja auch für jeden Filter ein eignes Listview erstellen und jedes sofort beim Start befüllen, und dann nur das gewünschte zur Anzeige bringen.

  • Hallo BugFix,

    intgeressante Lösungsmöglichkeit.
    Hättest du die Muse mir ein kleines Script dazu zu basteln?
    Schon mal vor ab vielen Dank für deine Mühe.

    MfG Inferior

    Einmal editiert, zuletzt von Inferior (20. März 2013 um 11:20)

  • Habe sowas auch, allerdings nicht ganz soviele Daten. Ich habe das unter anderem dadurch beschleunigen können, dass ich grundsätzlich alle listview UDF Funktionen rausgeworfen habe, da diese massivst langsamer waren. Bei dir sehe ich z.B. noch

    [autoit]

    _GUICtrlListView_DeleteAllItems($ListView)

    [/autoit]

    Ich lösche stattdessen das ganze Listview Control, baue mir ein neues gefiltertes Array und erzeuge das Listview dann komplett neu. Um die Stammdaten nicht neu einlesen zu müssen verbleibt grundsätzlich ein ungefiltertes Array im Speicher und die Listviews werden je nach Fall direkt aus dem ungefilterten oder eben aus dem ggf. aktualisierten gefilterten Array erstellt. Ich verwende deshalb ein zweites gefiltertes Array, damit das Zuschalten weiterer Filter nicht erfordert, dass man das ungefilterte Array durchlaufen muss, sondern das neue gefilterte Array auch aus einem bereits vorgefilterten Array erstellt werden kann. Du gehst soweit ich das sehe immer das gesamte ungefilterte Array, also alle 50000 Zeilen durch.

    Wichtig sind auch Optimierungen in der Filterschleife, die das gefilterte Array aktualisiert/neu aufbaut. Hier lohnt es sich z.B. wenn man die Filter nach logischer (oder wahrscheinlichster Ausschluss-) Reihenfolge prüft und den Schleifendurchlauf mit continueloop überspringt, wenn bereits eines der x-Filterkriterien ein Ausschlusskriterium ist. Du prüfst derzeit alle Kriterien auf einmal wenn ich das recht sehe. (ist auch unübersichtlich alle Filter in einer einzigen if-Bedingung zu haben...)

    Was du mit LiveSearch meinst müsstest du nochmal genauer beschreiben, ich vermute du möchtest bereits bei der Eingabe eines Suchbegegriffs mit dem Filtern anfangen, was dann wohl mächtig auf die Performance gehen wird. Sowas habe ich mal für ein Script mit mehreren tausend Checkboxen realisiert. (in Wahrheit gibts es nur 120 Checkboxen deren Text bei jeder Ergenisseite aktualisiert wird)

    https://www.youtube.com/watch?v=t7Xbl0zu8GY

    Um die Performance zu steigern solltest du da mit timern arbeiten, also eine kleine Latenz von einigen ms einbauen, bevor erneut geprüft wird ob der Anwender Daten eingegeben hat. So spart man sich unnötige Filterungen und kann gleich mit längeren Suchbegriffen filtern, bzw. nicht sofort für jeden getippten Buchstaben.

  • Hallo misterspeed,

    sehr interessanter Lösungsweg.


    Habe nun lange daran herumgebastelt jedoch mein script nur verschlimmert als verbessert.
    Ich wäre dir sehr dankbar für die ein oder andere Gedankenbrücke.
    Bekomme nur durch sehr viel Umstand die Verbindungen zwischen ungefilterten array zu gefilterten her.

    Wäre dir sehr dankbar, wenn du mir ein Beispiel coden könntest.

    MfG Inferior

  • Hier mal ein Beispiel. Allerdings ist das so natürlich noch fehlerhaft, es macht aber auch keinen Sinn da weiter dran zu basteln solange du keine Angaben dazu machst wie die Filter voneinander abhängig und kombinierbar sind und vorallem wären Beispieldaten notwendig um das ganze zu optimieren. Grundsätzlich funktioniert das Script so wie es ist nur wenn man zuerst das Dropdown nutzt und danach dieses vorgefilterte Array über die Inputfelder durchsucht. In meinem eigentlichen Script verwende ich ausschließlich voneinander abhängige Dropdowns zum Filtern, da ist es sehr viel leichter das so wie unten gezeigt zu realisieren. Bei freien Eingabefeldern dürfte es kaum möglich sein effektiv mit vorgefilterten Arrays weiterzuarbeiten. Man müsste auf jedenfall noch einiges ändern, damit die Suche korrekte Ergebnisse liefert, das habe ich z.B. durch den Wechsel aufs ungefilterte Array angedeutet, wenn etwas im Dropdown geändert wird. Besonders schnell ist es bei 50k Zeilen allerdings auch nicht, den Geschwindigkeitsvorteil bemerkt man erst wenn man das ganze durch das Dropdown massivst dezimiert hat. Nunja vielleicht hilfts dir trotzdem und vielleicht ist es ja schneller als das was du derzeit verwendest. Ich habe gottseidank nur an die 3k Zeilen und 8 Spalten, da ist die Performance noch ausreichend.

    Anmerkung:

    Die csv-datei muss so aufgebaut sein:

    Code
    überschrift1,....,überschrift6
    datenspalte1zeile1,.....,datenspalte6zeile1
    ...

    Alternativ wird ein 2D Array mit den Test Daten benötigt.

    Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <ComboConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ListViewConstants.au3>
    #include <WindowsConstants.au3>
    #include <file.au3>
    #include <array.au3>
    #include <GuiListView.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $aUnfilteredData[1][6]
    Global $aFilteredData[1][6]
    Global $fileData = @ScriptDir & "\exampleData.txt"
    readCSVToArray($fileData,$aUnfilteredData)

    [/autoit] [autoit][/autoit] [autoit]

    Global $curFilter1 = ""
    Global $curFilter2 = ""
    Global $curFilter3 = ""
    Global $curFilter4 = "alle"
    Global $found = "?"
    ;_ArrayDisplay($aUnfilteredData)

    [/autoit] [autoit][/autoit] [autoit]

    Global $gMain = GUICreate("FastListViewFilter", 1034, 707, 192, 124)
    Global $lwData = GUICtrlCreateListView("||||||", 32, 176, 969, 505)
    Global $chkFilter1 = GUICtrlCreateCheckbox("Filter1", 32, 51, 97, 17)
    Global $chkFilter2 = GUICtrlCreateCheckbox("Filter2", 32, 90, 97, 17)
    Global $chkFilter3 = GUICtrlCreateCheckbox("Filter3", 32, 128, 97, 17)
    Global $inpFilter1 = GUICtrlCreateInput("", 168, 47, 129, 21)
    Global $inpFilter2 = GUICtrlCreateInput("", 168, 86, 129, 21)
    Global $inpFilter3 = GUICtrlCreateInput("", 168, 124, 129, 21)
    Global $lblFound = GUICtrlCreateLabel($found,496,95,80,20)
    Global $btnSearch = GUICtrlCreateButton("suche",496,120, 100, 30)
    Global $cbFilter4 = GUICtrlCreateCombo("", 496, 40, 249, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetData($cbFilter4,"alle|rot|grün|blau","alle")
    fillListview($lwData,$aUnfilteredData)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $cbFilter4, $btnSearch
    filterListview($lwData,$aFilteredData)
    EndSwitch
    If UBound($aFilteredData)-1 <> $found Then
    $found = UBound($aFilteredData)-1
    GUICtrlSetData($lblFound,$found)
    EndIf
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func readCSVToArray($file,ByRef $aData)
    Local $aTemp, $aSplit
    _FileReadToArray($file,$aTemp)
    ReDim $aData[$aTemp[0]][6]
    For $i=1 to $aTemp[0]
    $aSplit = StringSplit($aTemp[$i],",")
    For $j=1 to $aSplit[0]
    $aData[$i-1][$j-1]=$aSplit[$j]
    Next
    Next
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func fillListview(ByRef $lwID,ByRef $aData)
    _GUICtrlListView_BeginUpdate($lwID)
    GUICtrlDelete($lwID)
    _GUICtrlListView_EndUpdate($lwID)

    [/autoit] [autoit][/autoit] [autoit]

    $lwID = GUICtrlCreateListView("||||||", 32, 176, 969, 505)

    [/autoit] [autoit][/autoit] [autoit]

    _GUICtrlListView_BeginUpdate($lwID)
    GUICtrlSetData($lwData,$aData[0][0] & "|" & $aData[0][1] & "|" & $aData[0][2] & "|" & $aData[0][3] & "|" & $aData[0][4] & "|" & $aData[0][5])
    For $i=1 to UBound($aData)-1
    GUICtrlCreateListViewItem($aData[$i][0] & "|" & $aData[$i][1] & "|" & $aData[$i][2] & "|" & $aData[$i][3] & "|" & $aData[$i][4] & "|" & $aData[$i][5],$lwID)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    For $i=0 to 5
    _GUICtrlListView_SetColumnWidth($lwID, $i , 150)
    Next
    $aFilteredData = $aData
    _GUICtrlListView_EndUpdate($lwID)

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func filterListview(ByRef $lwID, ByRef $aCurrent)
    Local $aNew[ubound($aCurrent)][UBound($aCurrent,2)]

    [/autoit] [autoit][/autoit] [autoit]

    $filter1 = GUICtrlRead($inpFilter1)
    $filter2 = GUICtrlRead($inpFilter2)
    $filter3 = GUICtrlRead($inpFilter3)
    $filter4 = GUICtrlRead($cbFilter4)
    If $filter4 <> $curFilter4 Then
    $curFilter4 = $filter4
    filterListview($lwID,$aUnfilteredData)
    Return
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $k=1
    For $i=1 to UBound($aCurrent)-1
    if $filter4 <> "alle" Then
    if $aCurrent[$i][4]<> $filter4 Then ContinueLoop
    EndIf
    If $filter1 <> "" Then
    If not StringInStr($aCurrent[$i][1],$filter1) then ContinueLoop
    EndIf
    If $filter2 <> "" Then
    If not StringInStr($aCurrent[$i][2],$filter2) then ContinueLoop
    EndIf
    If $filter3 <> "" Then
    If not StringInStr($aCurrent[$i][3],$filter3) then ContinueLoop
    EndIf
    For $j = 0 to UBound($aCurrent,2)-1
    $aNew[$k][$j] = $aCurrent[$i][$j]
    Next
    $k+=1
    Next
    For $i = 0 to UBound($aCurrent,2)-1
    $aNew[0][$i] = $aCurrent[0][$i]
    Next
    redim $aNew[$k+1][UBound($aCurrent,2)]
    fillListview($lwID,$aNew)
    EndFunc

    [/autoit]

    2 Mal editiert, zuletzt von misterspeed (26. März 2013 um 15:04)

  • Hallo misterspeed,


    vielen Dank für die Mühe die du bisher dir gemacht hast.
    Ich habe dein Script mal versucht ein wenig anzupassen.
    Ebenso habe ich eine testdatei hochgeladen - siehe Anhang.

    Erlich gesagt benötige ich eine suche die schon bei der eingabe ausfiltert.
    Bei deinem script muss man entweder den suchen-button oder die combo betätigen.
    Die Inputs sollen also ohne Checkpox sofort wirken. Checkboxen gibt es in meinem Script auch, jedoch filtern diese speziell etwas aus bei Betätigung.

    Dies ist soweit auch alles realisiert, jedoch viel zu langsam.

    Ich poste nochmal etwas von meinem aktuellen Script

    Lg Inferior

  • Ich bräuchte die Excel UDF einmal bitte, dann könnte ich sofern gewünscht auch mal schauen ob ich eine bessere Lösung finde :P

    Grüße Yaerox

    Grüne Hölle

  • Hier bitte schön.

    Spoiler anzeigen
    [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _Excel_RangeRead
    ; Description ...: Reads the value, formula or displayed text from a cell or range of cells of the specified workbook and worksheet.
    ; Syntax.........: _Excel_RangeRead($oExcel[, $oWorkbook = Default[, $oWorksheet = Default[, $vRange = Default[, $iReturn = 1]]]])
    ; Parameters ....: $oExcel - Excel application object
    ; $oWorkbook - Optional: Excel workbook object. If set to Default the active workbook will be used
    ; $oWorksheet - Optional: Excel worksheet object. If set to Default the active sheet will be used
    ; $vRange - Optional: Either a range object or an A1 range. If set to Default all used cells will be processed
    ; $iReturn - Optional: What to return of the specified cell:
    ; |1 - Value (default)
    ; |2 - Formula
    ; |3 - The displayed text
    ; Return values .: Success - Returns the data from the specified cell(s). A string for a cell, an zero-based array for a range of cells.
    ; Failure - Returns 0 and sets @error:
    ; |1 - $oExcel is not an object
    ; |2 - $oWorkbook is not an object
    ; |3 - $oWorksheet is not an object
    ; |4 - $vRange is invalid
    ; |5 - Parameter $iReturn is invalid. Has to be > 1 and < 3
    ; |6 - Error occurred when reading data. @extended is set to the error code returned when accessing the Value property
    ; Author ........: SEO <locodarwin at yahoo dot com>
    ; Modified.......: litlmike, water
    ; Remarks .......:
    ; Related .......:
    ; Link ..........:
    ; Example .......: Yes
    ; ===============================================================================================================================
    Func _Excel_RangeRead($oExcel, $oWorkbook = Default, $oWorksheet = Default, $vRange = Default, $iReturn = Default)
    If Not IsObj($oExcel) Then Return SetError(1, 0, 0)
    If $oWorkbook = Default Then $oWorkbook = $oExcel.ActiveWorkbook
    If Not IsObj($oWorkbook) Then Return SetError(2, 0, 0)
    If $oWorksheet = Default Then $oWorksheet = $oWorkbook.Activesheet
    If Not IsObj($oWorksheet) Then Return SetError(3, 0, 0)
    If $vRange = Default Then $vRange = $oWorksheet.Usedrange
    If IsString($vRange) Then $vRange = $oExcel.Range($vRange)
    If Not IsObj($vRange) Then Return SetError(4, 0, 0)
    If $iReturn = Default Then $iReturn = 1
    If $iReturn < 1 Or $iReturn > 3 Then Return SetError(5, 0, 0)
    Local $vResult
    If $iReturn = 1 Then
    $vResult = $oExcel.Transpose($vRange.Value)
    ElseIf $iReturn = 2 Then
    $vResult = $oExcel.Transpose($vRange.Formula)
    Else
    $vResult = $oExcel.Transpose($vRange.Text)
    EndIf
    If @error Then Return SetError(6, @error, 0)
    Return $vResult
    EndFunc ;==>_Excel_RangeRead

    [/autoit]


    UPDATE:
    So hier mal mein Beispiel-Script:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <GuiListView.au3>
    #include <ComboConstants.au3>
    #include <EditConstants.au3>
    #include <Excel.au3>
    #include <DateTimeConstants.au3>
    #include <WindowsConstants.au3>
    #include <StaticConstants.au3>
    #include <ButtonConstants.au3>
    #include <INet.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $filter1, $filter2, $filter3, $filter4, $filter5, $filter6, $filter7, $filter8, $filter9, $filter10, $filter11, $filter12

    [/autoit] [autoit][/autoit] [autoit]

    ; einlesen der excel-datei
    $oExcel = _ExcelBookOpen(@ScriptDir & "\Test.xls", 0, True)
    $aSheet = _Excel_RangeRead($oExcel, Default, Default, Default, 1)
    _ExcelBookClose($oExcel, 0, 0)

    [/autoit] [autoit][/autoit] [autoit]

    ; erstelle GUI
    $Main = GUICreate("Test", 660, 480)
    GUICtrlCreateLabel("Input 1:", 7, 10)
    $input1 = GUICtrlCreateInput("", 5, 25, 250, 22)
    GUICtrlCreateLabel("Input 2:", 262, 10)
    $input2 = GUICtrlCreateInput("", 260, 25, 60, 22, $ES_NUMBER)
    GUICtrlCreateLabel("Input 3:", 325, 10)
    $input3 = GUICtrlCreateInput("", 325, 25, 40, 22, $ES_NUMBER)
    GUICtrlCreateLabel("Input 4:", 372, 10)
    $input4 = GUICtrlCreateInput("", 370, 25, 150, 22)
    GUICtrlCreateLabel("Combo 1:", 527, 10)
    $combo1 = GUICtrlCreateCombo("", 525, 25, 130, 22, $CBS_DROPDOWNLIST)
    GUICtrlSetData(-1, "||abc|def|ghi|jkl|mno", "")
    $checkbox1 = GUICtrlCreateCheckbox("Filtern nach XX", 10, 70, 100, 15)
    $checkbox2 = GUICtrlCreateCheckbox("Filtern nach XY", 10, 90, 100, 15)
    $checkbox3 = GUICtrlCreateCheckbox("Filtern nach YX", 120, 70, 100, 15)
    $checkbox4 = GUICtrlCreateCheckbox("Filtern nach YZ", 120, 90, 100, 15)
    $radio1 = GUICtrlCreateRadio("Alle", 250, 60, 65, 15)
    $radio2 = GUICtrlCreateRadio("jedes 2", 250, 80, 65, 15)
    $radio3 = GUICtrlCreateRadio("jedes 5", 250, 100, 65, 15)
    $ListView = GUICtrlCreateListView("A|B|C|D|E|F|G", 5, 130, 650, 345, BitOR($LVS_SINGLESEL, $LVS_SHOWSELALWAYS))
    Guictrlsetresizing(-1, 102)
    For $i = 0 To 7
    _GUICtrlListView_SetColumnWidth($ListView, $i, 90)
    Next
    GUISetState()
    While 1
    $iMsg = GUIGetMsg()
    Switch $iMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    _ListviewFilter()
    WEnd
    ;======================== Filterung der Listview durch Inputs/Combo/Checkboxen/Radios ===========================
    Func _ListviewFilter()
    If $filter1 <> GUICtrlRead($input1) Or $filter2 <> GUICtrlRead($input2) Or $filter3 <> GUICtrlRead($input3) Or $filter4 <> GUICtrlRead($input4) Or $filter5 <> GUICtrlRead($combo1) Or $filter6 <> GUICtrlRead($checkbox1) Or $filter7 <> GUICtrlRead($checkbox2) Or $filter8 <> GUICtrlRead($checkbox3) Or $filter9 <> GUICtrlRead($checkbox4) Or $filter10 <> GUICtrlRead($radio1) Or $filter11 <> GUICtrlRead($radio2) Or $filter12 <> GUICtrlRead($radio3) Then
    _GUICtrlListView_DeleteAllItems($ListView)
    _GUICtrlListView_BeginUpdate($ListView)
    $filter1 = GUICtrlRead($input1)
    $filter2 = GUICtrlRead($input2)
    $filter3 = GUICtrlRead($input3)
    $filter4 = GUICtrlRead($input4)
    $filter5 = GUICtrlRead($combo1)
    $filter6 = GUICtrlRead($checkbox1)
    If GUICtrlRead($checkbox1) = $GUI_UNCHECKED Then
    $filter6a = ""
    Else
    $filter6a = "test"
    EndIf
    $filter7 = GUICtrlRead($checkbox2)
    If GUICtrlRead($checkbox2) = $GUI_UNCHECKED Then
    $filter7a = ""
    Else
    $filter7a = "abc"
    EndIf
    $filter8 = GUICtrlRead($checkbox3)
    If GUICtrlRead($checkbox3) = $GUI_UNCHECKED Then
    $filter8a = ""
    Else
    $filter8a = "xxx"
    EndIf
    $filter9 = GUICtrlRead($checkbox4)
    If GUICtrlRead($checkbox4) = $GUI_UNCHECKED Then
    $filter9a = ""
    Else
    $filter9a = "hhh"
    EndIf
    $filter10 = GUICtrlRead($radio1)
    If GUICtrlRead($radio1) = $GUI_UNCHECKED Then
    $filter10a = ""
    Else
    $filter10a = "vvv"
    EndIf
    $filter11 = GUICtrlRead($radio2)
    If GUICtrlRead($radio2) = $GUI_UNCHECKED Then
    $filter11a = ""
    Else
    $filter11a = "fff"
    EndIf
    $filter12 = GUICtrlRead($radio3)
    If GUICtrlRead($radio3) = $GUI_UNCHECKED Then
    $filter12a = ""
    Else
    $filter12a = "rrrr"
    EndIf
    ; ----- Schreibe ListeView mit selektierten Filtern -----
    For $i = 1 To UBound($aSheet) - 1
    If StringInStr($aSheet[$i][0], $filter1, 2) Or $filter1 = "" Or StringInStr($aSheet[$i][0], $filter2, 2) Or $filter2 = "" Or StringInStr($aSheet[$i][0], $filter3, 2) Or $filter3 = "" Or StringInStr($aSheet[$i][0], $filter4, 2) Or $filter4 = "" Or StringInStr($aSheet[$i][0], $filter5, 2) Or $filter5 = "" Or StringInStr($aSheet[$i][0], $filter6a, 2) Or StringInStr($aSheet[$i][0], $filter7a, 2) Or StringInStr($aSheet[$i][0], $filter8a, 2) Or StringInStr($aSheet[$i][0], $filter9a, 2) Or StringInStr($aSheet[$i][0], $filter10a, 2) Or StringInStr($aSheet[$i][0], $filter11a, 2) Or StringInStr($aSheet[$i][0], $filter12a, 2) Then
    GUICtrlCreateListViewItem($aSheet[$i][0]&"|"&$aSheet[$i][1]&"|"&$aSheet[$i][2]&"|"&$aSheet[$i][3]&"|"&$aSheet[$i][4]&"|"&$aSheet[$i][5]&"|"&$aSheet[$i][6]&"|"&$aSheet[$i][7]&"|"&$aSheet[$i][8], $ListView)
    EndIf
    Next
    _GUICtrlListView_EndUpdate($ListView)
    EndIf
    EndFunc
    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _Excel_RangeRead
    ; Description ...: Reads the value, formula or displayed text from a cell or range of cells of the specified workbook and worksheet.
    ; Syntax.........: _Excel_RangeRead($oExcel[, $oWorkbook = Default[, $oWorksheet = Default[, $vRange = Default[, $iReturn = 1]]]])
    ; Parameters ....: $oExcel - Excel application object
    ; $oWorkbook - Optional: Excel workbook object. If set to Default the active workbook will be used
    ; $oWorksheet - Optional: Excel worksheet object. If set to Default the active sheet will be used
    ; $vRange - Optional: Either a range object or an A1 range. If set to Default all used cells will be processed
    ; $iReturn - Optional: What to return of the specified cell:
    ; |1 - Value (default)
    ; |2 - Formula
    ; |3 - The displayed text
    ; Return values .: Success - Returns the data from the specified cell(s). A string for a cell, an zero-based array for a range of cells.
    ; Failure - Returns 0 and sets @error:
    ; |1 - $oExcel is not an object
    ; |2 - $oWorkbook is not an object
    ; |3 - $oWorksheet is not an object
    ; |4 - $vRange is invalid
    ; |5 - Parameter $iReturn is invalid. Has to be > 1 and < 3
    ; |6 - Error occurred when reading data. @extended is set to the error code returned when accessing the Value property
    ; Author ........: SEO <locodarwin at yahoo dot com>
    ; Modified.......: litlmike, water
    ; Remarks .......:
    ; Related .......:
    ; Link ..........:
    ; Example .......: Yes
    ; ===============================================================================================================================
    Func _Excel_RangeRead($oExcel, $oWorkbook = Default, $oWorksheet = Default, $vRange = Default, $iReturn = Default)
    If Not IsObj($oExcel) Then Return SetError(1, 0, 0)
    If $oWorkbook = Default Then $oWorkbook = $oExcel.ActiveWorkbook
    If Not IsObj($oWorkbook) Then Return SetError(2, 0, 0)
    If $oWorksheet = Default Then $oWorksheet = $oWorkbook.Activesheet
    If Not IsObj($oWorksheet) Then Return SetError(3, 0, 0)
    If $vRange = Default Then $vRange = $oWorksheet.Usedrange
    If IsString($vRange) Then $vRange = $oExcel.Range($vRange)
    If Not IsObj($vRange) Then Return SetError(4, 0, 0)
    If $iReturn = Default Then $iReturn = 1
    If $iReturn < 1 Or $iReturn > 3 Then Return SetError(5, 0, 0)
    Local $vResult
    If $iReturn = 1 Then
    $vResult = $oExcel.Transpose($vRange.Value)
    ElseIf $iReturn = 2 Then
    $vResult = $oExcel.Transpose($vRange.Formula)
    Else
    $vResult = $oExcel.Transpose($vRange.Text)
    EndIf
    If @error Then Return SetError(6, @error, 0)
    Return $vResult
    EndFunc ;==>_Excel_RangeRead

    [/autoit]

    6 Mal editiert, zuletzt von Inferior (12. April 2013 um 09:59)

  • Hallo,

    Wäre immer noch SEHR an einer Lösungsmöglichkeit interessiert.
    Falls also jemand noch ein paar Gedankenstützen hätte wäre ich sehr dankbar.

    Wenn jemand noch irgendetwas wissen möchte, einfach schreiben.
    Ich versuche dann das so gut es geht zu beantworten.

    vielen Dank.
    LG Inferior

    Einmal editiert, zuletzt von Inferior (16. April 2013 um 09:48)

  • Mir stellt sich die Frage:

    - Ist AutoIt einfach zu langsam für so eine Auslesung? (Suche bereits während der Eingabe)
    oder
    - Ist es nur bisher keinem gelungen, die Vorgehensweise soweit zu optimieren, dass die Suche schnell und flüssig läuft?

  • Vielleicht solltest du eine Datenbank benutzen... damit lassen sich große Datenmengen superschnell verarbeiten.
    Mit AutoIt geht u.a. SQLite (für single User) und MySQL (mächtig!).

    Wer andern eine Bratwurst brät
    der hat ein Bratwurstbratgerät.

  • Hallo ohforf,

    so wie ich das sehe, ist das eine Online-Datenbank.

    Mein Script darf und soll nur mit lokalen Daten arbeiten.

    Hat Jemand eine Idee, einen Ansatz auf dem ich aufbauen kann?

    Gern stelle ich noch mehr Beispiele zur Verfügung bzw. beantworte euch Fragen falls die Problemstellung hier und da noch nicht ganz klar ist.

    Vielen Dank schon mal für eure Unterstützung.

    MfG Inferior

  • Was meinst du mit "Online-Datenbank" ?
    Du brauchst keine Netzwerk- oder Internetverbindung dafür.
    Die Daten können auf deinem PC gespeichert werden.

    Wer andern eine Bratwurst brät
    der hat ein Bratwurstbratgerät.

  • Da ich jetzt noch nicht herauslesen konnte was genau du damit vor hast außer die Daten in eine Listview zu schreiben, und sie zu filtern, kannst du das eigentlich ganz einfach machen indem du zunächst alle Daten in eine DB schreibst (Das kann natürlich auch eine Weile dauern, aber ist ja wohl auch logisch, die Datenbank füllt sich ja nicht aus dem Nirgendwo). Folgend gibt es verschiedene Möglichkeiten, ich habe vor einiger Zeit eine Livesearch geschrieben, sprich es wird ständig eine Listview erzeugt und es werden nur die Spalten angezeigt die durch Checkboxen auch markiert worden sind.

    Bei meiner Livesearch wurden dann zwar etliche SQL-Statements abgefeuert, aber es war (auch logisch) viel schneller, und da es lediglich eine Verwaltung für ein anderes Tool sein sollte somit kein problem in Hinsicht auf Speicherverbrauch.

    Vll. noch eine kleine erweiterte Erläuterung zu ohforf: Du kannst dir jede Datenbank auf deinem lokalen Rechner installieren. Vll benötigt die ein oder andere noch weitere Software, allerdings ist da SQLite wie schon gesagt ganz Nutzerfreundlich.

    Grüße Yaerox

    Grüne Hölle