StringSplit Array-Variable Problem

04/02/2014 15:06 Meredy123#1
Tag zusammen, ich bins schon wieder

Folgendes Problem: Aus einer .txt soll aus den Zeilen, die jeweils aus "Text"|"Text"|"Zahl" bestehen, in einer Schleife jede Zeile in ein Array gepackt werden. Aus dem Input von zwei Comboboxen, soll dann zusammen mit den Arrays ein Output erzeugt werden. Je nach Input der Combobox, gibt es in einer If-ElseIf-Schleife 4 mögliche Ausgänge für den Output. Von diesen 4 möglichen Ausgängen funktionieren allerdings nur 2, bei den andren beiden erhalte ich den Error: "Array variable has incorrect number of subscripts or subscript dimension range exceeded." Hierbei handelt es sich bei beiden um das Subscript "$iSplit[2]", die anderen beiden ($iSplit[1] und $iSplit[3]) bereiten keine Probleme.
Hier der Code der Funktion:
PHP Code:
Func Stunden()
   
$StundenFileLoad2 FileOpen ($StundenDB)
   
$StundenUser GUICtrlRead ($ComboUserStunden)
   
$StundenProjekt GUICtrlRead ($ComboProjektStunden)
   If 
$StundenUser "Alle" And $StundenProjekt "Alle" Then
      Local $i 
0
      Local $StundenStunden 
0
      
Do
         
$i += 1
         $iLine 
FileReadLine($StundenFileLoad2$i)
         
$iSplit StringSplit($iLine"|")
         
$StundenStunden $StundenStunden $iSplit[3]
      
Until @Error <> 0
      GUICtrlSetData
($OutputLabel"Insgesamt wurden " $StundenStunden " Stunden gearbeitet")
   ElseIf 
$StundenUser <> "Alle" And $StundenProjekt "Alle" Then
      Local $i 
0
      Local $StundenStunden 
0
      
Do
         
$i += 1
         $iLine 
FileReadLine($StundenFileLoad2$i)
         
$iSplit StringSplit($iLine"|")
         If 
$iSplit[1] = $StundenUser Then
            $StundenStunden 
$StundenStunden $iSplit[3]
         EndIf
      
Until @Error <> 0
      GUICtrlSetData
($OutputLabel"Benutzer " $StundenUser " hat insgesamt " $StundenStunden " Stunden gearbeitet.")
   ElseIf 
$StundenUser "Alle" And $StundenProjekt <> "Alle" Then
      Local $i 
0
      Local $StundenStunden 
0
      
Do
         
$i += 1
         $iLine 
FileReadLine($StundenFileLoad2$i)
         
$iSplit StringSplit($iLine"|")
         If 
$iSplit[2] = $StundenProjekt Then
            $StundenStunden 
$StundenStunden $iSplit[3]
         EndIf
      
Until @Error <> 0
      GUICtrlSetData
($OutputLabel"Für Projekt " $StundenProjekt " wurden insgesamt " $StundenStunden " Stunden gearbeitet.")
      Else
      
Local $i 0
      Local $StundenStunden 
0
      
Do
         
$i += 1
         $iLine 
FileReadLine($StundenFileLoad2$i)
         
$iSplit StringSplit($iLine"|")
         If 
$iSplit[1] = $StundenUser And $iSplit[2] = $StundenProjekt Then
            $StundenStunden 
$StundenStunden $iSplit[3]
         EndIf
      
Until @Error <> 0
      GUICtrlSetData
($OutputLabel"Benutzer " $StundenUser " hat " $StundenStunden "Stunden an Projekt " $StundenProjekt " gearbeitet.")
   EndIf
FileClose ($StundenFileLoad2)
EndFunc 
Die Errors erhalte ich wie schon erwähnt in 2 "If-Ausgängen" und zwar bei:
PHP Code:
ElseIf $StundenUser "Alle" And $StundenProjekt <> "Alle" Then 
in der Zeile:
PHP Code:
If $iSplit[2] = $StundenProjekt Then 
Und
PHP Code:
Else 
in der Zeile
PHP Code:
If $iSplit[1] = $StundenUser And $iSplit[2] = $StundenProjekt Then 
Wie auch schon oben beschrieben beschwert er sich über "$iSplit[2]"
Danke schonmal im Vorraus

Mit freundlichem Gruß
Meredy123

