'Kundenverwaltung.odb Modul Wartung
'Backup Texte
Const sTextBackupErfolgreich1 = "Backup erfolgreich gespeichert unter: "
Const sTextBackupErfolgreich2 = "gesichert"
Const sTextBackupErfolgreich3 = "Backupset Nummer "
Const sTextBackupErfolgreich4 = " von "
Const sTextBackupErfolgreich5 = " Sets "
Const sTextBackupErfolgreich6 = "Backup ausgeführt"


'Wartung der Datenbank
SUB Datenbank_komprimieren
    DIM stMessage AS STRING
    oDatenquelle = ThisComponent.Parent.CurrentController ' Zugriffsmöglichkeit aus dem    Formular heraus
    IF NOT (oDatenquelle.isConnected()) THEN
    oDatenquelle.connect()
    END IF
    
    
    oVerbindung = oDatenquelle.ActiveConnection()
    oSQL_Anweisung = oVerbindung.createStatement()
    stSql = "SHUTDOWN COMPACT" ' Die Datenbank wird komprimiert und geschlossen
    oSQL_Anweisung.executeQuery(stSql)
    stMessage = "Die Datenbank wurde komprimiert." + CHR(13) + "Das Formular wird jetzt geschlossen."
    stMessage = stMessage + CHR(13) + "Anschließend sollte die Datenbankdatei geschlossen werden."
    stMessage = stMessage + CHR(13) + "Auf die Datenbank kann erst nach dem erneuten Öffnen der Datenbankdatei zugegriffen werden."
    msgbox stMessage
    ThisDatabaseDocument.FormDocuments.getByName( "Unternehmen" ).close
    REM Das Schließen der Datenbankdatei führt beim Neustart zu einem Wiederherstellungsablauf.
    ' ThisDatabaseDocument.close(True)
    SaveAndCloseAll
END SUB

SUB Daten_aus_Cache_schreiben
    DIM oDaten AS OBJECT
    DIM oDataSource AS OBJECT
    oDaten = ThisDatabaseDocument.CurrentController
    IF NOT ( oDaten.isConnected() ) THEN oDaten.connect()
    oDataSource = oDaten.DataSource
    oDataSource.flush
END SUB

SUB Datenbankbackup
    DIM oPath AS OBJECT
    DIM oDoc AS OBJECT
    DIM sTitel AS STRING
    DIM sUrl_Ziel AS STRING
    DIM sUrl_Start AS STRING
    DIM i AS INTEGER
    DIM k AS INTEGER
    Daten_aus_Cache_schreiben 'Aufruf von SUB Daten_aus_Cache_schreiben
    msgbox "zuerst wird der Cache gesichert", 64, "Cache speichern"
    oDoc = ThisComponent
    'sTitel = oDoc.Title
    'sUrl_Start = oDoc.URL
    sTitel = ThisDatabaseDocument.Title
       sUrl_Start = ThisDatabaseDocument.URL
    oPath = createUnoService("com.sun.star.util.PathSettings")
    
    FOR i = 1 TO 100
    IF NOT FileExists(oPath.Backup & "/" & i & "_" & sTitel) THEN
    IF i > 99 THEN
    FOR k = 98 TO 1 STEP -1
    IF FileDateTime(oPath.Backup & "/" & k & "_" & sTitel) <= FileDateTime(oPath.Backup & "/" & k+1 & "_" & sTitel) THEN
    IF k = 1 THEN
    i = k
    EXIT FOR
    END IF
    ELSE
    i = k + 1
    EXIT FOR
    END IF
    NEXT
    END IF
    EXIT FOR
    END IF
    NEXT
    knur = k
    inur = i
    sUrl_Ziel = oPath.Backup & "/" & i &"_" & sTitel
    FileCopy(sUrl_Start,sUrl_Ziel)
    MsgBox(sTextBackupErfolgreich1 + Chr(13) & oPath.Backup + Chr(13) + sTextBackupErfolgreich3 & knur & sTextBackupErfolgreich4 & inur & sTextBackupErfolgreich5 & sTextBackupErfolgreich2,64,sTextBackupErfolgreich6)
END SUB


