Office Forum
www.Office-Loesung.de
Access :: Excel :: Outlook :: PowerPoint :: Word :: Office :: Sicherheitshinweis ---> für registrierte Mitglieder <-
automatisches Frontendupdate
zurück: VBA -- erste Schritte weiter: Datensatz an Exceltabelle anhängen Unbeantwortete Beiträge anzeigen
Neues Thema eröffnen   Neue Antwort erstellen     Status: Tutorial Facebook-Likes Diese Seite Freunden empfehlen
Zu Browser-Favoriten hinzufügen
Autor Nachricht
Volker
Fortgeschrittener, Datenjongleur


Verfasst am:
18. März 2005, 11:20
Rufname:

automatisches Frontendupdate - automatisches Frontendupdate

Nach oben
       

Hallo fite Accessgemeinde,

ich habe was gemacht, was sicherlich auch für andere Access-Programmier interessant sein kann.

Ich habe mein Backend auf dem Server liegen.
Die Frontends sind auf allen Workstations lokal abgelegt.

Nun, da ich die Datenbank programmiere und möchte, dass alle anderen auch immer auf dem aktuellen Stand sind, habe ich mir folgendes überlegt.

Ich habe eine Tabelle mit Konstanten in meinem Backend. Dort ist ein Datensatz angelegt, der das Versionsdatum (also einfach nur ein Datum) beinhaltet.
Habe ich nun Veränderungen an der Datenbank vorgenommen, und möchte nun, dass alle auch diese neueste Version benutzen sollen, ändere ich das Datum auf den heutigen Tag. Danach kopiere ich die neue Frontendversion auf den Server.

Beim Aufruf eines jeden Frontends wird eine init()-Funktion durchlaufen, in der folgendes gemacht wird.
Zunächst wird eine Textdatei gesucht, die z.B. im Hauptverzeichnis der Workstation liegt. Ist sie nicht vorhanden, wird sie angelegt und als einzige Zeile das Versiondatum aus den Konstanten gefüllt.
Ist die Datei vorhanden, so wird das Datum in dieser Datei mit dem Datum in den Konstanten verglichen. Gibt es einen Unterschied, so wird die Textdatei ersetzt durch eine, die das aktuelle Versionsdatum enthält.
Dann wird das Frontend, welches ich vorher auch auf dem Server abgelegt habe mittels einer Batchdatei vom Server auf die Workstation kopiert und sofort gestartet.

Fazit: Sobald jemand auf seiner Workstation sein Frontend startet, erhält er, sofern vorhanden, automatisch ein Update auf die neueste Version.

Ich find´s einfach toll, denn das erspart mir die Rennerei zu allen Workstations, wenn ein Update vorliegt.

So, das wollte ich heute morgen mal loswerden. Würde mich über Feedback, Fragen und Anregungen auch freuen.

Gruß aus Münster von
Volker

_________________
Alles, was denkbar ist, ist auch machbar.
Packen wir´s an.


Zuletzt bearbeitet von Volker am 24. Apr 2005, 23:42, insgesamt einmal bearbeitet
borstel
Im Profil kannst Du frei den Rang ändern


Verfasst am:
18. März 2005, 12:51
Rufname:


AW: automatisches Frontendupdate - AW: automatisches Frontendupdate

Nach oben
       

hallo volker,
deine lösung gefällt mir so gut, dass ich interesse an weiteren details habe.
magst du den code der function init() und den inhalt der batchdatei bekannt geben?
wenn nicht öffentlich hier im forum dann eventuell über email? (ist freigeschaltet im profil).

_________________
Gruß borstel
Windows 8 Pro 64 Bit - Office 2007
Positive und negative Rückmeldungen sind eine große Hilfe für alle Forumsteilnehmer!
Volker
Fortgeschrittener, Datenjongleur


Verfasst am:
18. März 2005, 13:45
Rufname:

Code zum o.g. Thema - Code zum o.g. Thema

Nach oben
       

Klar stelle ich mal den Code vor. Das spart Euch auch ein wenig Zeit. Wink

Vorwort: Meine Datenbanken stehen immer im Verzeichnis \Daten\Bank, sowohl auf dem Server, als auch lokal. Server hier hat LW S:
Code:
Option Compare Database
Option Explicit

Public Function init()
' diese Funktion wird im Access-autoexec-Makro (d.h. bei Programmstart)
' aufgerufen
    Dim Frontend_Version, Frontendback_Version
    Dim stappname As String

    Frontend_Version = Versionsdatum()  ' Versionsdatum aus Textdatei holen
    Frontendback_Version = Konstdat(4)  ' Konstante 4 beinhaltet das aktuelle
                                        ' Versionsdatum
    If Frontend_Version <> Frontendback_Version Then
        MsgBox ("Es liegt ein Update des Datenbank Frontends vor." & _
                " Bitte aktualisieren!")
        ' Version.txt löschen und ...
        Kill ("C:\Daten\Bank\Version.txt")
        ' ... mit aktuellem Versionsdatum neu anlegen
        Frontend_Version = Versionsdatum()
        ' Frontend vom Server auf lokal kopieren und neu starten
        ' S:\Daten\Bank ist das Verzeichnis auf dem Server
        stappname = "S:\Daten\Bank\kopiere-nach-lokal.bat"
        Call Shell(stappname, 1)
        DoCmd.Quit
    End If
End Function