€: Habs selbst gefixt, einfach statt
PHP Code:
Until @Error <> 
PHP Code:
Until $i $StundenLines 
(natürlich vorher für $StundenLines die Anzeahl der Zeilen rausgesucht) eingesetzt. Hat wohl dann noch nen zweiten Durchlauf gestartet und da natürlich nix gefunden und nur was in das erste Subscript gepackt
04/02/2014 16:20 alpines#2
Du accest die Sachen direkt, aber was ist wenn die Lines nicht da sind? Prüf mit UBound nach ob das Array wirklich so groß ist.
04/02/2014 16:40 lolkop#3
deine methode die datei auszulesen ist extrem ineffektiv...

mal von der unsinnigen variablen bennenung abgesehen (bei einer textdatei kann es sich selbstverständlich nicht um eine datenbank handeln), wäre es mal interesannt zu wissen, wie deine textdatei denn aufgebaut ist.

sollte sie auch nur halbwegs strukturiert aufgebaut sein, so kannst du den inhalt mit einem regulären ausdruck einlesen und direkt parsen.

der erforderliche code würde sich so auf etwa 5-9 zeilen beschränken.
04/02/2014 16:48 Meredy123#4
Das mein Code nicht unbedingt der effektivste ist, hab ich mir schon gedacht.
Die Datenbank (oder von mir aus auch .txt-Datei die Daten enthält) ist wie ich Anfangs beschrieben habe so aufgebaut "Text"|"Text"|"Zahl" (bzw. User|Projekt|Arbeitsstunden). Das Programm beschränkt sich nicht nur auf die oben beschrieben Funktion und so wird bei einer anderen Funktion, bei der eine Eingabe getätigt wird, bei der eben die User und die Stundenzahlen der Projekte zusammengefügt werden, jeweils eine neue Zeile mit genau der Eingabe (User|Projekt|Arbeitsstunden) gemacht welche ich dann mit oben genannter Funktion auslese und zu verschiedenen Ausgaben zusammenfüge.

€: Kann auch den kompletten Code posten, wenn du unbedingt Lust hast dir 500 Zeilen zusammengeflickten Code anzusehen :D
04/02/2014 17:15 YatoDev#5
Quote:
Originally Posted by Meredy123 View Post
€: Kann auch den kompletten Code posten, wenn du unbedingt Lust hast dir 500 Zeilen zusammengeflickten Code anzusehen :D
wtf ?!

lolkop ich denke stringsplit ist da schon optimal
04/02/2014 18:08 lolkop#6
hier mal ein beispiel, wie ich es machen würde (natürlich ohne zu wissen, wie dein code aussieht):
Code:
Global $StundenDB = "test.txt", $content=getContent()
GUICreate('Gui', 300, 100, Default, Default, 0x10C80000)
$ComboUserStunden = GUICtrlCreateCombo('Alle', 10, 10, 140, 20)
$ComboProjektStunden = GUICtrlCreateCombo('Alle', 150, 10, 140, 20)
For $i=0 To UBound($content)-1 Step 3
	GUICtrlSetData($ComboUserStunden, $content[$i])
	GUICtrlSetData($ComboProjektStunden, $content[$i+1])
Next
$OutputLabel = GUICtrlCreateLabel('', 10, 40, 280, 20)
$GO = GUICtrlCreateButton('Go', 10, 70, 280, 20)

While True
	Switch GUIGetMsg()
		Case -3
			Exit
		Case $GO
			Stunden()
	EndSwitch
WEnd

Func Stunden()
	Local $stunden=0, $user = GUICtrlRead($ComboUserStunden), $project = GUICtrlRead($ComboProjektStunden), $array = getContent()
	For $i=0 To UBound($array)-1 Step 3
		If ($user="Alle" And $project="Alle") Or ($project="Alle" And $user=$array[$i]) Or ($user="Alle" And $project=$array[$i+1]) Or ($user=$array[$i] And $project=$array[$i+1]) Then $stunden+=$array[$i+2]
	Next
	GUICtrlSetData($OutputLabel, ($user="Alle"?"Es wurden ":"Benutzer "&$user&" hat ") & $stunden & " Stunden" & ($project<>"Alle"?" an Projekt "&$project:"") & " gearbeitet.")
EndFunc

Func getContent()
	Return StringRegExp(FileRead($StundenDB), "(.+?)\|(.+?)\|(.+)", 3)
EndFunc
04/02/2014 19:30 Meredy123#7
Wäre es möglich, dass du den Code ein wenig kommentierst? Blicke nicht so direkt durch.

Achja hier mal der Code:
PHP Code:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
#include <File.au3>
#include <ComboConstants.au3>
#include <GuiListView.au3>
#include <StaticConstants.au3>

