Hallo Community,
Ich möchte euch hier ein Tool vorstellen welches Wiedervorlagen zur Kundenkommunikation bzw. Erinnerungen an Vorgänge verwaltet.
Ich Code nun knapp einen Monat daran, natürlich nicht durchgehend sondern eher "nebenbei" Real Life geht halt vor
Warum ist das Tool enstanden? Nun ja, ich opfere hier meine Zeit um es meinen Kollegen leichter zu machen. Es soll dazu dienen private Wiedervorlagen im Auge zu behalten. Private Wiedervorlagen dienen zur steigerung der Kundenzufriedenheit. Wenn man einem Kunden der sich Inbound meldet erklärt das noch bestimmte Dinge fehlen damit alles wieder okay ist und man als Mitarbeiter dann bestimmte Systemvorgänge kontrollieren muss und den Kunden dann per Outbound informieren will, genau da greift das Tool ein und speichert übersichtlich diesen Vorgang.
Der Mitarbeiter bekommt zur festgelegten Zeit eine Info, es öffnet sich am Wiedervorlagezeitpunkt ein PopUp mit allen Informationen zu diesem Vorgang. Der Mitarbeiter kann notieren was genau gemacht wurde und den Vorgang am Ende schließen. Einmal geschlossen kann er nicht mehr editiert werden. Die meisten Callcenter nutzen zur Kontaktdokumentation ein entsprechendes System. Der Mitarbeiter entscheidet selber ob es notwendig ist dort eine "CallNote" zu hinterlassen oder nicht. Wenn ja wird neben dem Schließen des Vorgangs noch eine Note gemacht. Dazu habe ich ein Script erstellt welches alle notwendigen Klicks etc. durchführt, dieses ist hier im Code nicht enthalten.
Beim Speichern eines Vorgangs wird immer auf die sog. Linezeiten geachtet. D. h. das es nur erlaubt ist innerhalb dieser Zeiten Vorgänge anzulegen. Dies soll verhindern das etwas liegen bleibt weil zufällig eine falsche Zeit angegeben wurde.
Genutzt wird eine HauptGui mit 2 ListViews, offene Vorgänge oben, geschlossene unten. Fällige Vorgänge werden Rot dargestellt, ein Vorgang der im oberen LV doppelt angeklickt wurde wird in den Editor geladen und Grün margiert. Im Editor kann man dann inhaltliche Änderungen vornehmen oder auch den Vorgang schließen. Ein Löschen ist nicht vorgesehen. Geschlossene Vorgänge werden nach 10 Tagen in ein Archiv verschoben.
Ein noch nicht existierendes Admin Tool wird die Archive der User in ein gesammt Archiv verschieben. Es soll zudem ermöglichen offene Vorgänge von einem Mitarbeiter der z. B. Krank ist einem anderen Mitarbeiter zuzuweisen damit eben kein versprochener Outbound verloren geht.
Genutzt wird zum Speichern der ganzen Vorgänge SQLite3, dazu möchte ich mich an dieser Stelle bei "just me" bedanken. Er hat viel Geduld mit mir gehabt und sich die Zeit genommen meine Problembeschreibung in funktionierenden Code zu wandeln. Daher vielen Dank dafür!
Desweiteren bedanke ich mich bei SAPlayer und nnnik die mir beide immer wieder geholfen haben, und dass nicht nur bei diesem Projekt.
Ich würde mir wünschen, dass ihr euch den Code anschaut und mir mitteilt ob es grobe schnitzer gibt, ob Fehler vorhanden sind ob etwas besser sein könnte um genauer zu funktionieren. Das Tool sollte so zuverlässig wie möglich funktionieren damit es Produktiv eingesetzt werden kann.
Ich habe viel Kommentiert und hoffe das alles verständlich ist.
Ich bedanke mich im voraus für jeden Kommentar!
Hier ein Bild von der HauptGui:
Hier ein Bild vom PopUp:
Hier der Code vom Tool:
Siehe unten...
Hier die INI für die Linezeiten, hier wird in UserRollen für Abteilung AB und TK unterschieden, zum nutzen muss dein Username unten mit einer Rolle verbunden werden:
[DaysClosed] 25122013=1 26122013=1 ; Wochentag (1 - 7). Sonntag ist der 1. Tag einer Woche. [TIMINGABOPEN] 1=none 2=0800 3=0800 4=0800 5=0800 6=0800 7=none [TIMINGABCLOSE] 1=none 2=1700 3=1700 4=1700 5=1700 6=1700 7=none [TIMINGTKOPEN] 1=1000 2=0800 3=0800 4=0800 5=0800 6=0800 7=1000 [TIMINGTKCLOSE] 1=1900 2=2100 3=2100 4=2100 5=2100 6=2100 7=1900 [UserName1] rolle=AB [UserName1] rolle=TK
Benötigt werden zudem diese Classen:
CLass_SQLiteDB.ahk Hier: http://www.autohotke...and-u64-support
Class_LV_Colors.ahk Hier: http://www.autohotke...n-gui-listviews
Class_CTLCOLORS.ahk Hier: http://www.autohotke...r-your-controls
Hier die Classes im Paket: http://www.file-uplo...minder.rar.html
Benötigt wird ausserdem die sqlite3.exe: http://www.file-uplo...qlite3.rar.html
Zuletzt das Icon: http://www.file-uplo...erTool.ico.html
MfG
fump
/EDIT 08.07.2013
Ein paar kleine Änderungen. Zum einen die von nnnik vorgeschlagene anpassung für die Spaltensortierung.
Dann "SubStr(DateTime, 1, 12) . "00" " verwendet um die PopUps genauer zu machen (danke just me).
Zuletzt den Vorschlag von Babba übernommen. Dadurch sind die Erinnerungen pünktlich.
/EDIT 14.08.2013
Hier nun Version 1.0.0.9
Neu ist, dass der Reminder nun seine Datenbank auf einem Netzlaufwerk anlegt. Dies dient dazu mit einem Admin Tool (seperater Post) ein gesamtarchiv zu bilden und Vorgänge zu verwalten. Desweiteren könnte über die talk Classe von A v i der Reminder zu einem Modul gemacht werden, es kann so in andere bestehende Projekte eingebunden werden. Es wäre dennoch möglich den Reminder zu steuern, Vorgänge anzulegen etc.
Der Reminder speichert nun seine Position und taucht an dieser wieder auf.
Die Pfade werden über eine INI eingelesen.
reminder.ini:
[REMINDER] RMGUIX=50 RMGUIY=50 LANPfad=E:\LanPfad\ INIFilePath=E:\LanPfad\global.ini
Hier der Link zur talk Classe von A v i.
http://www.autohotke...e-updated-2707/
Hier das neue Script:
;============================================================================ ; Titel: Reminder ; AHK: 1.1.11.02 L Unicode x86 ; E-Mail: fump2000@web.de ; OS: Windows 7 x64 ; ;---------------------------------------------------------------------------- ; script best view with Notepad++ and SyntaxHighlighting=Autoit ;---------------------------------------------------------------------------- ; Version Reminder ReminderVer = 1.0.0.9 ReminderDate = 13.08.2013 ;============================================================================ ; Setzen der Globalen Variablen: ;============================================================================ #NoEnv #SingleInstance force #MaxMem, 1024 #Persistent SetWorkingDir, %A_ScriptDir% #Include %A_ScriptDir% SetBatchLines, -1 ;============================================================================ ; User Einstellungen: ;============================================================================ ; Reminder INI einlesen IniRead,globalinipfad, %A_ScriptDir%\reminder.ini, REMINDER, INIFilePath IniRead,LANPfad, %A_ScriptDir%\reminder.ini, REMINDER, LANPfad IniRead,RMGUIX, %A_ScriptDir%\reminder.ini, REMINDER, RMGUIX IniRead,RMGUIY, %A_ScriptDir%\reminder.ini, REMINDER, RMGUIY ; Bezeichnungen der Spalten für die beiden ListViews ColumnNames := "Reminder ID|KD Nr.|Text ID|ToDo|RR Nr.|WVL Zeitpunkt|Status|ToDo Text|ToDo Erl. Text|Benutzer|FullTime|ShowFlag|FirstUser" ; Status der Vorgänge StatusArray := ["Offen", "Geschlossen"] ; Inhalt für das DropDown zur ToDo Auswahl ToDoArray := ["Outbound", "Systemänderung", "Kontrolle"] ToDoList := "" For K, V In ToDoArray ToDoList .= (A_Index = 1 ? "" : "|") . V ; Abbruchmeldung AbortProg := "`r`nDas Programm wird beendet!" ; Programname AppName := "Reminder" ; Holt den Usernamen in die Var UserName, die DB ist an den User gebunden. EnvGet, UserName, USERNAME ; Ordner in dem die Datanbank liegt DBFolder := LANPfad . UserName ; Direkter Pfad zur DB DBFilePath := DBFolder . "\Reminder-" . UserName . ".sql" DBArchivFilePath := DBFolder . "\Reminder-Archiv-" . UserName . ".sql" ; Tabellenname in der DB TableName := "Reminder" TableNameArchiv := "ReminderArchiv" ; Erstwerte für die Notification PopUp GUI a:=1 SnoozePopUp:=0 CallNotePopUpFlag:=0 ; Data Verzeichnis als Var "Datadir" einbinden. Datadir:= A_ScriptDir "\Data" ; Vorgaben zu Kundennummern und deren Länge, wird für die Prüfung auf Korrektheit im Kundennummernfeld genutzt. KDNr1:=325 ; Hier den sich wiederholenden Teil der ersten Kundennummer KDNr2:=725 ; Hier den sich wiederholenden Teil der zweiten Kundennummer Len1:=11 ; Hier die Länge die bei der ersten KD Nr. da sein muss. Len2:=10 ; Hier die Länge der zweiten Kd Nr. ; Hier den ersten ToolTipText für die Prüfung der ersten Kundennummer. Text1:="Die Kundennummer ist zu kurz.`nSie muss " . Len1 . " Zeichen Länge haben." ; Hier der ToolTip Text des zweiten Checks. Text2:="Die Kundennummer ist zu kurz oder zu lang.`nSie muss " . Len2 . " Zeichen Länge haben." /* ; Öffnet die Kommunikation zum PWM. PWM := new talk("pw_master.exe") PWMKDNR:= */ PopUpNew:=0 ; Aktivieren der MouseLeave überwachung OnMessage(0x2a3, "WM_MOUSELEAVE") StartFlag=%1% If (StartFlag="-Test") Test:=1 ;============================================================================ ; ###################### Start Autoexecutebereich ########################### ;============================================================================ If !FileExist(DBFolder) { FileCreateDir, %DBFolder% If (ErrorLevel) { MsgBox, 16, %AppName%, Das Verzeichnis %DBFolder% konnte nicht erstellt werden.%AbortProg%`n`nBitte ändere nicht ohne Rücksprache die Pfadangaben. Anscheinend ist das Netzlaufwerk nicht verfügbar. Warte bis es wieder nutzbar ist und starte den Reminder neu. ExitApp } } if (Test=1) { ; Sofern eine DB existiert wird gefragt ob neue Testdaten erzeugt werden sollen. CreateTestValues := False If FileExist(DBFilePath) { MsgBox, 36, %AppName%, Soll die Datenbank neu mit Testdaten angelegt werden? IfMsgBox, Yes CreateTestValues := True } Else { CreateTestValues := True } } ; Öffnen der Archiv-DB und falls nicht vorhanden erstellen selbiger mit entsprechenden Spalten. DB := New SQLiteDB If !DB.OpenDB(DBArchivFilePath) { MsgBox, 16, SQLite Error, % "Msg:`t" . DB.ErrorMsg . "`nCode:`t" . DB.ErrorCode ExitApp } SQL := "CREATE TABLE IF NOT EXISTS " . TableNameArchiv . " (Reminder_ID, KD_Nr, D_ID, ToDo, RR_Nr, WVL_Zeitpunkt, Status, ToDo_Text, ToDo_Erl_Text, Benutzer, FullTime, ShowFlag, FirstUser, " . " PRIMARY KEY(Reminder_ID ASC, KD_Nr ASC));" If !DB.Exec(SQL) MsgBox, 16, SQLite Error1, % "Msg:`t" . DB.ErrorMsg . "`nCode:`t" . DB.ErrorCode DB.CloseDB(DBArchivFilePath) ; Öffnen der User-DB und falls nicht vorhanden erstellen selbiger mit entsprechenden Spalten. DB := New SQLiteDB If !DB.OpenDB(DBFilePath) { MsgBox, 16, SQLite Error, % "Msg:`t" . DB.ErrorMsg . "`nCode:`t" . DB.ErrorCode ExitApp } SQL := "CREATE TABLE IF NOT EXISTS " . TableName . " (Reminder_ID, KD_Nr, D_ID, ToDo, RR_Nr, WVL_Zeitpunkt, Status, ToDo_Text, ToDo_Erl_Text, Benutzer, FullTime, ShowFlag, FirstUser, " . " PRIMARY KEY(Reminder_ID ASC, KD_Nr ASC));" If !DB.Exec(SQL) MsgBox, 16, SQLite Error1, % "Msg:`t" . DB.ErrorMsg . "`nCode:`t" . DB.ErrorCode If (Test=1) { If (CreateTestValues) GoSub, Create_Test_Values } /* ; Prüft ob pw_master.exe noch aktiv ist, falls nicht wird der Reminder beendet. Settimer, LiveCheck, 60000 Gosub LiveCheck */ ; Startet den Archivierungsvorgang GoSub Archiv ; Scannt auf die existens einer txt und löscht diese. Dies signalisiert das der Client "Online" ist. settimer, OnlineCheckUp, 10 ; Scannt auf die existens einer txt wird diese erkannt wird der Client beendet. settimer, KILLCheckUp, 800 ;============================================================================ ; ####################### Ende Autoexecutebereich ########################### ;============================================================================ ;============================================================================ ; Tray Menü & Haupt GUI ;============================================================================ Menu, Tray, DeleteAll Menu, Tray, Standard Menu, Tray, Add Menu, Tray, Click, 2 Menu, Tray, Add, Reminder öffnen, zeigegui Menu, Tray, Default, Reminder öffnen Menu, Tray, Icon, Reminder öffnen, %A_ScriptDir%\ReminderTool.ico,,24 Menu, Tray, Icon, %A_ScriptDir%\ReminderTool.ico ;---------------------------------------------------------------------------- Gui, +HWNDh_MainGui Gui, +LastFound Gui, Color, FFFFFF Gui, Font, S7 CDefault, Verdana Gui, Add, Text, x2 y2 w130 h18 , Offene Wiedervorlagen: Gui, Add, Text, x132 y2 w860 h18 +Center, Klicke Doppelt auf einen Eintrag um ihn für den Editor freizuschalten. Gui, Add, ListView, x2 y20 w990 h240 vResultsLV gLV1 -Multi +NoSort HWNDh_LV1 +BackgroundD9E7FB -LV0x10, %ColumnNames% Gui, Add, GroupBox, x2 y270 w990 h140 cBlack, Editor Gui, Add, Text, x12 y290 w70 h20 , Reminder-ID: Gui, Add, Text, x87 y290 w100 h20 cGreen vRM_ID, Gui, Add, Text, x12 y320 w60 h20 , Dein ToDo: Gui, Add, DropDownList, x112 y320 w130 h20 r3 vRM_ToDo_DropDown Choose1 HWNDh_1, %ToDoList% Gui, Add, Edit, x12 y340 w230 h60 vRM_ToDo_Text HWNDh_2, Gui, Add, Text, x252 y292 w60 h20 , Rufnummer: Gui, Add, Edit, x317 y290 w120 h20 vRM_RRNr Limit15 Number HWNDh_3, Gui, Add, Text, x252 y320 w120 h20 , Was hast Du gemacht? Gui, Add, Edit, x252 y340 w230 h60 vRM_ToDo_Erl_Text HWNDh_4, Gui, Add, Text, x507 y290 w140 h20 +Center, Datum/Uhrzeit: Gui, Add, DateTime, x507 y310 w140 h30 vRM_DateTime, dd.MM.yyyy HH:mm Gui, Add, Text, x490 y352 w80 h20 +Right, Kundennummer: Gui, Add, Edit, x574 y350 w90 h20 vRM_KDNr Limit%Len1% Number HWNDh_5, Gui, Add, Text, x490 y374 w80 h20 +Right, ggf. Text ID: Gui, Add, Edit, x574 y372 w90 h20 vRM_DID Limit10 HWNDh_6, Gui, Add, Button, x682 y300 w80 h90 vRM_Abort gRM_Abort, Vorgang`n`nabbrechen Gui, Add, Button, x772 y300 w90 h40 vRM_New gRM_New, Neuer Eintrag Gui, Add, Button, x772 y350 w90 h40 vRM_Save gRM_Save, Speichern Gui, Add, Button, x872 y300 w100 h40 vRM_NoneCallNote gRM_NoneCallNote, Ohne CallNote`nabschließen Gui, Add, Button, x872 y350 w100 h40 vRM_CallNote gRM_CallNote, Mit CallNote`nabschlließen Gui, Add, Text, x2 y412 w990 h18 , Geschlossene Widervorlagen (werden nach 10 Tagen ins Archiv verschoben): Gui, Add, ListView, x2 y430 w990 h180 vResultsLV2 gLV2 -Multi +NoSort HWNDh_LV2 +BackgroundD9E7FB -LV0x10, %ColumnNames% ; Hier werden die Controls farbig gemacht. Loop, 6 CTLCOLORS.Attach(h_%A_Index%, "DCF1DD", "Black") ; Setzt die nicht benötigten Controls auf Disabled. GuiControl, Disabled, RM_Abort GuiControl, Disabled, RM_Save GuiControl, Disabled, RM_CallNote GuiControl, Disabled, RM_NoneCallNote GuiControl, Disabled, RM_ID GuiControl, Disabled, RM_ToDo_DropDown GuiControl, Disabled, RM_ToDo_Text GuiControl, Disabled, RM_RRNr GuiControl, Disabled, RM_ToDo_Erl_Text GuiControl, Disabled, RM_DateTime GuiControl, Disabled, RM_KDNr GuiControl, Disabled, RM_DID Gui, Show, Hide h612 w993 x%RMGUIX% y%RMGUIY%, %AppName% ; Hier die ListViews mit Daten gefüllt. GoSub RefreshLV GoSub RefreshLV2 ; Zeichnet das Fenster neu. WinSet, ReDraw ; Hier werden die Reihen die Zeitlich überfällig sind Rot gemacht. LV_Colors.OnMessage() LV_Colors.Attach(h_LV1, False) GoSub LVColor ; Springt das Label für die Notification PopUp's zum ersten mal an. GoSub TimeCheck ; Dies startet den Timer für die Notification PopUp's if (A_Sec+0) sleep,% (60-A_Sec)*1000 Settimer, TimeCheck, 30000 Return ;============================================================================ ; Ende GUI ;============================================================================ ;============================================================================ ; Prüft ob eine Datei vorliegt und wenn dem so ist wird sie gelöscht. ; Dies signalisiert dem AdminTool das der Client Online ist. ;============================================================================ OnlineCheckUp: ; Analog zum LivingCheck, prüft ob eine Onlineanfrage kommt und bestätigt diese indem das File gelöscht wird. If !FileExist(DBFolder) { FileCreateDir, %DBFolder% If (ErrorLevel) { MsgBox, 16, %AppName%, Auf das Verzeichnis %DBFolder% konnte nicht zugegriffen werden.`n`nBitte ändere nicht ohne Rücksprache die Pfadangaben. Anscheinend ist das Netzlaufwerk nicht verfügbar. Warte bis es wieder nutzbar ist und starte den Reminder neu.`n%AbortProg% ExitApp } } CheckOnline:=LANPfad A_UserName "\*checkOn.line" IfExist %CheckOnline% Filedelete, %CheckOnline% Return ;============================================================================ ;============================================================================ ; Prüft ob ein Killfile vorliegt, ein AdminClient wünscht die beendigung ; des User Clienten um Vorgänge von einem zum anderen User zu verschieben. ;============================================================================ KILLCheckUp: CheckKILL:=LANPfad A_UserName "\*checkOn.kill" IfExist %CheckKILL% { t:=60 Settimer, KILLCheckUp, off Settimer, KillTimer, 1000 msgbox, 4144, Killfile entdeckt...,Ein Reminder-Admin Client bittet darum diesen User-Client zu beenden.`n`nBitte speicher alle offnen Vorgänge ab (offene Reminder-Fenster)`, beende dann den Reminder.`n`nDer Reminder wird in 60 Sekunden beendet } Return KillTimer: t-- ToolTip, Reminder wird in %t% Sekunden beendet. If (t<0) { Filedelete, %CheckKILL% ExitApp } Return EndReminder: Filedelete, %CheckKILL% ExitApp ;============================================================================ ;============================================================================ ; Speichert die Position der GUI ;============================================================================ WM_MOUSELEAVE() { global h_MainGui global RMGUIX global RMGUIY IfWinActive, ahk_id %h_MainGui% { WinGetPos, RMGUIX, RMGUIY,,, ahk_id %h_MainGui% IniWrite,%RMGUIX%, %A_ScriptDir%\funktionen.ini, REMINDER, RMGUIX IniWrite,%RMGUIY%, %A_ScriptDir%\funktionen.ini, REMINDER, RMGUIY } } Return ;============================================================================ ;============================================================================ ; Labels zur GUI ;============================================================================ ; Zeigt die Haupt Gui nach Doppelklick auf das Trayicon oder Auswahl im Menü zeigegui: IfWinNotExist, %h_MainGui% { Gui, 1:+LastFound Gui, 1:Show GoSub LVColor Winset, Redraw } Return ; Sorgt dafür das die farbigen controls korrekt dargestellt werden. GuiSize: If (A_EventInfo != 1) { Gui, %A_Gui%:+LastFound WinSet, ReDraw } Return ; Speichern von Änderungen unter Rücksicht auf verchiedene Prüfungsergebnisse. RM_Save: Toff:=1 ; Entfernt ein evtl. offenes ToolTip If (PopUpNewRM=1) Gui, PopUpNewRM:Submit, NoHide else Gui, Submit, NoHide RM_DateTime:=SubStr(RM_DateTime, 1, 12) . "00" ; Setzt im YYYYMMDDHH24MISS Zeitstring die Sekunden auf 00. FullTime:=RM_DateTime ; FullTime enthält immer den YYYYMMDDHH24MISS Zeitstring. If (LVOpen=1) ; Prüft nur dann wenn der Eintrag über das ListView in den Editor geladen wurde. { ; Checkt ob überhaupt änderungen an den Werten vorgenommen wurden. Wenn nicht erscheint entsprechend eine Meldung. Das Speichern wird dann abgebrochen. if (Helper2=RM_KDNr && Helper3=RM_DID && Helper4=RM_ToDo_DropDown && Helper5=RM_RRNr && Helper8=RM_ToDo_Text && Helper9=RM_ToDo_Erl_Text && Helper11=FullTime) { ToolTipText:="Es wurde nichts verändert!" TTZeit:=3000 Settimer, STT, -1 Return } } If (RM_ToDo_Text="" || RM_KDNr="" || RM_DateTime<=A_Now) ; Prüft ob die Felder für den ToDoText sowie Kundennummer einen Inhalt haben und ob die Zeitangabe in der Zukunft liegt. { ; Sollte auch nur ein element nicht passen erscheint eine Meldung. Das Speichern wird abgebrochen. ToolTipText:="Eintrag konnte nicht gespeichert werden!`nFolgendes muss vorhanden sein:`nDein ToDo (Textfeld)`nEine Kundennummer`nZeitangabe in der Zukunft" PopUpNewRMError=1 TTZeit:=8000 Settimer, STT, -1 Return } else { ; Hier erfolgt die Zeitprüfung sowie weitere Checks bzgl. einzelner Felder. StrCheck := RegExMatch(RM_KDNr, "^" . KDNr1 . "|^" . KDNr2 . "", StrOut) KDNRLen:=StrLen(RM_KDNr) If (StrOut!=KDNr1 && StrOut!=KDNr2) ; Prüft ob im Feld Kundennummer am Anfang %KDNr1% oder %KDNr2% steht. { ; Ist keine von beiden vorhanden erscheint diese Meldung, das speichern wird abgebrochen. ToolTipText:="Die Kundennummer fängt nicht mit " . KDNr1 . " oder " . KDNr2 . " an.`nBitte gebe eine korrekte Kundennummer an." PopUpNewRMError=1 TTZeit:=5000 Settimer, STT, -1 Return } else { If (StrOut=KDNr1 && KDNRLen!=Len1) { ; Prüft ob die Länge von %Len1% Zeichen eingehalten wurde. Wenn nicht wird darauf hingewiesen und das Speichern abgebrochen. ToolTipText:=Text1 PopUpNewRMError=1 TTZeit:=5000 Settimer, STT, -1 Return } If (StrOut=KDNr2 && KDNRLen!=Len2) { ; Prüft ob die Länge von %Len2% Zeichen eingehalten wurde. Wenn nicht wird darauf hingewiesen und das Speichern abgebrochen. ToolTipText:=Text2 PopUpNewRMError=1 TTZeit:=5000 Settimer, STT, -1 Return } } FormatTime, VarDate, %RM_DateTime%, ddMMyyyy ; Zum vergleich wird hier das Datum des Crontrols gespeichert. FormatTime, VarTime, %RM_DateTime%, HHmm ; Hier die Uhrzeit. FormatTime, VarDay, %RM_DateTime%, WDay ; Hier der Wochentag. FormatTime, RM_DateTime, %RM_DateTime%, dd.MM.yyyy HH:mm ; Hier das komplette Datum in ansehnlicher Form für das ListView. Gosub DateTime ; Hier erfolgt der Öffnungszeiten Check. Nur wenn das ausgewählte Datum/Uhrzeit innerhalb der Öffnungszeiten liegt kann gespeichert werden. ; Hier erfolgt die Prüfung ob ein Fehler vorlag und wenn ja wird die passende Meldung ausgegeben. Das Speichern wird dann abgebrochen. if (TimeCheck=1) { ToolTipText:="Am von dir gewünschten Datum ist die Line geschlossen.`nDaher kann hier keine WVL erstellt werden.`nWähle bitte ein anderes Datum aus." PopUpNewRMError=1 TTZeit:=8000 Settimer, STT, -1 Return } if (TimeCheck=2) { ToolTipText:="Am von dir gewünschten Tag hat die Line erst`nab " Time " Uhr geöffnet. Bitte wähle eine spätere Uhrzeit aus." PopUpNewRMError=1 TTZeit:=8000 Settimer, STT, -1 Return } if (TimeCheck=4) { ToolTipText:="Am von dir gewünschten Tag hat die Line nur`nbis " Time " Uhr geöffnet. Bitte wähle eine frühere Uhrzeit aus." PopUpNewRMError=1 TTZeit:=8000 Settimer, STT, -1 Return } if (TimeCheck=5) { ToolTipText:="Deinem User wurde noch keine Rolle zugewisen.`nWende dich an deinen TL/AP.`n`nKlicke anschließend erneut auf Speichern." PopUpNewRMError=1 TTZeit:=8000 Settimer, STT, -1 Return } } If (RM_New_Entry=1) ; Hier erfolgt das Speichern wenn es sich um einen Neueintrag handelt. { RM_New_Entry:=0 DB.Exec("BEGIN TRANSACTION;") ; Beginn der Übertragung SQL := "INSERT INTO " . TableName . " VALUES('" . RM_ID . "', '" . RM_KDNr . "', '" . RM_DID . "', '" . RM_ToDo_DropDown . "', '" . RM_RRNr . "', '" . RM_DateTime . "', 'Offen', '" . RM_ToDo_Text . "', '" . RM_ToDo_Erl_Text . "', '" . UserName . "', '" . FullTime . "', '1', '');" ; Zusammensetzen des SQL Befehls als INSERT da NEU If !DB.Exec(SQL) ; durchführen des SQL Befehls MsgBox, 16, SQLite Error, % "Msg:`t" . DB.ErrorMsg . "`nCode:`t" . DB.ErrorCode DB.Exec("COMMIT TRANSACTION;") ; Schließen der Übertragung GoSub RefreshLV ; Refresh des oberen ListViews GoSub LVColor } If (PopUpNewRM=1) { PopUpNewRM:=0 DB.Exec("BEGIN TRANSACTION;") ; Beginn der Übertragung SQL := "INSERT INTO " . TableName . " VALUES('" . RM_ID . "', '" . RM_KDNr . "', '" . RM_DID . "', '" . RM_ToDo_DropDown . "', '" . RM_RRNr . "', '" . RM_DateTime . "', 'Offen', '" . RM_ToDo_Text . "', '" . RM_ToDo_Erl_Text . "', '" . UserName . "', '" . FullTime . "', '1', '');" ; Zusammensetzen des SQL Befehls als INSERT da NEU If !DB.Exec(SQL) ; durchführen des SQL Befehls MsgBox, 16, SQLite Error, % "Msg:`t" . DB.ErrorMsg . "`nCode:`t" . DB.ErrorCode DB.Exec("COMMIT TRANSACTION;") ; Schließen der Übertragung GoSub RefreshLV ; Refresh des oberen ListViews GoSub LVColor } If (LVOpen=1) ; Hier erfolgt das Speichern wenn der Vorgang aus dem ListView kommt. { IfWinExist, Reminder ID: %RM_ID% { Winset, Disable, , Reminder ID: %RM_ID% Gui, 1:+Disabled msgbox,262180,Achtung - Doppelte Bearbeitung!,Du hast versucht einen Vorgang im Editor zu speichern obwohl noch ein Notification PopUp zur ID: %RM_ID% offen ist.`n`nDies kann zu Inkonsistenzen führen. Daher entscheide dich nun über welches Fenster du deine Eingaben speichern möchtest.`n`nJA = Weiter über den Editor (schließt das PopUp).`n`nNEIN = Weiter über das Notification PopUp (setzt den Editor zurück). IfMsgBox, Yes { WinGet, AktivID, ID, Reminder ID: %RM_ID% Gui, %AktivID%:Destroy WinActivate, %AppName% } IfMsgBox, No { GoSub CleanUp LVOpen:=0 WinActivate, Reminder ID: %RM_ID% Winset, Enable, , Reminder ID: %RM_ID% } Gui, 1:-Disabled Return } DB.Exec("BEGIN TRANSACTION;") ; Beginn der Übertragung SQL := "UPDATE " . TableName . " SET KD_Nr='" . RM_KDNr . "', D_ID='" . RM_DID . "', ToDo='" . RM_ToDo_DropDown . "', RR_Nr='" . RM_RRNr . "', WVL_Zeitpunkt='" . RM_DateTime . "', Status='Offen', ToDo_Text='" . RM_ToDo_Text . "', ToDo_Erl_Text='" . RM_ToDo_Erl_Text . "', Benutzer='" . UserName . "', FullTime='" . FullTime . "', ShowFlag='1', FirstUser='" . RM_FirstUser . "' WHERE Reminder_ID='" . RM_ID . "';" ; Zusammensetzen des SQL Befehls als UPDATE da bestehender Vorgang - Hier wird nur die Reihe upgedatet deren ID mit RM_ID übereinstimmt. If !DB.Exec(SQL) ; durchführen des SQL Befehls. MsgBox, 16, SQLite Error, % "Msg:`t" . DB.ErrorMsg . "`nCode:`t" . DB.ErrorCode DB.Exec("COMMIT TRANSACTION;") ; Schließen der Übertragung. GoSub RefreshLV ; Refresh des oberen ListViews. GuiControl, Disabled, RM_CallNote LVOpen:=0 GoSub LVColor } GoSub CleanUp ; Der CleanUp bereinigt nach dem Speichern die GUI und setzt die Buttons auf Anfang zurück. Return ; Dieses Label wird aktiv wenn ein Doppelklick auf das obere ListView erfolgt oder eine der Spaltenüberschriften angeklickt wird. LV1: Gui, ListView, %h_LV1% If (A_GuiEvent = "ColClick") { LV_ModifyCol({2:2,3:3,4:4,6:11}[A_EventInfo],"Sort") GoSub LVColor } if (A_GuiEvent = "DoubleClick") ; Hier werden die Inhalte der doppelt angeklickten Reihe des ListViews nacheinander in behilfs Variablen gelesen. { If (RM_New_Entry=1) { ; Sollte schon ein neuer Vorgang offen sein erscheint diese Meldung. ToolTipText:="Ein neuer Vorgang ist bereits offen.`nBitte diesen erst Speichern oder löschen." TTZeit:=5000 Settimer, STT, -1 Return } If (LVOpen=1) { ; Sollte schon ein Vorgang vom ListView aus geöffnet sein erscheint diese Meldung. ToolTipText:="Ein Vorgang ist bereits offen.`nBitte diesen erst Speichern\Löschen\Abschließen." TTZeit:=5000 Settimer, STT, -1 Return } LV_Colors.Row(h_LV1, A_EventInfo, 0x86e855, 0x000000) ; Markiert die aktive Reihe, setzt diese auf Grün. Loop % LV_GetCount("Col") ; Ermittelt die Menge an Spalten. { LV_GetText(RM_LV_INPUT_%A_Index%, A_EventInfo, A_Index) ; Ließt den Inhalt aus. } if (RM_LV_INPUT_1="Reminder ID") Return else { Loop,11 { Helper%A_Index%:=RM_LV_INPUT_%A_Index% ; Speichert den Inhalt nochmal in einen weiteren Satz behilfs Variablen. Diese werden oben beim Check genutzt ob eine Änderung an den Daten erfolgte. } LVOpen:=1 GuiControl, Disabled, RM_New ;msgbox % RM_LV_INPUT_1 " - " RM_LV_INPUT_2 " - " RM_LV_INPUT_3 " - " RM_LV_INPUT_4 " - " RM_LV_INPUT_5 " - " RM_LV_INPUT_6 " - " RM_LV_INPUT_7 " - " RM_LV_INPUT_8 " - " RM_LV_INPUT_9 " - " RM_LV_INPUT_10 " - " RM_LV_INPUT_11 " - " RM_LV_INPUT_12 " - " RM_LV_INPUT_13 ; Hier wird die GUI entsprechend angepasst. Die Buttons werden freigegeben und die Controls mit den ausgelesenen Werten gefüllt. GuiControl, Enabled, RM_Abort GuiControl, Enabled, RM_Save GuiControl, Enabled, RM_NoneCallNote GuiControl, Enabled, RM_CallNote GuiControl, Enabled, RM_ID GuiControl, Enabled, RM_ToDo_DropDown GuiControl, Enabled, RM_ToDo_Text GuiControl, Enabled, RM_RRNr GuiControl, Enabled, RM_ToDo_Erl_Text GuiControl, Enabled, RM_DateTime GuiControl, Enabled, RM_KDNr GuiControl, Enabled, RM_DID RM_ID:=RM_LV_INPUT_1 RM_FirstUser:=RM_LV_INPUT_13 GuiControl, , RM_ID, %RM_LV_INPUT_1% GuiControl, , RM_KDNr, %RM_LV_INPUT_2% GuiControl, , RM_DID, %RM_LV_INPUT_3% If (RM_LV_INPUT_4="Outbound") GuiControl, Choose, RM_ToDo_DropDown, 1 If (RM_LV_INPUT_4="Systemänderung") GuiControl, Choose, RM_ToDo_DropDown, 2 If (RM_LV_INPUT_4="Kontrolle") GuiControl, Choose, RM_ToDo_DropDown, 3 GuiControl, , RM_RRNr, %RM_LV_INPUT_5% GuiControl, , RM_DateTime, %RM_LV_INPUT_11% GuiControl, , RM_ToDo_Text, %RM_LV_INPUT_8% GuiControl, , RM_ToDo_Erl_Text, %RM_LV_INPUT_9% } } Return ; Sorgt für die Sortierungen beim 2. ListView. Nicht unbedingt nötig aber der Vollständigkeit halber. LV2: Gui, ListView, %h_LV2% If (A_GuiEvent = "ColClick") { LV_ModifyCol({2:2,3:3,4:4,6:11}[A_EventInfo],"Sort") } Return ; Dient zum farbigen Markieren einzelner Reihen wenn die WVL Zeit A_Now unterschreitet. LVColor: Gui, ListView, %h_LV1% LVName:="ResultsLV" Loop % LV_GetCount() ; Ermittelt die Menge an Reihen. { LV_GetText(TimeCheck, A_Index, 11) ; Ließt den Inhalt aus. If (TimeCheck<A_Now) ; Checkt ob FullTime kleiner als A_Now ist. { ; Setzt bei Erfolg die Farbe auf Rot. GuiControl, -ReDraw, %LVName% LV_Colors.Row(h_LV1, A_Index, 0xff8075, 0x000000) GuiControl, +ReDraw, %LVName% } else { ; Setzt bei Misserfolg die Farbe zurück auf die Hintergrundfarbe des ListViews. GuiControl, -ReDraw, %LVName% LV_Colors.Row(h_LV1, A_Index, 0xD9E7FB, 0x000000) GuiControl, +ReDraw, %LVName% } } Return ; Prüft ob die WVL Zeit A_Now unterbietet. Bei positver Prüfung wird geschaut ob das ShowFlag noch gesetzt ist. Nur wenn dieses auf 1 steht werden alle Daten geholt und die GUI gestartet. TimeCheck: Gui, ListView, %h_LV1% Loop % LV_GetCount() ; Ermittelt die Menge an Reihen. { ; Ließt den Inhalt aus. LV_GetText(PopUp_ID, A_Index, 1) LV_GetText(PopUp_KDNr, A_Index, 2) LV_GetText(PopUp_DID, A_Index, 3) LV_GetText(PopUp_ToDoList, A_Index, 4) LV_GetText(PopUp_RRNr, A_Index, 5) LV_GetText(PopUp_ToDoText, A_Index, 8) LV_GetText(PopUp_ToDoErlText, A_Index, 9) LV_GetText(TimeCheck, A_Index, 11) LV_GetText(ShowFlag, A_Index, 12) LV_GetText(PopUp_FirstUser, A_Index, 13) If (TimeCheck<=A_Now) ; Vergleicht die WVL Zeit mit der A_Now { If (ShowFlag=1) { IfWinNotExist , Reminder ID: %PopUp_ID% { ReminderPopUp() } } } } Return ; Mit diesem Sprungpunkt wird ein Vorgang abgeschlossen und zudem eine Note erstellt. RM_CallNote: CloseWithCN:=1 GoSub RM_NoneCallNote Return ; Dieser Sprungpunkt schließt einen Vorgang ab ohne eine Note zu erstellen. Mit Entprechend gesetztem Flag jedoch wird eine Note erstellt. RM_NoneCallNote: Toff:=1 ; Entfernt ein evtl. offenes ToolTip If (CallNotePopUpFlag=0) { Gui, Submit, NoHide FullTime:=RM_DateTime FormatTime, RM_DateTime, %RM_DateTime%, dd.MM.yyyy HH:mm } If (RM_ToDo_Erl_Text!="") { ; Die Übermittlung um den Fall zu schließen startet nur dann wenn auch ein ToDo Text hinterlegt wurde. DB.Exec("BEGIN TRANSACTION;") SQL := "UPDATE " . TableName . " SET KD_Nr='" . RM_KDNr . "', D_ID='" . RM_DID . "', ToDo='" . RM_ToDo_DropDown . "', RR_Nr='" . RM_RRNr . "', WVL_Zeitpunkt='" . RM_DateTime . "', Status='Geschlossen', ToDo_Text='" . RM_ToDo_Text . "', ToDo_Erl_Text='" . RM_ToDo_Erl_Text . "', Benutzer='" . UserName . "', FullTime='" . FullTime . "', ShowFlag='0', FirstUser='" . RM_FirstUser . "' WHERE Reminder_ID='" . RM_ID . "';" ; Zusammensetzen des SQL Befehls als UPDATE da bestehender Vorgang - Hier wird nur die Reihe upgedatet deren ID mit RM_ID übereinstimmt. If !DB.Exec(SQL) MsgBox, 16, SQLite Error, % "Msg:`t" . DB.ErrorMsg . "`nCode:`t" . DB.ErrorCode DB.Exec("COMMIT TRANSACTION;") GoSub RefreshLV GoSub RefreshLV2 ; Refresh für das untere ListView. LVOpen:=0 GuiControl, Disabled, RM_CallNote GoSub CleanUp If (CloseWithCN=1) { CallNoteBetreff:="Reminder erledigt, ID: " . RM_ID TT0:="Reminder `""Task erledigt"`" Meldung:`r`n`r`n" TT1:="Reminder ID: " . RM_ID . "`r`n" TT2:="`r`nKundennummer: " . RM_KDNr If (RM_DID !="") TT3:="`r`nBetreffende Text ID: " . RM_DID else TT3:="" If (RM_RRNr !="") TT4:="`r`nRückrufnummer: " . RM_RRNr else TT4:="" TT5:="`r`nWiedervorlagezeit: " . RM_DateTime . "`r`n" TT6:="`r`nReminder Kategorie: " . RM_ToDo_DropDown . "`r`n" TT7:="`r`nWas war zu tun?: " . RM_ToDo_Text TT8:="`r`n`r`nWas wurde gemacht: " . RM_ToDo_Erl_Text . "`r`n" CallNoteText:=TT0 TT1 TT2 TT3 TT4 TT5 TT6 TT7 TT8 GoSub CreateCallNote CloseWithCN:=0 } If (CallNotePopUpFlag=1) { GoSub RefreshLVPopUp } GoSub LVColor } else { ; Meldung dies erscheint wenn im ToDoErl Text nichts steht. ToolTipText:="Es wurde kein 'Was hast Du gemacht?' Text eingetragen.`nOhne ist das Abschließen nicht möglich." TTZeit:=5000 Settimer, STT, -1 Return } Return ; Startet einen neuen Vorgang und weist eine ID zu. RM_New: GuiControl, Disabled, RM_New GuiControl, Enabled, RM_Abort GuiControl, Enabled, RM_Save GuiControl, Enabled, RM_ID GuiControl, Enabled, RM_ToDo_DropDown GuiControl, Enabled, RM_ToDo_Text GuiControl, Enabled, RM_RRNr GuiControl, Enabled, RM_ToDo_Erl_Text GuiControl, Enabled, RM_DateTime GuiControl, Enabled, RM_KDNr GuiControl, Enabled, RM_DID RM_New_Entry:=1 GoSub GetID ; Erzeugt eine ID und weist sie dem Control zu RM_ID:=SecureID GuiControl, , RM_ID, %SecureID% Return ; Bricht einen Vorgang ab und verwirft die Änderungen. Die GUI wird dadurch einfach in den Anfangszustand zurückversetzt. RM_Abort: Toff:=1 ; Entfernt ein evtl. offenes ToolTip GoSub CleanUp GuiControl, Disabled, RM_CallNote LVOpen:=0 RM_New_Entry:=0 GoSub LVColor Return ; Zerstört die Haupt GUI. GuiClose: Toff:=1 ; Entfernt ein evtl. offenes ToolTip Gui, 1:Hide Return ; Cleant die GUÌ, erzeugt den Anfangszustand. CleanUp: GuiControl, Enabled, RM_New GuiControl, Disabled, RM_Abort GuiControl, Disabled, RM_Save GuiControl, Disabled, RM_NoneCallNote GuiControl, Disabled, RM_ID GuiControl, Disabled, RM_ToDo_DropDown GuiControl, Disabled, RM_ToDo_Text GuiControl, Disabled, RM_RRNr GuiControl, Disabled, RM_ToDo_Erl_Text GuiControl, Disabled, RM_DateTime GuiControl, Disabled, RM_KDNr GuiControl, Disabled, RM_DID GuiControl, , RM_ID, GuiControl, , RM_ToDo_Text, GuiControl, , RM_RRNr GuiControl, , RM_ToDo_Erl_Text, GuiControl, , RM_DateTime, %A_Now% GuiControl, , RM_KDNr, GuiControl, , RM_DID, Return ; Erstellt eine CallNote mit entsprechendem Inhalt. CreateCallNote: ClipBoard:=CallNoteText ToolTip, Die CallNote befindet sich in der Zwischenablage. Sleep, 2000 ToolTip Return ;============================================================================ ;============================================================================ ; Funktion zum erzeugen des Notification PopUp. Dies erscheint dann ; wenn der Zeitpunkt der Widervorlage abgelaufen ist. ;============================================================================ ReminderPopUp() { Global Gui, POP%a%:+LastFound +OwnDialogs -SysMenu Gui, POP%a%:Color, FFFFFF Gui, POP%a%:Add, Edit,x0 y0 w0 h0 vReminderIDPopUp Gui, POP%a%:Add, Edit,x0 y0 w0 h0 vReminderFirstUser Gui, POP%a%:Add, Text, x2 y0 w60 h20 , Dein ToDo: Gui, POP%a%:Add, DropDownList, x92 y0 w140 h20 r3 vPopVar1 HWNDh_2_2, %ToDoList% Gui, POP%a%:Add, Edit, x2 y20 w230 h60 vPopVar2 HWNDh_2_1, Gui, POP%a%:Add, Text, x2 y80 w120 h20 , Was hast du gemacht?: Gui, POP%a%:Add, Edit, x2 y100 w230 h60 vPopVar3 HWNDh_2_3, Gui, POP%a%:Add, Text, x2 y160 w80 h20 +Right , Kundennummer: Gui, POP%a%:Add, Edit, x92 y160 w120 h20 vPopVar4 HWNDh_2_4 ReadOnly, Gui, POP%a%:Add, Text, x2 y180 w80 h20 +Right , Text ID: Gui, POP%a%:Add, Edit, x92 y180 w120 h20 vPopVar5 Limit10 HWNDh_2_5, Gui, POP%a%:Add, Text, x2 y200 w80 h20 +Right , Rückrufnummer: Gui, POP%a%:Add, Edit, x92 y200 w120 h20 vPopVar6 HWNDh_2_6 Limit15 Number, Gui, POP%a%:Add, GroupBox, x242 y0 w130 h160 , Wiedervorlage: Gui, POP%a%:Add, Edit, x252 y20 w30 h20 vPopVar7 gSnoozeCheck HWNDh_2_7 Limit3 +Center Number,5 Gui, POP%a%:Add, Button, x282 y20 w80 h20 gSnooze, Snooze Gui, POP%a%:Add, Text, x252 y40 w110 h20 +Center, max. 120 Min Gui, POP%a%:Add, Text, x252 y70 w110 h20 +Center, Datum/Uhrzeit: Gui, POP%a%:Add, DateTime, x252 y90 w110 h30 vNewTimeCheck, dd.MM.yyyy HH:mm Gui, POP%a%:Add, Button, x252 y120 w110 h30 gWVL, Wiedervorlage Gui, POP%a%:Add, Button, x212 y160 w160 h30 gNoneCallNotePopUp, Ohne CallNote abschließen Gui, POP%a%:Add, Button, x212 y190 w160 h30 gCallNotePopUp, Mit CallNote abschließen Gui, POP%a%:Add, Button, x2 y220 w370 h30 gKillFlag, Vorgang offen halten`, aber keine Erinnerung mehr anzeigen. If (PopUp_ToDoList="Outbound") GuiControl, POP%a%:Choose, PopVar1, 1 If (PopUp_ToDoList="Systemänderung") GuiControl, POP%a%:Choose, PopVar1, 2 If (PopUp_ToDoList="Kontrolle") GuiControl, POP%a%:Choose, PopVar1, 3 GuiControl, POP%a%:, PopVar2, %PopUp_ToDoText% GuiControl, POP%a%:, PopVar3, %PopUp_ToDoErlText% GuiControl, POP%a%:, PopVar4, %PopUp_KDNr% GuiControl, POP%a%:, PopVar5, %PopUp_DID% GuiControl, POP%a%:, PopVar6, %PopUp_RRNr% GuiControl, POP%a%:, ReminderIDPopUp, %PopUp_ID% GuiControl, POP%a%:, ReminderFirstUser, %PopUp_FirstUser% Loop, 7 CTLCOLORS.Attach(h_2_%A_Index%, "DCF1DD", "Black") Gui, POP%a%:Show, h254 w376, Reminder ID: %PopUp_ID% a++ GoSub LVColor WinSet, ReDraw Return } ;============================================================================ ; Labels zum Notification PopUp ;============================================================================ ; Setz der User im PopUp eine neue WVL Zeit wird hier zuerst geprüft ob diese im Zeitlichen Rahmen der Linebedingungen liegen. Wenn nicht erscheint 1. ein ToolTip mit Fehlermeldung (über das TimeCheckPopUp) und 2. wird Treffer auf 1 gesetzt wodurch die Bearbeitung dann endet. Ist die gewählte WVL Zeit im Rahmen der Vorgaben wird diese als neue Zeit in der DB gespeichert. WVL: Toff:=1 ; Entfernt ein evtl. offenes ToolTip GUIID:=A_Gui Gosub GetVarPopUp GoSub TimeCheckPopUp If (Treffer=1) { Treffer:=0 Return } DB.Exec("BEGIN TRANSACTION;") ; Beginn der Übertragung SQL := "UPDATE " . TableName . " SET KD_Nr='" . RM_KDNr . "', D_ID='" . RM_DID . "', ToDo='" . RM_ToDo_DropDown . "', RR_Nr='" . RM_RRNr . "', WVL_Zeitpunkt='" . RM_DateTime . "', Status='Offen', ToDo_Text='" . RM_ToDo_Text . "', ToDo_Erl_Text='" . RM_ToDo_Erl_Text . "', Benutzer='" . UserName . "', FullTime='" . FullTime . "', ShowFlag='1', FirstUser='" . RM_FirstUser . "' WHERE Reminder_ID='" . RMIDPopUp . "';" ; Zusammensetzen des SQL Befehls als UPDATE da bestehender Vorgang - Hier wird nur die Reihe upgedatet deren ID mit RM_ID übereinstimmt. If !DB.Exec(SQL) ; durchführen des SQL Befehls. MsgBox, 16, SQLite Error, % "Msg:`t" . DB.ErrorMsg . "`nCode:`t" . DB.ErrorCode DB.Exec("COMMIT TRANSACTION;") ; Schließen der Übertragung. GoSub RefreshLVPopUp Return ; Dies wird in der PopUp Funktion als gLabel für das Snooze Editfeld verwendet. Es sorgt dafür das nie eine höhere Zeit als 120 min. angegeben wird, falls doch setzt es sich selbst zurück auf 120. SnoozeCheck: GUIID:=A_Gui GuiControlGet, SnoozeTime, %GUIID%:, PopVar7 If (SnoozeTime>120) GuiControl, %GUIID%:, PopVar7, 120 Return ; addiert die im Editfeld angegebenen Minuten zu A_Now und gibt dies zur Prüfung ans Label TimeCheckPopUp. Ist die neue Zeit im Rahmen der Vorgaben wird sie als WVL Zeitpunkt in der DB abgelegt. Wenn nicht erscheint eine Meldung und die Bearbeitung endet (weil Treffer=1). Snooze: Toff:=1 ; Entfernt ein evtl. offenes ToolTip GUIID:=A_Gui SnoozePopUp:=1 GoSub GetVarPopUp GoSub TimeCheckPopUp ; Zum Testen ohne Timecheck... ; TimeToCheck:=SubStr(A_Now, 1, 12) . "00" ; Setzt im YYYYMMDDHH24MISS Zeitstring die Sekunden auf 00. ; TimeToCheck += %SnoozeTime%, Minutes ; FullTime:=TimeToCheck ; FormatTime, RM_DateTime, %TimeToCheck%, dd.MM.yyyy HH:mm SnoozePopUp:=0 If (Treffer=1) { Treffer:=0 Return } DB.Exec("BEGIN TRANSACTION;") ; Beginn der Übertragung SQL := "UPDATE " . TableName . " SET KD_Nr='" . RM_KDNr . "', D_ID='" . RM_DID . "', ToDo='" . RM_ToDo_DropDown . "', RR_Nr='" . RM_RRNr . "', WVL_Zeitpunkt='" . RM_DateTime . "', Status='Offen', ToDo_Text='" . RM_ToDo_Text . "', ToDo_Erl_Text='" . RM_ToDo_Erl_Text . "', Benutzer='" . UserName . "', FullTime='" . FullTime . "', ShowFlag='1', FirstUser='" . RM_FirstUser . "' WHERE Reminder_ID='" . RMIDPopUp . "';" ; Zusammensetzen des SQL Befehls als UPDATE da bestehender Vorgang - Hier wird nur die Reihe upgedatet deren ID mit RM_ID übereinstimmt. If !DB.Exec(SQL) ; durchführen des SQL Befehls. MsgBox, 16, SQLite Error, % "Msg:`t" . DB.ErrorMsg . "`nCode:`t" . DB.ErrorCode DB.Exec("COMMIT TRANSACTION;") ; Schließen der Übertragung. GoSub RefreshLVPopUp Return ; Hier erfolgt die überprüfung der Snooze Zeit und der WVL Zeit. Diese muss wie bei Neuanlage oder Editieren aus der HauptGui heraus immer im Rahmen der Vorgaben liegen. Ist dem nicht so, erscheinen entsprechende Meldungen und Treffer wird auf 1 gesetzt wodurch die Bearbeitung des entsprechenden Labels endet. TimeCheckPopUp: If (SnoozePopUp=1) ; Kommt der Sprung vom Snooze Button wird TimeToCheck neu gesetzt. { TimeToCheck:=SubStr(A_Now, 1, 12) . "00" ; Setzt im YYYYMMDDHH24MISS Zeitstring die Sekunden auf 00. TimeToCheck += %SnoozeTime%, Minutes } FormatTime, VarDate, %TimeToCheck%, ddMMyyyy ; Zum vergleich wird hier das Datum des Crontrols gespeichert. FormatTime, VarTime, %TimeToCheck%, HHmm ; Hier die Uhrzeit. FormatTime, VarDay, %TimeToCheck%, WDay ; Hier der Wochentag. FormatTime, RM_DateTime, %TimeToCheck%, dd.MM.yyyy HH:mm ; Hier das komplette Datum in ansehnlicher Form für das ListView. GoSub DateTime If (SnoozePopUp=0) { If (RM_ToDo_Text="" || TimeToCheck<=A_Now) ; Prüft ob die Zeitangabe in der Zukunft liegt. { ToolTipText:="Eintrag konnte nicht gespeichert werden!`nFolgendes muss vorhanden sein:`nDein ToDo (Textfeld)`nZeitangabe in der Zukunft" TTZeit:=8000 Settimer, STT, -1 Treffer:=1 Return } if (TimeCheck=1) { ToolTipText:="Am von dir gewünschten Datum ist die Line geschlossen.`nDaher kann hier keine WVL erstellt werden.`nWähle bitte ein anderes Datum aus." TTZeit:=8000 Settimer, STT, -1 Treffer:=1 Return } if (TimeCheck=2) { ToolTipText:="Am von dir gewünschten Tag hat die Line erst`nab " Time " Uhr geöffnet. Bitte wähle eine spätere Uhrzeit aus." TTZeit:=8000 Settimer, STT, -1 Treffer:=1 Return } if (TimeCheck=4) { ToolTipText:="Am von dir gewünschten Tag hat die Line nur`nbis " Time " Uhr geöffnet. Bitte wähle eine frühere Uhrzeit aus." TTZeit:=8000 Settimer, STT, -1 Treffer:=1 Return } if (TimeCheck=5) { ToolTipText:="Deinem User wurde noch keine Rolle zugewisen.`nWende dich an deinen TL/AP.`n`nKlicke anschließend erneut auf Speichern." TTZeit:=8000 Settimer, STT, -1 Treffer:=1 Return } } else { if (TimeCheck=4) { ToolTipText:="Die Line hat nur bis " Time " Uhr geöffnet.`nBitte wähle eine frühere WVL-Zeit aus." TTZeit:=4000 Settimer, STT, -1 Treffer:=1 Return } } FullTime:=TimeToCheck Return ; Hier werden die Daten aus dem Notification PopUp geholt und entsprechend den Vars zugewiesen. GetVarPopUp: GuiControlGet, RMIDPopUp, %GUIID%:, ReminderIDPopUp GuiControlGet, RM_FirstUser, %GUIID%:, ReminderFirstUser GuiControlGet, TimeToCheck, %GUIID%:, NewTimeCheck GuiControlGet, RM_ToDo_DropDown, %GUIID%:, PopVar1 GuiControlGet, RM_ToDo_Text, %GUIID%:, PopVar2 GuiControlGet, RM_ToDo_Erl_Text, %GUIID%:, PopVar3 GuiControlGet, RM_KDNr, %GUIID%:, PopVar4 GuiControlGet, RM_DID, %GUIID%:, PopVar5 GuiControlGet, RM_RRNr, %GUIID%:, PopVar6 GuiControlGet, SnoozeTime, %GUIID%:, PopVar7 TimeToCheck:=SubStr(TimeToCheck, 1, 12) . "00" ; Setzt im YYYYMMDDHH24MISS Zeitstring die Sekunden auf 00. Return ; Als letzte Aktion einer erfolgreichen Bearbeitung wird dieses Label angesprungen. Das obere ListView wird neu mit Daten gefüttert, die Farbigen Reihen werden neu gesetzt. Zum Schluss wird das Notification PopUp geschlossen. RefreshLVPopUp: GoSub RefreshLV ; Refresh des oberen ListViews. GoSub LVColor ; Setzt die Farben der Reihen neu. Gui, %GUIID%:Destroy ; Zerstört das Notification PopUp Return ; Hier wird lediglich das ShowFlag auf 0 gesetzt. Dies kann auch nur aus dem PopUp heraus erfolgen. Jede andere Bearbeitung lässt das Flag auf 1 stehen oder setzt es wieder auf 1. Ist das ShowFlag auf 0 erfolgt keine weitere Info über das Notification PopUp. KillFlag: Toff:=1 ; Entfernt ein evtl. offenes ToolTip GUIID:=A_Gui ; Speichert die GuiID da diese immer anders ist. GoSub GetVarPopUp DB.Exec("BEGIN TRANSACTION;") ; Beginn der Übertragung SQL := "UPDATE " . TableName . " SET KD_Nr='" . RM_KDNr . "', D_ID='" . RM_DID . "', ToDo='" . RM_ToDo_DropDown . "', RR_Nr='" . RM_RRNr . "', Status='Offen', ToDo_Text='" . RM_ToDo_Text . "', ToDo_Erl_Text='" . RM_ToDo_Erl_Text . "', Benutzer='" . UserName . "', ShowFlag='0', FirstUser='" . RM_FirstUser . "' WHERE Reminder_ID='" . RMIDPopUp . "';" ; Zusammensetzen des SQL Befehls als UPDATE da bestehender Vorgang - Hier wird nur die Reihe upgedatet deren ID mit RM_ID übereinstimmt. If !DB.Exec(SQL) ; durchführen des SQL Befehls. MsgBox, 16, SQLite Error, % "Msg:`t" . DB.ErrorMsg . "`nCode:`t" . DB.ErrorCode DB.Exec("COMMIT TRANSACTION;") ; Schließen der Übertragung. GoSub RefreshLVPopUp Return ; Sorgt dafür das beim Schließen auch eine Note erstellt wird. CallNotePopUp: CloseWithCN:=1 GoSub NoneCallNotePopUp Return ; Sorgt für das abschließen eines Vorgangs. Dazu wird der Status in der DB von offen auf Geschlossen gesetzt. Wird das Label direkt angesprungen erfolgt keine CallNote. Alle Änderungen des Users werden ebenfalls in der DB gespeichert. NoneCallNotePopUp: GUIID:=A_Gui GoSub GetVarPopUp CallNotePopUpFlag:=1 FullTime:=TimeToCheck RM_ID:=RMIDPopUp FormatTime, RM_DateTime, %FullTime%, dd.MM.yyyy HH:mm GoSub RM_NoneCallNote CallNotePopUpFlag:=0 Return ;============================================================================ ; Funktion die einen neuen Reminder anlegt initiiert vom PWM. ;============================================================================ MakeReminder: IfWinExist, Reminder: Neuer Vorgang { msgbox, 262192, Neuer Vorgang noch offen!, Ein neuer Vorgang ist bereits offen.`n`nBitte diesen erst speichern oder abbrechen danach erneut versuchen. Return } GoSub GetID ; Erzeugt eine ID und weist sie dem Control zu RM_ID:=SecureID Gui, PopUpNewRM:+LastFound +OwnDialogs -SysMenu Gui, PopUpNewRM:Color, FFFFFF Gui, PopUpNewRM:Add, Text, x2 y0 w60 h20 , Dein ToDo: Gui, PopUpNewRM:Add, DropDownList, x92 y0 w140 h20 r3 vRM_ToDo_DropDown Choose1 HWNDh_3_1, %ToDoList% Gui, PopUpNewRM:Add, Edit, x2 y20 w230 h60 vRM_ToDo_Text HWNDh_3_2, Gui, PopUpNewRM:Add, Text, x2 y80 w120 h20 , Was hast du gemacht?: Gui, PopUpNewRM:Add, Edit, x2 y100 w230 h60 vRM_ToDo_Erl_Text HWNDh_3_3, Gui, PopUpNewRM:Add, Text, x2 y160 w80 h20 +Right , Kundennummer: Gui, PopUpNewRM:Add, Edit, x92 y160 w120 h20 vRM_KDNr Limit11 Number HWNDh_3_4, Gui, PopUpNewRM:Add, Text, x2 y180 w80 h20 +Right, Text ID: Gui, PopUpNewRM:Add, Edit, x92 y180 w120 h20 vRM_DID Limit10 HWNDh_3_5, Gui, PopUpNewRM:Add, Text, x2 y200 w80 h20 +Right, Rückrufnummer: Gui, PopUpNewRM:Add, Edit, x92 y200 w120 h20 vRM_RRNr HWNDh_3_6 Limit15 Number, Gui, PopUpNewRM:Add, GroupBox, x242 y10 w130 h80 , Wiedervorlage: Gui, PopUpNewRM:Add, Text, x252 y30 w110 h20 +Center, Datum/Uhrzeit: Gui, PopUpNewRM:Add, DateTime, x252 y50 w110 h30 vRM_DateTime, dd.MM.yyyy HH:mm Gui, PopUpNewRM:Add, GroupBox, x242 y100 w130 h50 , Reminder ID Gui, PopUpNewRM:Add, Edit, x252 y120 w110 h20 vRM_ID HWNDh_3_7 +Center +Readonly, Gui, PopUpNewRM:Add, Button, x212 y160 w160 h30 gNoneCallNoteNewPopUp, Vorgang ohne Note speichern Gui, PopUpNewRM:Add, Button, x212 y190 w160 h30 gCallNoteNewPopUp, Vorgang mit Note speichern Gui, PopUpNewRM:Add, Button, x2 y220 w370 h30 gAbortNewPopUp, Abbrechen GuiControl, PopUpNewRM:, RM_KDNr, %PWMKDNR% GuiControl, PopUpNewRM:, RM_ID, %SecureID% Loop, 7 CTLCOLORS.Attach(h_3_%A_Index%, "DCF1DD", "Black") Gui, PopUpNewRM:Show, h254 w376, Reminder: Neuer Vorgang WinSet, ReDraw Return NoneCallNoteNewPopUp: PopUpNewRMError:=0 PopUpNewRM:=1 GoSub RM_Save If (PopUpNewRMError=1) Return PWMKDNR:= Gui, PopUpNewRM:Destroy Return CallNoteNewPopUp: PopUpNewRM:=1 GoSub RM_Save If (PopUpNewRMError=1) Return PWMKDNR:= CallNoteBetreff:="Reminder neuer Task, ID: " . RM_ID TT0:="Reminder `""Neuer Task"`" Meldung:`r`n`r`n" TT1:="Reminder ID: " . RM_ID . "`r`n" TT2:="`r`nKundennummer: " . RM_KDNr If (RM_DID !="") TT3:="`r`nBetreffende Text ID: " . RM_DID else TT3:="" If (RM_RRNr !="") TT4:="`r`nRückrufnummer: " . RM_RRNr else TT4:="" TT5:="`r`nWiedervorlagezeit: " . RM_DateTime . "`r`n" TT6:="`r`nReminder Kategorie: " . RM_ToDo_DropDown . "`r`n" TT7:="`r`nWas ist zu tun?: " . RM_ToDo_Text If (RM_ToDo_Erl_Text !="") TT8:="`r`n`r`nWas wurde bisher gemacht: " . RM_ToDo_Erl_Text . "`r`n" else TT8:="" CallNoteText:=TT0 TT1 TT2 TT3 TT4 TT5 TT6 TT7 TT8 Gui, PopUpNewRM:Destroy GoSub CreateCallNote Return AbortNewPopUp: PWMKDNR:= Gui, PopUpNewRM:Destroy Return ;============================================================================ ; Timer um einen ToolTip x Sekunden anzuzeigen. ;============================================================================ STT: Zähler:=TTZeit//25 Zähler2:=0 Toff:=0 Loop, { If (Toff=1) { ToolTip break } else { Tooltip %ToolTipText% sleep 25 Zähler2++ if (Zähler2=Zähler) { ToolTip break } } } Return ;============================================================================ ; Tickets, die vor mehr als 10 Tagen geschlossen wurden, werden in die ; Archiv-DB geschoben, diese wird dann vom Admin-Tool verarbeitet. ;============================================================================ Archiv: ArchivDBAlias := "Archiv" ; Aliasname für die Archivdatenbank SelectDate := A_Now ; Aktuelle Zeit SelectDate += -10, Days ; Von der aktuellen Zeit werden 10 Tage abgezogen. Selection := " WHERE FullTime <= '" . SelectDate . "' AND Status = '" . StatusArray[2] . "';" ; Auswahlkriterien If !DB.Exec("ATTACH DATABASE '" . DBArchivFilePath . "' AS " . ArchivDBAlias . ";") { ; Archivdatenbank hinzufügen SQLiteError(A_ThisLabel, DB, "ATTACH") Return ; bei einem Fehler ist hier Schluss! } DB.Exec("BEGIN IMMEDIATE TRANSACTION;") SQL := "INSERT OR ROLLBACK INTO " . ArchivDBAlias . "." . TableNameArchiv . " SELECT * FROM " . TableName . Selection If !DB.Exec(SQL) { SQLiteError(A_ThisLabel, DB, "INSERT") DB.Exec("ROLLBACK TRANSACTION;") ; Transaktion zurücksetzen (sicher ist sicher) DB.Exec("DETACH DATABASE " . ArchivDBAlias . ";") ; Archivdatenbank entfernen Return ; bei einem Fehler ist hier Schluss! } ; Inserted := DB.Changes ; nur zum Testen SQL := "DELETE FROM " . TableName . Selection If !DB.Exec(SQL) { SQLiteError(A_ThisLabel, DB, "DELETE") DB.Exec("ROLLBACK TRANSACTION;") ; Transaktion zurücksetzen DB.Exec("DETACH DATABASE " . ArchivDBAlias . ";") ; Archivdatenbank entfernen Return ; bei einem Fehler ist hier Schluss! } Deleted := DB.Changes ; nur zum Testen DB.Exec("COMMIT TRANSACTION;") ; Alles ist fehlerfrei gelaufen, die Transaktion kann gültig gesetzt werden. If !DB.Exec("DETACH DATABASE " . ArchivDBAlias . ";") { ; Archivdatenbank entfernen SQLiteError(A_ThisLabel, DB, "DETACH") } ; Nur zum Testen ; MsgBox, 64, Daten wurden archiviert,%Inserted% Sätze wurden in das Archiv eingefügt`r`n%Deleted% Sätze wurden gelöscht. Return ; ---------------------------------------------------------------------------------------------------------------------- SQLiteError(LabelOrFunc, DB, SQL) { MsgBox, 16, Fehler in %LabelOrFunc%, % "SQLite Fehler bei '" . SQL . "'`r`nMsg:`t" . DB.ErrorMsg . "`nCode:`t" . DB.ErrorCode } Return ;============================================================================ ; Refresh Listview & Show results ;============================================================================ RefreshLV: ; Refresh für ListView1 ; Holt die "Offenen" Vorgänge (StatusArray[1] = "Offen") LVName := "ResultsLV" ; Name des Controls SQL := "SELECT * FROM " . TableName . " WHERE Status = '" . StatusArray[1] . "';" ; SQL String um alle Reihen zu lesen die den Status "Offen" haben. If !DB.GetTable(SQL, Result) ; Führt den SQL String aus. MsgBox, 16, SQLite Error: GetTable, % "Msg:`t" . DB.ErrorMsg . "`nCode:`t" . DB.ErrorCode Else ShowTable(Result, LVName, 1) ; Übergibt das Result an die Funktion die dann das ListView mit Daten befüllt. Return RefreshLV2: ; Refresh für ListView2 ; Hol die "Geschlossenen" Vorgänge (StatusArray[2] = "Geschlossen") LVName := "ResultsLV2" SQL := "SELECT * FROM " . TableName . " WHERE Status = '" . StatusArray[2] . "';" If !DB.GetTable(SQL, Result) MsgBox, 16, SQLite Error: GetTable, % "Msg:`t" . DB.ErrorMsg . "`nCode:`t" . DB.ErrorCode Else ShowTable(Result, LVName, 1) Return ; Funktion um die ListViews mit Werten zu füllen. ShowTable(Table, LVName, Label) { Gui, %Label%:Default Gui, ListView, %LVName% GuiControl, -ReDraw, %LVName% LV_Delete() If (Table.HasRows) { Loop, % Table.RowCount { Table.Next(Row) LV_Add("", Row*) } } LV_ModifyCol(7, "0"), Lv_ModifyCol(10, "0"), Lv_ModifyCol(11, "0"), Lv_ModifyCol(12, "0"), Lv_ModifyCol(13, "0"), LV_ModifyCol(1, "90"), LV_ModifyCol(2, "90"), LV_ModifyCol(3, "79"), LV_ModifyCol(4, "99"),LV_ModifyCol(5, "105"), LV_ModifyCol(6, "110"), LV_ModifyCol(8, "198"), LV_ModifyCol(9, "198"), LV_ModifyCol(11, "Sort") GuiControl, +ReDraw, %LVName% } ;============================================================================ ; Create Test Values ;============================================================================ Create_Test_Values: SQL := "DROP TABLE IF EXISTS " . TableName If !DB.Exec(SQL) { MsgBox, 16, SQLite Error: GetTable, % "Msg:`t" . DB.ErrorMsg . "`nCode:`t" . DB.ErrorCode Return } SQL := "CREATE TABLE " . TableName . " (Reminder_ID, KD_Nr, D_ID, ToDo, RR_Nr, WVL_Zeitpunkt, Status, ToDo_Text, ToDo_Erl_Text, Benutzer, FullTime, ShowFlag, FirstUser, " . " PRIMARY KEY(Reminder_ID ASC, KD_Nr ASC));" If !DB.Exec(SQL) { MsgBox, 16, SQLite Error: GetTable1, % "Msg:`t" . DB.ErrorMsg . "`nCode:`t" . DB.ErrorCode Return } DB.Exec("BEGIN TRANSACTION;") Loop, 50 { GoSub GetID Sleep 2 RMID := SecureID ; Reminder_ID KDNR := 325 . Rand(1, 99999999, True) ; KD_Nr TXID := "A" . Rand(1, 99999999, True) ; Text_ID RRNR := 0172 . Rand(1, 99999999, True) ToDo := ToDoArray[Rand(1, 3)] ; ToDo if (TimeChange=1) { Diff := -(Rand(1, 20)) TimeChange=0 } else { Diff := +(Rand(1, 20)) TimeChange=1 } WVTIME := A_Now WVTIME += %Diff%, Days FullTime:=WVTIME FullTime:=SubStr(FullTime, 1, 12) . "00" ; Setzt im YYYYMMDDHH24MISS Zeitstring die Sekunden auf 00. FormatTime, WVTIME, %WVTIME%, dd.MM.yyyy HH:mm ; Wiedervorlage Status := StatusArray[Rand(1, 2)] ; Status if (Status="Geschlossen") ShowFlag=0 else ShowFlag=1 SQL := "INSERT INTO " . TableName . " VALUES('" . RMID . "', '" . KDNR . "', '" . TXID . "', '" . ToDo . "', '" . RRNR . "', '" . WVTIME . "', '" . Status . "', 'ToDo Text bla bla bla', 'ToDo Erl Text bla bla bla', '" . UserName . "', '" . FullTime . "', '" . ShowFlag . "', '');" If !DB.Exec(SQL) MsgBox, 16, SQLite Error, % "Msg:`t" . DB.ErrorMsg . "`nCode:`t" . DB.ErrorCode } DB.Exec("COMMIT TRANSACTION;") Return Rand(Low, High, Prepend := False) { Static Filler := "00000000000000000" Random, R, %Low%, %High% If (Prepend) && (StrLen(High) > 1) Return SubStr(Filler . R, -(StrLen(High) - 1)) Return R } ;============================================================================ ; Funktion zum erzeugen einer "hoffentlich" einmaligen ID. ; Dazu wird ein String erzeugt der aus dem aktuellen YYYYMMDDHH24MISS String ; kombiniert mit der aktuellen Millisekunde und dem Rechnernamen besteht. ; Dieser String wird genutzt um einen Hash zu erzeugen. ; Ein zweiter String der aus der insgesamten Laufzeit des Scriptes in ms und ; dem Usernamen besteht wird zum Salzen genutzt. ; Nach dem erzeugen wird das Resultat von 32 Zeichen auf 12 zusammengekürzt. ; Das Ergebnis ist eine ID, in einem Testdurchlauf bei dem eine Millionen ; ID's erzeugt wurden, war keine doppelte ID zu finden. ; 100%ig auszuschließen ist es jedoch nicht. ;============================================================================ GetID: strToHash := A_Now A_MSec A_ComputerName strToSalt := A_TickCount A_UserName strCrypt := SSMD5(strToHash, strToSalt) secureIDTemp := RegExReplace(strCrypt, "s).{" 2 - 1 "}\K.") secureID := RegExReplace(secureIDTemp, "s).{" 4 - 1 "}\K.") Return ; Erzeugt einen gesalzenen String SSMD5(data, salt) { hash := "" saltedHash := MD5(data . salt) saltedHashR := MD5(salt . data) len := StrLen(saltedHash) Loop, % len / 2 { byte1 := "0x" . SubStr(saltedHash, 2 * A_index - 1, 2) byte2 := "0x" . SubStr(saltedHashR, 2 * A_index - 1, 2) SetFormat, integer, hex hash .= StrLen(ns := SubStr(byte1 ^ byte2, 3)) < 2 ? "0" ns : ns } SetFormat, integer, dez return hash } ; Erezugt einen MD5 Hash anhand des Strings MD5(string) { return HashFromString(string, 0x8003) } ; Funktion die mit windows-Funktionen einen Hash erzeugt. HashFromAddr(pData, len, algid, key=0) { hProv := size := hHash := hash := "" ptr := (A_PtrSize) ? "ptr" : "uint" aw := (A_IsUnicode) ? "W" : "A" if (DllCall("advapi32\CryptAcquireContextW","Ptr*",hProv,"Uint",0,"Uint",0,"Uint",24,"UInt",0xF0000000)) { if (DllCall("advapi32\CryptCreateHash","Ptr",hProv,"Uint",algid,"Uint",0,"Uint",0,"Ptr*",hHash )) { if (DllCall("advapi32\CryptHashData", "Ptr", hHash, "Ptr", pData, "Uint", len, "Uint", 0)) { if (DllCall("advapi32\CryptGetHashParam", "Ptr", hHash, "Uint", 2, "Uint", 0, "UintP", size, "Uint", 0)) { VarSetCapacity(bhash, size, 0) DllCall("advapi32\CryptGetHashParam", "Ptr", hHash, "Uint", 2, "Uint", &bhash, "UintP", size, "Uint", 0) } } DllCall("advapi32\CryptDestroyHash", "Ptr", hHash) } DllCall("advapi32\CryptReleaseContext", "Ptr", hProv, "Uint", 0) } int := A_FormatInteger SetFormat, Integer, h Loop, % size { v := substr(NumGet(bhash, A_Index-1, "uchar") "", 3) while (strlen(v)<2) v := "0" v hash .= v } SetFormat, Integer, % int return hash } ; Erzeugt den gewünschten Hash HashFromString(string, algid, key=0) { len := strlen(string) if (A_IsUnicode) { VarSetCapacity(data, len) StrPut := "StrPut" %StrPut%(string, &data, len, "cp0") return HashFromAddr(&data, len, algid, key) } data := string return HashFromAddr(&data, len, algid, key) } Return ;============================================================================ ; Tag- und Zeitprüfung ;============================================================================ DateTime: TimeCheck:=0 IniRead, DaysClosed, %globalinipfad%, DaysClosed, % VarDate, 0 if(DaysClosed=1) ; Prüft als erstes ob an dem Tag geschlossen ist. { TimeCheck:=1 } else { IniRead,rolle,%globalinipfad%,%A_Username%,rolle If (rolle="AB") ; Prüft welche Userrolle vorliegt. { IniRead,Day1,%globalinipfad%,TIMINGABOPEN, % VarDay if (VarTime < Day1) ; Prüft ob die Öffnungszeit eingehalten wurde. { TimeCheck:=2 StringTrimLeft, Time1, Day1, 2 StringTrimRight, Time2, Day1, 2 Time:=Time2 ":" Time1 } IniRead,Day2,%globalinipfad%,TIMINGABCLOSE, % VarDay if (VarTime > Day2) ; Prüft ob die Schließzeit eingehalten wurde. { TimeCheck:=4 StringTrimLeft, Time1, Day2, 2 StringTrimRight, Time2, Day2, 2 Time:=Time2 ":" Time1 } If (Day1="none" || Day2="none") ; Bei none ist geschlossen. { TimeCheck:=1 } } If (rolle="TK") { IniRead,Day1,%globalinipfad%,TIMINGTKOPEN, % VarDay IniRead,Day1,%globalinipfad%,TIMINGTKOPEN, % VarDay if (VarTime < Day1) { TimeCheck:=2 StringTrimLeft, Time1, Day1, 2 StringTrimRight, Time2, Day1, 2 Time:=Time2 ":" Time1 } IniRead,Day2,%globalinipfad%,TIMINGTKCLOSE, % VarDay if (VarTime > Day2) { TimeCheck:=4 StringTrimLeft, Time1, Day2, 2 StringTrimRight, Time2, Day2, 2 Time:=Time2 ":" Time1 } If (Day1="none" || Day2="none") { TimeCheck:=1 } } if (rolle="ERROR") ; ERROR ist dann vorhanden wenn keine Rolle für den User vorliegt. { TimeCheck:=5 } } Return ;============================================================================ ;============================================================================ ; Funktion: RefBitmap() ; Ließt Bitmap Daten aus einer DLL aus und zeigt diese in einer GUI an. ; ; RefBitmap(Resource, ResourceID [, X-Position, Y-Position, Width, Height, v-Label, g-Label, GUIID]) ; ; 1 Parameter: name der .dll ; 2 Parameter: der Resource Name ; 3 Parameter: x-Position im GUI ; 4 Parameter: y-Position im GUI ; 5 Parameter: Breite des Bildes ; 6 Parameter: Höhe des Bildes ; 7 Parameter: V-Label (leer) ; 8 Parameter: G-Label (leer) ; 9 Parameter: GUI ID (bedeutet jedes GUI benötigt eine eindeutige ID) ; 10 Parameter: Style ; ; Beispiel: ; RefBitmap("imgdll.dll", "1", 5, 5, 205, 285, "", 5) ; RefBitmap(Res, ID, X = "", Y = "", W = "", H = "", Variable = "", Label = "", GUIID = "", Style = "") { global hModule := DllCall("LoadLibrary", Str, Res) Gui, %GUIID%:Add, Picture, x%X% y%Y% w%W% h%H% v%Variable% g%Label% 0xE 0x0100 %Style% hWndPic1 hBitmap := DllCall("LoadImageA", UInt, hModule, UInt, ID , UInt, 0x0, UInt, W, UInt, H, UInt, 0x8000) SendMessage, 0x172, 0x0, hBitmap, , ahk_id %Pic1% Return, %Errorlevel% } ;============================================================================ /* ;============================================================================ ; Prüft ob pw_master.exe gestartet ist, wenn nicht wird Reminder beendet ;============================================================================ LiveCheck: Process,Exist,pw_master.exe if (Errorlevel=0) ExitApp else pwmPID:=Errorlevel Return ;============================================================================ */ ;============================================================================ ; Funktion zur Bildsuche ;============================================================================ Bildsuche(datei,BildX,BildY) { global ImageSearch,PosX,PosY,0,0,A_ScreenWidth,A_ScreenHeight,%Datadir%\%datei% if not Errorlevel { PosX+=%BildX% ;Die X Grösse deines bildes durch 2 PosY+=%BildY% ;Die Y Grösse deines bildes durch 2 bsf = 0 return } else { bsf++ return bsf } } ;============================================================================ ;============================================================================ ; Includes ;============================================================================ #Include Class_SQLiteDB.ahk ; Classe um Controls Farbig zu gestalten #Include Class_CTLCOLORS.ahk ; Classe um Reihen in einem ListView Farbig zu gestalten #Include Class_LV_Colors.ahk /* ; Classe zum Kommunizieren innerhalb von verschiedenen Scripten #Include talk.ahk */ ;============================================================================