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
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.
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?
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.
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?
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.
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...
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.