Public Function Versionsdatum() As Date
' holt Versionsdatum aus der Datei Version.txt
' falls Version.txt nicht angelegt ist, wird sie mit aktuellem Versionsdatum
' aus Backend Konstdat(4) erzeugt.
On Error GoTo err_Versionsdatum
    Dim Eingabezeile, fs, a
   
    ' Textdatei auslesen
    Open "C:\Daten\Bank\Version.txt" For Input As #1
    Line Input #1, Eingabezeile
    Close #1
    Versionsdatum = Eingabezeile
    Exit Function

err_Versionsdatum:
    If Err.Number = 53 Then
        ' Datei existiert nicht und muß angelegt werden
        Set fs = CreateObject("Scripting.FileSystemObject")
        Set a = fs.CreateTextFile("C:\Daten\Bank\Version.txt", True)
        ' mit Datum aus Backend beschreiben
        a.WriteLine Konstdat(4)
        a.Close
      Else
        MsgBox Err.Number
    End If
    Exit Function
End Function

Public Function Konstdat(ByVal KonstNr)
' diese Funktion liest aus der Konstantentabelle einen Wert aus dem Feld
' Konstdat aus Konstante (KonstNr)
' meine Konstantentabelle beinhaltet u.a. die Felder
' KonstNr (=eindeutige Konstanten-ID) und
' Konstdat (ein als Datum definiertes Feld)
    Konstdat = DLookup("Konstdat", "Konstanten", "[KonstNr] = " & KonstNr)
End Function

Und noch die Zeilen der .bat-Datei, die auf dem Server im Verzeichnis S:\Daten\Bank liegt.
Code:
cls
@echo "Aktualisieren der lokalen Datenbank
pause

REM jetzt vom Server auf Workstation kopieren
copy S:\Daten\Bank\MeinFrontend.mdb C:\Daten\Bank

REM und nun das Frontend selber aufrufen
C:\Daten\Bank\MeinFrontend.mdb

Ich hoffe, ich habe nichts vergessen.
Falls er nicht funktioniert, dann einfach nochmal melden.
Gruß von Volker

_________________
Alles, was denkbar ist, ist auch machbar.
Packen wir´s an.
borstel
Im Profil kannst Du frei den Rang ändern


Verfasst am:
18. März 2005, 13:55
Rufname:

AW: automatisches Frontendupdate - AW: automatisches Frontendupdate

Nach oben
       

hi volker,
danke für die schnelle reaktion.
komme leider erst anfang der nächsten woche dazu, deine lösung zu testen,
melde mich dann auf jeden fall noch einmal.

_________________
Gruß borstel
Windows 8 Pro 64 Bit - Office 2007
Positive und negative Rückmeldungen sind eine große Hilfe für alle Forumsteilnehmer!
Frank_xyz
lerne täglich was dazu


Verfasst am:
31. März 2005, 12:05
Rufname:
Wohnort: Bautzen


AW: automatisches Frontendupdate - AW: automatisches Frontendupdate

Nach oben
       

Hallo,

vielleicht ein Verbesserungsvorschlag (war ja erwünscht)

Die Versionsnummer würde ich in den Datenbankeigenschaften des Frontends ablegen.
Beim Starten des Frontend vergleiche ich einfach die Versionsnummer meines Frontends mit der auf dem Server und führe ggf. die Batch zum Kopieren aus.

Der Code zum lesen von Datenbankeigenschaften wurde hier schon veröffentlicht. Weiterhin sind somit weniger Fehler/Manipulationen an der Textdatei möglich.

Bye
Ludger
Access Hobbyist


Verfasst am:
04. Mai 2005, 10:19
Rufname:

AW: automatisches Frontendupdate - AW: automatisches Frontendupdate

Nach oben
       

Hallo,

das Verfahren zum automatischen Frontend-Update ist eine interessante Sache.

Bei uns existiert das allerdings mehrere Probleme:
1. Es werden verschieden Datenbanken genutzt, deren Versionsdaten ich in einer einzigen Datei speicheren möchte
2. Der User nennt u.U. sein Frontend um.
3. Ich möchte das Update unter dem gleichen Namen speichern, unter dem es bisher vorhanden war, damit alle vom User angelegten Verknüpfungen noch funktionieren.
4. Es gibt User, die das Frontend an mehreren Stellen gespeichert haben und ich möchte sicher gehen, dass jedes Frontend augestauscht wird.

Ich hab das Modul entsprechend angepasst und dabei ist folgendes heraus gekommen:
2. Die Dateinamen und Pfade und andere Variablen werden im Deklarationsbereich des Moduls festgelegt. So kann man das Modul einfacher an seine Bedürfnisse anpassen.
2. Die Versionsdaten werden in einer ini-Datei gespeichert. So kann ich in jedem Abschnitt die Version einer anderen Datenbank speichern.
3. Die ini-Datei wird durch das Modul erstellt, wenn sie nicht vorhanden ist.
4. Die Batch-Datei wird durch das Modul erstellt.
5. Als Dateiname für das Update wird der aktuelle Dateiname gewählt. Dadurch lässt sich die Datei allerdings nicht über die Batch-Datei öffnen. Sie muss also anschließend noch einmal geöffnet werden.

Der Code dazu ist etwas umfangreicher geworden, es muss allerdings weiterhin nur die Funktion init aufgerufen werden, alles andere läuft automatisch ab.

