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
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.
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
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
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
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
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.
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