Programm mit parametern ausführen und Werte in einer MySQL Datenbank oder als .ini speichern

  • Ich habe ein Buchhaltungsprogramm, dass bei einem Erreignis ein Programm mit verschiedenen Parametern ausführen kann.
    Nennen wir das zu erstellende AutoIt Programm Test.exe;
    Ich habe eine Buchhaltung die verschiedene Geldmünzen zählt.
    Unter [DEVICES] kann ich den Wert einer Münze eintragen:
    z.B. ci_coin1=10 heisst das der "ci_coin1" einen Wert von 10 Cent hat

    [DEVICES]
    ci=on
    ci_comport=COM-1
    ci_totalblocking=off
    ci_binary=on
    ci_coin1=10
    ci_coin2=20
    ci_coin3=50
    ci_coin4=100
    ci_coin5=200
    ci_bill1=1000

    Im [Bookkeeping] wird registriert, wieviele Münzen eingeworfen wurden.
    Da wir, wie im oberen Bsp., 10 Cent reingeworfen haben wird bei ci_coin1_in=1 erfasst.
    Beim nächsten 10 Cent Stück würde ci_coin1_in=2 stehen. u.s.w
    Des Weiteren kann auch über remote_in ein Betrag aufgeladen werden.
    Oder mit service_out ein Betrag wieder ausbezahlt werden.
    P.s, Das ganze wird für ein Internetterminal genutzt.

    [BOOKKEEPING]
    ci_coin1_in=1
    ci_coin2_in=1
    ci_coin3_in=0
    ci_coin4_in=0
    ci_bill1_in=0
    remote_in=600
    service_out=200

    Bei jedem einwurf könnte ich ein Programm ausführen lassen. Ein Parameter wird automatisch angefühgt.
    Bei unserem Bsp. würde beim einwurf von 10 Cent das AutoIt Programm als "Test.exe coin1_in 10",
    beim einwurf von 1€ "Test.exe coin4_in 100" ausgeführt.

    Ich möchte diese Geldannahmen Zeitlich festhalten, um diese auszuwerten. Dafür brauche ich das AutoIt-Script.
    Die erste Möglichkeit wäre, ein AutoIt-Script, dass mir eine .CSV oder .TXT Datei erstellt und bei jedem einwurf die Werte reinschreibt mit Datum und Zeit.
    Diese könnte ich dann in einer Tabellenkalkulation oder Datenbank auswerten.
    Bei "remoute_in" und"service_out" wird bis jetzt noch kein Parameter mitgegeben, dies könnte ich aber ändern, dass z.B. der Parameter mit dem Betrag mitgegeben wird.
    Könnte in etwa so aussehen: test.exe service_out_200 oder test.exe remoute_in_600 o.ä.

    Folgende Werte müsste mir das Script, durch Tabulatoren getrennt, erzeugen:
    Bei einwurf von 10 Cent:
    (27.04.201122:05;10;0)
    Bei einwurf von 2€:
    (27.04.2011;23:20;200;0)
    Bei remoute_in von 6€
    (27.04.2011;23.25;600;0)
    Bei service_out von einem Betrag von 2€:
    (27.04.2011;23:30;0;200)

    D.h. Ich hätte vier spalten: Datum;Zeit;Einzahlung;Auszahlung

    Hat jemand einen Vorschlag, bin für jeden Rat dankbar, oder könnte man auch direkt in eine MySQL Datenbank schreiben.

    Man könnte auch jedesmal die vorhandene Buchhaltung auswerten (Vorher/Nachher) und die Differenz in eine .csv oder .txt File schreiben.
    Problem ist nur, wenn jemand hintereinander sehr schnell Münzen einwirft, muss das Script schnell sein um alle Münzen zu erfassen.

    Bin ein Newbie mit AutoIt. Finde es aber ein tolles Tool: Habe bereits einen eigenen Internetbrowser damit programmiert (Google sei Dank) ;)
    Ich biete es im Anhang zum Download an.

    Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <IE.au3>

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

    $IE = _IECreateEmbedded () ;ist der Befehl zum "eindringen" in eine Internetverbindung
    _IEErrorHandlerRegister() ;"registriert" den Browser

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

    #Region ### START Koda GUI section ### Form=R:\Documents\SmartWebPublishing\Favoriten\iStationbrowser.kxf
    $GUI_main = GUICreate("iStation Browser", 1366, 768, 0, 0,0x80000000)
    $GUI_Adresszeile = GUICtrlCreateInput("http:\\http://www.google.ch", 40, 40, 369, 21)
    $GUI_send = GUICtrlCreateButton("Go", 448, 40, 51, 25)
    $browser = GUICtrlCreateObj ($IE,0, 72, 1365, 689)
    $GUI_google = GUICtrlCreateButton("Google", 536, 40, 75, 25)
    $GUI_hotmail = GUICtrlCreateButton("Hotmail", 624, 40, 75, 25)
    $GUI_gmail = GUICtrlCreateButton("Gmail", 712, 40, 75, 25)
    $GUI_youtube = GUICtrlCreateButton("Youtube", 800, 40, 75, 25)
    $GUI_tastatur = GUICtrlCreateButton("Tastatur", 1278, 40, 75, 25)
    $GUI_help = GUICtrlCreateButton("Info", 536, 8, 75, 25)
    $GUI_back = GUICtrlCreateButton("Back", 448, 8, 75, 25)
    $Pic1 = GUICtrlCreatePic("D:\Browser\oben1366.jpg", 0, 0, 1366, 80, BitOR($WS_GROUP,$WS_CLIPSIBLINGS)) ;Bindet das Hintergrundbild ein (grosse 1366x80px)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    _IENavigate($IE,"http:\\http://www.google.ch")

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $GUI_send, $GUI_Adresszeile ; lässt den Browser auch durch Enter-Klick bedienen
    $Url = GUICtrlRead($GUI_Adresszeile) ;liesst den Inhalt der InputBox
    If $Url = "skype" Then
    MsgBox (0,"Info","skype ist leider nicht Installiert",10) ;hier könnte z.B. auch eine externe Anwedung gestartet werden.
    GUICtrlSetData($GUI_Adresszeile,'');Löscht den inhalt von der Adresszeile
    Else
    _IENavigate($IE, $Url) ;verbindet zur eingegebener Seite
    EndIf
    Case $GUI_EVENT_PRIMARYDOWN ;steht in der Hilfe unter GUIGetMsg()
    $cInfo = GUIGetCursorInfo()
    If IsArray($cInfo) Then
    If $cInfo[4] = $GUI_Adresszeile Then
    GUICtrlSetData($GUI_Adresszeile, "")
    EndIf
    EndIf

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

    Case $GUI_google
    _IENavigate($IE,"www.google.ch")
    Case $GUI_hotmail
    _IENavigate($IE,"www.hotmail.ch")
    Case $GUI_gmail
    _IENavigate($IE,"www.gmail.com")
    Case $GUI_youtube
    _IENavigate($IE,"www.youtube.com")
    Case $GUI_tastatur
    Run("D:\Browser\Click-N-Type.exe") ;lädt die Virtuelle Tastatur (Siehe http://cnt.lakefolks.org/)
    Case $GUI_back
    _IEAction( $IE, "back")
    IF @error Then _IENavigate($IE,"http:\\http://www.google.ch")

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

    Case $GUI_help
    MsgBox(0,"Info","Solange der Benutzer Guthaben hat, kann er im Internet surfen, Emails schreiben, oder sonstige freigegebene Programme auf dem Terminal benützen.Sind alle Kredite verbraucht wird das Terminal automatisch gesperrt und alle laufenden Programme geschlossen. Ab einer Zeit von 60 Sekunden wird die Anzeige in Rot dargestellt um ein evtl. Nachzahlen anzuzeigen. Während den letzten 15 Sekunden Zeitguthaben wird zusätzlich ein Signalton ausgegeben",20)

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

    EndSwitch
    WEnd

    [/autoit]

    4 Mal editiert, zuletzt von tohu74 (18. Juli 2011 um 00:58) aus folgendem Grund: Dateianhang als Spoiler angehängt.

  • Ich habe dir mal schnell ein Script gebastelt, ich denke es ist leicht verständlich
    Dabei müssen aber 2 Parameter übergeben werden.
    Zum einen welche Münze bzw. service_out oder remoute_in, und der Betrag

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    If Not FileExists(@ScriptDir & "\test.log") Then
    _FileCreate(@ScriptDir & "\test.log")
    $hFile = FileOpen(@ScriptDir & "\test.log", 1)
    Else
    $hFile = FileOpen(@ScriptDir & "\test.log", 1)
    EndIf

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

    If $CmdLine[2] = "service_out" Then
    FileWriteLine($hFile, @MDAY&"."&@MON&"."&@YEAR&@TAB&@HOUR&":"&@MIN&@TAB&"0"&@TAB&$CmdLine[3])
    ElseIf $CmdLine[2] = "remoute_in" Then
    FileWriteLine($hFile, @MDAY&"."&@MON&"."&@YEAR&@TAB&@HOUR&":"&@MIN&@TAB&$CmdLine[3]&@TAB&"0")
    ElseIf $CmdLine[2] = "ci_coin1_in" Then
    FileWriteLine($hFile, @MDAY&"."&@MON&"."&@YEAR&@TAB&@HOUR&":"&@MIN&@TAB&$CmdLine[3]&@TAB&"0")
    ElseIf $CmdLine[2] = "ci_coin2_in" Then
    FileWriteLine($hFile, @MDAY&"."&@MON&"."&@YEAR&@TAB&@HOUR&":"&@MIN&@TAB&$CmdLine[3]&@TAB&"0")
    ElseIf $CmdLine[2] = "ci_coin3_in" Then
    FileWriteLine($hFile, @MDAY&"."&@MON&"."&@YEAR&@TAB&@HOUR&":"&@MIN&@TAB&$CmdLine[3]&@TAB&"0")
    ElseIf $CmdLine[2] = "ci_coin4_in" Then
    FileWriteLine($hFile, @MDAY&"."&@MON&"."&@YEAR&@TAB&@HOUR&":"&@MIN&@TAB&$CmdLine[3]&@TAB&"0")
    EndIf
    FileClose($hFile)

    [/autoit]
  • Hallo TheLuBu
    Danke für den Scipt, er ist wirklich leicht verständlich.

    Musste nur $CmdLine[2] in $CmdLine[1] und $CmdLine[3] in $CmdLine[2] umändern damit es funktionierte.

    $CmdLine[1] ist Parameter 1 (nach dem Skriptnamen)
    $CmdLine[2] ist Parameter 2 etc.

    Spoiler anzeigen
    [autoit]


    #include <File.au3>
    If Not FileExists(@ScriptDir & "\test.log") Then
    _FileCreate(@ScriptDir & "\test.log")
    $hFile = FileOpen(@ScriptDir & "\test.log", 1)
    Else
    $hFile = FileOpen(@ScriptDir & "\test.log", 1)
    EndIf

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

    If $CmdLine[1] = "service_out" Then
    FileWriteLine($hFile,
    @MDAY&"."&@MON&"."&@YEAR&@TAB&@HOUR&":"&@MIN&@TAB&"0"&@TAB&$CmdLine[2])
    ElseIf $CmdLine[1] = "remoute_in" Then
    FileWriteLine($hFile,
    @MDAY&"."&@MON&"."&@YEAR&@TAB&@HOUR&":"&@MIN&@TAB&$CmdLine[2]&@TAB&"0")
    ElseIf $CmdLine[1] = "ci_coin1_in" Then
    FileWriteLine($hFile,
    @MDAY&"."&@MON&"."&@YEAR&@TAB&@HOUR&":"&@MIN&@TAB&$CmdLine[2]&@TAB&"0")
    ElseIf $CmdLine[1] = "ci_coin2_in" Then
    FileWriteLine($hFile,
    @MDAY&"."&@MON&"."&@YEAR&@TAB&@HOUR&":"&@MIN&@TAB&$CmdLine[2]&@TAB&"0")
    ElseIf $CmdLine[1] = "ci_coin3_in" Then
    FileWriteLine($hFile,
    @MDAY&"."&@MON&"."&@YEAR&@TAB&@HOUR&":"&@MIN&@TAB&$CmdLine[2]&@TAB&"0")
    ElseIf $CmdLine[1] = "ci_coin4_in" Then
    FileWriteLine($hFile,
    @MDAY&"."&@MON&"."&@YEAR&@TAB&@HOUR&":"&@MIN&@TAB&$CmdLine[2]&@TAB&"0")
    EndIf
    FileClose($hFile)

    [/autoit]

    Besten Dank für Deine Mühe. Hat mir sehr geholfen und habe wieder was dazugelernt. :thumbup:

    4 Mal editiert, zuletzt von tohu74 (28. April 2011 um 13:29)

  • Ginge auch noch kürzer wenn du für jedes münzereignis einen aufruf mit dem wert der Münze erstellst.
    Bei service_Out machst du einen negativen wert.

    Würde dann etwa so aussehen:

    If $cmdline[1] < 0 then
    FileWriteLine($hFile, @MDAY&"."&@MON&"."&@YEAR&@TAB&@HOUR&":"&@MIN&@TAB&"0"&@TAB&$CmdLine[1]*(-1))
    Else
    FileWriteLine($hFile, @MDAY&"."&@MON&"."&@YEAR&@TAB&@HOUR&":"&@MIN&@TAB&$CmdLine[3]&@TAB&"0")
    Endif

  • Ich habe das Scrip noch einbisschen angepasst und mit _stringEncrypt erweitert. Es soll ja nicht gleich jeder die Datei auslesen können.
    Der kompl. Eintrag wird jeweils verschlüsselt in einer Zeile gespeichert:

    Spoiler anzeigen
    [autoit]


    #include <File.au3>
    #include<String.au3>
    #include <GUIConstants.au3>

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

    If Not FileExists(@ScriptDir & "\test.ini") Then
    _FileCreate(@ScriptDir & "\test.ini")
    $hFile = FileOpen(@ScriptDir & "\test.ini", 1)
    Else
    $hFile = FileOpen(@ScriptDir & "\test.ini", 1)
    EndIf

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

    $pass = "xxxxx"
    GUISetState(@SW_SHOW)

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

    If $CmdLine[1] = "service_out" Then
    FileWriteLine($hFile, _StringEncrypt (1, $pass,(@YEAR&"/"&@MON&"/"&@MDAY&@TAB&@HOUR&":"&@MIN&@TAB&"0"&@TAB&$CmdLine[2]),3))

    ElseIf $CmdLine[1] = "service_in" Then
    FileWriteLine($hFile, _StringEncrypt (1, $pass,(@YEAR&"/"&@MON&"/"&@MDAY&@TAB&@HOUR&":"&@MIN&@TAB&$CmdLine[2]&@TAB&"0"),3))

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

    ;und so weiter
    EndIf
    FileClose($hFile)

    [/autoit]

    Jetzt möchte ich natürlich die Daten, über ein Script wieder auslesen können.
    Und zwar möchte ich nicht die ganze .ini Datei auslesen, sondern nur einen definierten Bereich.
    D.h. Ich gebe im Script das Anfangsdatum mit der Uhrzeit an (erster Wert grösser oder gleich als), bis zum Enddatum und Zeit (letzter Wert gleich oder kleiner als).
    Es soll in etwa so aussehen:

    Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <DateTimeConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=D:\Documents\AutoIt\Buchhaltung\Version1\Buchhaltung.kxf
    $Form1 = GUICreate("Buchhaltung", 505, 255, 184, 124)
    $Date1 = GUICtrlCreateDate("2011/01/1 00:00:00", 64, 32, 186, 21)
    $Date2 = GUICtrlCreateDate("", 296, 32, 186, 21)
    $Bis = GUICtrlCreateLabel("Bis", 264, 32, 18, 17, $SS_CENTER)
    $Datum = GUICtrlCreateLabel("Datum", 16, 32, 35, 17, $SS_CENTER)
    $Date3 = GUICtrlCreateDate("00:00:00", 64, 64, 186, 21, BitOR($DTS_UPDOWN,$DTS_TIMEFORMAT))
    $Date4 = GUICtrlCreateDate("2011/05/25 13:27:34", 296, 64, 186, 21, BitOR($DTS_UPDOWN,$DTS_TIMEFORMAT))
    $Zeit = GUICtrlCreateLabel("Zeit", 24, 64, 22, 17)
    $Bisz = GUICtrlCreateLabel("Bis", 264, 64, 18, 17)
    $Button1 = GUICtrlCreateButton("Auswerten", 408, 112, 75, 25)
    $Intxt = GUICtrlCreateInput("", 64, 136, 121, 21)
    $Outtxt = GUICtrlCreateInput("", 64, 168, 121, 21)
    $Totaltxt = GUICtrlCreateInput("", 64, 200, 121, 21)
    $I = GUICtrlCreateLabel("In", 24, 136, 13, 17)
    $Out = GUICtrlCreateLabel("Out", 24, 168, 21, 17)
    $Total = GUICtrlCreateLabel("Total", 24, 200, 28, 17)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

    Case $Button1

    EndSwitch
    WEnd

    [/autoit]

    Jetzt liegt die .ini noch im Sciptverzeichnis, später soll sie auf einem FTP-Server gespeichert werden.
    Wie das geht, weiss ich...
    Aber mit dem Auslesen der .ini hänge ich ein bisschen.
    Bin um jeden Rat froh.

  • Mir fallen 3 Möglichkeiten ein,
    entweder gesamte Inidatei entschlüsseln und dann auslesen,
    oder Zeile für Zeile entschlüsseln und ab dem ersten Anfangsdatum bis zum ersten Datum nach der Endzeit zählen.

    DIe dritte Möglichkeit wäre nicht verschlüsselt nochmals das Datum schrieben und die nächste Zeile dann verschlüsseln