Cross-Referenz der dynamischen Datenfelder
Die Cross-Referenz der dynamischen Datenfelder zeigt für jedes dynamische Datenfeld die
Objekte, in denen dieses Datenfeld existiert.
Dies ist nur als Momentaufnahme der Datenbank möglich; jede folgende Updateoperation kann neue dynamische Datenfelder erzeugen; die Cross-Referenz wird dabei
nicht aktualisiert.Die Information über die Verwendung der dynamischen Datenfelder wird in Objekten der Klasse CX_SLOT_XREF gehalten. Aufbau einer Cross-Rererenz bedeutet, dass für jedes dynamische Datenfeld ein CX_SLOT_XREF-Objekt erzeugt wird, und dieses Objekte verweist auf alle Objekte, in denen das Datenfeld vorkommt.
Es ist sinnvoll, die CX_SLOT_XREF-Objekte in einer separaten physischen Datenbank zu
halten - sie stellen ja nur eine Momentaufnahme dar, die bald ihre Aktualität verliert. CX_SLOT-XREF-Objekte verweisen auf "normale" Objekte - aber nicht umgekehrt. Die physische Teildatenbank für die Cross-Referenz kann deshalb jederzeit wieder gelöscht
werden, ohne Auswirkung auf die "eigentliche" Datenbank.Beschreibung einer Hilfsdatenbank für die Cross-Referenz:
MetaInfo |
Database(3,
CX_SLOTXREFDB) Segment(slotXrefS, DB(3), EXTERN) Class(CX_SLOT_XREF, 52, slotXref) File(slotXref, slotXref, slotXref) Storage(slotXref, DB(3), slotXrefS, EP(slotXrefL0), CSeg(slotXrefS), Garbage(slotXrefG0, slotXrefS)) |
Diese Beschreibung wird - solange man mit der Cross-Referenz arbeiten will - dem
Initialisierungsfile CLASSIX.INI hinzugefügt.
Mit dem Programmaufruf
...
SET CX_SLOTXREFDB=mySlotXReferenceDB.cxd
cxgoso -U -I modifiziertesInitFile
wird die (leere) Hilfsdatenbank erzeugt.
Die Cross-Referenz wird mit dem Utility-Programm
cxxosr.exe aufgebaut. Dabei ist es möglich, die Cross-Referenz der
dynamischen Datenfelder zusammen mit der Cross-Referenz für Objekte in einem
Durchlauf zu generieren.
Aufbau und Verwendung der Cross-Referenz mit InstantView®:
(siehe auch das AppsWH-Modul zur Pflege
dynamischer Datenfelder)
Window(win, 50, 50, 735, 150, "Slot XRef")
{
Menu
{
Item("Slot X-Ref")
{
Item("show objects")
[
SELECT: OpenWindow(objWin, 1)
]
}
}
ObjectList(slots, AUTO_POSITION, 1, 1, 1, 1) // show all
dynamic data fields
[
INITIALIZE: [ "CX_SLOT_XREF::Name()",
COLOR BLUE ] SetFormat
[ "CX_SLOT_XREF::slot", COLOR LIGHTRED,
JUSTIFY_RIGHT ] SetFormat
0 SetSort
FindAll(CX_SLOT_XREF) FillObox
SELECT: GetObject SendMsg(SHOW_SLOT_XREF)
]
Attach(slots, LEFT, STRETCH, 5)
Attach(slots, RIGHT, STRETCH, 5)
Attach(slots, TOP, STRETCH, 5)
Attach(slots, BOTTOM, STRETCH, 5)
}
Window(objWin, 50, 201, 735, 150, "Objects")
[
SHOW_SLOT_XREF: -> slot
slot Copy(Name()) slot Copy(slot) String("Slot %s (%d)") PutValue
slot FillWindow
]
{
// show objects with a specific dynamic datafield
ObjectListView(CX_SLOT_XREF::objects, ENTIRE,
AUTO_POSITION, 1, 1, 1, 1)
Attach(objects, LEFT, STRETCH, 5)
Attach(objects, RIGHT, STRETCH, 5)
Attach(objects, TOP, STRETCH, 5)
Attach(objects, BOTTOM, STRETCH, 5)