Sub Defrag_Database()
' this macro can be assigned to a button on your data form
dim conn, stmt, dbName, DBContext, Datasource As Object
dbName = "Kundenverwaltung" '<<- change to suit, must be a registered datasource

DBContext=createUnoService("com.sun.star.sdb.DatabaseContext")

    If DBContext.hasByName(dbName) then
          DataSource = DBContext.getByName(dbName)
          conn = DataSource.getConnection( "sa", "" ) '<<- default username/password pair
          stmt = conn.CreateStatement
          stmt.ExecuteUpdate( "CHECKPOINT DEFRAG" )
          conn.dispose '<<- your database will still be open to enter/edit the data
        'Wir Zeigen eine Erfolgsmeldung das die Defragmentierung der Kundenverwaltung.odb abgeschlossen ist!
          MsgBox "Defragmentierung " & chr(13) & dbName & chr(13) & "erfolgreich beendet....", ," --AOO Database Defrag-- "
    else
        'Wir Zeigen eine Fehlermeldung da die Defragmentierung der Kundenverwaltung.odb fehlgeschlagen ist!
         MsgBox "Defragmentierung fehlgeschlagen!" & chr(13) & "Defragmentierung kann nicht erfolgen da die Kundenverwaltung.odb bereits geöffnet ist. Sie müssen Sub Defrag_Database_Silent vor dem öffnen einbinden" & chr(13) & dbName,  ," --AOO Database Defrag--"
    End If
End Sub

Sub Defrag_Database_Silent()
' this macro can be assigned to a button on your data form
dim conn, stmt, dbName, DBContext, Datasource As Object
dbName = "Kundenverwaltung" '<<- change to suit, must be a registered datasource

DBContext=createUnoService("com.sun.star.sdb.DatabaseContext")

    If DBContext.hasByName(dbName) then
          DataSource = DBContext.getByName(dbName)
          conn = DataSource.getConnection( "sa", "" ) '<<- default username/password pair
          stmt = conn.CreateStatement
          stmt.ExecuteUpdate( "CHECKPOINT DEFRAG" )
          conn.dispose '<<- your database will still be open to enter/edit the data
        'Wir Zeigen eine Erfolgsmeldung das die Defragmentierung der Kundenverwaltung.odb abgeschlossen ist!
          'MsgBox "Defragmentierung " & chr(13) & dbName & chr(13) & "erfolgreich beendet....", ," --AOO Database Defrag-- "
    else
        'Wir Zeigen eine Fehlermeldung da die Defragmentierung der Kundenverwaltung.odb fehlgeschlagen ist!
         'MsgBox "Defragmentierung fehlgeschlagen!" & chr(13) & "Defragmentierung kann nicht erfolgen da die Kundenverwaltung.odb bereits geöffnet ist. Sie müssen Sub Defrag_Database_Silent vor dem öffnen einbinden" & chr(13) & dbName,  ," --AOO Database Defrag--"
    End If
End Sub

SUB Datenbankbackup_Silent
    'DIM oPath AS STRING
    DIM sUrlBackupFiles AS STRING
    ' Dateipfad ermitteln
    'sUrlBackupFiles = ThisComponent.getUrl()
    'URL = Dokument.getURL()
    'MsgBox(sUrlBackupFiles,64,"URL")
    sUrlBackupFiles = "file:///O:/VERWALTUNG/BACKUP/"
    DIM oDoc AS OBJECT
    DIM sTitel AS STRING
    DIM sUrl_Ziel AS STRING
    DIM sUrl_Start AS STRING
    DIM i AS INTEGER
    DIM k AS INTEGER
        Daten_aus_Cache_schreiben 'Aufruf von SUB Daten_aus_Cache_schreiben
        'msgbox "zuerst wird der Cache gesichert", 64, "Cache speichern"
        oDoc = ThisComponent
        'sTitel = oDoc.Title
        'sUrl_Start = oDoc.URL
        sTitel = ThisDatabaseDocument.Title
        'oPath = sUrlBackupFiles
        'oPath = createUnoService("com.sun.star.util.PathSettings")
        'sUrlBackupFiles = createUnoService("com.sun.star.util.PathSettings")
        
        FOR i = 1 TO 100
            IF NOT FileExists(sUrlBackupFiles & i & "_" & sTitel) THEN
                IF i > 99 THEN
                    FOR k = 98 TO 1 STEP -1
                        IF FileDateTime(sUrlBackupFiles & k & "_" & sTitel) <= FileDateTime(sUrlBackupFiles & k+1 & "_" & sTitel) THEN
                            IF k = 1 THEN
                            i = k
                    EXIT FOR
                END IF
            ELSE
            i = k + 1
        EXIT FOR
    END IF
