Daten aus einem Listenfeld in ein anderes übertragen auf grundlagen einer SQLite DB

  • Hallo an alle,

    Ich bin toooootal am Rätseln und weis nicht mehr weiter. Ich habe folgendes Problem.

    Das Programm dient dem zuteilen von Software zu einem PC und heist Serverrob. Es betseht aus eine linken Listenfeld einem rechtem Listenfeld und einer Combobox Wenn man nun in der Combobox einen PC auswählt bekommt man im linken Listenfeld die Dateien bzw Software angezeigt die diesem PC noch nicht zugeteilt ist.

    (Zur Info ein weiters prog. Namens Clientrob was sich auf den Clients befindet :) war klar ... und bei jeden Neustart, morgens oder so, die Datenbank nach Änderungen abfragt die man mit Serverrob eingestellt hat.)

    Das funktioniert soweit.

    Jetzt zum ersten Problem was ich nicht raffe ...

    Wenn ich nun einen Wert im linken Listenfeld markiere und es über drücken des $Button1 (Zeiger nach rechts) in das rechte Listenfeld übertragen möchte funktioniert das. Was aber nicht funktioniert ist wenn ich nun mehrere Werte auswähle/markiere und sie nun durch drücken des $Button1 in das rechte Listenfeld übertragen möchte. Das dann dazu führt das Windows die Ausführung des scriptes unterbricht.

    Es gibt also eine SQLite DB Names daten.db in der ich in drei Tabellen informationen abgelegt habe. Und dann noch mein Script:

    UPDATE 21:00 Uhr --- Ich habe die Datenbank mal von .db in .txt umbenannt um Sie hier zur Einsicht hochzuladen

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    #include <ButtonConstants.au3>
    #include <ComboConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ListBoxConstants.au3>
    #include <WindowsConstants.au3>
    #include <array.au3>
    #include <GUIListBox.au3>

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

    #include <SQLite.au3>
    #include <SQLite.dll.au3>

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

    $clientINI="Serverrob.ini"
    $server=IniRead(@ScriptDir & "\" & $clientINI, "Server", "name_or_ip", "")
    $DirSQLite_DB=IniRead(@ScriptDir & "\" & $clientINI, "Server", "path", "")
    $Datenbankname='daten.db'
    ;$Computername="PC001"

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

    $IpLeftTrim=StringTrimLeft($server,2)
    $IpRightTrim=StringTrimRight($IpLeftTrim,1)

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

    ;######################################################################################################################################################################

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

    if FileExists(@ScriptDir & "\" & $clientINI)==0 Then

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

    IniWrite(@ScriptDir & "\" & $clientINI, "Server", "name_or_ip", "\\127.0.0.1\")
    IniWrite(@ScriptDir & "\" & $clientINI, "Server", "path", "kein_eintrag__bitte_pfad_eintragen\")
    IniWrite(@ScriptDir & "\" & $clientINI, "Server", "name", "serverrob.ini")

    if @error Then
    MsgBox(16, "Serverrob - Fehlermeldung", "Die Ini - Datei konnte im Ordner " & @ScriptDir & " nicht geschrieben werden." & @CRLF & "Bitte prüfen Sie die schreibrechte dieses Ordners und versuchen Sie danach Serverrob nochmal zu starten.")
    Exit
    EndIf

    ; Wert auslesen für die IF Schleife
    $PruefePfadinINI=IniRead(@ScriptDir & "\" & $clientINI, "Server", "path", "")

    ; Pingversuch für die IF Schleife
    $PingStatus=ping($IpRightTrim,250)

    if $PruefePfadinINI=="kein_eintrag__bitte_pfad_eintragen\" or @error==3 Then
    MsgBox(48, "Serverrob - Achtung", "In der Ini - Datei [Serverrob.ini] ist noch kein Pfad zum Softwaredepot eingetragen." & @CRLF & "Drücken Sie OK. Danach wird sich die Ini - Datei öffnen. Tragen Sie dort dann bei 'path=\kein_eintrag__bitte_pfad_eintragen\'" & @CRLF & "den Pfad zum Softwaredepot ein. Das könnte dan z.B. so aussehen: 'path=\\server\softwareordner\'." & @CRLF & " Tragen Sie dann noch den Servernamen oder die Server IP bei 'name_or_ip=""' ein. Speichern und schliessen Sie die Ini - Datei und starten Sie Serverrob erneut.")
    ShellExecute(@ScriptDir & "\" & $clientINI)
    EndIf

    Exit

    EndIf

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

    ;######################################################################################################################################################################
    ;prüfung ob die client.ini die richtigen informationen enthält

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

    ; Wert auslesen für die IF Schleife
    $PruefePfadinINI=IniRead(@ScriptDir & "\" & $clientINI, "Server", "path", "")
    ; Pingversuch für die IF Schleife
    $PingStatus=ping($IpRightTrim,250)
    ; Prüft ob ein Eintrag in der Sektion [server] wert path vorgenommen wurde und ob ein Ping auf den Server machbar ist
    if $PruefePfadinINI=="kein_eintrag__bitte_pfad_eintragen\" or @error==3 Then
    MsgBox(48, "Serverrob - Achtung", "In der Ini - Datei [Serverrob.ini] ist noch kein Pfad zum Serververzeichins eingetragen." & @CRLF & "Drücken Sie OK. Danach wird sich die Ini - Datei öffnen. Tragen Sie dort dann bei 'path=\kein_eintrag__bitte_pfad_eintragen\'" & @CRLF & "den Pfad zum Softwaredepot ein. Das könnte dan z.B. so aussehen: 'path=\\server\softwareordner\'." & @CRLF & " Tragen Sie dann noch den Servernamen oder die Server IP bei 'name_or_ip=""' ein. Speichern und schliessen Sie die Ini - Datei und starten Sie Serverrob erneut.")
    ShellExecute(@ScriptDir & "\" & $clientINI)
    Exit
    EndIf

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

    ; Prüft die erreichbarkeit der Serverseitigen ini - Datei
    if FileExists($server & $DirSQLite_DB & "serverrob.ini")==0 Then
    MsgBox(16, "Serverrob - Fehlermeldung", "Die Serverseitige Ini - Datei ist nicht im Zielpfad zu finden." & @CRLF & "Bitte kontaktieren Sie Ihren Administrator wegen diesem Problem.")
    Exit
    EndIf
    ; Prüft ob in ScriptDir die AutoIt3.exe liegt wenn nicht wird sie vom Server kopiert.
    ; Diese Datei ist zwingend notwenig für die Ausführung der Unterscripte vom Server

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

    ;$test=$ServerIP_IniDatei & $ServerPath_IniDatei & "AutoIt3.exe"

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

    $FileExistTest=FileExists(@ScriptDir & "\AutoIt3.exe")

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

    If not $FileExistTest Then

    FileCopy($server & $DirSQLite_DB & "AutoIt3.exe", @ScriptDir & "\AutoIt3.exe", 1)

    if @error Then
    Msgbox(0,"Filecopy","Es ist ein Fehler mit der Nummer " & @error & " aufgetreten.")
    Exit
    EndIf

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

    EndIf

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

    ;######################################################################################################################################################################
    ; Verbindungstest zum Server

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

    $PingStatus=ping($IpRightTrim,250)

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

    If $PingStatus Then; also possible: If @error = 0 Then ...

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

    Else
    Msgbox(16,"Robclient - Ping Error","Der Server konnte nicht erreicht werden. Errorcode to Ping: " & @error & @CRLF & _
    "Der Verbindungsversuch wird abgebrochen.")
    Exit
    EndIf

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

    $DirveStatus = DriveStatus($server & $DirSQLite_DB)

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

    if @error then
    MsgBox(16, "Robclient - DriveStatus Error", "Der angegeben Pfad zur Datenbank ist nicht korrekt." & @CRLF & _
    "Der angebenen Pfad lautet derzeit: " & $DirSQLite_DB & @CRLF & _
    "Überprüfen Sie den in der client.ini abgegebenen Pfad.")

    Exit
    EndIf

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

    ;######################################################################################################################################################################
    Local $Query_TABLE_CLIENT, $aRow_CLIENT, $sMsg_CLIENT
    Local $Query_TABLE_SOFTWAREDEPOT, $aRow_SOFTWAREDEPOT, $sMsg_SOFTWAREDEPOT,$Query_combo,$Query_rechte_listbox,$sID,$cID

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

    ; Startet die SQLite.dll
    _SQLite_Startup ()
    ; Öffnet die Datenbank
    _SQLite_Open ($server & $DirSQLite_DB & $Datenbankname)
    ; Bereitet eine SQLite-Abfrage anhand des @Computername der Tabelle USER vor

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


    _SQlite_Query (-1, "select pcname from client order by id;", $Query_TABLE_CLIENT)

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

    #Region ### START Koda GUI section ### Form=D:\Autoit\Client_PC_update\GUI\datenbankeingabe_softwarezuteilung.kxf

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

    $Form1 = GUICreate("Serverrob - Dateidisponent", 353, 416, 303, 219)
    GUISetIcon("D:\007.ico")

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

    ;############################ C O M B O B O X #####################################
    $Combo1 = GUICtrlCreateCombo("Auswahl", 200, 8, 137, 25)

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

    While _SQLite_FetchData ($Query_TABLE_CLIENT,$aRow_CLIENT) = $SQLITE_OK
    $sMsg_CLIENT &= $aRow_CLIENT[0]
    GUICtrlSetData(-1,'' & $sMsg_CLIENT & "|")
    $sMsg1_CLIENT = $sMsg_CLIENT
    $sMsg_CLIENT=""
    WEnd

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

    ;##################################################################################

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


    ;############################ linke L I S T B O X #################################
    $linke_listbox = GUICtrlCreateList("", 8, 8, 137, 344, BitOR($LBS_EXTENDEDSEL,$WS_VSCROLL))

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

    ;##################################################################################

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

    ;############################ linke L I S T B O X #################################
    $rechte_listbox = GUICtrlCreateList("", 200, 48, 137, 292,$WS_VSCROLL)

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

    ;##################################################################################

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

    ;############################ Zeiger nach rechts ##################################
    $Button1 = GUICtrlCreateButton(">", 156, 48, 31, 25, 0)

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

    ;##################################################################################
    ;~ $Button2 = GUICtrlCreateButton(">>", 156, 48, 31, 25, 0)
    ;~ GUICtrlSetState(-1, $GUI_DISABLE)
    ;~ $Button3 = GUICtrlCreateButton("<", 157, 81, 31, 25, 0)
    ;~ GUICtrlSetState(-1, $GUI_DISABLE)
    ;~ $Button4 = GUICtrlCreateButton("<<", 157, 114, 32, 25, 0)
    ;~ GUICtrlSetState(-1, $GUI_DISABLE)
    $ok = GUICtrlCreateButton("&OK", 104, 369, 75, 25, 0)
    $abbrechen = GUICtrlCreateButton("&Cancel", 184, 369, 75, 25, 0)
    $help = GUICtrlCreateButton("&Help", 264, 369, 75, 25, 0)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Select
    Case $nMsg = $GUI_EVENT_CLOSE
    Exit
    Case $nMsg = $abbrechen
    Exit
    Case $nMsg = $ok

    For $i=0 to _GUICtrlListBox_GetCount($rechte_listbox)-1

    _SQLite_Query(-1,"select id from softwaredepot where softname='"& _GUICtrlListBox_GetText($rechte_listbox,$i) &"';)",$Query_rechte_listbox)
    _SQLite_FetchData($Query_rechte_listbox, $sID)
    _SQLite_Query(-1,"select id from client where pcname='"& GUICtrlRead($Combo1) &"';)",$Query_combo)
    _SQLite_FetchData($Query_combo, $cID)
    _SQLite_Exec(-1,"INSERT INTO SOFTWAREINSTALL (Client,Softid) VALUES ("&$sID[0]&","&$cID[0]&");")

    Next

    ExitLoop

    Case $nMsg=$Button1

    $aSel=_GUICtrlListBox_GetSelItems($linke_listbox)

    for $i=1 To $aSel[0]
    _GUICtrlListBox_InsertString($rechte_listbox,_GUICtrlListBox_GetText($linke_listbox,$aSel[$i]))
    _GUICtrlListBox_DeleteString($linke_listbox,$aSel[$i])
    Next

    ;~ Case $nMsg=$Button3
    ;~
    ;~ $aSel=_GUICtrlListBox_GetSelItems($rechte_listbox)
    ;~ MsgBox("","",GUICtrlRead($rechte_listbox))
    ;~ for $i=1 To $aSel[0]
    ;~ _GUICtrlListBox_InsertString($linke_listbox,_GUICtrlListBox_GetText($rechte_listbox,$aSel[$i]))
    ;~ _GUICtrlListBox_DeleteString($rechte_listbox,$aSel[$i])
    ;~ Next
    ;~

    Case $nMsg=$Combo1


    ;MsgBox("","1",GUICtrlRead($Combo1))


    GUICtrlSetData($rechte_listbox,"")
    _SQlite_Query (-1, "select sd.softname from client c, softwaredepot sd left join softwareinstall s " & _
    "on c.ID = s.CLIENT and s.softid=sd.id where s.id is null and c.PCNAME = '" & GUICtrlRead($Combo1) & "';", $Query_TABLE_SOFTWAREDEPOT)
    ;MsgBox("","2", "select sd.softname from client c, softwaredepot sd left join softwareinstall s on c.ID = s.CLIENT and s.softid=sd.id where s.id is null and c.PCNAME = '" & GUICtrlRead($Combo1) & "';")
    $sMsg_SOFTWAREDEPOT=""


    While _SQLite_FetchData ($Query_TABLE_SOFTWAREDEPOT,$aRow_SOFTWAREDEPOT) = $SQLITE_OK
    $sMsg_SOFTWAREDEPOT &= "|"&$aRow_SOFTWAREDEPOT[0]
    WEnd
    ;MsgBox("","",$sMsg_SOFTWAREDEPOT)
    GUICtrlSetData($linke_listbox,$sMsg_SOFTWAREDEPOT)

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

    EndSelect
    WEnd

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

    GUIDelete()

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

    _SQLite_Close($server & $DirSQLite_DB & $Datenbankname)
    _SQLite_Shutdown()

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

    MsgBox(64, "Information", "Durchgelaufen",2)

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

    Exit

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

    ;(;( Kann mir jemand von der Brücke helfen... dieser Eselsbrücke ??? ;(;(

    5 Mal editiert, zuletzt von JanausSm (10. Februar 2009 um 10:12)

  • Das für dann dazu das Windows die Ausführung des scriptes unterbricht.

    ach so genau gleich^^
    und du kannst ruhig ein wenig warten bis du nochmal schreibst^^ (naja ich versteh die ungeduld)

    Padmak

  • So, das Problem sollte hier zu finden sein:

    [autoit]

    $aSel=_GUICtrlListBox_GetSelItems($linke_listbox)

    for $i=1 To $aSel[0]
    _GUICtrlListBox_InsertString($rechte_listbox,_GUICtrlListBox_GetText($linke_listbox,$aSel[$i]))
    _GUICtrlListBox_DeleteString($linke_listbox,$aSel[$i])
    Next

    [/autoit]


    Mit GetSelItems bekommst du den Index der Items. Sobald du eines Löschst, verändern sich die Index-werte. Daher beim löschen Rückwärts arbeiten ;)

    [autoit]

    $aSel=_GUICtrlListBox_GetSelItems($linke_listbox)

    for $i=1 To $aSel[0]
    _GUICtrlListBox_InsertString($rechte_listbox,_GUICtrlListBox_GetText($linke_listbox,$aSel[$i]))
    Next
    for $i=$aSel[0] To 1
    _GUICtrlListBox_DeleteString($linke_listbox,$aSel[$i])
    Next

    [/autoit]
  • Danke für die Hilfe progandy es funktioniert jetzt. :)
    Leider konnte ich erst jetzt antworten da ich mal eine Woche im Skiurlaub gewesen bin.

    So nun werde ich mich gleich mal ans weiterbasteln begeben :)