Hi just me,
konnte eine Weile nicht am Tool arbeiten aber nun gehts weiter.
Ich versuche gerade die Daten der einzelnen Archive in ein gesammtarchiv umzuräumen, anschließend wil ich gerne die User-Archive löschen, dies will mir aber nicht gelingen. Sobald ich die User DB Close kommt beim nachfolgenden ATTACH ein Fehler. Aber warum will mir nicht so ganz einleuchten...
Kurze Erklärung zum Code,
die User legen in einem Pfad auf einem Netzlaufwerk einen Oder an der Name ist A_UserName, diesen kompletten Pfad lese ich ein und parse dann durch. Solange ich das DB.Close nicht nutze klappt das alles auch wunderbar. Die Archiv Datei füllt sich, nur bleiben die einzelnen Archive erhalten... beim nächsten mal kommt es dann automatisch zu Fehlern da die Inhalte der einzelnen DB's ja schon im gesammtarchiv vorhanden sind.
Hier mein Code:
;============================================================================
; Setzen der Globalen Variablen:
;============================================================================
#NoEnv
#SingleInstance force
#MaxMem, 1024
#Persistent
SetWorkingDir, %A_ScriptDir%
#Include %A_ScriptDir%
SetBatchLines, -1
;============================================================================
; User Einstellungen:
;============================================================================
; INI einlesen
IniRead,globalinipfad, %A_ScriptDir%\funktionen.ini, REMINDER, INIFilePath
IniRead,LANPfad, %A_ScriptDir%\funktionen.ini, REMINDER, LANPfad
IniRead,UserINI, %A_ScriptDir%\funktionen.ini, REMINDER, UserINI
ArchivPath := LANPfad "..\_Archiv\"
; 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 Admin-Tool"
; Ordner in dem die Datanbank liegt
DBFolder := ArchivPath
; Direkter Pfad zur DB
DBArchivFilePath := DBFolder . "\Reminder-Archiv-" . A_YYYY . ".sql"
; Tabellenname in der DB
TableNameArchiv := "ReminderArchiv"
TableNameArchivAdmin := "ReminderAdmin"
ListViewSearchPfad:=LANPfad "\*.*"
;============================================================================
; ###################### Start Autoexecutebereich ###########################
;============================================================================
If !FileExist(DBFolder) {
FileCreateDir, %DBFolder%
If (ErrorLevel) {
MsgBox, 16, %AppName%, Das Verzeichnis %DBFolder% konnte nicht erstellt werden.%AbortProg%
ExitApp
}
}
; Ö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 " . TableNameArchivAdmin . " (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
;============================================================================
; ####################### Ende Autoexecutebereich ###########################
;============================================================================
Gui, +HWNDh_MainGui
Gui, +LastFound
Gui, Color, FFFFFF
Gui, Font, S7 CDefault, Verdana
Gui, Add, Button, x996 y2 w220 h16 gRefresh, Refresh
Gui, Add, ListView, x996 y20 w220 h675 vResultsLV1 -Multi NoSortHdr +Sort HWNDh_LV1 +BackgroundD9E7FB -LV0x10, Name|Kurzname
Gui, Add, Tab, x0 y0 w996 h695 +AltSubmit, Infos|Archiv Recherche|Offene Vorgänge verwalten|Livemonitor|Globale Einstellungen
Gui, Tab, 1
Gui, Add, Button, x12 y160 w490 h20 gArchiv, Archivierung starten
Gui, Show, h697 w1219,
GoSub Refresh
Settimer, Refresh, 60000
Return
Archiv:
ArchivAktiveFile =
(
Archivierung ist aktiv!
)
CheckArchivAktive := ArchivPath "archiv.txt"
IfExist %CheckArchivAktive%
{
ToolTip, Es ist bereits eine Archivierung aktiv!
Sleep, 2000
ToolTip
}
else
{
FileAppend, %ArchivAktiveFile%, %CheckArchivAktive%
sleep, 50
Loop, %ListViewSearchPfad%, 2, 1
ArchivDateiliste := ArchivDateiliste A_LoopFileName "`n"
DBAlias := "UserDB" ; Aliasname für die Archivdatenbank
Loop, parse, ArchivDateiliste, % "`n"
{
If A_LoopField = ; Ignoriert das leere Element am Ende der Liste.
break
DBUserFilePath := LANPfad A_LoopField "\Reminder-Archiv-" A_LoopField ".sql"
If FileExist(DBUserFilePath)
{
If !DB.Exec("ATTACH DATABASE '" . DBUserFilePath . "' AS " . DBAlias . ";") { ; Archivdatenbank hinzufügen
SQLiteError(A_ThisLabel, DB, "ATTACH")
}
DB.Exec("BEGIN IMMEDIATE TRANSACTION;")
SQL := "INSERT OR ROLLBACK INTO " . TableNameArchivAdmin . " SELECT * FROM " . DBAlias . "." . TableNameArchiv
If !DB.Exec(SQL) {
SQLiteError(A_ThisLabel, DB, "INSERT")
DB.Exec("ROLLBACK TRANSACTION;") ; Transaktion zurücksetzen (sicher ist sicher)
DB.Exec("DETACH DATABASE " . DBAlias . ";") ; Archivdatenbank entfernen
Return
}
Inserted := 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 " . DBAlias . ";") { ; Archivdatenbank entfernen
SQLiteError(A_ThisLabel, DB, "DETACH")
Return
}
;DB.CloseDB(DBUserFilePath)
Filedelete, DBUserFilePath
; Nur zum Testen
MsgBox, 64, Daten wurden archiviert,%DBUserFilePath%`n`n%Inserted% Sätze wurden in das Archiv eingefügt.
}
}
Filedelete, %CheckArchivAktive%
msgbox ende
}
Return
Refresh: ; Refresh der ListView
Gui, 1:Default
Gui, ListView, %h_LV1%
BildlisteID:=IL_Create(2,1,0)
IL_Add(BildlisteID, "onlineico.ico")
IL_Add(BildlisteID, "offlineico.ico")
CheckOnlineFile =
(
AreYouOnline?
)
LV_SetImageList(BildlisteID)
; GuiControl, -Redraw, ResultsLV1
Dateiliste:=
Loop, %ListViewSearchPfad%, 2, 1
Dateiliste := Dateiliste A_LoopFileName "`n"
LV_Delete()
LV_ModifyCol()
LV_ModifyCol(1, 215)
LV_ModifyCol(2, 0)
Loop, parse, Dateiliste, % "`n"
{
If A_LoopField = ; Ignoriert das leere Element am Ende der Liste.
break
OnlineCheckFile:=LANPfad A_LoopField "\" A_UserName "checkOn.line"
IfNotExist, %OnlineCheckFile%
FileAppend, %CheckOnlineFile%, %OnlineCheckFile%
IniRead, name, %UserINI%, user, % A_LoopField, % A_LoopField
sleep, 25
IfExist %OnlineCheckFile%
LV_Add("Icon2",name,A_LoopField)
else
LV_Add("Icon1",name,A_LoopField)
}
; GuiControl, +Redraw, ResultsLV1
Return
;============================================================================
; Includes
;============================================================================
#Include Class_SQLiteDB.ahk
Hab mich an deinen Rat gehalten und löse die "Online" Dinge nun per Datei.
Also so: Erstellle Datei X bei User Y, warte kurz, prüfe ob Datei X bei User Y noch existiert, wenn ja dann Offline, wenn nein dann Online. So in etwa 
MfG
fump