Page 1 of 1

Manuelle Linked Reference

PostPosted: Tue Jun 27, 2017 12:16 pm
by manfrede
Ich versuche mich gerade an einem Prototypen für eine neue Applikation. Leider habe ich das Problem, dass die Storage bei
Code: Select all
setAutoLinkReference(true)
die falschen Spalte der Referenzierten Tabelle angezeigt wird.

Datenbank ist Oracle 11.2.0.4.0.
JVx-Version ist die 2.7 beta aus der letzen VisionX Version.

DDL:
Code: Select all
CREATE TABLE "MITARBEITER"  (
    "ID" NUMBER(11,0),
    "FMNR" VARCHAR2(5) NOT NULL ENABLE,
    "PSNR" VARCHAR2(10) NOT NULL ENABLE,
    "NAME" VARCHAR2(40),
    ...,
    CONSTRAINT "MITARBEITER_PK" PRIMARY KEY ("ID"));

CREATE TABLE "THEMEN"  (
    "THEMA" VARCHAR2(265) NOT NULL ENABLE,
   "VERANTW_ID" NUMBER(11,0),
   "KUNDENRELEVANZ" NUMBER(3,0) DEFAULT 0 NOT NULL ENABLE,
   "BESCHREIBUNG" VARCHAR2(4000),
    CONSTRAINT "THEMEN_PK" PRIMARY KEY ("THEMA"),
    CONSTRAINT "THEMEN_VERANTW_FK" FOREIGN KEY ("VERANTW_ID") REFERENCES "MITARBEITER" ("ID") ENABLE);
   
CREATE TABLE "WISSENSSTAND" (
    "THEMA" VARCHAR2(256) NOT NULL ENABLE,
   "MITARBEITER" NUMBER(11,0) NOT NULL ENABLE,
   "WISSENSSTAND" NUMBER(3,0) NOT NULL ENABLE,
   "INTERESSE" NUMBER(1,0) DEFAULT 0 NOT NULL ENABLE,
    CONSTRAINT "WISSENSSTAND_PK" PRIMARY KEY ("THEMA", "MITARBEITER"),
    CONSTRAINT "WISSENSSTAND_THEMA_FK" FOREIGN KEY ("THEMA") REFERENCES "THEMEN" ("THEMA") ENABLE,
    CONSTRAINT "WISSENSSTAND_MITARB_FK" FOREIGN KEY ("MITARBEITER") REFERENCES "MITARBEITER" ("ID") ENABLE);


Server-code:
Code: Select all
public DBStorage getThemen() throws Exception {
    DBStorage dbsThemen = (DBStorage) get("themen");
    if (dbsThemen == null){
      dbsThemen = new DBStorage();
      dbsThemen.setDBAccess(getDBAccess());
      dbsThemen.setWritebackTable("themen");
      dbsThemen.setAutoLinkReference(true);
      dbsThemen.open();
     
      put("themen", dbsThemen);
    }
    return dbsThemen;
  }
 
 
  public DBStorage getWissensstand() throws Exception {
    DBStorage dbsWissensstand = (DBStorage) get("wissensstand");
    if (dbsWissensstand == null){
      dbsWissensstand = new DBStorage();
      dbsWissensstand.setDBAccess(getDBAccess());
      dbsWissensstand.setAutoLinkReference(true);
      dbsWissensstand.setWritebackTable("wissensstand");
      dbsWissensstand.open();
      put("wissensstand", dbsWissensstand);
    }
    return dbsWissensstand;
  }


Im Screenshot-Attachment sieht man, wie durch den AutoLink Reference die Firmanummer des verantwortlichen Mitarbeiters angezeigt wird. Mein Ziel wäre jedoch der Name.

Ich habe hierzu keine API (bzw. Hilfe im Forum) gefunden, wo ich gezielt ansteuern kann, welche Spalten der referenzierten Tabelle ich nun anzeigen will. Gibt es solche überhaupt?

Bzw. gibt es die Möglichkeit die Link Reference manuell zu erstellen sowie die zugehörige "fremde" Spalte?
Prinzipiell kann ich ja eine ColumnMetadata zu den Metadata der Storage hinzufügen, so wie ich eine StorageReferenceDefinition auf der ColumnMetadata setzen kann, jedoch nicht auf der Storage.

Ich wäre dankbar wenn ich das ohne View lösen könnte, da es sich bei dem Schema um ein Fremdsystem handelt, auf welche wir nur Leserechte haben.

Re: Manuelle Linked Reference

PostPosted: Tue Jun 27, 2017 12:28 pm
by manfrede
Ok, Kommando zurück, gerade ausprobiert, es reicht offenbar, die gewünschten Spalten beim Aufrufen von createAutomaticLinkReference anzugeben.
Code: Select all
dbsThemen.createAutomaticLinkReference(new String[] { "VERANTW_ID", "VERANTW_NAME",}, "mitarbeiter", new String[] { "ID", "NAME" });


Ich dachte dort dürfen nur die Spalten für den Foreign Key Constraint angegeben werden.
Draufgekommen bin ich jedoch nur, da die Funktion dazu im VisionX etwas versteckt ist.

Hat sich also erledigt, danke!

Re: Manuelle Linked Reference

PostPosted: Tue Jun 27, 2017 5:11 pm
by mhandsteiner
In folgendem Forum Beitrag ist die Funktion createAutomaticLinkReference beschrieben:
Using custom SQL statements

Setzt man mit createAutomaticLinkReference eine eigene ForeignKey Beziehung, so wird diese der automatisch Ermittelten vorgezogen.

Zu dem Thema, dass die falsche Spalte herangezogen wird:

Die Auswahl der Anzeige Spalte erfolgt wie folgt:
1) Unique Key
1. Text Spalte eines Unique Keys oder wenn nur 1 Unique Key mit einer Spalte existiert diese Spalte

Wenn man den Namen als Auswahlkriterium sehen will, und nicht in Gefahr laufen will,
dass beim Namen Martin die IDs 1, 2, 3 möglich sind, sollte der Name Unique sein.

Wenn fachlich kein Unique Key möglich ist, funktioniert auch der Trick, dass man einen
Disabled Unique Key auf den Namen anlegt.

Dieser wird nicht geprüft, hat keinerlei Performance Impact.

Der Trick funktioniert auch für Views als Auswahlliste.
zB: V_MITARBEITER_AUSWAHL
und auf der View einen Disable ForeignKey mit den Spalten anlegt.

2) 1. Text Spalte

3) 1. Nicht Binary Spalte

Re: Manuelle Linked Reference

PostPosted: Tue Jun 27, 2017 5:21 pm
by mhandsteiner
In VisionX kann man die Spalten, die angezeigt werden sollen einfach im Tabellen Editor ändern:

Unten in den Data Controls den Tabellen Edit Wizard öffnen.
- Auf mehr klicken, damit man die Details sieht.
- Die Zeile Auswahlliste "Excel Kontakte" anklicken.
- Auf der rechten Seite erscheinen die Details zur Auswahlliste.
Man kann nun Spalten hinzufügen oder wegnehmen durch an- abhaken.
- Nachname zusätzlich anhaken.
- Fertig klicken.