Register for your free account! | Forgot your password?

Go Back   elitepvpers › Coders Den › AutoIt
You last visited: Today at 15:02

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



StringSplit Array-Variable Problem

Discussion on StringSplit Array-Variable Problem within the AutoIt forum part of the Coders Den category.

Reply
 
Old   #1
 
elite*gold: 0
Join Date: Jul 2010
Posts: 205
Received Thanks: 31
StringSplit Array-Variable Problem

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 <> 0 
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
Meredy123 is offline  
Old   #2
 
alpines's Avatar
 
elite*gold: 60
Join Date: Aug 2009
Posts: 2,256
Received Thanks: 815
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.
alpines is offline  
Old   #3
 
lolkop's Avatar
 
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
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.
lolkop is offline  
Old   #4
 
elite*gold: 0
Join Date: Jul 2010
Posts: 205
Received Thanks: 31
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
Meredy123 is offline  
Old   #5
 
YatoDev's Avatar
 
elite*gold: 50
Join Date: Sep 2012
Posts: 3,841
Received Thanks: 1,462
Quote:
Originally Posted by Meredy123 View Post
€: Kann auch den kompletten Code posten, wenn du unbedingt Lust hast dir 500 Zeilen zusammengeflickten Code anzusehen
wtf ?!

lolkop ich denke stringsplit ist da schon optimal
YatoDev is offline  
Old   #6
 
lolkop's Avatar
 
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
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
lolkop is offline  
Thanks
1 User
Old   #7
 
elite*gold: 0
Join Date: Jul 2010
Posts: 205
Received Thanks: 31
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", 840, 438, 192, 124)
$ProjektList = GUICtrlCreateListView("Projekt|Benutzer|Stunden|Stunden seit letzter Abrechnung", 8, 40, 820, 321) ;Listview
Global $nLVHandle = GUICtrlGetHandle($ProjektList) ;Listview-Handle
_GUICtrlListView_SetColumn
($nLVHandle, 0, "Projekt", 150, 0) ;1.Spalte
_GUICtrlListView_SetColumn
($nLVHandle, 1, "Benutzer", 400, 0) ;2.Spalte
_GUICtrlListView_SetColumn
($nLVHandle, 2, "Stunden", 70, 0) ;3.Spalte
_GUICtrlListView_SetColumn
($nLVHandle, 3, "Stunden seit letzter Abrechnung", 195, 0) ;4. Spalte

Global $bNew = GUICtrlCreateButton("Neues Projekt", 24, 376, 107, 33)
GUICtrlSetCursor (-1, 0)
Global 
$bUserNew = GUICtrlCreateButton("Neuer Benutzer", 160, 376, 107, 33)
GUICtrlSetCursor (-1, 0)
Global 
$bAdd = GUICtrlCreateButton("Benutzer hinzufügen", 296, 376, 107, 33)
GUICtrlSetCursor (-1, 0)
Global 
$bWork = GUICtrlCreateButton("Leistung hinzufügen", 432, 376, 107, 33)
GUICtrlSetCursor (-1, 0)
Global 
$bReset = GUICtrlCreateButton("Stunden Reset", 570, 376, 107, 33)
GUICtrlSetCursor (-1, 0)
Global 
$bStunden = GUICtrlCreateButton("Stundenauflistung", 710, 376, 107, 33)
GUICtrlSetCursor (-1, 0)
#EndRegion ### END Koda GUI section ###

#Region ### START Koda GUI section ### Form= ;Neues Projekt GUI
Global $GUINew = GUICreate("Neues Projekt anlegen", 255, 95, -1, -1)
Global 
$ButtonOkNew = GUICtrlCreateButton("&OK", 30, 64, 75, 25)
Global 
$ButtonCancelNew = GUICtrlCreateButton("Abbrechen", 143, 64, 75, 25)
Global 
$LabelNew = GUICtrlCreateLabel("Projektname", 8, 4, 109, 28, 0)
GUICtrlSetFont(-1, 15, 400, 0, "MS Sans Serif")
Global 
$InputNew = GUICtrlCreateInput("", 8, 32, 233, 21)
#EndRegion ### END Koda GUI section ###

