This website uses cookies for visitor traffic analysis. By using the website, you agree with storing the cookies on your computer.More information

Automatische Referenzen bei Tabellen?

Allgemeine Fragen zur Entwicklung von und mit JVx.

Automatische Referenzen bei Tabellen?

Postby Mihail121 » Wed Jan 25, 2012 12:26 pm

Hallo, liebe JVx-Community! Mein Name ist Mihail Ivanchev, Software-Entwickler aus Berlin, ich habe vor 2 Monaten JVx entdeckt und schreibe nun mein erstens Projekt damit. Das Framework ist zweifellos das beste, was ich bisher gesehen habe, total intuitiv und einfach zu benutzen. Für 1-Man-Armies bestens geeignet. Vielen Dank und viel Erfolg weiterhin!!

So, mein Problem ist, dass JVx bei der Darstellung von Tabellen automatisch den Foreign Keys folgt und, so schneint es mir, die erste String-Spalte aus der referenzentiereten Tabelle nimmt. Hier ist ein Ausschnitt aus meiner MySQL-DB:

Code: Select all
CREATE TABLE UserRoles
(
    id                          INTEGER AUTO_INCREMENT PRIMARY KEY,
    name                        VARCHAR(20) NOT NULL UNIQUE,
    printable_name              VARCHAR(40) NOT NULL,
    description                 VARCHAR(255)
);

INSERT INTO UserRoles (name, printable_name) VALUES
('admin', 'Administrator'),
('surveyor', 'Property surveyor'),
('reviewer', 'Property reviewer'),
('associate', 'Company associate');

CREATE TABLE Users
(
    id                          INTEGER AUTO_INCREMENT PRIMARY KEY,
    username                    VARCHAR(255) NOT NULL UNIQUE,
    password                    VARCHAR(255) NOT NULL,
    change_password             CHAR(1) DEFAULT 'N',
    valid_from                  TIMESTAMP,
    valid_to                    TIMESTAMP,
    active                      CHAR(1) DEFAULT 'Y',
    first_name                  VARCHAR(40),
    last_name                   VARCHAR(40),
    email                       VARCHAR(255),
    phone                       VARCHAR(30),
    role_id                     INTEGER NOT NULL,
    company_id                  INTEGER,

    CONSTRAINT FOREIGN KEY (role_id) REFERENCES UserRoles(id),
    CONSTRAINT FOREIGN KEY (company_id) REFERENCES Companies(id)
);


Hier ist mein Code:

Code: Select all
   dataSource = new RemoteDataSource();
      dataSource.setConnection(connection);
      dataSource.open();

      rdbUsers = new RemoteDataBook();
      rdbUsers.setDataSource(dataSource);
      rdbUsers.setName("users");
      rdbUsers.open();


Und hier ist das Ergebnis:

http://i.imgur.com/VkoLb.png

Wie man sieht wurde ROLE_ID durch Name ersetzt. Dies ist zwar gut, ich will aber die "printable_name"-Spalten benutzen und das Label auf "System role" ändern wollen. Wie kann ich das erreichen?

Danke im Voraus!

EDIT:

Ich habe soeben das versucht:

Code: Select all
public DBStorage getUsers() throws Exception {
      DBStorage dbsUsers = (DBStorage) get("users");
      if (dbsUsers == null) {
         dbsUsers = new DBStorage();
         dbsUsers.setDBAccess(getDBAccess());
         dbsUsers.setFromClause("Users");
         dbsUsers.setWritebackTable("Users");
         dbsUsers.setAutoLinkReference(false);
         dbsUsers.open();
         
         dbsUsers.setAutoLinkReference(true);
         dbsUsers.createAutomaticLinkReference(new String[] {"ROLE_ID", "ROLE_NAME"},
            "userroles",
            new String[] { "ID", "PRINTABLE_NAME" });

         put("users", dbsUsers);
      }
      return dbsUsers;
   }


mit dem Ergebnis "ROLE_NAME not found in meta data". Ich würde erwarten, dass dies automatisch geschieht. Was mache ich denn falsch bzw. was kann ich machen?
Mihail121
 
Posts: 7
Joined: Tue Nov 22, 2011 8:12 pm

Re: Automatische Referenzen bei Tabellen?

Postby Support@SIB » Wed Jan 25, 2012 4:20 pm

Vielen Dank für das Lob. Es wäre gut für die Verbreitung von JVx, wenn solche Emotionen auch in anderen Netzwerken verbreitet werden :)

JVx wird bereits von größeren Entwicklungsteams eingesetzt um Projekte mit mehreren Mann Monaten umzusetzen. Vor allem die Wartung wird damit auch gerne übernommen!


Die automatischen Auswahllisten sind mit Sicherheit noch ausbaufähig.
Im Moment werden in der Auswahlliste alle Spalten aus UKs angezeigt bzw. die erste Textspalte, wenn kein UK vorhanden ist. In der Ausgangstabelle wird jedoch immer nur 1 Spalte hinzugefügt.

Sie können jetzt zwar den PRINTABLE_NAME ebenfalls als UK definieren oder in den vorhandenen UK aufnehmen, um die Auswahlliste zu verändern, aber dennoch wird in der Ausgangstabelle nur der NAME angezeigt (Das wird in einer der nächsten Releases geändert).