Hier nun der angpasste Code:
Code:
...
(Neuer Code siehe Unten. Zur besseren Uebersichtlichkeit entfernt by Willi Wipp)
Ludger


Zuletzt bearbeitet von Ludger am 22. Jun 2005, 16:27, insgesamt einmal bearbeitet
Gast



Verfasst am:
08. Jun 2005, 23:53
Rufname:

Warum so kompliziert - Warum so kompliziert

Nach oben
       

HAllo,

ich frage mich, warum nur so kompliziert.

Wenn das Backend auf einem Server liegt, hat jeder der das Frontend auf seiner Wokrstation hat, ja Zugriff auf den Server mit dem Backend.

Warum wird dann nicht auch das Frontend auf dem Server abgelegt. Hast du in deiner Entwickler-Version des Frontends Änderungen vorgenommen und möchtes die alte Versoin ersetzen, kopierst du einfach nach Feierabend das neue Frontend auf den Server und fertig. Von da an haben alle die neue Version.

Nun ist hier natürlich zu bedenken, dass jeder aus der Datei raus sein muss, sonst kannst du sie nicht ersetzen. Dafür gibt es meiner Meinung nach die Lösung, dass du eine Tabelle anlegst, in der parametergesteuert z.B. jede Minute geschaut wird, ob der Admin (also du) ein Kennzeichen gesetzt hat, dass sich die User ausloggen sollen. Die User, die das Frontend offen haben, erhalten die Meldung. Du kannst ja hier ebenfalls einen Parameter einstellen, nach welcher Zeit die Datenbank dann geschlossen werden soll. z. B. nach 5 Minuten nach der Meldung.
HELM
Gast


Verfasst am:
20. Jun 2005, 15:19
Rufname:

Nicht mit XP - Nicht mit XP

Nach oben
       

Also: Ich finde die Lösung prima, tolle Sache. Jedoch mit XP ist es nicht ganz so gut. Immer nach der Meldung,dass das Update OK ist und neu gestartet werden kann verabschiedet sich A2000, Keine Rückmeldung. Super töten mit Task Manager. Dann finktioniert es einwandfrei.
Weiß jemand warum, Danke HELM
Willi Wipp
Moderator


Verfasst am:
22. Jun 2005, 11:25
Rufname:
Wohnort: Raum Wiesbaden

Re: automatisches Frontendupdate - Re: automatisches Frontendupdate

Nach oben
       

Hi Folks,

eine schoene Arbeit! Bin leider erst Heute dazugekommen es mit etwas genauer anzuschauen.

Bitte Nachfragen zu diesem Thema im Forum Access Programmierung / VBA
beim Thema automatisches Frontendupdate {Nachgefragt} stellen.

@Ludger, habe das andere Thema geloescht Wink

_________________
Eine kurze Rueckmeldung waere nett
SL Willi Wipp

(Anleitung fuer das Anhaengen von Dateien: Klicke links auf [www], Gaeste muessen sich dafuer anmelden)
Ludger
Access Hobbyist


Verfasst am:
22. Jun 2005, 16:26
Rufname:

AW: automatisches Frontendupdate - AW: automatisches Frontendupdate

Nach oben
       

Hallo Accessgemeinde,

ich habe den Code zum automatischen Frontend-Update noch ein wenig überarbeitet.

Und zwar hat's folgende Probleme gegeben:

Nach Aufruf der Batch-Datei darf keine msg-Box mehr ausgegeben werden, da sonst die gerade verwendete Access-Datei u.U. nicht richtig überschrieben wird.

Die Batch-Datei kann nur mit dem ANSI-Zeichensatz korrekt arbeiten. Da sie jedoch in Windows (nutzt den ASCII-Zeichensatz) erstellt wird, kommt es zu Fehlern bei der Interpretation der Zeichen. Insbesondere werden Umlaute und das "ß" nicht richtig erkannt. Dateien mit diesen Zeichen im Namen werden dadurch nicht gefunden.
Ich habe eine Funktion eingefügt, die die Batch-Datei in das richtige Format bringt, so dass diese nun korrekt funktioniert.

Die Funktion Init() lässt sich am besten in einem autoexec-Makro starten. Damit dann das richtige Startformular göffnet wird, kann es in dem Modul angegeben werden.

Hier nun der angepasste Code. Es müssen weiterhin nur im Deklarationsbereich die richtigen Pfade und Dateinamen angegeben werden. Nach Aufruf der Funktion Init() läuft alles automatisch ab.
Code:
Option Compare Database
Option Explicit

'-----------------------------------------------------------------------------
'*****Deklarationen für ini-Datei*********************************************
Public Declare Function SetPrivateProfileString Lib "kernel32" Alias _
                        "WritePrivateProfileStringA" _
                        (ByVal lpApplicationName As String, _
                         ByVal lpKeyName As Any, ByVal lpString As Any, _
                         ByVal lpFileName As String) As Long

Public Declare Function GetPrivateProfileString Lib "kernel32" Alias _
                        "GetPrivateProfileStringA" _
                        (ByVal lpApplicationName As String, _
                         ByVal lpKeyName As Any, ByVal lpDefault As String, _
                         ByVal lpReturnedString As String, _
                         ByVal nSize As Long, _
                         ByVal lpFileName As String) As Long
'*****************************************************************************
'-----------------------------------------------------------------------------

