Variable weiter verarbeiten aus einem Array bringt Fehlermeldung

  • Hallo zusammen,

    ich habe ein komische Problem.

    ich erhalte durch einen Oracle connect ein Array durch $object.GetRows
    Diese Array enthält definitiv 3 Zeilen (ich lasse es mir anzeigen).
    Wenn ich nun irgendeine Zeile verarbeiten will, sei es auch nur mit ner MSGBox erhalte ist den Fehler:

    Error: Array variable has incorrect number of subscripts or subscript dimension range exceeded.

    Kann mir jemand sagen, was ich falsch mache ??

    [autoit]


    $ergebnis = $object.GetRows
    $d3l = FileOpen(@ScriptDir&"\temp.d3l",2)
    FileWriteLine($d3l, "idlist" & @CRLF)
    $x = 0
    While $x <= UBound($ergebnis)-1
    $temp = _ArrayToString($ergebnis[$x])
    FileWriteLine($d3l, $temp & @CRLF)
    $x = $x + 1
    WEnd
    FileClose($d3l)

    [/autoit]
  • Zitat

    "Error: Array variable has incorrect number of subscripts or subscript dimension range exceeded."


    Das bedeutet nur das du ein Index angibts welches nicht existiert. (< 0 oder >= Ubound Array)
    Da ich leider nicht das Objekt hab kann ich dir nur eins raten: Lass dir jedes mal dein $x in einer MsgBox ausgeben, es überzählt sich anscheinend. Es darf nicht größer als 2 sein, da du meintest das Array hat 3 Felder.


    EDIT: Es kann auch am _ArrayToString liegen. Du übergibst kein Array sondern nur einen Wert aus diesem. Kann sein das es deswegen abstürzt aber dann wäre der Fehler anders. Aufjeden Fall ist _ArrayToString an der Stelle falsch, da du nur einen Wert in einen String wandelst.

  • Erstmal danke für die schnelle Mithilfe.

    $x ist bei mir 2, aber selbst wenn ich MsgBox(0,"",$ergebnis[0]) ausgeben lasse, erhalte ich den selben Fehler, obwohl ich mit _ArrayDisplay($ergebnis) eindeutig Inhalte sehe.
    Ich bin komplett ratlos.

  • Wenns nicht zu lang ist, kannst du dann mal den Code posten? Den gesammten. Und wann lässt du dir das Array ausgeben und wann die MsgBox? Mach mal direkt nach dem erstellen ein _ArrayDisplay und eine MsgBox, dann verhinderst du das es zwischendurch irgendwie verändert wird.

    EDIT: In _ArrayToString wird das Array als Referenz übergeben, das heißt verändert. Änder es mal auf String dann gehts direkt oder mach die Schleife weg und übergeb nur das Array ohne Index.

    Versuch das mal:

    [autoit]

    $ergebnis = $object.GetRows
    $d3l = FileOpen(@ScriptDir & "\temp.d3l", 2)
    FileWriteLine($d3l, "idlist" & @CRLF)

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

    For $x = 0 To UBound($ergebnis) - 1
    $temp = String($ergebnis[$x])
    FileWriteLine($d3l, $temp & @CRLF)
    Next
    FileClose($d3l)

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

    ;;; ODER

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

    $ergebnis = $object.GetRows
    $d3l = FileOpen(@ScriptDir & "\temp.d3l", 2)
    FileWriteLine($d3l, "idlist" & @CRLF)

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

    $temp = _ArrayToString($ergebnis, @CRLF)
    FileWriteLine($d3l, $temp & @CRLF)
    FileClose($d3l)

    [/autoit]
  • Hi,
    1. Ich würde das mit einer For-Schleife machen

    [autoit]


    $ergebnis = $object.GetRows
    $d3l = FileOpen(@ScriptDir&"\temp.d3l",2)
    FileWriteLine($d3l, "idlist" & @CRLF)
    ConsoleWrite('Obergrenze vom Array=' &UBound($ergebnis))
    For $x=0 To UBound($ergebnis)-1
    ConsoleWrite('$x=' & $x)
    $temp = _ArrayToString($ergebnis[$x])
    FileWriteLine($d3l, $temp & @CRLF)
    Next
    FileClose($d3l)

    [/autoit]


    (dann kannste durch das eingebaute ConsoleWrite() auch sehen, bei welchem Index AutoIt aussteigt..)
    2. Warum haste nicht geschrieben, wie groß UBound($ergebnis) ist? ist es 2 oder 3? Gibt es noch weitere Dimensionen?
    Probier mal..
    Gruß
    ytwinky
    [Edit]
    Wenn man älter wird..
    Da sind doch wirklich Postings gekommen während ich geschrieben habe^^
    Naja, ich muß trotzdem nix zurücknehmen..
    [Edit 2]
    oder hat das Object sowas wie ne .count()-Methode, die die Zeilen-Anzahl liefert?

    (Ich) benutze stets die aktuelle (Beta) und SciTE..

    Einmal editiert, zuletzt von ytwinky (12. April 2012 um 11:07)

  • hier mal der komplette Code:

    Spoiler anzeigen
    [autoit]


    #include <_sql.au3>
    #include <Process.au3>
    #include <Array.au3>
    #include <IE.au3>

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

    If $CmdLine[0] > 0 Then

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

    Select
    Case $CmdLine[1] == "2D3"
    Select
    Case $CmdLine[2] == "BAID"

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

    $Warenkorbnummer = $CmdLine[3]
    $Search = "dok_dat_feld_82"

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

    $ergebnis= _Check_Oracle($Search, $Warenkorbnummer)
    _Create_D3Link($ergebnis)

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

    Case $CmdLine[2] == "Ticket"

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

    $TicketID = $CmdLine[3]

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

    EndSelect

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

    EndSelect

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

    Else
    _RunDOS("echo Bitte Parameter mit angeben")
    exit 3
    EndIf

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

    Func _Check_Oracle($Search, $ID)

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

    $conn = ObjCreate( "ADODB.Connection" )
    $DSN = "Driver={Microsoft ODBC for Oracle};" & _
    "CONNECTSTRING=(DESCRIPTION=" & _
    "(ADDRESS=(PROTOCOL=TCP)" & _
    "(HOST=SRV.XXX.de)(PORT=XXX))" & _
    "(CONNECT_DATA=(SERVICE_NAME=XXX))); Uid=XXX;Pwd=XXX;"
    $conn.Open($DSN)
    $rs = ObjCreate( "ADODB.RecordSet" )

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

    $rs.Open( "select Doku_ID from Firmen_spezifisch where "&$Search&" = "&$ID, $conn )
    $ergebnis = $rs.GetRows
    $conn.close

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

    Return $ergebnis

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

    EndFunc

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

    Func _Create_D3Link($ergebnis)
    $d3l = FileOpen(@ScriptDir&"\temp.d3l",2)
    FileWriteLine($d3l, "idlist" & @CRLF)
    _ArrayDisplay($ergebnis)
    MsgBox(0,"",$ergebnis[0])
    $x = 0
    While $x < UBound($ergebnis)-1
    $temp = _ArrayToString($ergebnis[$x])
    FileWriteLine($d3l, $temp & @CRLF)
    $x = $x + 1
    WEnd
    FileClose($d3l)

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

    EndFunc

    [/autoit]

    auch hier erhalte ich den gleichen Fehler auf den Verweis mit der ZEile der MSGBOX

  • Obergrenze=3
    D:\AUTOIT\SPSconnectD3\SPSconnectD3.au3 (151) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
    $temp = String($ergebnis[$x])
    $temp = String(^ ERROR
    ->11:25:34 AutoIT3.exe ended.rc:1

    man muss es nicht verstehen ;o)

    Spoiler anzeigen
    [autoit]

    Func _Create_D3Link($ergebnis)
    $d3l = FileOpen(@ScriptDir&"\temp.d3l",2)
    FileWriteLine($d3l, "idlist" & @CRLF)
    If IsArray($ergebnis) Then ConsoleWrite('Obergrenze=' &UBound($ergebnis))
    For $x = 0 To UBound($ergebnis) - 1
    $temp = String($ergebnis[$x])
    FileWriteLine($d3l, $temp & @CRLF)
    Next
    FileClose($d3l)

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

    EndFunc

    [/autoit]