Drag&Drop Listview? - Disposition

  • Hallo liebe AutoIt-Community,

    ich habe ein Anliegen und zwar würde ich gerne eine Mitarbeiterdisposition erstellen.
    Leider fehlt mir der Ansatz. Die Oberfläche sollte kein Problem darstellen, leider habe ich aber noch nie wirklich mit einem Kalender gearbeitet.

    Ich stelle mir das in etwa so vor, dass 3 Monate angezeigt werden, bspw 2 Monate Aktuell + Nächster.
    Darunter eine Listview, "Objekt", "Mitarbeiteranzahl", "Treffpunkt", "Uhrzeit", "Beginn", "Ende", "Stonstiges1", "Sonstiges2", "Sonstiges3")

    darunter wiederum eine Listview - mit Mitarbeitern aus einer .ini oder wie auch immer.

    Bis dahin werde ich wahrscheinlich kommen, ABER die Übergabe, die schaffe ich nicht. Bspw. ich will einen Mitarbeiter einplanen.

    Ich markiere den Auftrag, wählen den Mitarbeiter und sage bspw. "disponieren", der Mitarbeiter soll dann im Auftrag auftauchen, und für den Zeitraum aus der Buchung entfernt werden. Ich denke das geht mit Arrays - leider beherrsche ich Listviews nicht und auch die Hilfe, hilft mir nicht wirklich.

    Ich hoffe die Fragestellung ist nicht allzu unverschämt, ich versuche mich mal am Code und hoffe ich kriege etwas zustande. Den Übertrag zwischen den Listviews, sowie dessen Speicherung von Aufträgen und Mitarbeitern über Inputs, kann ich mir nicht logisch zusammenreimen. =(

    EDIT:
    Hier der Code, den ich bis jetzt habe, kann ich die Mitarbeiter per Drag&Drop dem Auftrag zuweisen? Den Auftrag mit zB. Doppelklick öffnen und die zugewiesenen MAs sehen?

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <GuiListView.au3>
    #include <Array.au3>

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

    $gui1 = GUICreate("Disposition", 800, 400)
    $cal = GUICtrlCreateMonthCal("Kalender", 0,0,340,160)

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

    $neuer_Auftrag = GUICtrlCreateButton("neuer Auftrag", 10, 165, 100, 20)
    $speichern_Auftrag = GUICtrlCreateButton("speichern", 120, 165, 100, 20)
    $laden_Auftrag = GUICtrlCreateButton("laden", 230, 165, 100, 20)
    GUICtrlSetState($laden_Auftrag, $GUI_DISABLE)
    $loeschen_Auftrag = GUICtrlCreateButton("löschen", 350, 165, 100, 20)
    $loeschen_alles = GUICtrlCreateButton("alles löschen", 455, 165, 100, 20)
    $recover = GUICtrlCreateButton("Backup einspielen", 560, 165, 100, 20)
    If FileExists("Files\Plan.txt") Then GUICtrlSetState($recover, $GUI_DISABLE)
    If FileExists("Files\Plan.txt") Then GUICtrlSetState($laden_Auftrag, $GUI_ENABLE)
    $Listview_Auftrag = GUICtrlCreateListView("Auftrag|Adresse|MA|Treffpunkt|Uhrzeit|Beginn|Ende|Sonstiges1|Sonstiges2|Sonstiges3|Gebucht", 0, 190, 800, 200)
    $hListView = GUICtrlGetHandle($Listview_Auftrag)
    _AuftragLaden()
    $Listview_Mitarbeiter = GUICtrlCreateListView("PersNr.|Name|Vorname|SPK|FS|43a", 345, 0, 455, 140)
    $hListView2 = GUICtrlGetHandle($Listview_Mitarbeiter)
    _MitarbeiterLaden()
    GUICtrlCreateButton("buchen", 350, 143, 100, 20)
    GUISetState(@SW_SHOW)
    $gui2 = GUICreate("Neuer Auftrag", 300, 255)
    GUICtrlCreateLabel("Auftrag", 10, 10, 50)
    $gui2_Auftrag = GUICtrlCreateInput("", 70, 10, 220, 17)
    GUICtrlCreateLabel("Adresse", 10, 30, 50)
    $gui2_Adresse = GUICtrlCreateInput("", 70, 30, 220, 17)
    GUICtrlCreateLabel("Mitbeiter", 10, 50, 50)
    $gui2_Mitarbeiter = GUICtrlCreateInput("", 70, 50, 220, 17)
    GUICtrlCreateLabel("Treffpunkt", 10, 70, 50)
    $gui2_Treffpunkt = GUICtrlCreateInput("", 70, 70, 220, 17)
    GUICtrlCreateLabel("Uhrzeit", 10, 90, 50)
    $gui2_Uhrzeit = GUICtrlCreateInput("", 70, 90, 220, 17)
    GUICtrlCreateLabel("Beginn", 10, 110, 50)
    $gui2_Beginn = GUICtrlCreateInput("", 70, 110, 220, 17)
    GUICtrlCreateLabel("Ende", 10, 130, 50)
    $gui2_Ende = GUICtrlCreateInput("", 70, 130, 220, 17)
    GUICtrlCreateLabel("Sonstiges", 10, 150, 50)
    $gui2_Sonstiges1 = GUICtrlCreateInput("", 70, 150, 220, 17)
    GUICtrlCreateLabel("Sonstiges", 10, 170, 50)
    $gui2_Sonstiges2 = GUICtrlCreateInput("", 70, 170, 220, 17)
    GUICtrlCreateLabel("Sonstiges", 10, 190, 50)
    $gui2_Sonstiges3 = GUICtrlCreateInput("", 70, 190, 220, 17)
    GUICtrlCreateLabel("Datum", 10, 210, 50)
    $gui2_Datum = GUICtrlCreateInput(GUICtrlRead($cal), 70, 210, 170, 17)
    $gui2_Datum_set = GUICtrlCreateButton("Heute", 245, 210, 50, 17)
    $speichern_Auftrag_gui2 = GUICtrlCreateButton("speichern", 10, 230, 280, 20)
    $gui2_Schliessen = GUICtrlCreateCheckbox("nach Speichern schließen", 10, 250)
    GUICtrlSetState($gui2_Schliessen, $GUI_CHECKED)
    GUISetState(@SW_HIDE)

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

    Func _ListViewToArray()
    Local $iCnt = _GUICtrlListView_GetItemCount($hListView)
    If $iCnt < 1 Then Return SetError(1)
    Dim $aRet[$iCnt][4]
    For $i = 0 To $iCnt - 1
    $aRet[$i][0] = _GUICtrlListView_GetItemText($hListView, $i, 0)
    $aRet[$i][1] = _GUICtrlListView_GetItemText($hListView, $i, 1)
    $aRet[$i][2] = _GUICtrlListView_GetItemText($hListView, $i, 2)
    $aRet[$i][3] = _GUICtrlListView_GetItemText($hListView, $i, 3)
    Next
    Return $aRet
    EndFunc

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

    Func _FileWriteFromArray2D($FILEPATH, $ARRAY, $iROWstart = 0, $iROWend = 0, $iCOLstart = 0, $iCOLend = 0, $DELIM = '|')
    If Not IsArray($ARRAY) Then
    SetError(1)
    Return 0
    EndIf
    Local $Ubound = UBound($ARRAY)
    If $iROWend = 0 Then $iROWend = $Ubound - 1
    Local $fh = FileOpen($FILEPATH, 2)
    If $fh = -1 Then
    SetError(2)
    Return 0
    EndIf
    Select
    Case $iROWstart < 0 Or $iROWstart > $Ubound - 1
    $iROWstart = 0
    ContinueCase
    Case $iROWend < 0 Or $iROWend > $Ubound - 1
    $iROWend = $Ubound - 1
    ContinueCase
    Case $iROWstart > $iROWend
    $tmp = $iROWstart
    $iROWstart = $iROWend
    $iROWend = $tmp
    EndSelect
    Local $Ubound2nd = UBound($ARRAY, 2)
    If @error = 2 Then
    For $i = $iROWstart To $iROWend
    FileWriteLine($fh, $ARRAY[$i])
    Next
    Else
    If $iCOLend = 0 Then $iCOLend = $Ubound2nd - 1
    Select
    Case $iCOLstart < 0 Or $iCOLstart > $Ubound2nd - 1
    $iCOLstart = 0
    ContinueCase
    Case $iCOLend < 0 Or $iCOLend > $Ubound2nd - 1
    $iCOLend = $Ubound2nd - 1
    ContinueCase
    Case $iCOLstart > $iCOLend
    $tmp = $iCOLstart
    $iCOLstart = $iCOLend
    $iCOLend = $tmp
    EndSelect
    For $i = $iROWstart To $iROWend
    $tmp = ''
    For $k = $iCOLstart To $iCOLend
    If $k < $iCOLend Then
    $tmp &= $ARRAY[$i][$k] & $DELIM
    Else
    $tmp &= $ARRAY[$i][$k]
    EndIf
    Next
    FileWriteLine($fh, $tmp)
    Next
    EndIf
    FileClose($fh)
    Return -1
    EndFunc

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

    Func _FileReadToArray2D($FILEPATH, ByRef $ARRAY, $DELIM = -1)
    Local $fh = FileOpen($FILEPATH, 0), $line, $var, $n = 1
    If $fh = -1 Then
    SetError(2)
    Return 0
    EndIf
    If $DELIM <> -1 Then
    $line = FileReadLine($fh, 1)
    $var = StringSplit($line, $DELIM)
    If IsArray($var) Then
    $Ubound2nd = $var[0]
    Local $AR[1][$Ubound2nd]
    $AR[0][0] = 0
    Else
    SetError(1)
    Return 0
    EndIf
    While 1
    $line = FileReadLine($fh, $n)
    If @error = -1 Then ExitLoop
    $var = StringSplit($line, $DELIM)
    If IsArray($var) Then
    ReDim $AR[UBound($AR) + 1][$Ubound2nd]
    For $i = 0 To $Ubound2nd - 1
    $AR[UBound($AR) - 1][$i] = $var[$i + 1]
    Next
    $AR[0][0] += 1
    Else
    SetError(1)
    Return 0
    EndIf
    $n += 1
    WEnd
    Else
    Local $AR[1]
    $AR[0] = 0
    While 1
    $line = FileReadLine($fh, $n)
    If @error = -1 Then ExitLoop
    ReDim $AR[UBound($AR) + 1]
    $AR[UBound($AR) - 1] = $line
    $AR[0] += 1
    $n += 1
    WEnd
    EndIf
    FileClose($fh)
    $ARRAY = $AR
    Return -1
    EndFunc

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

    Func _AuftragLaden()
    $PathLoad = "Files/Plan.txt"
    Local $ARRAY
    _FileReadToArray2D($PathLoad, $ARRAY, "|")
    _ArrayDelete($ARRAY, 0)
    _GUICtrlListView_AddArray($hListView, $ARRAY)
    EndFunc

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

    Func _MitarbeiterLaden()
    $PathLoad = "Files/Mitarbeiter.txt"
    Local $ARRAY
    _FileReadToArray2D($PathLoad, $ARRAY, "|")
    _ArrayDelete($ARRAY, 0)
    _GUICtrlListView_AddArray($hListView2, $ARRAY)
    EndFunc

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

    Func _AuftragSpeichern()
    $PathSave = "Files\Plan"
    If StringRight($PathSave, 4) <> ".txt" Then $PathSave &= ".txt"
    $aArrayListView = _ListViewToArray()
    _FileWriteFromArray2D($PathSave, $aArrayListView)
    EndFunc

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

    Func _Recover()
    $PathLoad = FileOpenDialog("Datei öffnen", "Files\Backup", "Textdateien (*.txt)")
    Local $ARRAY
    _FileReadToArray2D($PathLoad, $ARRAY, "|")
    _ArrayDelete($ARRAY, 0)
    _GUICtrlListView_AddArray($hListView, $ARRAY)
    GUICtrlSetState($recover, $GUI_DISABLE)
    GUICtrlSetState($laden_Auftrag, $GUI_ENABLE)
    _AuftragSpeichern()
    EndFunc

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

    While 1
    $msg = GUIGetMsg(1)
    Switch $msg[1]
    Case $gui1
    Switch $msg[0] ; Event
    Case $GUI_EVENT_CLOSE
    _AuftragSpeichern()
    Exit
    Case $neuer_Auftrag
    GUISetState(@SW_SHOW, $gui2)
    case $speichern_Auftrag
    $PathSave = "Files\Plan"
    If StringRight($PathSave, 4) <> ".txt" Then $PathSave &= ".txt"
    $aArrayListView = _ListViewToArray()
    _FileWriteFromArray2D($PathSave, $aArrayListView)
    case $laden_Auftrag
    $PathLoad = "Files/Plan.txt"
    Local $ARRAY
    _FileReadToArray2D($PathLoad, $ARRAY, "|")
    _ArrayDelete($ARRAY, 0)
    _GUICtrlListView_AddArray($hListView, $ARRAY)
    case $loeschen_Auftrag
    _GUICtrlListView_DeleteItemsSelected($hListView)
    _AuftragSpeichern()
    case $loeschen_alles
    $SafeMsg1 = MsgBox(64+4,"Bestätigen", "Sind Sie sicher, dass Sie alles löschen wollen?" & @CRLF & @CRLF & "Es werden alle Daten restlos gelöscht!")
    If $SafeMsg1 = 6 Then $SafeMsg2 = MsgBox(48+4,"Bestätigen", "WIRKLICH SICHER?!")
    If $SafeMsg2 = 6 Then
    _GUICtrlListView_DeleteAllItems($hListView)
    DirCreate("Files\Backup" & @YEAR & @MON & @MDAY & @HOUR & @MIN)
    FileCopy("Files\Plan.txt", "Files\Backup" & @YEAR & @MON & @MDAY & @HOUR & @MIN & "\Plan.txt")
    FileDelete("Files\Plan.txt")
    _AuftragSpeichern()
    EndIf
    case $recover
    _Recover()
    EndSwitch
    Case $gui2
    Switch $msg[0]
    Case $GUI_EVENT_CLOSE
    GUISetState(@SW_SHOW, $gui1)
    GUISetState(@SW_HIDE, $gui2)
    Case $speichern_Auftrag_gui2
    GUICtrlCreateListViewItem(GUICtrlRead($gui2_Auftrag) & "|" & GUICtrlRead($gui2_Adresse) & "|" & GUICtrlRead($gui2_Mitarbeiter) & " (" & GUICtrlRead($gui2_Mitarbeiter) & ")" & "|" & GUICtrlRead($gui2_Treffpunkt) & "|" & GUICtrlRead($gui2_Uhrzeit) & "|" & GUICtrlRead($gui2_Beginn) & "|" & GUICtrlRead($gui2_Ende) & "|" & GUICtrlRead($gui2_Sonstiges1) & "|" & GUICtrlRead($gui2_Sonstiges2) & "|" & GUICtrlRead($gui2_Sonstiges3) & "|" & "", $Listview_Auftrag)
    If GUICtrlRead($gui2_Schliessen) = "1" Then GUISetState(@SW_HIDE, $gui2)
    GUICtrlSetData($gui2_Auftrag, "")
    GUICtrlSetData($gui2_Adresse, "")
    GUICtrlSetData($gui2_Mitarbeiter, "")
    GUICtrlSetData($gui2_Treffpunkt, "")
    GUICtrlSetData($gui2_Uhrzeit, "")
    GUICtrlSetData($gui2_Beginn, "")
    GUICtrlSetData($gui2_Ende, "")
    GUICtrlSetData($gui2_Sonstiges1, "")
    GUICtrlSetData($gui2_Sonstiges2, "")
    GUICtrlSetData($gui2_Sonstiges3, "")
    _AuftragSpeichern()
    EndSwitch
    EndSwitch
    WEnd

    [/autoit]

    3 Mal editiert, zuletzt von vism (9. Dezember 2013 um 13:10) aus folgendem Grund: Code hinzugefügt

    • Offizieller Beitrag

    Bis dahin werde ich wahrscheinlich kommen, ABER die Übergabe, die schaffe ich nicht. Bspw. ich will einen Mitarbeiter einplanen.

    Ich markiere den Auftrag, wählen den Mitarbeiter und sage bspw. "disponieren", der Mitarbeiter soll dann im Auftrag auftauchen, und für den Zeitraum aus der Buchung entfernt werden. Ich denke das geht mit Arrays - leider beherrsche ich Listviews nicht und auch die Hilfe, hilft mir nicht wirklich.


    Ich denke mal, das Problem liegt hier einen Ansatz zu finden, wie du Mitarbeiter zum Einen in der Buchung führst und zum Anderen an die Planung übergibst und sie währenddessen aus der Verfügbarkeit entfernst.
    Hier mal mein spontaner Gedankenansatz, den du dann versuchen kannst umzusetzen.
    - Jeder Mitarbeiter wird identifiziert durch eine Zahl - und zwar Potenzen von 2
    Somit kannst du eine Summe bilden aus der mit: BitXOr der Kollege zu-/oder abgebucht wird und mit BitAnd seine Verfügbarkeit ermittelbar ist
    - Du benötigst ein Zeitarray, je nach Arbeitszeiteinheit gegliedert (10, 12 od. 15 min Einheiten, also 6, 5 od. 4 Einträge je Stunde)
    Nun verknüpst du Zeit und Mitarbeitersumme:
    - In der Summe Verfügbarkeit wird der Mitarbeiter "abgebucht", die neue Summe wird in dem entsprechenden Zeitraum abgespeichert (bzw. aus vorhandenen Werten mittels BitXOr neu gebildet!)
    - Für das Listview brauchst du eine gegenteilige Summe, in der der Mitarbeiter "zugebucht" wird
    - Im Listview kannst du die Summe an das Item mit _GuiCtrlListview_SetItemParam zuweisen (abfragbar mit der Umkehrfunktion ...GetItemParam)
    ggf. je nach Struktur deines Listview, ist es einfacher in einem Array ( [Zeilen_Listview][Spalten_Listview] ) direkt die "Mitarbeitersumme" abzuspeichern
    Übergabe in das Listview kannst du mit Klick in die entsprechende Spalte realisieren.

    Viel Spaß bei der Umsetzung.