Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Foreign Key aus Tabelle über Modul und Abfrage auslesen

Begonnen von OPS, November 04, 2010, 10:37:59

⏪ vorheriges - nächstes ⏩

OPS

Hallo

Mein Problem führt meine Fragen aus dem Post http://www.access-o-mania.de/forum/index.php?topic=13262.0 weiter.

Ich habe jetzt lange versucht das selbst hinzukriegen aber ich schaffe es einfach nicht.

Hier das eigentliche Problem:

Ich habe ein Endlosformular. Eine Änderungshistorie. Die Änderungen die da hinein kommen, stammen aus verschiedenen Tabellen.
Es gibt die Felder:
Table_Origin (Herkunftstabelle), Table_ID (welche ID hat der Datensatz in der Herkunftstabelle), Field_Name (Name des veränderten Feldes), OldValue, NewValue und Zeitstempel

Dank einer großartigen Lösung von Database wurde in diese History eine Möglichkeit implementiert um mit Hilfe der IDs in der Tabelle History im Formular über den guten Umweg einer Abfrage die Klarnamen, und nicht die ID# anzuzeigen (beschrieben in dem oben erwähnten Post).

Ein ähnliches Problem ergibt sich jetzt in dem selben Formular:
In der Tabelle History im Feld Field_Name, stehen die Felder die verändert wurden. In OldValue und NewValue steht dann der veränderte Wert.
Beispiel für Änderungen in der History (Zeitstempel weggelassen):
ID(in der History)Table_Origin (Herkunftstabelle des Wertes)Table_ID (ID des geänderten Wertes)FieldName (Name des Feldes dessen Wert verändert wurde)OldValue(alterWert)NewValue(neuer Wert)
Xtbl_signalsAWertebereich_Anfang0°C10°C
Ytbl_SignalsBFK_Function37

Der erste Fall ID X ist gut: Alles stimmt, im zweiten  Fall ID Y habe ich lediglich FKs angezeigt, ich möchte aber in dem Formular nicht nur die FK (Foreign Key) anzeigen sondern auch das verlinkte Element.
FK_Function 3 könnte vielleicht den Wert "Command" repräsentieren und
FK_Function 7 den Wert "Binary Indication"

Was ich aus dem ersten Post gelernt habe, ist,
- dass ich eine Abfrage benötige mit einem Modul das in der Abfrage aufgerufen wird.
- Also etwa ein Modul: LeseFK.
- Daran übergebe ich in der Abfrage qry_History den Namen des geänderten Feldes und die geänderte FK.
- Und jetzt muss ich in dem Quelltext irgendwie definieren, dass für die übergebenen FK-Werte aus den Lookuptabellen gelesen werden und die "Klarnamen" (wie heißt der Begriff richtig?) ausgelesen werden.
- Das Modul müsste ich nun zwei Mal in die Abfrage einbauen, einmal für den NewValue und einmal für den OldValue.

Doch wie müsste der Quelltext sinnvollerweise aussehen?
Bei mir kommt bis jetzt nichts sinnvolles heraus.

Shai

Um das herauszufinden, müsste man ja, falls vorhanden, die zum Foreign Key verknüpfte Untertabelle kennen, dazu wissen, wie in der verknüpften Tabelle das Feld heißt, in dem die entsprechende ID drinne steht sowie das Feld, wo die Beschreibung drin steht.
Mitgekommen? Die Beschreibung für das Feld FK_Funktion steht ja in einer Untertabelle, also nicht in der Tabelle "tbl_signals", sondern z.B. in der Tabelle "tbl_SignalType"
Die Tabelle tbl_SignalType ist z.B. hat z.B. die Felder ID und Bezeichnung.

Wir brauchen nun eine Tabelle "tbl_HistoryRelations" mit den Feldern ID, Table, TableField, SubTable, SubTableKey, SubTableField
Da schreibst Du dann z.B. rein:

Table, TableField, SubTable, SubTableKey, SubTableField
"tbl_signals", "fk_function", "tbl_signaltype","ID","Beschreibung"

Und nun kannst Du auf Basis dieser weiteren Tabelle anhand der Feldinhalte der Felder "table_origin" und "FieldName" das Feld in der Untertabelle bestimmen.
Also:
strWert = DLookup(tbl_HistoryRelations.SubTableField,tbl_HistoryRelations.SubTable,tbl_HistoryRelations.SubTableKey & "=" & tblHistory.OldValue)


zu viele Leute denken in Excel.

OPS


database

#3
Hallo,

ZitatUm das herauszufinden, müsste man ja, falls vorhanden, die zum Foreign Key verknüpfte Untertabelle kennen, dazu wissen, wie in der verknüpften Tabelle das Feld heißt, in dem die entsprechende ID drinne steht sowie das Feld, wo die Beschreibung drin steht.

...Findet man allesamt in der Tabelle MSysRelationships   ;)

Zitatdie zum Foreign Key verknüpfte Untertabelle
... da wird es HOFFENTLICH keine geben sondern nur eine Mastertabelle mit entsprechendem Primary Key!

Blende dir in deiner DB mal die Systemobjekte ein und schau vorsichtig in die Tabelle MSysRelationships.
Du solltest dort die entsprechenden Feldnamen (FK_....) und die Tabellennamen (tbl_signals ....) finden können.
Über eine geeignete Function, die dann in deiner Abfrage aufgerufen wird wenn das das Feld unter FieldName mit 'FK' beginnt kannst du dann durch umstellen der DLookup-Funktion den Namen des Primärschlüssels in der Mastertabelle ermitteln. (Daran kannst du erkennen, wie wichtig es sein kann, wenn man in einer Datenbank eine durchgehend gleiche Benennungskonvention verwendet)

Zitat... und die "Klarnamen" (wie heißt der Begriff richtig?)
...das sind die Feldnamen oder Feldbezeichungen der in Beziehung stehenden Felder ... die Feldnamen von PrimaryKey und ForeignKey ... oder so

Ja,ja, nicht gleich wieder 'Ach Herrije' schreiben ... !    ;D ;D ;D

Auch das ist nicht schwer - nur ein wenig Schreibarbeit und lesen...   aber diese Aussage kennst du ja seit deinem letzten Thread nun schon  :D :D :D

HTH
Peter

p.s.
ZitatHab eine Lösung gefunden
Ist die nur geheim oder so gut, dass du sie uns nicht verraten willst? ;D

OPS

Die Lösung ist langweilig, ist dein Text auf die Situation angepasst und ein paar spezifische Veränderungen.
Nichts weltbewegendes, aber ohne deinen Text hätte ich es nicht hingekriegt.