Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Format eines neuen Tabellenfeldes per VBA auf Uhrzeit Lang setzen

Begonnen von tragger, Februar 27, 2013, 17:49:58

⏪ vorheriges - nächstes ⏩

tragger

Hallo Leute,

mal wieder ein Problem bei mir.

Vorweg, ich weiß, dass man an einer Tabellenstruktur im Backend nachträglich nichts verändern sollte. Nun ist aber nachträglich der Wunsch einer Vorgangshistorie entstanden, die ich umsetzen möchte. Da ich immer nur eine neue Frontend-Version erstellen kann, muss ich aus dieser mittels VBA an den Tabellen im Backend arbeiten.

Ich kann mit dem unten angegebenen Code problemlos die Tabelle erstellen und mit dem Fontend verbinden, sowie den Primärschlüssel setzen. Jedoch soll auch eine Uhrzeit protokolliert werden. Hierzu muss ich bei einem neu erstellten Feld "Vorgangszeit" das Format irgendwie auf Lange Zeit einstellen. Ich finde aber keine richtige Lösung. Die Versuche scheitern.... Ich hoffe auf eure tatkräftige Unterstützung oder Idee für eine andere Umsetzung. Den Weg über ALTER TABLE habe ich irgendwie nicht verstanden und umsetzen können, deshalb habe ich diese Weg gewählt....

Dim db As Database
    Dim SQL$
    Dim SQL2$
    Dim SQL3$
    Dim rs As DAO.Recordset
    Dim rs2 As DAO.Recordset
    Dim rs3 As DAO.Recordset
    Dim merker As String
   
    merker = CurrentProject.Path & "\Verwaltung _be.accdb"
    Set db = OpenDatabase(merker)
    Dim tabDef As DAO.TableDef
    Dim tabField As DAO.Field
    Dim tabProp As DAO.Property
    Dim tidx As DAO.Index
    Dim strFile As String
    Dim TabelleBack As String
    Dim TabelleFront As String

If fct_TabelleVorhanden(merker, "tabVorgangshistorie") = False Then
      ' 1. Tabelle und Felder erstellen
        Set td = db.CreateTableDef("tabVorgangshistorie")  'Tabelle wird erstellt
        Set f = td.CreateField("VorgangsNr", dbLong) 'ID Feld wird erstellt.
        'f.Attributes = dbAutoIncrField '->AutoWert
        td.Fields.Append f
        Set f = td.CreateField("Vorgangsart", dbText)
        td.Fields.Append f
        db.TableDefs.Append td
        Set f = td.CreateField("Vorgangsdatum", dbDate)
        td.Fields.Append f
        Set f = td.CreateField("Vorgangszeit", dbDate)
        td.Fields.Append f
' ---->> hier beginnt die Problematik
        Set tabProp = td.CreateProperty("Format", LongTime)
        td.Properties.Append tabProp
' ----->> ab hier geht alles wieder
        Set f = td.CreateField("MitgliedsNr", dbLong)
        td.Fields.Append f
        Set f = td.CreateField("Tabelle", dbText)
        td.Fields.Append f
        Set f = td.CreateField("Feld", dbText)
        td.Fields.Append f
        Set f = td.CreateField("Alter_Wert", dbText)
        td.Fields.Append f
        Set f = td.CreateField("Neuer_Wert", dbText)
        td.Fields.Append f
        db.TableDefs.Append td
        Set f = td.CreateField("Kategorie", dbText)
        td.Fields.Append f
        Set f = td.CreateField("Bemerkungstext", dbText)
        td.Fields.Append f
        db.TableDefs.Refresh
      ' 2. Index (Primärschlüssel) erstellen
        Set tidx = td.CreateIndex
        tidx.Name = "VorgangsNr_Index"
        tidx.Primary = True
        tidx.Unique = True
        Set f = tidx.CreateField("VorgangsNr")
        tidx.Fields.Append f
        td.Indexes.Append tidx
        td.Indexes.Refresh
   
        'pfad
        strFile = merker
        ' Tabellenname Backend
        TabelleBack = "tabtabVorgangshistorie"
        ' Tabellenname Frontend
        TabelleFront = "tabtabVorgangshistorie"
       'Tabellen Verknüpfung erstellen
        DoCmd.TransferDatabase acLink, "Microsoft Access", strFile, acTable, _
                               TabelleBack, TabelleFront
    End If

MzKlMu