#Region ### START Koda GUI section ### Form= ;Neuer Benutzer GUI
Global $GUIUserNew = GUICreate("Neuen Benutzer anlegen", 255, 95, -1, -1)
Global 
$ButtonOkUserNew = GUICtrlCreateButton("&OK", 30, 64, 75, 25)
Global 
$ButtonCancelUserNew = GUICtrlCreateButton("Abbrechen", 143, 64, 75, 25)
Global 
$LabelUserNew = GUICtrlCreateLabel("Benutzername", 8, 4, 109, 28, 0)
GUICtrlSetFont(-1, 15, 400, 0, "MS Sans Serif")
Global 
$InputUserNew = GUICtrlCreateInput("", 8, 32, 233, 21)
#EndRegion ### END Koda GUI section ###

#Region ### START Koda GUI section ### Form= ;Benutzer hinzufügen GUI
$GUIAdd = GUICreate("Benutzer zu Projekt hinzufügen", 380, 131, 302, 218)
$ComboProjektAdd = GUICtrlCreateCombo("", 32, 48, 145, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
$LabelProjektAdd = GUICtrlCreateLabel("Projekt", 32, 16, 61, 28)
GUICtrlSetFont(-1, 15, 400, 0, "MS Sans Serif")
$LabelUserAdd = GUICtrlCreateLabel("Benutzer", 224, 16, 79, 28)
GUICtrlSetFont(-1, 15, 400, 0, "MS Sans Serif")
$ButtonOkAdd = GUICtrlCreateButton("OK", 80, 88, 75, 25)
$ButtonCancelAdd = GUICtrlCreateButton("Abbrechen", 232, 88, 75, 25)
$ComboUserAdd = GUICtrlCreateCombo("", 216, 48, 145, 25, BitOR($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", 585, 143, 302, 218)
$ComboProjektWork = GUICtrlCreateCombo("", 32, 48, 145, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
$LabelProjektWork = GUICtrlCreateLabel("Projekt", 32, 16, 61, 28)
GUICtrlSetFont(-1, 15, 400, 0, "MS Sans Serif")
$LabelUserWork = GUICtrlCreateLabel("Benutzer", 224, 16, 79, 28)
GUICtrlSetFont(-1, 15, 400, 0, "MS Sans Serif")
$ButtonOkWork = GUICtrlCreateButton("OK", 200, 88, 75, 25)
$ButtonCancelWork = GUICtrlCreateButton("Abbrechen", 304, 88, 75, 25)
$ComboUserWork = GUICtrlCreateCombo("", 216, 48, 145, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
$InputWork = GUICtrlCreateInput("", 408, 48, 121, 21)
$LabelStundenWork = GUICtrlCreateLabel("Arbeitsstunden", 408, 16, 130, 28)
GUICtrlSetFont(-1, 15, 400, 0, "MS Sans Serif")
#EndRegion ### END Koda GUI section ###

#Region ### START Koda GUI section ### Form= ;Hinweis GUI
$HinweisNew = GUICreate("Hinweis", 219, 90, 321, 218)
$LabelHinweisNew = GUICtrlCreateLabel("Projekt wurde erfolgreich erstellt", 16, 16, 193, 20)
GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
$ButtonHinweisNew = GUICtrlCreateButton("Ok", 72, 48, 75, 25)
#EndRegion ### END Koda GUI section ###

#Region ### START Koda GUI section ### Form= ;Hinweis GUI
$HinweisUserNew = GUICreate("Hinweis", 219, 90, 321, 218)
$LabelHinweisUserNew = GUICtrlCreateLabel("Benutzer wurde erfolgreich erstellt", 16, 16, 193, 20)
GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
$ButtonHinweisUserNew = GUICtrlCreateButton("Ok", 72, 48, 75, 25)
#EndRegion ### END Koda GUI section ###

#Region ### START Koda GUI section ### Form= ;Hinweis GUI
$HinweisAdd = GUICreate("Hinweis", 219, 90, 321, 218)
$LabelHinweisAdd = GUICtrlCreateLabel("Benutzer wurde erfolgreich hinzugefügt", 16, 16, 240, 20)
GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
$ButtonHinweisAdd = GUICtrlCreateButton("Ok", 72, 48, 75, 25)
#EndRegion ### END Koda GUI section ###

#Region ### START Koda GUI section ### Form= ;Hinweis GUI
$HinweisWork = GUICreate("Hinweis", 219, 90, 321, 218)
$LabelHinweisWork = GUICtrlCreateLabel("Leistung wurde erfolgreich hinzugefügt", 16, 16, 240, 20)
GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
$ButtonHinweisWork = GUICtrlCreateButton("Ok", 72, 48, 75, 25)
#EndRegion ### END Koda GUI section ###

#Region ### START Koda GUI section ### Form= ;Error GUI
$ErrorForm = GUICreate("ErrorForm", 276, 125, 192, 124)
$bError = GUICtrlCreateButton("OK", 96, 80, 75, 25)
$eLabel1 = GUICtrlCreateLabel("Leistung hinzufügen fehlgeschlagen. Benutzer", 0, 16, 273, 20)
GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
$eLabel2 = GUICtrlCreateLabel("ist nicht Mitglied des Projektes.", 40, 48, 186, 20)
GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
#EndRegion ### END Koda GUI section ###

#Region ### START Koda GUI section ### Form= ;Stundenauflistung GUI
$GUIStunden = GUICreate("Stundenauflistung", 402, 195, 192, 124)
$ComboUserStunden = GUICtrlCreateCombo("", 24, 24, 145, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
$ComboProjektStunden = GUICtrlCreateCombo("", 232, 24, 145, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
$OutputLabel = GUICtrlCreateLabel("", 24, 64, 356, 68)
GUICtrlSetFont(-1, 10, 400, 0, "MS Sans Serif")
$bStundenBerechnen = GUICtrlCreateButton("Arbeitsstunden anzeigen", 32, 144, 139, 25)
$bStundenAbbrechen = GUICtrlCreateButton("Abbrechen", 232, 144, 139, 25)
#EndRegion ### END Koda GUI section ###

_GUICtrlListView_RegisterSortCallBack ($ProjektList) ;ListView Sortierungsvorraussetzung

GUISetState 
(@SW_SHOW, $GUIMain) ;Main GUI anzeigen



If FileExists ($AllDB) Then AllLoad() ;DatenBank ins Listview laden

While 1
    $nMsg 
= GUIGetMsg(1)
    Switch 
$nMsg [0]
    Case 
$ProjektList ;sortieren
       _GUICtrlListView_SortItems 
($nLVHandle, GUICtrlGetState($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 gewiesen, dann
       FileClose
($UserFileLoad2) ;in StundenDB schreiben
       $StundenFileLoad 
= FileOpen($StundenDB, 1)
       
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, $j, 0)
             
$Itemtext2 = _GUICtrlListView_GetItemText ($nLVHandle, $j, 1)
             
$Itemtext3 = _GUICtrlListView_GetItemText ($nLVHandle ,$j, 2)
             If 
$Itemtext = $wProjekt And StringInStr($Itemtext2, $wUser)  <> 0 Then ;Wenn Projekt und User im Projekt schon existieren, dann
                _GUICtrlListView_SetItemText 
($nLVHandle, $j, $Itemtext3 + $wStunden, 2)
                
_GUICtrlListView_SetItemText ($nLVHandle, $j, $Itemtext3 + $wStunden, 3)
                
$k = 1
             
ElseIf $ItemText = $wProjekt And StringInStr($Itemtext2, $wUser)  = 0 Then ;Wenn nur Projekt existiert, dann
                _GUICtrlListView_SetItemText 
($nLVHandle, $j, $Itemtext2 & ", " & $wUser, 1)
                
_GUICtrlListView_SetItemText ($nLVHandle, $j, $Itemtext3 + $wStunden, 2)
                
_GUICtrlListView_SetItemText ($nLVHandle, $j, $Itemtext3 + $wStunden, 3)
                
$k = 1
             
EndIf
          
Until $j = $Itemcount
          
If $k = 0 Then ;Wenn weder noch, dann neuer Eintrag
             _GUICtrlListView_AddItem 
($nLVHandle, "", $ItemCount)
             
_GUICtrlListView_SetItemText ($nLVHandle, $ItemCount, $wProjekt, 0)
             
_GUICtrlListView_SetItemText ($nLVHandle, $ItemCount, $wUser, 1)
             
_GUICtrlListView_SetItemText ($nLVHandle, $ItemCount, $wStunden, 2)
             
_GUICtrlListView_SetItemText ($nLVHandle, $ItemCount, $wStunden, 3)
          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 ($ProjektDB, 1)
   
FileWriteLine ($ProjektFile, $nProjekt)
   
FileClose ($ProjektFile)
EndFunc

Func UserSave
() ;Funktion Benutzer speichern
   $UserFile 
= FileOpen ($UserDB, 1)
   
FileWriteLine ($Userfile, $nUser)
   
FileClose ($UserFile)
EndFunc

Func AddSave
() ;Funktion ProjekteBenutzer speichern
    $AddFile 
= FileOpen ($ProjektUserDB, 1)
    
FileWriteLine ($AddFile, $aAdd)
    
FileClose ($AddFile)
 
EndFunc

Func WorkSave
() ;Funktion Leistung speichern
   Local $iCount 
= _GUICtrlListView_GetItemCount($nLVHandle) - 1
   Local $WorkFile 
= FileOpen ($AllDB, 2)
   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 ($AllDB, 0)
   
_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, $u, 0, 3)
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 wurden, dann (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 wurden, dann (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 wurden, dann (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 wurden, dann (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
Attached Files
File Type: rar Projektdatenbank (1).rar (3.8 KB, 0 views)
Meredy123 is offline  
Old   #8
 
lolkop's Avatar
 
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
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.
lolkop is offline  
Reply


Similar Threads Similar Threads
Array und Stringsplit
09/21/2013 - AutoIt - 5 Replies
Tach hab nun wieder ein kleines problem und zwar das sich stringsplit und arrays nicht so wirklich vertragen. Ich lese aus einer .ini mehrere zahlen aus, da nun die zahlen einzeln ausgegebn werden müssen verwende ich stringsplit. Wenn ich nun via _arrayDisblay diese ausgeben will geht das ohne probleme, sobald ich aber einzelne werte des array ausgebn will gibt er mir ein error aus. $wearing1 = IniRead("test.ini","1","2 ","") $aZahlen = StringSplit($wearing1, " ",2)...
subscript used with non-array variable
06/09/2013 - AutoIt - 6 Replies
Hey Leute, ich bin vor kurzem auf AutoIT gestoßen und interessiere mich für die ImageSearch Funktion, also habe ich mir ein kleines Script gebastelt. Das Script soll nach einem bestimmten Bild suchen und wenn dieses Bild nicht gefunden wurde die F1 Taste drücken (F1 generiert in einem Spiel für welches ich das Script nutzen will ein neues Bild). Das Script soll dann solange F1 drücken, bis ein bestimmtes Bild gefunden wurde, und dann eine MsgBox anzeigen. Da es mein erstes kleines mini...
[HELP] _FTP_ListToArrayEx Subscript used with non Array variable
02/29/2012 - AutoIt - 2 Replies
Ich habe das problem das bei meinem Script der Fehler : "Subscript used with non Array variable" auftaucht. Der Fehler ist angeblich auf Linie 25 aber _FTP_ListToArrayEx müsste eigentlich ein Array zurückgeben sogar bei einem Fehler und ich bin mir sicher das die Connection Stimmt. Ich hoffe ihr könnt mir Helfen Ja ich weis ich könnte das auch kürzer machen aber für`n Momment is es so okey also bitte unterlasst diesbezügliche Kommentare Script: #include-once
Problem error: Subscript used whit non-Array variable "
08/26/2010 - Last Chaos - 1 Replies
hey leute, seitdem mein laptop ein windows update gemacht hat funktioniert der ultra bot nicht. es dann kommt immer die fehlermeldung " error: Subscript used whit non-Array variable " vor diesem update ging der bot noch.
beliebiege variable aus array
04/21/2010 - AutoIt - 3 Replies
hallo zusammen. ich arbeite zur zeit an einem kleinen programm und dafür ist es nötig, dass autoit vergleicht, ob eine bestimmte variable innerhalb eines array vorhanden ist. das array enthält zum bsp variabeln mit den werten: 1, 2 und 3. jetzt soll überprüft werden, ob die variable a im array ist (a=1, z.B.). das array hab ich natürlich schon erstellt (1dimensional), nur der abgleich ist knifflig. ich habs mit if $a= $array_items Then $score= $score+1 EndIf



All times are GMT +2. The time now is 15:02.


Powered by vBulletin®
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2026 elitepvpers All Rights Reserved.