Vergleich von Variablen schlägt fehl

  • Hallo,

    ich möchte gerne 2 Varibalen miteinander vergleichen. Die erste lese ich aus einer INI Datei aus und lasse Sie zu Kontrolle über die Messagebox anzeigen.

    Hier z.B. der Wert 1234

    Danach lese ich eine Zelle aus Excel aus, welche die 2. Variable bildet. Auch diese lasse ich per Messagebox anzeigen.

    Auch hier wird als Wert 1234 angezeigt.

    Zum Schluss gebe ich folgenden Befehl ein:

    [autoit]

    If $var_nr_ini = $var_nr_excel Then
    Msgbox(0,"info", "Ist gleich")
    Else
    Msgbox(0,"info", "Ist nicht gleich")
    EndIf

    [/autoit]

    Leider lande ich IMMER im Else Block, d.h. "Ist nicht gleich"

    OK, erst dachte ich

    a.) INI Datei = Textdatei
    b.) Excel = Zahl

    Daraufhin habe ich Excel mal per Hand formatiert und dort gesagt, das die Zelle TEXT enthält.

    Leider auch hier keine Besserung.

    Was muss ich bei Vergleichen von Strings beachten ?

    Gruss Hassan

    Einmal editiert, zuletzt von HassanMullah (25. Oktober 2010 um 15:32)

  • Probiers mal so:

    [autoit]

    If $var_nr_ini == $var_nr_excel Then
    Msgbox(0,"info", "Ist gleich")
    Else
    Msgbox(0,"info", "Ist nicht gleich")
    EndIf

    [/autoit]

    Wobei das eigentlich keinen Unterschied machen sollte

    Ansonsten:

    [autoit]

    StringCompare

    [/autoit]

    Ist vielleicht in der INI aus versehen ein Leerzeichen mit drin?

  • Ich glaube das liegt daran, dass er den mathematischen Wert des Strings bestimmen will - welcher immer 0 ist.
    Ansonsten kann ich mir das nicht erklären, versuch einfach mal

    [autoit]

    StringCompare

    [/autoit]


    Oder lass dir mal beide Werte in einer MsgBox ausgeben

  • Erst mal vielen Dank.

    Also das soll einer verstehen ??

    Jetzt vergleiche ich mit Hilfe von

    [autoit]

    StringCompare

    [/autoit]

    Wie gesagt, ich lasse die Werte der Varialen mit der Messagebox ausgeben, wobei "rein optisch" alles OK und GLEICH ist.

    Als Ergebnis von StringCompare bekomme ich -1 raus, was ja bedeutet, das string1 kleiner als string2 ist.

    Ich habe gerade keinen Plan, woran das liegt.

    Gruss Hassan

  • OK hier mal das Script:

    Spoiler anzeigen
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_UseUpx=n
    #AutoIt3Wrapper_UseX64=n
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    d#include <Excel.au3>

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

    ; ########################################################### Datum ermitteln ###################################################################

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

    ; Variablen für das aktuelle Jahr, Monat und Tag ermitteln
    Global $var_excel_file, $var_excel_open, $var_logpath, $var_system_drive
    Dim $var_year, $var_month, $var_day

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

    $var_year = @YEAR
    $var_month = @MON
    $var_day = @MDAY

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

    ; ########################################################### Log Pfad ###################################################################

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

    ;Prüfen ob Datei @HomeDrive & "\ABCDLog\ABCDwaage\" existiert. Wenn nein, dann erstellen

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

    ;Ermitteln der Umgebungsvariablen "SystemDrive"
    $var_system_drive = EnvGet("SystemDrive")
    $var_logpath = $var_system_drive & "\ABCDLog\ABCDwaage\"

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

    If Not FileExists($var_logpath) Then
    ;~ MsgBox(0, "Kurz-Check", "Verzeichnis existiert nicht")
    DirCreate($var_logpath)
    Else
    ;~ MsgBox(0, "Kurz-Check", "Verzeichnis existiert")
    EndIf

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

    ; ########################################################### Ini Datei erzeugen, und auslesen ###################################################################

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

    ;Prüfen ob Datei YYYYMMTT.ini existiert. Wenn nein, dann eröffnen, wenn ja, dann öffnen
    Dim $var_date_ini

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

    $var_date_ini = $var_year & $var_month & $var_day & ".ini"

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

    If Not FileExists($var_logpath & "\" & $var_date_ini) Then
    ;MsgBox(0, "Kurz-Check", "Datei " & $var_date_ini & " existiert nicht")
    IniWrite($var_logpath & "\" & $var_date_ini, "Open", "Datum", $var_day & "." & $var_month & "." & $var_year)
    IniWrite($var_logpath & "\" & $var_date_ini, "Open", "Zeit", @HOUR & ":" & @MIN & ":" & @SEC)
    IniWrite($var_logpath & "\" & $var_date_ini, "Open", "Username", @UserName)
    IniWrite($var_logpath & "\" & $var_date_ini, "Open", "Computername", @ComputerName)

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

    IniWrite($var_logpath & "\" & $var_date_ini, "Aktueller XYZ", "IN_XYZ_NR", "121168")

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

    IniWrite($var_logpath & "\" & $var_date_ini, "121168", "IN_KFZ_KENNZEICHEN", "GP-R 1212")
    IniWrite($var_logpath & "\" & $var_date_ini, "121168", "IN_BEHOERDLICHE_NUMMER", "A123454321")
    Else
    ;MsgBox(0, "Kurz-Check", "Datei " & $var_date_ini & " existiert bereits")
    IniWrite($var_logpath & "\" & $var_date_ini, "Open", "Datum", $var_day & "." & $var_month & "." & $var_year)
    IniWrite($var_logpath & "\" & $var_date_ini, "Open", "Zeit", @HOUR & ":" & @MIN & ":" & @SEC)
    IniWrite($var_logpath & "\" & $var_date_ini, "Open", "Username", @UserName)
    IniWrite($var_logpath & "\" & $var_date_ini, "Open", "Computername", @ComputerName)

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

    ;~ IniWrite($var_logpath & "\" & $var_date_ini, "Aktueller XYZ", "IN_XYZ_NR", "121168")

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

    IniWrite($var_logpath & "\" & $var_date_ini, "121168", "IN_KFZ_KENNZEICHEN", "F - PD 2123")
    IniWrite($var_logpath & "\" & $var_date_ini, "121168", "IN_BEHOERDLICHE_NUMMER", "A123454321")

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

    EndIf

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

    ;aktuelle XYZ Nummer aus YYYYMMDD.ini ermitteln
    Dim $var_aktuelle_XYZ_nr

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

    $var_aktuelle_XYZ_nr = IniRead($var_logpath & "\" & $var_date_ini, "Aktueller XYZ", "IN_XYZ_NR", "Schlüssel IN_XYZ_NR existiert nicht")
    If $var_aktuelle_XYZ_nr = "" Then
    $var_aktuelle_XYZ_nr = "Wert von Schlüssel IN_XYZ_NR= in Sektion [Aktueller XYZ] ist nicht vorhanden"
    MsgBox(0, "Warnung", $var_aktuelle_XYZ_nr, 3)
    EndIf
    MsgBox(0,"info", $var_aktuelle_XYZ_nr)

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

    ;aktuelle XYZ Nummer aus Anwendung ermitteln
    Dim $var_XYZ_nr_anwendung
    If WinExists("Microsoft Excel - Abfall.xlsx") Then
    ;MsgBox(0, "", "Das Fenster existiert")
    WinActivate("Microsoft Excel - Abfall.xlsx", "")
    WinSetState("[ACTIVE]", "", @SW_MAXIMIZE)
    EndIf
    Opt("MouseCoordMode", 0) ;1=absolute, 0=relative, 2=client => 0 ist pro Anwendung die XY Koordinaten
    MouseClick("Left", 221, 823,1,0); Excel Sheet Blatt "Ergebnis" anklicken
    MouseClick("Left", 16, 178,1,0); Alle Zellen markieren
    Send("{LEFT}" & "{RIGHT 2}" & "{DOWN 3}")
    Sleep(300)
    send("^c"); kopieren
    send("^c"); kopieren
    $var_XYZ_nr_anwendung = ClipGet(); Inhalt aus Zwischenablage in Variable kopieren
    MsgBox(0,"info", $var_XYZ_nr_anwendung)

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

    $result = StringCompare($var_aktuelle_XYZ_nr, $var_XYZ_nr_anwendung)
    MsgBox(0, "Ergebnis des Stringvergleichs (Modus 0):", $result)

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

    If $var_aktuelle_XYZ_nr == $var_XYZ_nr_anwendung Then
    Msgbox(0,"info", "Ist gleich")
    Else
    Msgbox(0,"info", "Ist nicht gleich")
    EndIf

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

    Exit

    [/autoit]
  • Mach vor dem Vergleich doch mal den Test ob beide Variablen als int Zahlen erkannt werden. Das geht mit StringIsInt() wenn dabei wie vermutet keine int Zahl gefunden wird dann geb mal beide strings mit StringToASCIIArray() aus und schau dir an wo die Unterschiede liegen. Ich vermute dass sich in einer oder beiden Variablen Formatierungszeichen wie @CR , @LF oder Leerzeichen verstecken, was in einer msgbox nicht/schlecht sichtbar ist. Wenn dem so sein sollte hilft ggf. ein Blick auf die Funktionen StringStripCR() und StringStripWS() oder wenns das erste bzw. letzte Zeichen des Strings sein sollte auch einfache Funktionen wie StringLeft() oder StringRight().

    EDIT:

    Du solltest im übrigen die Zwischenablage mit ClipPut("") leeren bevor du die Daten aus Excel ausliest, da du dies mit sehr fehleranfälligen Methoden wie mouseclick und send ausliest. Bei mir kam es da sehr oft dazu, dass "STRG+C" ins leere lief und in der Zwischenablage unerwünschte Daten standen.

    Einmal editiert, zuletzt von misterspeed (25. Oktober 2010 um 14:56)

  • Hallo misterspeed,

    Du hattest Recht. Die Variable, welche aus der INI Datei kommt ist eine reine Zahl. Die andere Variable aus Excel enthält am Ende noch ein CRLF

    Folgendes Problem habe ich. Das Array zeigt am Ende die 13 und die 10 (also einmal CR und einmal LF)

    Wenn ich jetzt ....

    [autoit]

    Sleep(300)
    ClipPut("")
    Sleep(300)
    ClipPut("")
    Send("^c"); kopieren
    Send("^c"); kopieren
    $var_bgs_nr_anwendung = ClipGet(); Inhalt aus Zwischenablage in Variable kopieren
    $var_bgs_nr_anwendung_mod = StringStripCR($var_bgs_nr_anwendung & Chr(13))

    [/autoit]

    ... eingebe, erhalte ich statt der 13 und 10 als Ergebnis 10 und 10.

    Auch ein ...

    [autoit]

    $var_bgs_nr_anwendung_mod2 = StringStripCR($var_bgs_nr_anwendung_mod & Chr(10))

    [/autoit]

    .... bringt die 10 nicht weg.

    Was muss ich hier noch machen ?

  • Danke für die Lösung,

    habe es jedoch mit

    [autoit]

    StringTrimRight

    [/autoit]

    gelöst.

    Es geht jetzt.

    Das eigentlich Unangenehme bei meiner "Übung" ist, das beim Kunden kein Excel, sondern eine normale Anwendung vorhanden ist. Ich nehme Excel nur zum Üben

    Gruss und vielen Dank

    Hassan

  • Dann sollte dir aber klar sein, dass das Ergebnis beim Auslesen einer anderen Anwendung auch andere Strings liefern und somit die String Nachbearbeitung anders ausschauen könnte.

  • Dann sollte dir aber klar sein, dass das Ergebnis beim Auslesen einer anderen Anwendung auch andere Strings liefern und somit die String Nachbearbeitung anders ausschauen könnte.

    Ja das ist mir schon klar. Da ich mich aber erst seit ca. 5 Tagen mit AutoIT beschäftige, muss ich erst mal ein Grundrauschen für die möglichen Befehle entwickeln. Ich habe aus diese Session auf jeden Fall gelernt, das gleich nicht gleich gleich ist, bzw. man nicht alles glauben soll, was "mann" sieht

  • @Hassan: Beruf Technical Consultant hört sich nach einem Job Code an! ;)

    Darf ich fragen, in welcher Firma du arbeitest? Kannst mir auch in der SB "whispern"!

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