Global $ProjektDB = @scriptdir "\projektdb.txt" ;Datenbank und Variablen
Global $UserDB = @scriptdir "\userdb.txt"
Global $ProjektUserDB = @scriptdir "\projektuserdb.txt"
Global $AllDB = @scriptdir "\alldb.txt"
Global $StundenDB = @scriptdir "\stundendb.txt"
Global $nProjekt 0
Global $nUser 0
Global $aAdd 0
Global $cItem 0
Global $dItem 0
Global $eItem 0
Global $fItem 0
Global $UserFileLoad 0
Global $u = -1
Global $StundenStunden 0

#Region ### START Koda GUI section ### Form=C:\Users\Maurice\Documents\Projektdatenbank\GUIMain.kxf  ;MainGUI
$GUIMain GUICreate("Projektdatenbank"840438192124)
$ProjektList GUICtrlCreateListView("Projekt|Benutzer|Stunden|Stunden seit letzter Abrechnung"840820321) ;Listview
Global $nLVHandle GUICtrlGetHandle($ProjektList) ;Listview-Handle
_GUICtrlListView_SetColumn
($nLVHandle0"Projekt"1500) ;1.Spalte
_GUICtrlListView_SetColumn
($nLVHandle1"Benutzer"4000) ;2.Spalte
_GUICtrlListView_SetColumn
($nLVHandle2"Stunden"700) ;3.Spalte
_GUICtrlListView_SetColumn
($nLVHandle3"Stunden seit letzter Abrechnung"1950) ;4. Spalte

Global $bNew GUICtrlCreateButton("Neues Projekt"2437610733)
GUICtrlSetCursor (-10)
Global 
$bUserNew GUICtrlCreateButton("Neuer Benutzer"16037610733)
GUICtrlSetCursor (-10)
Global 
$bAdd GUICtrlCreateButton("Benutzer hinzufügen"29637610733)
GUICtrlSetCursor (-10)
Global 
$bWork GUICtrlCreateButton("Leistung hinzufügen"43237610733)
GUICtrlSetCursor (-10)
Global 
$bReset GUICtrlCreateButton("Stunden Reset"57037610733)
GUICtrlSetCursor (-10)
Global 
$bStunden GUICtrlCreateButton("Stundenauflistung"71037610733)
GUICtrlSetCursor (-10)
#EndRegion ### END Koda GUI section ###

#Region ### START Koda GUI section ### Form= ;Neues Projekt GUI
Global $GUINew GUICreate("Neues Projekt anlegen"25595, -1, -1)
Global 
$ButtonOkNew GUICtrlCreateButton("&OK"30647525)
Global 
$ButtonCancelNew GUICtrlCreateButton("Abbrechen"143647525)
Global 
$LabelNew GUICtrlCreateLabel("Projektname"84109280)
GUICtrlSetFont(-1154000"MS Sans Serif")
Global 
$InputNew GUICtrlCreateInput(""83223321)
#EndRegion ### END Koda GUI section ###

#Region ### START Koda GUI section ### Form= ;Neuer Benutzer GUI
Global $GUIUserNew GUICreate("Neuen Benutzer anlegen"25595, -1, -1)
Global 
$ButtonOkUserNew GUICtrlCreateButton("&OK"30647525)
Global 
$ButtonCancelUserNew GUICtrlCreateButton("Abbrechen"143647525)
Global 
$LabelUserNew GUICtrlCreateLabel("Benutzername"84109280)
GUICtrlSetFont(-1154000"MS Sans Serif")
Global 
$InputUserNew GUICtrlCreateInput(""83223321)
#EndRegion ### END Koda GUI section ###