Hallo,
zu was willst Du in der Tabelle ein Format einstellen?
Formate sind Schall und Rauch und sollten nur dort eingestellt werden, wo man diese auch anzeigt. Z.B. Formular oder Bericht.
Meiner Meinung nach haben Formate in Tabellen nichts zu suchen, da man auf die Tabellen nie direkt zugreift, da das im Regelfall die langsamste Methode ist.
Daher kannst Du notfalls auch in einer Abfrage das gewünschte Format einfach einstellen.
Gruß Klaus

tragger

Jetzt muss ich noch einmal detaillierter nachfragen.

Ich benötige hinterher in der Abfrage die genaue Änderungszeit. Deshalb wollte ich diese speichern. Wenn ich im Feld Vorgangsdatum Daten speichere, wird dann die Systemzeit auch automatisch mitgeloggt?

Dann könnte ich in der Abfrage hinterher ja die Daten auseinandernehmen...

Ist meine Annahme richtig?

MzKlMu

Hallo,
nein, die Systemzeit wird nicht automatisch mit geloggt. Das musst Du selbst erledigen, durch Programmierung.
Z.B. über ein Formular das im Ereignis "Nach Aktualisierung" des Formulars oder eines Feldes das Datum in die Historie schreibt.
Eine andere Möglichkeit ist auch den Standardwert des Feldes auf das aktualle Dateum einzustellen, dann wird bei jedem neuen Datensatz das Datum/Zeitfeld automatisch gefüllt.

Was ich nicht verstehe, warum erstellst Du die Tabelle per Code und nicht einfach im Backend von Hand?

Um noch mal auf das Format zurückzukommen.
ZitatIch benötige hinterher in der Abfrage die genaue Änderungszeit. Deshalb wollte ich diese speichern.
Du kannst diese ja speichern, aber dazu benötigst Du nicht das Format. Ein Datumsformat in der Tabelle halte ich für völlig verzichtbar und bedeutungslos, egal was Du als Format einstellst, in der Tabelle steht immer eine reine Dezimalzahl (Double). Das ist so bei einem Access Datumsfeld.
Gruß Klaus

tragger

Also ich muss das per Code erstellen, da ich keinen direkten Zugriff auf das Backend habe / haben darf. Somit muss ich vorher mit einem Muster testen, das alles klappt. Einen anderen Weg als per Code kenne ich nicht..

Mir ist inzwischen die Idee gekommen, dass ich das Feld als normales Datumsfeld eingestellt lasse. Bei einer Änderung in einem Formular dann automatisch ein Datensatz in dieser Vorgangshistorie erzeugt wird und das Feld Vorgangsdatum einfach über Now() gefüllt wird und nicht über Date(). In einer Abfrage lasse ich das dann aufsplitten, damit jeder auch die genaue Änderungszeit sehen kann...

Oder bereite ich mir hiermit weitere Probleme?

MzKlMu

Hallo,
OK, wenn Du kein Zugriff hast OK, denn per Code.
Wobei es Unsinn ist, einem User keinen Zugriff auf eine DB zu geben aber Änderungen per Code zugelassen werden. Da kann man Dir auch gleich alle Rechte geben.
Und wenn Du keine Rechte am Backend hast, kannst Du auch per Code keine Änderungen machen.
ZitatBei einer Änderung in einem Formular dann automatisch ein Datensatz in dieser Vorgangshistorie erzeugt wird und das Feld Vorgangsdatum einfach über Now() gefüllt wird
Das meine ich doch die ganze Zeit. Und Aufsplitten musst Du doch auch nicht. Im Formular stellst Du das lange Datumsformat ein und fertig, mehr braucht es nicht.
Und wenn Du die Zeit haben willst, musst Du natürlich Now() bzw. Jetzt() verwenden. Jetzt() für ein deutsches Access.
Gruß Klaus

tragger

okay, vielen dank!!

Mit keinem Zugriff sollte einfach heißen, dass ich am Echtzeitbestand nicht arbeiten darf, damit die Aktualität immer gewahrt ist... aber egal...

MzKlMu

Hallo,
Zitatdass ich am Echtzeitbestand nicht arbeiten darf,
aber genau das musst Du auch machen wenn Du das per Code machst. Das Fraontend muss exclusiv geöffnet sein und niemand sonst darf arbeiten damit. Du musst also in jedem Fall das Produktivsystem anhalten. Erst dann kannst Du die Tabelle ergänzen bzw. neu anlegen.
Gruß Klaus