'-----------------------------------------------------------------------------
'******Deklarationen, um Ansi-Zeichen in ASCII-Zeichen umzuwandeln************
Declare Function OemToChar Lib "user32" Alias _
                 "OemToCharA" (ByVal lpszSrc As String, _
                               ByVal lpszDst As String) As Long

'' Ansi (Win) --> PC (DOS)
Declare Function CharToOem Lib "user32" Alias _
                 "CharToOemA" (ByVal lpszSrc As String, _
                 ByVal lpszDst As String) As Long
'-----------------------------------------------------------------------------

'-----------------------------------------------------------------------------
'******Konstanten und Variablen***********************************************
    'für ini-Datei
    Const conIniPfad As String = "C:\Programme\DatenbankenIni\"
                                                           'Pfad der ini-Datei
    Const conIniDatei As String = "Datenbanken.ini"   'Dateiname der ini-Datei
    Const conIniDateiPfad = conIniPfad & conIniDatei
                                           'kompletter Dateipfad der ini-Datei
    Dim strIniAbschnitt As String
               'Abschnitt in der Ini, in der das Versionsdatum hinterlegt wird
    'für Versionsdatum des Updates
    Const conBackFeld As String = "Versionsdatum"     'Feld in der Konstanten-
          'tabelle der Backend-DB, in der die aktuelle Version gespeichert ist
    Const conBackTabelle As String = "TAB_Version" 'Name der Konstantentabelle
                  'der Backend-DB, in der die aktuelle Version gespeichert ist
    Const conBackKriterien As String = ""            'evtl. Kriterien angeben,
                           'wenn Konstantentabelle mehr als 1 Datenatz enthält
    'für Update-Datei
    Const conBatPfad As String = conIniPfad
                   'Pfad zur Batchdatei (standardmäßig der Pfad zur Ini-Datei)
    Const conBatDatei As String = "Kopiere.bat"
                             'Name, unter der die Batch-Datei gespeichert wird
    Const conUpdatePfad As String = "\\Server\Mein_Verzeichnis\"
                                                        'Pfad zur Update-Datei
    Const conUpdateDatei As String = "meine_Datei.mde"
                                                   'Dateiname der Update-Datei
    Const conUpdateDateiPfad As String = conUpdatePfad & conUpdateDatei
                                        'kompletter Dateipfad zur Update-Datei
    'für Frontend-Datei
    Dim strDbPfadAlt As String           'Pfad zum aktuell geöffneten Frontend
    Dim strDbPfadNeu As String                        'Pfad zum neuen Frontend
    Dim strDbDateiNeu As String                  'Dateiname des neuen Frontend
    '1. Formular, das zu öffnen ist, wenn kein Update erforderlich ist
    Const conHauptformular As String = "Mein_Startformular"
'*****************************************************************************
'-----------------------------------------------------------------------------

Sub IniAbschnitt()
'legt den Abschnitt in der Ini-Datei fest, in der die Version gspeichert wird
'es wird der Pfad der Frontend-DB ausgelesen und angegeben
    strIniAbschnitt = Left(CurrentDb.Name, Len(CurrentDb.Name) - 4)
End Sub

Sub DbPfadAlt()
'schreibt Pfad zum aktuell geöffneten Frontend in eine Variable
    strDbPfadAlt = SplitPathFromFile(CurrentDb.Name)
End Sub

Function DbDateiNeu()
'Name der neuen Datei in Variable schreiben
'Standardmäßig wird der Name des aktuell geöffneten Frontend gesetzt
    strDbDateiNeu = CurrentDb.Name
End Function

Public Function Init()
' diese Funktion wird im Access-autoexec-Makro (d.h. bei Programmstart)
' aufgerufen
    Dim Frontend_Version, Backend_Version
    Dim stAppname As String

    '*******************
    'Update-Überprüfung nur durchführen,
    'wenn es sich um eine *.mde-Datenbank handelt
    If Right(CurrentDb.Name, 3) <> "mde" Then
        GoTo HFO_oeffnen
    End If
    '*******************
    'globale Variablen festlegen
    Call IniAbschnitt
    Call DbPfadAlt
    Call DbDateiNeu
    'Variablen für diese Prozedur
    Frontend_Version = FrontVersionsdatum() 'Versionsdatum aus ini-Datei
    'Versionsdatum aus Konstantentabelle des Backend
    Backend_Version = BackVersionsdatum(conBackFeld, conBackTabelle, _
                                        conBackKriterien)
    'DateiPfad zur Batch-Datei - im gleichen Verzeichnis wie Frontend
    stAppname = BackSlashTest(conBatPfad) & conBatDatei
    'prüfen, ob neue Version vorliegt
    If Frontend_Version < Backend_Version Then
        'prüfen, ob Update-Datei wirklich vorhanden ist
        'ggf. weiteren Ablauf hier beenden
        If FileExists(conUpdateDateiPfad) = False Then
            MsgBox "Sie verfügen nicht über die aktuellste Version der " & _
                   "Datenbank! Die Update-Datei kann jedoch nicht " & _
                   "gefunden werden! " & Chr(13) & Chr(13) & "Setzen " & _
                   "Sie sich mit dem Administrator in Verbindung!", _
                    vbExclamation, "Vorgang abgebrochen"
            Exit Function
        End If
        MsgBox "Es liegt ein Update der Datenbank vor.", vbInformation, _
               "Bitte aktualisieren"
        'schreibt die Batch-Datei zum Kopieren und Ausführen des Updates
        fncBatSchreiben
        'neue Versionsnummer in ini-Datei eintragen
        FnSetProfile strIniAbschnitt, "Version", CDate(Backend_Version), _
                     conIniDateiPfad
        'Batch-Datei aufrufen und damit das Update installieren und Programm
        'neu starten
        Shell stAppname, 1
        'MsgBox "Das Update wurde erfolgreich installiert!" & Chr(13) & _
                Chr(13) & "Die Datenbank kann jetzt neu gestartet werden", _
                vbInformation, "erfolgreich beendet"
        'FnSetProfile strIniAbschnitt, "Version", CDate(Backend_Version), _
                      conIniDateiPfad
        GoTo Beenden
      Else 'kein Update erforderlich - Hauptformular öffnen
        GoTo HFO_oeffnen
    End If
   