#Region ### START Koda GUI section ### Form= ;Benutzer hinzufügen GUI
$GUIAdd GUICreate("Benutzer zu Projekt hinzufügen"380131302218)
$ComboProjektAdd GUICtrlCreateCombo(""324814525BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
$LabelProjektAdd GUICtrlCreateLabel("Projekt"32166128)
GUICtrlSetFont(-1154000"MS Sans Serif")
$LabelUserAdd GUICtrlCreateLabel("Benutzer"224167928)
GUICtrlSetFont(-1154000"MS Sans Serif")
$ButtonOkAdd GUICtrlCreateButton("OK"80887525)
$ButtonCancelAdd GUICtrlCreateButton("Abbrechen"232887525)
$ComboUserAdd GUICtrlCreateCombo(""2164814525BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
#EndRegion ### END Koda GUI section ###

#Region ### START Koda GUI section ### Form= ;Leistung hinzufügen GUI
$GUIWork GUICreate("Leistung zu Projekt hinzufügen"585143302218)
$ComboProjektWork GUICtrlCreateCombo(""324814525BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
$LabelProjektWork GUICtrlCreateLabel("Projekt"32166128)
GUICtrlSetFont(-1154000"MS Sans Serif")
$LabelUserWork GUICtrlCreateLabel("Benutzer"224167928)
GUICtrlSetFont(-1154000"MS Sans Serif")
$ButtonOkWork GUICtrlCreateButton("OK"200887525)
$ButtonCancelWork GUICtrlCreateButton("Abbrechen"304887525)
$ComboUserWork GUICtrlCreateCombo(""2164814525BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
$InputWork GUICtrlCreateInput(""4084812121)
$LabelStundenWork GUICtrlCreateLabel("Arbeitsstunden"4081613028)
GUICtrlSetFont(-1154000"MS Sans Serif")
#EndRegion ### END Koda GUI section ###

#Region ### START Koda GUI section ### Form= ;Hinweis GUI
$HinweisNew GUICreate("Hinweis"21990321218)
$LabelHinweisNew GUICtrlCreateLabel("Projekt wurde erfolgreich erstellt"161619320)
GUICtrlSetFont(-1104000"MS Sans Serif")
$ButtonHinweisNew GUICtrlCreateButton("Ok"72487525)
#EndRegion ### END Koda GUI section ###

#Region ### START Koda GUI section ### Form= ;Hinweis GUI
$HinweisUserNew GUICreate("Hinweis"21990321218)
$LabelHinweisUserNew GUICtrlCreateLabel("Benutzer wurde erfolgreich erstellt"161619320)
GUICtrlSetFont(-1104000"MS Sans Serif")
$ButtonHinweisUserNew GUICtrlCreateButton("Ok"72487525)
#EndRegion ### END Koda GUI section ###

#Region ### START Koda GUI section ### Form= ;Hinweis GUI
$HinweisAdd GUICreate("Hinweis"21990321218)
$LabelHinweisAdd GUICtrlCreateLabel("Benutzer wurde erfolgreich hinzugefügt"161624020)
GUICtrlSetFont(-1104000"MS Sans Serif")
$ButtonHinweisAdd GUICtrlCreateButton("Ok"72487525)
#EndRegion ### END Koda GUI section ###

#Region ### START Koda GUI section ### Form= ;Hinweis GUI
$HinweisWork GUICreate("Hinweis"21990321218)
$LabelHinweisWork GUICtrlCreateLabel("Leistung wurde erfolgreich hinzugefügt"161624020)
GUICtrlSetFont(-1104000"MS Sans Serif")
$ButtonHinweisWork GUICtrlCreateButton("Ok"72487525)
#EndRegion ### END Koda GUI section ###

#Region ### START Koda GUI section ### Form= ;Error GUI
$ErrorForm GUICreate("ErrorForm"276125192124)
$bError GUICtrlCreateButton("OK"96807525)
$eLabel1 GUICtrlCreateLabel("Leistung hinzufügen fehlgeschlagen. Benutzer"01627320)
GUICtrlSetFont(-1104000"MS Sans Serif")
$eLabel2 GUICtrlCreateLabel("ist nicht Mitglied des Projektes."404818620)
GUICtrlSetFont(-1104000"MS Sans Serif")
#EndRegion ### END Koda GUI section ###

#Region ### START Koda GUI section ### Form= ;Stundenauflistung GUI
$GUIStunden GUICreate("Stundenauflistung"402195192124)
$ComboUserStunden GUICtrlCreateCombo(""242414525BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
$ComboProjektStunden GUICtrlCreateCombo(""2322414525BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
$OutputLabel GUICtrlCreateLabel(""246435668)
GUICtrlSetFont(-1104000"MS Sans Serif")
$bStundenBerechnen GUICtrlCreateButton("Arbeitsstunden anzeigen"3214413925)
$bStundenAbbrechen GUICtrlCreateButton("Abbrechen"23214413925)
#EndRegion ### END Koda GUI section ###

_GUICtrlListView_RegisterSortCallBack ($ProjektList) ;ListView Sortierungsvorraussetzung

GUISetState 
(@SW_SHOW$GUIMain) ;Main GUI anzeigen



If FileExists ($AllDBThen AllLoad() ;DatenBank ins Listview laden

While 1
    $nMsg 
GUIGetMsg(1)
    Switch 
$nMsg [0]
    Case 
$ProjektList ;sortieren
       _GUICtrlListView_SortItems 
($nLVHandleGUICtrlGetState($ProjektList))
    Case 
$bNew ;neues Projekt anlegen
       WinSetTitle 
($GUINew"""Neues Projekt")
       
GUISetState (@SW_SHOW$GUINew)
       
GUISetState (@SW_HIDE$GUIMain)
    Case 
$bUserNew ;neuer Benutzer
       WinSetTitle 
($GUIUserNew"""Neuer Benutzer")
       
GUISetState (@SW_Show$GUIUserNew)
       
GUISetState (@SW_HIDE$GUIMain)
    Case 
$bAdd ;Benutzer einem Projekt hinzufügen
       WinSetTitle 
($GUIAdd"""Benutzer hinzufügen")
       
GUISetState (@SW_SHOW$GUIAdd)
       
GUISetState (@SW_HIDE$GUIMain)
       
GUICtrlSetData($ComboProjektAdd"")
       
$ProjektFileLoad FileOpen($ProjektDB) ;Projekte aus ProjektDB in Combobox laden
       Local $sAdd  
""$i 0
       
Do
         
$i += 1
         $sAdd 
&= FileReadLine($ProjektFileLoad$i) & "|"
       
Until @Error <> 0
       GUICtrlSetData
($ComboProjektAdd$sAdd)
       
FileClose($ProjektFileLoad)
       
GUICtrlSetData($ComboUserAdd"")
       
$UserFileLoad FileOpen($UserDB) ;User aus UserDB in Combobox laden
       Local $tAdd  
""$i 0
       
Do
         
$i += 1
         $tAdd 
&= FileReadLine($UserFileLoad$i) & "|"
       
Until @Error <> 0
       GUICtrlSetData
($ComboUserAdd$tAdd)
       
FileClose($UserFileLoad)
    Case 
$bWork ;Leistung hinzufügen
       WinSetTitle 
($GUIWork"""Leistung hinzufügen")
       
GUISetState (@SW_SHOW$GUIWork)
       
GUISetState (@SW_HIDE$GUIMain)
       
GUICtrlSetData($ComboProjektWork"")
       
$ProjektFileLoad2 FileOpen($ProjektDB) ;Projekte aus ProjektDB in Combobox laden
       Local $uAdd  
""$i 0
       
Do
         
$i += 1
         $uAdd 
&= FileReadLine($ProjektFileLoad2$i) & "|"
       
Until @Error <> 0
       GUICtrlSetData
($ComboProjektWork$uAdd)
       
FileClose($ProjektFileLoad2)
       
GUICtrlSetData($ComboUserWork"")
       
$UserFileLoad2 FileOpen($UserDB) ;User aus UserDB in Combobox laden
       Local $vAdd  
""$i 0
       
Do
         
$i += 1
         $vAdd 
&= FileReadLine($UserFileLoad2$i) & "|"
       
Until @Error <> 0
       GUICtrlSetData
($ComboUserWork$vAdd)
       
FileClose($UserFileLoad2)
    Case 
$bReset
       Reset
()
    Case 
$ButtonOkNew ;Neues Projekt Button Funktionsstart
       NeuesProjekt
()
    Case 
$ButtonOkUserNew ;Neues Benutzer Button Funktionsstart
       NeuerUser
()
    Case 
$ButtonOkAdd ;Benutzer hinzufügen Button Funktionsstart
       UserAdd
()
    Case 
$ButtonOkWork ;Arbeit hinzufügen Button Funktionsstart
       WorkAdd
()
    Case 
$bError ;Errorhinweis wahrgenommen
       GUISetState 
(@SW_HIDE$ErrorForm)
       
GUISetState (@SW_SHOW$GUIWork)
       
WinActivate ($GUIWork)
    Case 
$bStunden ;Stundenauflistung
       WinSetTitle 
($GUIStunden"""Stundenauflistung")
       
GUISetState (@SW_HIDE$GUIMain)
       
GUISetState (@SW_SHOW$GUIStunden)
       
WinActivate ($GUIStunden)
       
GUICtrlSetData($ComboProjektStunden"")
       
$ProjektFileLoad3 FileOpen($ProjektDB) ;Projekte aus ProjektDB in Combobox laden
       Local $wAdd  
""$i 0
       
Do
         
$i += 1
         $wAdd 
&= FileReadLine($ProjektFileLoad3$i) & "|"
       
Until @Error <> 0
       GUICtrlSetData
($ComboProjektStunden"Alle" "|" $wAdd)
       
FileClose($ProjektFileLoad3)
       
GUICtrlSetData($ComboUserStunden"")
       
$UserFileLoad3 FileOpen($UserDB) ;User aus UserDB in Combobox laden
       Local $xAdd  
""$i 0
       
Do
         
$i += 1
         $xAdd 
&= FileReadLine($UserFileLoad3$i) & "|"
       
Until @Error <> 0
       GUICtrlSetData
($ComboUserStunden"Alle" "|" $xAdd)
       
FileClose($UserFileLoad3)
    Case 
$bStundenBerechnen
       Stunden
()
    Case 
$GUI_EVENT_CLOSE$ButtonCancelNew$ButtonCancelUserNew$ButtonCancelAdd$ButtonCancelWork$ButtonHinweisNew$ButtonHinweisUserNew$ButtonHinweisAdd$ButtonHinweisWork$bStundenAbbrechen  ;Schließen
       
Switch $nMSG[1]
          Case 
$GUIMain
             
If MSGBox(32+4"Beenden""Wollen sie das Programm wirklich beenden?") = 6 Then End()
          Case 
$GUINew
             GUISetState 
(@SW_HIDE$GUINew)
             
GUISetState (@SW_SHOW$GUIMain)
             
WinActivate ($GUIMain)
          Case 
$GUIUserNew
             GUISetState 
(@SW_HIDE$GUIUserNew)
             
GUISetState (@SW_SHOW$GUIMain)
             
WinActivate ($GUIMain)
          Case 
$GUIAdd
             GUISetState 
(@SW_HIDE$GUIAdd)
             
GUISetState (@SW_SHOW$GUIMain)
             
WinActivate ($GUIMain)
          Case 
$GUIWork
             GUISetState 
(@SW_HIDE$GUIWork)
             
GUISetState (@SW_SHOW$GUIMain)
             
WinActivate ($GUIMain)
          Case 
$HinweisNew
             GUISetState 
(@SW_HIDE$HinweisNew)
             
GUISetState (@SW_SHOW$GUINew)
             
WinActivate ($GUINew)
          Case 
$HinweisUserNew
             GUISetState 
(@SW_HIDE$HinweisUserNew)
             
GUISetState (@SW_SHOW$GUIUserNew)
             
WinActivate ($GUIUserNew)
          Case 
$HinweisAdd
             GUISetState 
(@SW_HIDE$HinweisAdd)
             
GUISetState (@SW_SHOW$GUIAdd)
             
WinActivate ($GUIAdd)
          Case 
$HinweisWork
             GUISetState 
(@SW_HIDE$HinweisWork)
             
GUISetState (@SW_SHOW$GUIWork)
             
WinActivate ($GUIWork)
          Case 
$GUIStunden
             GUISetState 
(@SW_HIDE$GUIStunden)
             
GUISetState (@SW_SHOW$GUIMain)
             
WinActivate ($GUIMain)
       EndSwitch
    EndSwitch
WEnd

Func NeuesProjekt
() ;Funktion Neues Projekt
   $nProjekt 
GUICtrlRead ($InputNew)
   
GUISetState (@SW_HIDE$GUINew)
   
GUISetState (@SW_SHOW$HinweisNew)
   
GUICtrlSetData ($InputNew"")
   
ProjektSave()
   
EndFunc

Func NeuerUser
() ;Funktion Neuer Benutzer
   $nUser 
GUICtrlRead ($InputUserNew)
   
GUISetState (@SW_HIDE$GUIUserNew)
   
GUISetState (@SW_SHOW$HinweisUserNew)
   
GUICtrlSetData ($InputUserNew"")
   
UserSave()
   
EndFunc

Func UserAdd
() ;Funktion Benutzer hinzufügen
   $aProjekt 
GUICtrlRead ($ComboProjektAdd)
   
$aUser GUICtrlRead ($ComboUserAdd)
   
$aAdd $aProjekt "|" $aUser
   GUISetState 
(@SW_HIDE$GUIAdd)
   
GUISetState (@SW_SHOW$HinweisAdd)
   
AddSave()
EndFunc

Func WorkAdd
() ;Funktion Leistung hinzufügen
   $wProjekt 
GUICtrlRead ($ComboProjektWork)
   
$wUser GUICtrlRead ($ComboUserWork)
   
$wStunden GUICtrlRead ($InputWork)
   
$ProjektUserFileLoad FileOpen($ProjektUserDB) ;Test ob User Projekt zugewiesen wurde
       Local $i 
0
       Local $o 
0
       
Do
         
$i += 1
         $iLine 
FileReadLine($ProjektUserFileLoad$i)
         If 
$iLine $wProjekt "|" $wUser Then
            $o 
1
         
EndIf
      
Until @Error <> 0
       
If $o=1 Then ;Wenn zu gewiesendann
       FileClose
($UserFileLoad2) ;in StundenDB schreiben
       $StundenFileLoad 
FileOpen($StundenDB1)
       
FileWriteLine($StundenFileLoad$wUser "|" $wProjekt "|" $wStunden)
       
FileClose($StundenFileLoad)
          
Local $j = -1
          Local $k 
0
          $ItemCount 
_GUICtrlListView_GetItemCount($nLVHandle)
          Do ;
Schleife zum Testen ob Projekt/User im Projekt exisitiert
             $j 
+= 1
             $Itemtext 
_GUICtrlListView_GetItemText ($nLVHandle$j0)
             
$Itemtext2 _GUICtrlListView_GetItemText ($nLVHandle$j1)
             
$Itemtext3 _GUICtrlListView_GetItemText ($nLVHandle ,$j2)
             If 
$Itemtext $wProjekt And StringInStr($Itemtext2$wUser)  <> 0 Then ;Wenn Projekt und User im Projekt schon existierendann
                _GUICtrlListView_SetItemText 
($nLVHandle$j$Itemtext3 $wStunden2)
                
_GUICtrlListView_SetItemText ($nLVHandle$j$Itemtext3 $wStunden3)
                
$k 1
             
ElseIf $ItemText $wProjekt And StringInStr($Itemtext2$wUser)  = 0 Then ;Wenn nur Projekt existiertdann
                _GUICtrlListView_SetItemText 
($nLVHandle$j$Itemtext2 ", " $wUser1)
                
_GUICtrlListView_SetItemText ($nLVHandle$j$Itemtext3 $wStunden2)
                
_GUICtrlListView_SetItemText ($nLVHandle$j$Itemtext3 $wStunden3)
                
$k 1
             
EndIf
          
Until $j $Itemcount
          
If $k 0 Then ;Wenn weder nochdann neuer Eintrag
             _GUICtrlListView_AddItem 
($nLVHandle""$ItemCount)
             
_GUICtrlListView_SetItemText ($nLVHandle$ItemCount$wProjekt0)
             
_GUICtrlListView_SetItemText ($nLVHandle$ItemCount$wUser1)
             
_GUICtrlListView_SetItemText ($nLVHandle$ItemCount$wStunden2)
             
_GUICtrlListView_SetItemText ($nLVHandle$ItemCount$wStunden3)
          EndIf
          
GUISetState (@SW_HIDE$GUIWork)
          
GUISetState (@SW_SHOW$HinweisWork)
       Else
          
GUISetState (@SW_HIDE$GUIWork)
          
GUISetState (@SW_SHOW$ErrorForm)
       EndIf
   
WorkSave()
EndFunc

Func ProjektSave
() ;Funktion Projekte speichern
   $ProjektFile 
FileOpen ($ProjektDB1)
   
FileWriteLine ($ProjektFile$nProjekt)
   
FileClose ($ProjektFile)
EndFunc

Func UserSave
() ;Funktion Benutzer speichern
   $UserFile 
FileOpen ($UserDB1)
   
FileWriteLine ($Userfile$nUser)
   
FileClose ($UserFile)
EndFunc

Func AddSave
() ;Funktion ProjekteBenutzer speichern
    $AddFile 
FileOpen ($ProjektUserDB1)
    
FileWriteLine ($AddFile$aAdd)
    
FileClose ($AddFile)
 
EndFunc

Func WorkSave
() ;Funktion Leistung speichern
   Local $iCount 
_GUICtrlListView_GetItemCount($nLVHandle) - 1
   Local $WorkFile 
FileOpen ($AllDB2)
   For $
1=0 To $iCount
      $sItem 
_GUICtrlListView_GetItemTextString ($nLVHandle, $1)
      
FileWriteLine($WorkFile$sItem)
   
Next
   FileClose
($WorkFile)
EndFunc

Func AllLoad
() ;Funktion Datenbank ins Listview laden
   Local $WorkFileLoad 
FileOpen ($AllDB0)
   
_GUICtrlListView_BeginUpdate($nLVHandle)
   While 
True
      $bItem 
FileReadLine ($WorkFileLoad)
      If @
error Then ExitLoop
      GUICtrlCreateListViewItem 
($bItem$ProjektList)
   
WEnd
   _GUICtrlListView_EndUpdate
($nLVHandle)
   
FileClose ($WorkFileLoad)
EndFunc

Func Reset
() ;Stundenzahl zurücksetzen
   $u 
_GUICtrlListView_GetSelectionMark  ($nLVHandle)
   
_GUICtrlListView_SetItemText ($nLVHandle$u03)
EndFunc

Func Stunden
() ;Stundendetails auflisten
   $StundenFileLoad2 
FileOpen ($StundenDB)
   
$StundenLines _FileCountLines ($StundenDB)
   
$StundenUser GUICtrlRead ($ComboUserStunden)
   
$StundenProjekt GUICtrlRead ($ComboProjektStunden)
   If 
$StundenUser "Alle" And $StundenProjekt "Alle" Then ;Wenn Alle User Alle Projekte ausgewählt wurdendann (Stunden insg.)
      
Local $i 0
      Local $StundenStunden 
0
      
Do
         
$i += 1
         $iLine 
FileReadLine($StundenFileLoad2$i)
         
$iSplit StringSplit($iLine"|")
         
$StundenStunden $StundenStunden $iSplit[3]
      
Until $i $StundenLines
      GUICtrlSetData
($OutputLabel"Insgesamt wurden " $StundenStunden " Stunden gearbeitet")
   ElseIf 
$StundenUser <> "Alle" And $StundenProjekt "Alle" Then ;Wenn Alle Projekte eines Users ausgewählt wurdendann (Stunden eines Users insg.)
      
Local $i 0
      Local $StundenStunden 
0
      
Do
         
$i += 1
         $iLine 
FileReadLine($StundenFileLoad2$i)
         
$iSplit StringSplit($iLine"|")
         If 
$iSplit[1] = $StundenUser Then
            $StundenStunden 
$StundenStunden $iSplit[3]
         EndIf
      
Until $i $StundenLines
      GUICtrlSetData
($OutputLabel"Benutzer " $StundenUser " hat insgesamt " $StundenStunden " Stunden gearbeitet.")
   ElseIf 
$StundenUser "Alle" And $StundenProjekt <> "Alle" Then ;Wenn alle User eines Projektes ausgewählt wurdendann (Stunden eines Projektes insg.)
      
Local $i 0
      Local $StundenStunden 
0
      
Do
         
$i += 1
         $iLine 
FileReadLine($StundenFileLoad2$i)
         
$iSplit StringSplit($iLine"|")
         If 
$iSplit[2] = $StundenProjekt Then
            $StundenStunden 
$StundenStunden $iSplit[3]
         EndIf
      
Until $i $StundenLines
      GUICtrlSetData
($OutputLabel"Für Projekt " $StundenProjekt " wurden insgesamt " $StundenStunden " Stunden gearbeitet.")
      Else ;
Wenn ein spezifischer User und ein spezifisches Projekt ausgewählt wurdendann (Stunden eines Users an einem Projekt)
      
Local $i 0
      Local $StundenStunden 
0
      
Do
         
$i += 1
         $iLine 
FileReadLine($StundenFileLoad2$i)
         
$iSplit StringSplit($iLine"|")
         If 
$iSplit[1] = $StundenUser And $iSplit[2] = $StundenProjekt Then
            $StundenStunden 
$StundenStunden $iSplit[3]
         EndIf
      
Until $i $StundenLines
      GUICtrlSetData
($OutputLabel"Benutzer " $StundenUser " hat " $StundenStunden " Stunden an Projekt " $StundenProjekt " gearbeitet.")
   EndIf
   
FileClose($StundenFileLoad2)
EndFunc

Func End
() ;Schließen
   WorkSave
()
   
_GUICtrlListView_UnRegisterSortCallBack ($nLVHandle)
   Exit
EndFunc 
Laufen tut auf jeden fall mal alles. Bissjen schlanker könnte es aber ruhig sein ;)
Hab zur Übersichtlichkeit die.au3 Datei mal angehangen, ist auch kommentiert
04/02/2014 20:43 lolkop#8
Quote:
Originally Posted by Meredy123 View Post
Wäre es möglich, dass du den Code ein wenig kommentierst? Blicke nicht so direkt durch.
da der code doch recht übersichtlich ist, sollte eigentlich klar sein, wie sich das ganze zusammenstellt.

die datei wird wie angegeben eingelesen und durch einen regulären ausdruck geparst. im anschluss werden in einer for-schleife die stunden zusammen gezählt (addiert werden nur stunden die eines der kriterien erfüllen).
im anschluss wird dann je nach ausgangslage der combo boxen der zusammengesetzte string im label ausgegeben.

Edit:
ich weis nicht, wieso du in deinem projekt ständig den begriff datenbank verwendest, wo du doch garkeine datenbank nutzt...

für deinen fall würde es im übrigen sinn machen, nur eine eingabemaske und ein datenfile zu nutzen. der code dürfte sich damit auf etwa 50zeilen belaufen. am ende wäre das script damit deutlich dynamischer und vorallem auch übersichtlicher. die suche eventueller fehler steigt ja bekanntlich mit der komplexität des codes, wodurch ein effizienter übersichtlicher code immer bevorzugt werden sollte.