Ausschusserfassung über MDB-Datenbank

  • Hallo Leute,

    ich bin neu hier im Forum und ebenso auch neuer Nutzer von AutoIt.
    Ich habe bisher in meinem Leben noch nicht sehr viel Programmiert - und wenn dann eher Batchscripte. Nun habe ich AutoIt entdeckt und mich daran versucht. Leider habe ich keine Ahnung, ob das was ich so zusammenprogge überhaupt dem "Status Quo" des Programmierens folgt.

    Wäre jemand so nett und würde mir eine Bewertung dessen geben, was ich so gebastelt habe? Bitte jedoch um konstruktive Kritik ;)

    Es handelt sich hierbei um eine Ausschusserfassung für kleine Unternehmen, welches über eine Maske die Eingaben in eine CSV-Datei schreibt welche somit später ausgewertet werden kann via Excel.

    Schon mal vielen Dank und nochmals ein Hallo an die Community :)

    Grüsse,
    Towacom

    Ps: Es ist noch nicht ganz fertig, d.h. nicht alle Felder werden übernommen. ;)

    Pss: Wie macht man eigentlich solche "Spoiler"?? Find da nirgends was in der Hilfe. Danke.

    2 Mal editiert, zuletzt von Towacom (27. September 2010 um 14:11)

  • Spoiler gehen mit

    Spoiler anzeigen

    text im Spoiler


    und Autoit-Code mit

    [autoit]

    Programm-Code

    [/autoit]
    • Offizieller Beitrag

    Sieht gut aus. Ein paar Tipps:
    Wenn das "If-Statement" nur eine Anweisung enthält - einfach in eine Zeile schreiben ohne EndIF
    Statt

    [autoit]

    If FileExists('Options.ini') = 0 Then
    FileInstall('Options.ini', 'Options.ini')
    EndIf

    [/autoit]

    besser

    [autoit]

    If FileExists('Options.ini') = 0 Then FileInstall('Options.ini', 'Options.ini')

    [/autoit]

    Mehrere Controls in gleichem Abstand erstellen geht besser in einer Schleife. Die ID's dann in einem Array auffangen.
    Hier mal das Original von dir und im Vergleich die Schleifenvariante.

    Spoiler anzeigen
    [autoit]

    Dim $fault1 = GUICtrlCreateCheckbox("1. " & $G1, 50, 330, 150, 17)
    Dim $input_fault1 = GUICtrlCreateInput("", 200, 330, 225, 20)

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

    Dim $fault2 = GUICtrlCreateCheckbox("2. " & $G2, 50, 355, 150, 17)
    Dim $input_fault2 = GUICtrlCreateInput("", 200, 355, 225, 20)

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

    Dim $fault3 = GUICtrlCreateCheckbox("3. " & $G3, 50, 380, 150, 17)
    Dim $input_fault3 = GUICtrlCreateInput("", 200, 380, 225, 20)

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

    Dim $fault4 = GUICtrlCreateCheckbox("4. " & $G4, 50, 405, 150, 17)
    Dim $input_fault4 = GUICtrlCreateInput("", 200, 405, 225, 20)

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

    Dim $fault5 = GUICtrlCreateCheckbox("5. " & $G5, 50, 430, 150, 17)
    Dim $input_fault5 = GUICtrlCreateInput("", 200, 430, 225, 20)

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

    Dim $fault6 = GUICtrlCreateCheckbox("6. " & $G6, 50, 455, 150, 17)
    Dim $input_fault6 = GUICtrlCreateInput("", 200, 455, 225, 20)

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

    Dim $fault7 = GUICtrlCreateCheckbox("7. " & $G7, 50, 480, 150, 17)
    Dim $input_fault7 = GUICtrlCreateInput("", 200, 480, 225, 20)

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

    Dim $fault8 = GUICtrlCreateCheckbox("8. " & $G8, 50, 505, 150, 17)
    Dim $input_fault8 = GUICtrlCreateInput("", 200, 505, 225, 20)

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

    Dim $fault9 = GUICtrlCreateCheckbox("9. " & $G9, 50, 530, 150, 17)
    Dim $input_fault9 = GUICtrlCreateInput("", 200, 530, 225, 20)

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

    Dim $fault10 = GUICtrlCreateCheckbox("10. " & $G10, 50, 555, 150, 17)
    Dim $input_fault10 = GUICtrlCreateInput("", 200, 555, 225, 20)

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

    Dim $fault11 = GUICtrlCreateCheckbox("99. " & $G11, 50, 580, 150, 17)
    Dim $input_fault11 = GUICtrlCreateInput("", 200, 580, 225, 20)

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

    ; verkürzte Variante:
    Dim $y = 305, $arCB[11], $arIn[11], $num
    For $i = 0 To UBound($arCB) -1
    $y += 25
    If $i < UBound($arCB) -1 Then
    $num = $i+1
    Else
    $num = 99
    EndIf
    $arCB[$i] = GUICtrlCreateCheckbox($num & ". " & Eval("G" & $i+1), 50, $y, 150, 17)
    $arIn[$i] = GUICtrlCreateInput("", 200, $y, 225, 20)
    Next

    [/autoit]

    In deinen Case-Statements (While-Schleife ab Zeile 320) verwendest du überall "ContinueLoop". Allerdings kann ich nicht den Bezug zur Schleife erkennen.
    Die Anwendung von "ContinueLoop" dient im Allgemeinen dazu, einen Anweisungsblock zu überspringen und mit dem folgenden Schleifenelement fortzufahren. Du bist jedoch in einer Endlosschleife, die auf GUI-Events wartet. Das "ContinueLoop" bringt somit keinen Nutzen (auch wenn es nicht schadet :) ).

    Also weiter so :thumbup:

  • @senden9:

    Ah ok - Dank Dir!
    Hab mittlerweile auch die Symbolleiste gefunden, die solche Dinge per Button anbietet. Hatte sie im anderen Browser nicht.

    Also Danke schonmal :)

    BugFix :

    Vielen Dank! :) Genau solche Kritik brauch ich. So weiß ich wenigstens in welche Richtung ich mich noch schlau machen muss.

    Das ContinueLoop-Statement musste ich setzten da mir das Script sonst alle Case-Fälle nacheinander abgearbeitet hat obwohl ich nur einen Button angeklickt habe. Ich werde es aber nochmals ohne versuchen.

    Der Tipp mit dem Array sieht super aus - sollte mich wohl mehr mit Arrays beschäftigen. Bisher traue ich mich an diese Materie noch nicht so sehr ran, da ich mir noch unsicher bin mit den Dingern. Aber das kommt evtl. noch - ich versuch mich an AutoIt schließlich auch erst seit ca. ner Woche... das muss langsam wachsen :)

    Ich dank Dir auf jeden Fall und werde deine Tipps auch gleich umsetzen.

    Bin auf alle Fälle schonmal begeistert von der Community hier! :)

    MfG
    Towacom

    Einmal editiert, zuletzt von Towacom (9. Juli 2008 um 21:41)

    • Offizieller Beitrag

    Das ContinueLoop-Statement musste ich setzten da mir das Script sonst alle Case-Fälle nacheinander abgearbeitet hat obwohl ich nur einen Button angeklickt habe. Ich werde es aber nochmals ohne versuchen.


    Ja, du hast recht. In diesem Fall hast du ja eine Folge von IF-Statements, die du so übergehen kannst. Wenn du statt der IF's, "Select-Case" verwendest, hast du denselben Effekt aber ohne ContinueLoop ;)

    Edit:
    Achja, wegen Arrays... schau mal in meine Signatur :whistling: *Zaunpfahl-schwenk* :D

  • Moin Moin,

    habe nun ein paar Dinge umgesetzt von den bisherigen Tipps. Mit dem Select-Case komm ich aber noch nicht klar. Hierbei gehts mir nur um die Logik:

    Wozu Select-Case oder Switch-Case verwenden wenn ich doch nur einen Case-Fall habe?
    Case: Zahl zu gross OR Zahl zu klein
    -> melde: 'Zahl falsch'
    -> ansonsten: Prüfe nächstes Feld

    In Code würde das so aussehen:

    Spoiler anzeigen
    [autoit]

    $fa_id -> Prüfung des Var-Inhalts
    If GUICtrlRead($fa_id) > $INI_FAmax Then
    MsgBox(16, 'Fertigungsauftragsnummer', 'FA-ID zu gross: Bitte kontrollieren Sie Ihre Eingaben!')
    ContinueLoop
    ElseIf GUICtrlRead($fa_id) < $INI_FAmin Then
    MsgBox(16, 'Fertigungsauftragsnummer', 'FA-ID zu klein: Bitte kontrollieren Sie Ihre Eingaben!')
    ContinueLoop
    EndIf

    ;~ $wo_id -> Prüfung des Var-Inhalts
    If GUICtrlRead($wo_id) > $INI_LZmax Then
    MsgBox(16, 'Leitzahl', 'Leitzahl zu gross: Bitte kontrollieren Sie Ihre Eingaben!')
    ContinueLoop
    ElseIf GUICtrlRead($wo_id) < $INI_LZmin Then
    MsgBox(16, 'Leitzahl', 'Leitzahl zu klein: Bitte kontrollieren Sie Ihre Eingaben!')
    ContinueLoop
    EndIf

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

    ;~ $adate -> Prüfung des Var-Inhalts
    If GUICtrlRead($adate) > (@YEAR & "/" & @MON & "/" & @MDAY) Then
    MsgBox(16, 'Ausschuss-Datum', 'Ausschussdatum falsch: Datum kann nicht in der Zukunft liegen.' & @CRLF & 'Bitte kontrollieren Sie Ihre Eingaben!')
    ContinueLoop
    ElseIf GUICtrlRead($adate) < ((@YEAR - 2) & "/" & @MON & "/" & @MDAY) Then
    MsgBox(16, 'Ausschuss-Datum', 'Ausschussdatum falsch: Datum muss nach Jahr ' & (@YEAR - 2) & ' liegen. Bitte kontrollieren Sie Ihre Eingaben!')
    ContinueLoop
    EndIf

    [/autoit]

    Oder ich fasse es einfach noch etwas zusammen - würde dann so aussehen:

    Spoiler anzeigen
    [autoit]

    If GUICtrlRead($fa_id) > $INI_FAmax OR GUICtrlRead($fa_id) < $INI_FAmin Then
    MsgBox(16, 'Fertigungsauftragsnummer', 'FA-ID fehlerhaft: Bitte kontrollieren Sie Ihre Eingaben!')
    ContinueLoop
    EndIf

    ;~ $wo_id -> Prüfung des Var-Inhalts
    If GUICtrlRead($wo_id) > $INI_LZmax OR GUICtrlRead($wo_id) < $INI_LZmin Then
    MsgBox(16, 'Leitzahl', 'Leitzahl fehlerhaft: Bitte kontrollieren Sie Ihre Eingaben!')
    ContinueLoop
    EndIf

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

    ;~ $adate -> Prüfung des Var-Inhalts
    If GUICtrlRead($adate) > (@YEAR & "/" & @MON & "/" & @MDAY) OR GUICtrlRead($adate) < ((@YEAR - 2) & "/" & @MON & "/" & @MDAY) Then
    MsgBox(16, 'Ausschuss-Datum', 'Ausschussdatum falsch: Datum kann nicht in der Zukunft liegen.' & @CRLF & _
    'Ausschussdatum falsch: Datum muss nach Jahr ' & (@YEAR - 2) & ' liegen. Bitte kontrollieren Sie Ihre Eingaben!')
    ContinueLoop
    EndIf

    [/autoit]

    MfG
    Towacom

    PS @ BugFix: Das ContinueLoop springt mir übrigends aus dem Case heraus zurück in die While-Schleife ohne weitere Cases abzuarbeiten. Hab ich woanders nun herausgelesen.

    Pss @ Mod: Wenn mein Thema hier falsch liegen sollte bitte verschieben :)

  • Ich habe bisher in meinem Leben noch nicht sehr viel Programmiert - und wenn dann eher Batchscripte.

    Ui, da ist doch ein User, der genauso wie ich hier anfängt. Habe ich doch damals alles via Batching absolviert, was möglich war, habe dann aber die Grenzen erleiden müssen. Was habe ich gemacht? Mich informiert und dann AutoIt entdeckt. Aber nicht nur AutoIt durfte ich entdecken, sondern auch dieses super Forum dazu, wo mir schon einige ganz liebe User ans Herz gewachsen sind.

    @Towacom, glaube mir, hier bist Du gut aufgehoben. Wenn Du mal umfällst, werden wir dich schon auf heben und wenn eine Kardiopulmonalen Reanimation notwendig sein sollte, schicken wir Dir auch eine süße Notärztin vorbei. Eine mit einem "Bit-Röckchen". :rofl:

    LG, Crazy-A(lina).

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    k3mrwmIBHejryPvylQSFieDF5f3VOnk6iLAVBGVhKQegrFuWr3iraNIblLweSW4WgqI0SrRbS7U5jI3sn50R4a15Cthu1bEr

  • @Towacom, glaube mir, hier bist Du gut aufgehoben. Wenn Du mal umfällst, werden wir dich schon auf heben und wenn eine Kardiopulmonalen Reanimation notwendig sein sollte, schicken wir Dir auch eine süße Notärztin vorbei. Eine mit einem "Bit-Röckchen". :rofl:

    Gut aufgehoben glaub ich auch - gefällt mir schon richtig gut hier, was ich bisher gesehn habe :)

    Schick mir mal die Notärztin lieber vorher schonmal zum "testen" weil

    • Möchte ich ja nicht daliegen und dann erst feststellen müssen, dass die mehr kaputt macht als gut und
    • wäre dann vielleicht meine Motivation ab morgen nochmal um einiges höher als bisher ;)

    Zur Not nehm ich aber auch das Bild, welches Gun-Food schon angefragt hat *g


  • Wozu Select-Case oder Switch-Case verwenden wenn ich doch nur einen Case-Fall habe?

    Weil man im Select Case auch unterschiedliche Sachen abfragen kann. Sobald ein Case-Ausdruck zutrifft, werden alle Nachfolgenden nicht mehr ausgeführt :)
    dann ist es noch kürzeer :)

    Spoiler anzeigen
    [autoit]

    Select
    Case GUICtrlRead($fa_id) > $INI_FAmax OR GUICtrlRead($fa_id) < $INI_FAmin
    MsgBox(16, 'Fertigungsauftragsnummer', 'FA-ID fehlerhaft: Bitte kontrollieren Sie Ihre Eingaben!')

    ;~ $wo_id -> Prüfung des Var-Inhalts
    Case GUICtrlRead($wo_id) > $INI_LZmax OR GUICtrlRead($wo_id) < $INI_LZmin
    MsgBox(16, 'Leitzahl', 'Leitzahl fehlerhaft: Bitte kontrollieren Sie Ihre Eingaben!')

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

    ;~ $adate -> Prüfung des Var-Inhalts
    Case If GUICtrlRead($adate) > (@YEAR & "/" & @MON & "/" & @MDAY) OR GUICtrlRead($adate) < ((@YEAR - 2) & "/" & @MON & "/" & @MDAY)
    MsgBox(16, 'Ausschuss-Datum', 'Ausschussdatum falsch: Datum kann nicht in der Zukunft liegen.' & @CRLF & _
    'Ausschussdatum falsch: Datum muss nach Jahr ' & (@YEAR - 2) & ' liegen. Bitte kontrollieren Sie Ihre Eingaben!')
    EndSelect

    [/autoit]


    Statt dem Continue Loop hättest du auch ElseIf nehmen konnen :=

    Spoiler anzeigen
    [autoit]

    If GUICtrlRead($fa_id) > $INI_FAmax OR GUICtrlRead($fa_id) < $INI_FAmin Then
    MsgBox(16, 'Fertigungsauftragsnummer', 'FA-ID fehlerhaft: Bitte kontrollieren Sie Ihre Eingaben!')

    ;~ $wo_id -> Prüfung des Var-Inhalts
    ElseIf GUICtrlRead($wo_id) > $INI_LZmax OR GUICtrlRead($wo_id) < $INI_LZmin Then
    MsgBox(16, 'Leitzahl', 'Leitzahl fehlerhaft: Bitte kontrollieren Sie Ihre Eingaben!')

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

    ;~ $adate -> Prüfung des Var-Inhalts
    ElseIf GUICtrlRead($adate) > (@YEAR & "/" & @MON & "/" & @MDAY) OR GUICtrlRead($adate) < ((@YEAR - 2) & "/" & @MON & "/" & @MDAY) Then
    MsgBox(16, 'Ausschuss-Datum', 'Ausschussdatum falsch: Datum kann nicht in der Zukunft liegen.' & @CRLF & _
    'Ausschussdatum falsch: Datum muss nach Jahr ' & (@YEAR - 2) & ' liegen. Bitte kontrollieren Sie Ihre Eingaben!')
    EndIf

    [/autoit]
  • So ... hab jetzt einiges am Script geändert und überarbeitet.
    Diese Version ist jetzt fertig und wird am Montag eingesetzt.

    Falls es jemanden interessiert, was daraus geworden ist :) im Anhang das fertige Teilskript für das Modul Ausschusserfassung.

    Komplettmodul mit Icons, INI usw. gibts auf Anfrage.

    Vielen Dank nochmal für die Hilfestellung am Anfang für mich als Noob :)

    EDIT: Dateianhang gelöscht da veraltet.

    Einmal editiert, zuletzt von Towacom (14. Oktober 2008 um 15:51)

  • Ich mag nicht spammen aber da ich ja noch ein Frischling unter den Wissenden bin wollte ich mal fragen, ob die Leute, die mein Script runtergeladen haben, mir dann auch grob sagen könnten ob das programmiertechnisch i.O. ist oder ob ich mich noch mit nem bestimmten Thema näher beschäftigen sollte weil "man manche Sachen einfach anders macht". Habe keinen richtigen Vergleich.
    Das Meiste was ich hier im Forum nämlich finde sind Scripte, die ganz andere Ziele verfolgen, so mit Fenster auslesen und Mausklicks schicken und so...

    Wenn mir also jemand sagen könnte ob die Richtung stimmt wäre ich dankbar... jetzt da das kleine "Werk" fertig ist :)

    Also schonmal vielen Dank.

  • Hi,
    ich finde es sieht echt gut aus. Alles schön erklärt.

    In Zeile 87 :

    [autoit]

    Global Const $tbl_std = String('Meldungen')

    [/autoit]


    Umwandeln in String muss man in AutoIt nicht (was es sehr viel leicht und verständlich macht)

  • Ok super - Vielen Dank.
    Weißt, dann kann ich nämlich so weitermachen und hab nicht später mal ein böses Erwachen wenn das alles mal ins Blut übergegangen ist und dann sagt man mir, dass man das eigentlich nicht so macht weil ... warum auch immer.

    Das mit dem String(...) hab ich rausgenommen.

    Juut - also nochmals Danke - bin einfach noch etwas unsicher gewesen aber wenn's so ist kann ich mich ans nächste Modul wagen.

    Schönen Abend noch! :)

  • Hallo Leute,

    habe mal wieder ein Problem - mittlerweile ist das Skript schon erheblich gewachsen und ich komme um einen externen Datenbank-Zugriff nicht mehr herum.
    So möchte ich nun aus einer bestehenden Datenbank Felder auslesen und diese in einen Array legen. Entweder stehe ich total auf dem Schlauch oder es ist wirklich ein Fehler drin.

    Hier das Beispielskript:

    Spoiler anzeigen
    [autoit]

    $query = IniRead('sql.qry','Basic','Query','')
    $rows = _RecordSearch($query)
    _2dArrayDisp($rows)

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

    Func _RecordSearch($_query)
    $adoCon = ObjCreate ("ADODB.Connection")
    $adoCon.Open ("Provider=ASAProv.70;Data source=pps;Uid=<usr>;Pwd=<psw>;Links=tcpip(Host=10.0.0.250)")
    $adoRs = ObjCreate ("ADODB.Recordset")
    $adoRs.CursorType = 1
    $adoRs.LockType = 3
    $adoRs.Open ($_query, $adoCon)

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

    With $adoRs
    Dim $_output[.Fields.Count + 1][.RecordCount + 1]
    $_output[0][0] = .RecordCount
    For $i = 1 To .Fields.Count
    $_output[$i][0] = .Fields ($i - 1).Name
    Next
    If $adoRs.RecordCount Then
    $y = 0
    While Not .EOF
    $y = $y + 1

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

    For $x = 1 To .Fields.Count
    $_output[$x][$y] = .Fields ($x - 1).Value
    Next
    .MoveNext
    WEnd
    EndIf
    EndWith
    $adoCon.Close
    Return $_output
    EndFunc ;==>_RecordSearch

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

    MsgBox(0,'Matching Data',$rows[0][0])

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

    Func _2dArrayDisp($array)
    $report = "Number of records matching = " & $array[0][0] & @CRLF
    For $x = 1 To UBound($array, 2) - 1
    For $i = 1 To UBound($array, 1) - 1
    $report = $report & $array[$i][$x] & "|"
    Next
    $report = StringTrimRight($report, 1) & @CRLF
    Next
    MsgBox(0, "Display", $report)
    EndFunc ;==>_2dArrayDisp

    [/autoit]


    Benutzernamen und Passwort natürlich entfernt ;)

    Die SELECT-Abfrage dazu lautet:

    SQL
    SELECT "Zeichnung","Matchcode","Preis"/100 FROM "DBA"."tblArtikel" KEY JOIN "DBA"."tblArtikelPreise" KEY JOIN "DBA"."tblPreisStaffel" WHERE Code LIKE 'VK-%' AND Freigabe=0 OR Freigabe IS NULL ORDER BY Zeichnung

    Warum funktioniert diese Abfrage und das Skript problemlos wenn ich zwei Felder aus einer Tabelle mit den Datensätzen auslese und wenn ich aber drei Felder aus verknüpften Datentabellen auslese meckert er folgendes:

    Code
    C:\_CodingFiles\_SourceCodes\BEISPIELE\Bsp_AccesDB\test.au3 (15) : ==> Array variable subscript badly formatted.: 
    Dim $_output[.Fields.Count + 1][.RecordCount + 1] 
    Dim $_output[.Fields.Count + 1][^ ERROR 
    ->14:50:56 AutoIT3.exe ended.rc:1

    Wäre um einen Wink oder Schlag mit dem Zaunpfahl dankbar :)

    • Offizieller Beitrag

    Hi,
    warst uns ja lange 'untreu' ;-), schön dich wieder zu sehen. :D

    Der Fehler weist speziell auf .RecordCount hin. Hast du dir mal ausgeben lassen, ob dort auch tatsächlich ein Wert enthalten ist?
    'badly formatted' ist eigentlich dann der Fall, wenn du z.B. "Dim $array[2][0]" verzapfst.

  • Hy Servus BugFix,

    auf Dich ist wie immer Verlass ;) Dank Dir.
    Ja da haste recht - war lange nimmer da aber hatte auch viel zu tun - mein Skript ist immer weiter gewachsen und ich hatte bisher keinerlei Probs damit. Lief soweit gut aber ich hab eben auch nur immer mal bissel was machen können.

    Zu dem Problem:
    Das SQL-Statement gibt mir wenn ich direkt in der Datenbank bin eine Tabelle aus, die 3 Spalten enthält und ca. 1260 Datensätze. Es sollte somit eigentlich etwas kommen. Das seltsame ist, dass eine normale Abfrage über zwei Spalten aus einer Tabelle super funktioniert. Kann es sein dass ich bei der Wert-Übergabe in den Array irgendwas falsch mache?

    Ps: Wie gehts dir Bug? Alles klar soweit? ;)

    • Offizieller Beitrag

    Danke, geht so - man kann nie genug klagen :rofl:

    Schieb mal vor den Teil "With $adoRs" zum Prüfen folgendes ein:
    ConsoleWrite('#FC: ' & $adoRs.Fields.Count & @CRLF)
    ConsoleWrite('#RC: ' & $adoRs.RecordCount & @CRLF)
    Danach ein Exit, damit nichts weiter ausgeführt wird. Denn wenn die Deklaration bemängelt wird, sollte auch dort der Fehler sein.

  • Oh super Tipp - das wusste ich noch garnich, dass man so praktisch schnell debuggen kann :)
    Muss ich mir merken! Thx!

    Also die Anzeige ist:

    Code
    >Running:(3.2.12.1):C:\Programme\AutoIt3\autoit3.exe "C:\_CodingFiles\_SourceCodes\BEISPIELE\Bsp_AccesDB\test.au3" 
    #FC: 3 
    #RC: -482

    Die Feldanzahl stimmt - warum er mir aber anstelle von 1206 Datensätzen sagt es wären MINUS 482 O.o kann ich mir nicht erklären - aber somit ist klar warum er mit der Arraygröße so nix anfangen kann *lol
    Oder hat schonmal wer einen Minus-Array geschrieben? O.o ;-D

    Ok... Fehlersuche... irgendwoher muss er die Zahl -482 ja haben.

    EDIT - Nachtrag:
    Folgendes hat jetzt funktioniert (manuelle Anpassung):

    Spoiler anzeigen
    [autoit]

    With $adoRs
    ;~ Dim $_output[.Fields.Count + 1][.RecordCount + 1]
    Dim $_output[4][1300]
    $_output[0][0] = .RecordCount
    For $i = 1 To .Fields.Count
    $_output[$i][0] = .Fields ($i - 1).Name

    [/autoit]

    Nicht elegant aber würde gehn - funktioniert so aber nicht generell leider. Falls wer ne Idee hat immer her damit *lol
    Mit SQL bin ich leider nicht so bewandert, dass ich ne Ahnung hätte woher die komische Zahl kommt.

    Einmal editiert, zuletzt von Towacom (14. Oktober 2008 um 16:16)

    • Offizieller Beitrag

    OK, Fehler lokalisiert - vielleicht solltest du die Abfrageform ändern?
    Ich habe da letztens mal mit ADOB experimentiert, zwar mit Firebird, aber das Prinzip ist ja gleich. Mal schauen ob ich was passendes finde.


    EDIT:
    Probier mal, ob die Variante mit Execute besser läuft.

    Spoiler anzeigen
    [autoit]

    Global $oMyError = ObjEvent("AutoIt.Error","MyErrFunc") ; Initialisieren COM error handler

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

    Global $sql_str = _
    'SELECT "Zeichnung","Matchcode","Preis"/100 FROM "DBA"."tblArtikel" ' & _
    'KEY JOIN "DBA"."tblArtikelPreise" KEY JOIN "DBA"."tblPreisStaffel" ' & _
    'WHERE Code LIKE "VK-%" AND Freigabe=0 OR Freigabe IS NULL ORDER BY Zeichnung'

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

    Global $oConn = _oSQLDB_Connect('Provider=ASAProv.70;Data source=pps;Uid=<usr>;Pwd=<psw>;Links=tcpip(Host=10.0.0.250)')
    If @error Then Exit MsgBox(0, 'Datenbank', 'keine Verbindung')

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

    ; Ausführung eines SQL-Statements mit Methode Execute ==> liefert Recordset zurück:
    Global $oRecSet = _oSQLDB_Execute($oConn, $sql_str)
    If @error Then
    MsgBox(0, 'Execute', 'Fehler Beim Ausführen des SQL-Statements')
    _close()
    EndIf

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

    ; Recordset in Array wandeln:
    Global $array = $oRecSet.GetRows
    If Not IsArray($array) Then
    MsgBox(0, 'Array', 'kein Ergebnis')
    _close()
    EndIf

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

    _ArrayDisplay($array, 'Ergebnis Agfrage')
    _close()

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

    Func _close()
    If IsObj($oRecSet) Then _oRecSet_Close($oRecSet)
    If IsObj($oConn) Then _oSQLDB_Close($oConn)
    Exit
    EndFunc

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

    ;===============================================================================
    ; Function Name: _oSQLDB_Connect($connStr)
    ; Description:: erstellt eine Objektreferenz auf die im $connStr angegebene Datenbank
    ; Parameter(s): $connStr Connection-String enthält die Verbindungsparameter
    ; Return Value(s): Erfolg Referenz des ADODB-Objektes
    ; Fehler 1, @error 1
    ;===============================================================================
    Func _oSQLDB_Connect($connStr)
    Local $objConnection = ObjCreate("ADODB.Connection")
    If Not IsObj($objConnection) Then Return SetError(1,0,1)
    $objConnection.Open($connStr)
    Return $objConnection
    EndFunc ;==>_oSQLDB_Connect

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

    ;===============================================================================
    ; Function Name: _oSQLDB_Execute($oConn, $strCommand, $Options=-1)
    ; Description:: führt Kommandostring (SQL-Sequenz) aus
    ; Parameter(s): $oConn Referenz des Connection-Objektes
    ; $strCommand Kommandostring
    ; optional $Options CommandTypeEnum (http://msdn.microsoft.com/en-us/library/ms675946(VS.85).aspx) oder
    ; ExecuteOptionEnum (http://msdn.microsoft.com/en-us/library/ms676517(VS.85).aspx)
    ; Return Value(s): Eine Recordset Objekt-Referenz, ein Stream oder Nichts
    ;===============================================================================
    Func _oSQLDB_Execute($oConn, $strCommand, $Options=-1)
    Local $recAffected
    Return $oConn.Execute($strCommand, $recAffected, $Options)
    EndFunc ;==>_oSQLDB_Execute

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

    ;===============================================================================
    ; Function Name: _oRecSet_Close($oRecSet)
    ; Description:: Beendet ein RecordsetObjekt
    ; Parameter(s): $oRecSet Referenz des Objektes
    ;===============================================================================
    Func _oRecSet_Close($oRecSet)
    $oRecSet.Close
    EndFunc ;==>_oRecSet_Close

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

    ;===============================================================================
    ; Function Name: _oSQLDB_Close($oConn)
    ; Description:: Beendet die Verbindung
    ; Parameter(s): $oConn Referenz des Connection-Objektes
    ;===============================================================================
    Func _oSQLDB_Close($oConn)
    $oConn.Close
    EndFunc ;==>_oSQLDB_Close

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

    Func MyErrFunc()
    Msgbox(0,"AutoItCOM Test","Ein COM-Fehler ist aufgetreten !" & @CRLF & @CRLF & _
    "err.description is: " & @TAB & $oMyError.description & @CRLF & _
    "err.windescription:" & @TAB & $oMyError.windescription & @CRLF & _
    "err.number is: " & @TAB & hex($oMyError.number,8) & @CRLF & _
    "err.lastdllerror is: " & @TAB & $oMyError.lastdllerror & @CRLF & _
    "err.scriptline is: " & @TAB & $oMyError.scriptline & @CRLF & _
    "err.source is: " & @TAB & $oMyError.source & @CRLF & _
    "err.helpfile is: " & @TAB & $oMyError.helpfile & @CRLF & _
    "err.helpcontext is: " & @TAB & $oMyError.helpcontext )
    Local $err = $oMyError.number
    If $err = 0 Then $err = -1
    Local $g_eventerror = $err
    Endfunc

    [/autoit]