Sie haben jetzt auch die Möglichkeit, manuell, zu definieren welche Columns in der Auswahlliste angezeigt werden, z.B.:

Code: Select all
((DBStorage)<storage>.getSubStorages().get("userroles")).setQueryColumns(new String[] {"ID", "PRINTABLE_NAME"})

oder Sie verändern die Auswahlliste komplett (siehe Codeblock am Ende von Automatische Auswahllisten).

Aber leider fehlt in der Ausgangstabelle die zusätzliche Spalte (Printable Name).

Sie könnten mit aktuellem JVx auch einen Trick anwenden:
Erstellen Sie eine View, mit den gleichen Spaltenbezeichnungen:

Code: Select all
System.out.println(StringUtil.toString(<storage>.getMetaData().getColumnNames()));

Das Statement für die View können Sie mit aktiviertem Logging ermitteln.
Erweitern Sie die Spaltenliste um die PRINTABLE_NAME Column. Diese View verwenden Sie für Ihre Storage als FromClause. Die WriteBackTable bleibt unverändert.

Abschließend ändern Sie noch die Auswahlliste(n), z.B.:

Code: Select all
<storage>.getMetaData().getColumnMetaData("ROLE_NAME").setLinkReference(
         new StorageReferenceDefinition(new String[] {"ROLE_ID", "ROLE_NAME",
                                                      "ROLE_PRINTABLE_NAME"},
                                        "userroles",
                                        new String[] {"ID", "NAME", "PRINTABLE_NAME"}));

<storage>.getMetaData().getColumnMetaData("ROLE_PRINTABLE_NAME").setLinkReference(
         new StorageReferenceDefinition(new String[] {"ROLE_ID", "ROLE_NAME",
                                                      "ROLE_PRINTABLE_NAME"},
                                        "userroles",
                                        new String[] {"ID", "NAME", "PRINTABLE_NAME"}));

und entfernen die ungewünschte Spalte aus der ColumnView, am Client.


Die immer gültige Alternative ist, die automatische Auswahllisten-Erkennung für die spezielle Storage zu deaktivieren und sich manuell darum zu kümmern.

Aber wie bereits erwähnt, wird in einer der nächsten Releases die Steuerung der automatischen Auswahllisten etwas transparenter!
User avatar
Support@SIB
 
Posts: 353
Joined: Mon Sep 28, 2009 1:56 pm

Re: Automatische Referenzen bei Tabellen?

Postby Support@SIB » Wed Jan 25, 2012 4:28 pm

EDIT:

Ich habe soeben das versucht:

Bitte keine Edits durchführen. Lieber eine Reply posten, damit der Lesefluss nicht unterbrochen wird!

Das Problem dabei:

Code: Select all
dbsUsers.setAutoLinkReference(false);
dbsUsers.open();

Da im Zuge von open() die MetaDaten und Auswahllisten ermittelt werden, ist die ROLE_NAME Spalte nicht inkludiert.

Sie können nach open() keinen Einfluß auf die MetaDaten Ermittlung nehmen!
User avatar
Support@SIB
 
Posts: 353
Joined: Mon Sep 28, 2009 1:56 pm

Re: Automatische Referenzen bei Tabellen?

Postby Mihail121 » Wed Jan 25, 2012 4:57 pm

Vielen Dank für die ausführliche Erklärung!

Support@SIB wrote:Vielen Dank für das Lob. Es wäre gut für die Verbreitung von JVx, wenn solche Emotionen auch in anderen Netzwerken verbreitet werden :)

JVx wird bereits von größeren Entwicklungsteams eingesetzt um Projekte mit mehreren Mann Monaten umzusetzen. Vor allem die Wartung wird damit auch gerne übernommen!


Es freut mich sehr, das zu hören. Ich tue mein Bestes, die Leute von den Vorteilen von JVx zu überzeugen. Das Framework ist super entworfen und dahinter stecken offensichtlich große Mengen Know-How. Manche Entwickler haben sicherlich Angst, einzusteigen, weil sie sich kaum vorstellen können, wie leicht der Umgang mit JVx ist (war anfangs auch bei mir der Fall). Ich würde auch gerne etwas beitragen, wenn ich kann. Z.B. durch Vervollständigung der API-Docs.

Ich glaube, ich werde auf die kommenden Releases warten und bis dahin auf die automatischen Auswahllisten eher verzichten. Ich brauche die Funktionalität nur an wenigen Stellen und könnte da manuell arbeiten. Nochmal vielen Dank!
Mihail121
 
Posts: 7
Joined: Tue Nov 22, 2011 8:12 pm

Re: Automatische Referenzen bei Tabellen?

Postby Support@SIB » Wed Jan 25, 2012 5:06 pm

Wir nehmen jede Hilfe dankend an - egal in welcher Art.
Falls Sie auch am Source Code arbeiten möchten, wäre allerdings ein CLA nötig, damit der Source Code auch wirklich Open bleiben kann! Aber für alles andere muss das natürlich nicht sein!

Bzgl. Auswahllisten, siehe Support System
User avatar
Support@SIB
 
Posts: 353
Joined: Mon Sep 28, 2009 1:56 pm


Return to Development (DE)