NEXT
    END IF
        EXIT FOR
    END IF
NEXT
    knur = k
    knur = 100
    inur = i

    sUrl_Start = ThisDatabaseDocument.URL
    'sUrlt_Start = ThisDatabaseDocument
    'sUrlt_Start = sUrlBackupFiles  & "/" & i &"_" & sTitel
    'sUrl_Ziel = oPath.Backup & "/" & i &"_" & sTitel
    sUrl_Ziel = sUrlBackupFiles & i &"_" & sTitel

    FileCopy(sUrl_Start,sUrl_Ziel)
    'Laden von Sub Defrag_Database_Silent
    Defrag_Database_Silent()

END SUB

SUB SaveAndCloseAllNOTWORKANYMORE( ) 'erzeugt als Knop einen Fehler: BASIC-Laufzeitfehler. Es ist eine Ausnahme aufgetreten  Type: com.sun.star.lang.DisposedException Message: Component is already disposed.
    IF MsgBox("Kundenverwaltung speichern und schliessen?", 1 + 48 + 512,"Kundenverwaltung beenden")= 1 THEN
     DIM oForm AS OBJECT
    'Dim oDispatch as object
    oDoc = ThisComponent.CurrentController.Frame
    oDispatch = createUnoService("com.sun.star.frame.DispatchHelper")
    oDispatch.executeDispatch(oDoc, ".uno:CloseDoc", "", 0, Array()) ' erst das aktive Formular schließen
    ' ***************************************************************************
    ' * Bei der folgenden Methode bleibt OO im Speicher *
    ' ***************************************************************************
    oDoc = ThisComponent.Parent.CurrentController.Frame ' und nun das Hauptfenster (Parent) holen
    oDoc.close(true) ' und schließen
        If not(saveandcloseall) then
        'Variable zur Steuerung der Fensterschließung (falls false: Endlosschleife
        '(shutdown schließt Formular, Formularschließen löst dbShutdown aus etc)
        saveandcloseall = true
        
        'Controler referenzieren
         oController = ThisDatabaseDocument.CurrentController
         oConnection = oController.ActiveConnection
         
         'Verbindung und SubComponenten schließen, Dokument speichern und DB anschließend schließen
        oDoc = ThisDatabaseDocument
        oDoc.store()
        oController.closeSubComponents
        oController.ActiveConnection.close()
        oDoc.dispose()
        oDoc.close(True)
    endif
        ' START Daten Backup_SIlent aus WARTUNG inklusive Defrag_Database_Silent() der Kundenverwaltung.odb nach /Backup
    Datenbankbackup_Silent 'inklusive Defrag_Database_Silent()
    ' ENDE Daten Backup der Kundenverwaltung.odb nach /Backup
    ' ***************************************************************************
    ' * Hier kommt die harte Methode, die anschliessend OO komplett beendet (incl. Schnellstart)*
    ' ***************************************************************************
    oDoc = ThisComponent.Parent.CurrentController.Frame
    oDispatch = createUnoService("com.sun.star.frame.DispatchHelper")
    oDispatch.executeDispatch(oDoc, ".uno:CloseDoc", "", 0, Array())
    oDispatch.executeDispatch(oDoc, ".uno:CloseWin", "", 0, Array())
    MsgBox(sTextAbgebrochen1 + Chr(13) + sTextAbgebrochen2,48,sTextAbgebrochen3)
    ELSE
    ' Hier sammeln wir Text mit Zeilenumbruch Chr$(13)für eine bessere Darstellung
    MsgBox(sTextAbgebrochen1 + Chr(13) + sTextAbgebrochen2,48,sTextAbgebrochen3)
        EXIT SUB
    END IF
END SUB