HFO_oeffnen:
    If conHauptformular <> "" Then
        DoCmd.OpenForm conHauptformular
    End If
    Exit Function
   
Beenden:
    DoCmd.Quit 'Programm schließen
End Function

Public Function FrontVersionsdatum() As Date
On Error GoTo Err_FrontVersionsdatum
'holt Versionsdatum aus ini-Datei
'falls Verzeichnis für ini-Datei nicht existiert wird es angelegt und
'fiktives Datum eingetragen
    Dim dtVersionsdatum As Date
   
    If FolderExists(conIniPfad) = False Then
        MkDir (conIniPfad) 'Verzeichnis erstellen
        'ini-Datei erstellen und fiktives Datum eintragen
        FnSetProfile strIniAbschnitt, "Version", CDate(#1/1/1970#), _
                     conIniDateiPfad
    End If

auslesen:
    dtVersionsdatum = FnGetProfile(strIniAbschnitt, "Version", _
                                   conIniDateiPfad)
    FrontVersionsdatum = dtVersionsdatum
   
Exit_FrontVersionsdatum:
    Exit Function
Err_FrontVersionsdatum:
    If Err.Number = 13 Then
                        'Abschnitt existiert nicht oder lässt sich nicht lesen
        'ini-Datei erstellen und fiktives Datum eintragen
        FnSetProfile strIniAbschnitt, "Version", CDate(#1/1/1970#), _
                     conIniDateiPfad
        Resume auslesen
      Else
        MsgBox Err.Description
        Resume Exit_FrontVersionsdatum
    End If
End Function

Public Function BackVersionsdatum(BackFeld As String, BackTabelle As String, _
                                  BackKriterien As String) As Date
' holt Versionsdatum aus Konstantentabelle des Backend
    Dim varVersionsdatum
   
    varVersionsdatum = DLookup(BackFeld, BackTabelle)
    If IsNull(varVersionsdatum) Then varVersionsdatum = CDate(#1/1/1990#)
    BackVersionsdatum = varVersionsdatum
End Function

Function fncBatSchreiben()
'schreibt die Batch-Datei zum Kopieren der Update-Datei
On Error GoTo Err_fncBatSchreiben
    Dim BatDatei As String
    Dim neueDatei As String
   
    BatDatei = BackSlashTest(conBatPfad) & conBatDatei
    neueDatei = strDbDateiNeu
    'zunächst alte Datei löschen
    'wenn sie nicht existiert wird Fehler produziert, der übergangen wird
    On Error Resume Next
    Kill BatDatei
    On Error GoTo Err_fncBatSchreiben
    'jetzt neue Batch-Datei schreiben
    Open BatDatei For Output As #1  ' Datei zur Ausgabe öffnen.
    Print #1, "cls"
    Print #1, "@echo Aktualisieren der lokalen Datenbank"
    Print #1, "@echo off"
    Print #1, "pause off"
    Print #1, "@echo on"
    Print #1, "@echo Das Update wird installiert.....Bitte warten " & _
              "(kann einige Zeit benötigen)......"
    Print #1, "@echo off"
    Print #1, "Rem jetzt vom Server auf Workstation kopieren"
    Print #1, "copy ";
    Write #1, Uml2Win(conUpdateDateiPfad, False);
    Print #1, " ";
    Write #1, Uml2Win(neueDatei, False)
    Print #1, "@echo on"
    Print #1, "@echo."
    Print #1, "@echo Das Update wurde erfogreich installiert!"
    Print #1, "@echo."
    Print #1, "@echo Das Programms wird nun gestartet"
    Print #1, "@echo off"
    Print #1, "pause off"
    'Jetzt die Datei neu aufrufen
    Write #1, Uml2Win(neueDatei, False)
    Print #1, "@echo on"
    Print #1, "del ";
    Write #1, Uml2Win(BatDatei, False)
    Close #1    ' Datei schließen
   
Exit_fncBatSchreiben:
    Exit Function
Err_fncBatSchreiben:
    Resume Exit_fncBatSchreiben
End Function

Public Function FolderExists(ByVal sPath As String) As Boolean
' Prüfen, ob ein Verzeichnis existiert
  FolderExists = (FileSystem.Dir(sPath, vbDirectory + vbHidden) <> "")
End Function

Public Function FileExists(ByVal sFile As String) As Boolean
'prüft, ob eine Datei vorhanden ist
'Der Parameter sFile enthält den zu prüfenden Dateinamen
    Dim Size As Long

    On Local Error Resume Next
    Size = FileLen(sFile)
    FileExists = (Err = 0)
    On Local Error GoTo 0
End Function

'Die nachfolgende Funktion ermittelt den reinen
'Pfadnamen aus einem übergebenen Pfad+Datei - String
Public Function SplitPathFromFile(ByVal File As String) As String
    Dim Pfad As String

    Pfad = File
    While Right(Pfad, 1) <> "\" And Right(Pfad, 1) <> ":" And Pfad <> ""
        Pfad = Left$(Pfad, Len(Pfad) - 1)
    Wend
    If Right(Pfad, 1) = "\" Then Pfad = Left(Pfad, Len(Pfad) - 1)
    SplitPathFromFile = Pfad '& "\"
End Function
   
' Die nachfolgende Funktion ermittelt den reinen
' Dateinamen aus einem übergebenen Pfad
Public Function SplitFileFromPath(ByVal Pfad As String) As String
    Dim File As String

    File = ""
    While Right$(Pfad, 1) <> "\" And Right$(Pfad, 1) <> "/" And _
          Right$(Pfad, 1) <> ":" And Pfad <> ""
        File = Right$(Pfad, 1) + File
        Pfad = Left$(Pfad, Len(Pfad) - 1)
    Wend
    SplitFileFromPath = File
End Function

Public Function BackSlashTest(Pfad As String)
' ----------------------------------------------------------------------------
'  Diese Funktion setzt, wenn nötig ans Ende eines Pfades einen BackSlash
' ----------------------------------------------------------------------------
On Error GoTo Fehler

    If Right(Pfad, 1) <> "\" Then
        BackSlashTest = Pfad & "\"
      Else
        BackSlashTest = Pfad
    End If

Ende:
    Exit Function
Fehler:
    Resume Ende
End Function

' GetProfile #################################################################
' Einzelnen Wert aus der INI-Datei einlesen
Public Function FnGetProfile(sAbschnitt As String, sEintrag As String, _
                             sFilename As String) As String
    Dim sRetVal As String
    Dim lOK     As Long
   
    sRetVal$ = String$(255, 0)
    lOK& = GetPrivateProfileString&(sAbschnitt$, sEintrag$, "", sRetVal$, _
                                    Len(sRetVal$), sFilename$)
    If lOK& = 0 Then
        FnGetProfile$ = ""
      Else
        FnGetProfile$ = Left$(sRetVal$, lOK&)
    End If
End Function

' SetProfile #################################################################
' Einzelnen Wert in die INI-Datei schreiben
Public Function FnSetProfile(sAbschnitt As String, sEintrag As String, _
                             vWert As Variant, sFilename As String) As Long
    Dim s   As String
   
    '{ncdt} nicht konvertierbarer Datentypen
    Select Case VarType(vWert)
      Case vbEmpty:      s$ = ""            'Nicht initalisiert
      Case vbNull:       s$ = ""            'Null (keine gültigen Daten)
      Case vbInteger:    s$ = CInt(vWert)    'Ganzzahl (Integer)
      Case vbLong:       s$ = CLng(vWert)    'Ganzzahl (Long)
      Case vbSingle:     s$ = CSng(vWert)    'Fließkommazahl (Single)
      Case vbDouble:     s$ = CDbl(vWert)    'Fließkommazahl (Double)
      Case vbCurrency:   s$ = CCur(vWert)    'Währungsbetrag (Currency)
      Case vbDate:       s$ = CDate(vWert)   'Datumswert (Date)
      Case vbString:     s$ = vWert          'Zeichenfolge (String)
      Case vbObject:     s$ = "Object"      'Objekt {ncdt}
      Case vbError:      s$ = "Error"       'Fehlerwert {ncdt}
      Case vbBoolean                        'Boolescher Wert (Boolean)
        If vWert = True Then s$ = "True" Else s$ = "False"
      Case vbVariant                        'Variant (nur bei Datenfeldern mit
        s$ = CVar(vWert)                     'Variant-Werten)
      Case vbDataObject: s$ = "DataObject"  'Ein Datenzugriffsobjekt {ncdt}
      Case vbDecimal                        'Dezimalwert
        s$ = Format$(vWert, "0.00")
      Case vbByte:       s$ = CByte(vWert)   'Ganzzahl (Byte)
      Case vbArray:      s$ = "Array"       'Datenfeld (Array) {ncdt}
      Case Else:         s$ = "Else"        'Andere (Unbekannt) {ncdt}
    End Select
    FnSetProfile& = SetPrivateProfileString(sAbschnitt$, sEintrag$, s$, _
                                            sFilename$)
End Function

' Test #######################################################################
' Testet in INI-Datei schreiben und danach wieder auslesen
'Public Function Test()
'    Dim lZahl   As Long
'    Dim sDBIni  As String
'    Dim sText   As String

'    lZahl& = 12345
'    sText$ = "Testtext"
'    sDBIni$ = Left$(CurrentDb.Name, Len(CurrentDb.Name) - 3) & "ini"
'    FnSetProfile% "TestAbschnitt", "String", sText$, sDBIni$
'    FnSetProfile% "TestAbschnitt", "Zahl", lZahl&, sDBIni$
'    sText$ = FnGetProfile$("TestAbschnitt", "String", sDBIni$)
'    lZahl& = Val(FnGetProfile$("TestAbschnitt", "Zahl", sDBIni$))
'    MsgBox "'" & sText$ & "' | " & lZahl&
'End Function
'Ende Test#################################################################


'Konvertierung von Ansi-Zeichen
''  Aufruf: der folgenden Funktion
''  DOS --> Win
''  Ergebnis = Uml2Win(Str_der_konvertiert_werden_soll, True)
''  Win --> DOS
''  Ergebnis = Uml2Win(Str_der_konvertiert_werden_soll, False)
Function Uml2Win(ByVal x As String, ASC2WIN As Boolean) As Variant
    Dim Temp, Tempstr As String
   
    Uml2Win = Null
    If Len(Trim(x)) > 0 Then
        x = x & Chr(0)
        Tempstr = Space(Len(x))
        If ASC2WIN = True Then
            Temp = OemToChar(x, Tempstr)
          Else
            Temp = CharToOem(x, Tempstr)
        End If
        If Right(Tempstr, 1) = Chr(0) Then
            Uml2Win = Left(Tempstr, Len(Tempstr) - 1)
          Else
            Uml2Win = Tempstr
        End If
    End If
End Function

Ludger
FiFo
Allroundtalent


Verfasst am:
18. Jul 2005, 13:21
Rufname:

The simple One - The simple One

Nach oben
       

Grüße!

Hab mir auch ne kleine Versionsverwaltung gebastelt. Allerdings mit ein paar Zeilen Code weniger ;D

Einfach ins Backend eine Tabelle "tbl_AktVersion" mit den Spalten ID, Version, Datum, und in das FrontEnd eine Tabelle "tbl_Version" mit den gleichen Spalten. Ich habe bei meinem Startformular als Datensatzherkunft die tbl_Version eingestellt, damit hab ich mir die Abfrage erspart. Man schreibe in die Öffnen Procedure des Startformulares ungefähr folgenden Code:
Code:
    Dim rs As DAO.Recordset
   
    DoCmd.Maximize
    tf_Version.Caption = "Sie arbeiten derzeit mit der Version " & _
                         Version & " vom " & Format$(Datum, "dd.mm.yyyy")
    Set rs = CurrentDb.OpenRecordset("qry_Is_Latest_Version")
    If rs.EOF = False Then
        If (rs.Fields("Aktuell") = "False") Then
            If MsgBox("Sie arbeiten aktuell mit der Version " & _
                      rs.Fields("Version") & " vom " & _
                      Format$(rs.Fields("tbl_Version.Datum"), "Long Date") & _
                      vbNewLine & "Die neueste Version ist die Version " & _
                      rs.Fields("AktVersion") & " vom " & _
                      Format$(rs.Fields("tbl_Akt_Version.Datum"), _
                              "Long Date") & _
                      vbNewLine & "Wollen Sie Ihre Version jetzt updaten?" & _
                      vbNewLine & "ACHTUNG! Falls Sie dies nicht tun, " & _
                      "kann das Programm instabil laufen!", _
                      vbYesNo) = vbYes Then
                Shell Chr(34) & "Pfad am Server\CopyLatestVersion.bat" & _
                      Chr(34) & " " & Chr(34) & "Pfad an Server" & _
                      Chr(34) & " " & Chr(34) & CurrentDb.Name & _
                      Chr(34) & " " & Chr(34) & "XXX.mdb" & Chr(34), 1
                DoCmd.Quit
            End If
        End If
    End If
In Worten:
Abfragen ob die Aktuelle Version gleich ist, wie die, die der Client gerade geöffnet hat. Wenn nicht, dann mach ihn aufmerksam, das eine neue version vorhanden ist. Diese Abfrage wird automatisch bei allen clients aufgerufen, falls eine neue Version zur verfügung steht.

Das qry_Is_Latest_Version sieht so aus:
Code:
SELECT IIf(([tbl_Akt_Version].[Datum]>[tbl_Version].[Datum])
           Or (tbl_Akt_Version.AktVersion<>tbl_Version.Version),
           "False","True") AS Aktuell,
       tbl_Akt_Version.AktVersion, tbl_Akt_Version.Datum, tbl_Version.Version,
       tbl_Version.Datum
FROM   tbl_Akt_Version
       INNER JOIN tbl_Version
       ON tbl_Akt_Version.ID = tbl_Version.ID;
und die CopyLatestVersion so:

Edit:
Code:
cls

@echo "Aktualisieren der Datenbank"

@set i=0

:Mark
@set /A i = %i% + 1
@if not "%i%"=="2000" goto Mark

@del %2
@echo jetzt vom Server auf Workstation kopieren
@copy %1%3 %2

@echo "Datenbankupdate erfolgreich!"
@pause

@echo und nun das Frontend selber aufrufen
%2
@exit
Edit: Die Schleife ist nötig, weil sonst die ldb noch geöffnet ist, wenn die Datenbank kopiert wird, und dadurch sich die Daten irgendwie überspielen. (Sleep hat bei mir nicht funktioniert Embarassed )

Funtioniert alles ganz einfach, Benutzer können sichs runterkopieren, umbenennen, funktioniert alles. Außerdem gibts auch kein Problem mit den Zeichensätzen, da alle Pfade als Paramter übergeben werden (Habe umlaute, leerzeichen im Pfad, funktioniert alles)

Das Prinzip funktioniert bei mir ausgezeichnet!
Ich hoff ich habe damit geholfen!

MfG

FiFo
Olaf
Gast


Verfasst am:
25. Aug 2005, 15:09
Rufname:

AW: automatisches Frontendupdate - AW: automatisches Frontendupdate

Nach oben
       

Hallo,

da ich ein ähnliches Problem hatte, habe ich eine ähnliche Lösung geschaffen (weitaus weniger Aufwand)

Die Access Benutzerdatei (mit allen Benutzern innestehend) wird per Batch-Datei verlinkt. Weiterhin sorgt die Batchdatei dafür, dass immer die aktuellste Version vom Server heruntergeladen wird.

Was noch interessant wäre: Eine Variante, dass man, sobald man am Backend arbeitet (bei mir ist das Firebird), die User herauskicken kann und dass sie sich erst wieder anmelden könne, wenn die Wartungsarbeiten abgeschlossen sind.

Hat jemand eine einfache Idee? An einer aufwändigen bin ich dran.

MfG

Olaf
Wolfe-
Gast


Verfasst am:
02. Sep 2005, 11:35
Rufname:

Genial!! - Genial!!

Nach oben
       

10000 Dank an Euch Alle, das ist genau das wonach ich schon lange gesucht habe!! Smile Funktioniert einwandfrei!
Gschaftlhuaba
Gast


Verfasst am:
03. Apr 2006, 00:03
Rufname:


AW: automatisches Frontendupdate - AW: automatisches Frontendupdate

Nach oben
       

Hallo,

wieso verwendet ihr zum Kopieren der neuen Frontend-Version eine Batch-Date? Ich gehe mal davon aus, dass diese neue Date einen anderen Dateinamen besitzt, als die alte Version. Schließlich wird das alte Frontend lt. dem o.g. Quellcode erst nach dem Kopieren des neuen gelöscht.

Verwendet doch zum Kopieren einfach die Windows-API. Dann sieht das Kopieren genau so aus, als wenn man das über den Explorer macht.

Übrigens. Wenn das Frontend auf dem Server läge, wurde ja hier schon angesprochen, dass zum Kopieren einer neuen Frontend-Version alle User aus der Datei draußen sein müssen. Dies lässt sich über eine Funktion lösen, da in einem gewissen Zeitinterwall in eine Tabelle guckt, ob der Admin ein Häkchen bei "update" gesetzt hat. Ist dem so, wird über ein selbst geschriebenes Formular eine Meldung an den User ausgegeben, dass die Datei sich in X Minuten automatisch schließt.
Neues Thema eröffnen   Neue Antwort erstellen Alle Zeiten sind
GMT + 1 Stunde

Diese Seite Freunden empfehlen

Seite 1 von 1
Gehe zu:  
Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum herunterladen

Verwandte Themen
Forum / Themen   Antworten   Autor   Aufrufe   Letzter Beitrag 
Keine neuen Beiträge Access Tabellen & Abfragen: Formular, Unterformular, Versionierung/automatisches Zählen 3 RammTammTamm 91 31. März 2014, 21:13
MiLie Formular, Unterformular, Versionierung/automatisches Zählen
Keine neuen Beiträge Access Tabellen & Abfragen: automatisches zuordnen einer Person durch eine Nummer 1 Mellmo 182 03. Jan 2012, 00:12
viezy automatisches zuordnen einer Person durch eine Nummer
Keine neuen Beiträge Access Formulare: Access + automatisches Speichern von Datensätzen 18 Damon D Lathe 10493 18. Feb 2011, 10:47
Anonymus Access + automatisches Speichern von Datensätzen
Keine neuen Beiträge Access Formulare: automatisches Aktualisieren in Formularen 30 PatrickZ 1110 10. Dez 2010, 19:52
derArb automatisches Aktualisieren in Formularen
Keine neuen Beiträge Access Formulare: kein automatisches Speichern bei Hauptf. und Unterf.?! 0 Gast 182 05. Aug 2010, 15:32
Gast kein automatisches Speichern bei Hauptf. und Unterf.?!
Keine neuen Beiträge Access Formulare: Automatisches Kombinationsfeld 1 Amiel 198 29. März 2010, 23:13
KlausMz Automatisches Kombinationsfeld
Keine neuen Beiträge Access Tabellen & Abfragen: Automatisches löschen von verknüpften Datensätzen 1 Gast 282 22. Feb 2010, 11:11
KlausMz Automatisches löschen von verknüpften Datensätzen
Keine neuen Beiträge Access Formulare: automatisches Textfeld befüllen 8 Gast 499 08. Jan 2010, 14:29
MiLie automatisches Textfeld befüllen
Keine neuen Beiträge Access Tabellen & Abfragen: automatisches einfügen von werten aus anderen tabellen 7 markus.hofer 496 10. Aug 2008, 22:17
KlausMz automatisches einfügen von werten aus anderen tabellen
Keine neuen Beiträge Access Formulare: Automatisches Erzeugen von Datensätzen? 6 jape 389 02. Feb 2008, 21:59
jape Automatisches Erzeugen von Datensätzen?
Keine neuen Beiträge Access Formulare: Automatisches Ergänzen weiterer Angaben 6 bilbo78 491 13. Okt 2007, 11:10
JörgG Automatisches Ergänzen weiterer Angaben
Keine neuen Beiträge Access Formulare: automatisches ausfüllen im access 2000 2 gast0815 590 23. Nov 2006, 11:55
Gast0815 automatisches ausfüllen im access 2000
 

----> Diese Seite Freunden empfehlen <------ Impressum - Besuchen Sie auch: Microsoft Word Serienbriefe