Suchen und Finden 2: Enterprise Architect DB-Schema

Der Umfang der Modelle kann, vor allem in Projekten, in denen kollaborativ gearbeitet wird, schnell sehr groß werden. Um den Überblick zu behalten, gibt es im EA die Model Search. Mit der Model Search können Modelle auf drei verschiedenen Arten gesucht werden, mittels:
  • Query Builder
  • SQL Suche
  • Add-in Suche
Erstellen einer neuen Modellsuche

Erstellen einer neuen Modellsuche

Der Query Builder ist ein “Query By Example” Approach, dabei können Elemente nach bestimmten Kriterien gesucht werden. Es ist nicht möglich, Elemente und deren Links abzufragen!
Die SQL Suche erlaubt es direkt im DB Repository von Enterprise Architect zu suchen. Hierbei ist es auch möglich, Elemente und deren Verbindungen zu anderen Elementen abzufragen. Wenn, ausgehend von einem Startelement, alle mit einem bestimmten Linktyp verbundenen Elemente ausgegeben werden sollen, kann dies mit einer SQL Suche nur bis zu einer vordefinierten Tiefe geschehen. Rekursive suchen sind nicht möglich!
Add-in Suchen sind programmierte suchen, die als Ergebnis ein XML-Resultset zurückliefern, das wiederum im Suchfenster des EA angezeigt wird. Mit der Add-in Suche ist jede erdenkliche Abfrage möglich, auch rekursive suchen und Suchen in denen andere Systeme eingebunden sind!
Um eine SQL Suche erstellen zu können braucht man Informationen über das Schema der DB. Jedes .EAP File kann mittels Microsoft Access geöffnet werden um die Struktur und den Inhalt der DB einzusehen! Um das Arbeiten mit SQL Suchen zu erleichtern, bieten wir Ihnen einen Auszug der wichtigsten EA Tabellen.
 
 
Weiterführende Links: Suchen und finden 1

Veröffentlicht unter Modell-Suche
Schlagworte: , , , , , , , , ,
18 comments on “Suchen und Finden 2: Enterprise Architect DB-Schema
  1. zheka sagt:

    Wie kann man die Anforderungen mit den entsprechenden Beziehungen suchen?
    D.h. ich habe z.B. 300 Anforderungen…
    Ich möchte jetzt die 300 Anforderungen sehen:

    *EINMAL: Die Anforderungen, die bereits Beziehungen haben
    *EINMAL: Die Anforderungen, die noch keine Beziehungen haben

    Das möchte ich mit SQL Behfel realisieren oder auch mit einem Skript…
    Kann mir da jemand bitte helfen?

  2. Horst Kargl sagt:

    Hallo Zheka,
    ja, das kann man machen. Die Anforderungen liegen in der Tabelle t_object, die Beziehungen in der Tabelle t_connector.
    Alle Anforderungen ohne Beziehungen:

    SELECT t_object.ea_guid AS CLASSGUID, t_object.Object_Type AS CLASSTYPE, * FROM t_object
    WHERE t_object.Object_ID NOT IN
    (SELECT t_connector.Start_Object_ID FROM t_connector )
    AND t_object.Object_ID NOT IN
    (SELECT t_connector.End_Object_ID FROM t_connector)
    AND t_object.Object_Type = ‘Requirement’

    Diese Abfrage liefert alle Elemente (aus t_object), deren Object_ID nicht in der Tabelle t_connector als Source oder Target (Start_object_ID, End_Object_ID) vorhanden ist. Damit nur Requirements aus der Tabelle t_object geliefert werden, wird in der letzen Zeile, die Menge der Elemente auf Requirements beschränkt.

    Um nun alle Requirements mit Beziehungen zu erhalten, kann einfach das NOT beim NOT IN weggelassen werden.

  3. Sascha Bötzel sagt:

    Where do I find the description of an external requirement within the EA DB scheme? The external requirements are stored in t_objects, but the ‘Notes’ field is empty for all external requirments.

  4. Horst Kargl sagt:

    The external requirement is an element of type Requirement, stored within t_object and linked with a realization link with another element e.g. “class1”. If this is the case, you will find the requirement element listed within the properties Rules.Requirements of “class1”.

    However, because it is an external requirement, the Rules.Requirements property view do not show the properties. You have to double click the table entry to open the property view of the external requirement.

    Because the external requirement is its own element, it provides also all properties of an element. The notes are stored as t_object.Notes
    Use this query to get all notes from t_object

    select t_object.Note as ElementNote from t_object

  5. Dr. Achim Hillen sagt:

    Hallo,
    ich würde gerne eine SQL-Abfrage erstellen, die mir die Attribute einer Klasse liefert, die über das “link to element feature” miteinander verknüpft sind. Das Start_Object bzw. das End_Object des Verbinders scheinen sich immer auf alle Attribute zu beziehen, die in der Klasse vorhanden sind.
    Ziel ist, am Schluss die Attribute zu ermitteln, die nicht über das link to element feature verbunden sind.
    Haben Sie da einen Tipp für mich?
    Viele Grüße

  6. Horst Kargl sagt:

    Hallo,

    die Information “Link to Element Feature” ist am Connector in den StyleEx Informationen gespeichert.

    LFEP={FF0F8C7B-67ED-4e42-A828-3221746F228F}L;
    LFSP={26C06D2F-9B3C-4b03-80B6-779B146DF771}L;

    Die GUID bezieht sich dabei auf das Attribut;
    LFEP … bezeichnet das Target Ende
    PFSP … bezeichnet das Source Ende

    Alle Attribute, die nicht mit einer Beziehung verbunden sind, erhält man z. B. mit dieser Abfrage:

    SELECT DISTINCT t_attribute.ID
    FROM t_attribute, t_connector
    WHERE t_connector.StyleEx NOT like ‘*’+t_attribute.ea_guid+’*’

    Möchte man die Abfrage noch auf ein bestimmtes Modell-Element einschränken, kann noch auf die Object_ID des Attributes eingeschränkt werden.

    Möchte man auf die Element-GUID einschänken, muss t_attribute noch mit t_object ‘gejoined’ werden, bevor in der Where Abfrage die LIKE Anweisung verwendet und auf die Element-GUID eingeschränkt werden kann.

    Ich hoffe die Antwort ist ausführlich geug!?
    Viele Grüße

  7. Oleg sagt:

    Hallo, ich würde gerne meine Ergebnisliste nach dem Wert eines Tagvalues sortieren. Obwohl der Wert numerisch ist, wir er in Tagvalue als string gespeichert und entsprechend sortiert. Wie kann man den Wert bei der Anfrage Casten? CAST oder TO_NUMBER geht scheinbar nicht.

    Gibt es eine Liste aller SQL-Funktionen, die EA unterstützt?

    Danke und Gruß

  8. Horst Kargl sagt:

    Hallo,
    es kommt drauf an welche DB Sie verwenden.

    Je nach verwendeter DB bietet die DB unterschiedliche Cast Operationen.
    Für die MSJet DB (= .EAP File) sieht die Lösung folgendermaßen aus:

    select t_object.Name, t_objectproperties.Value, cLNG( “0” &t_objectproperties.Value) as [Tag als Zahl]
    from t_object
    inner join t_objectproperties on t_object.Object_ID = t_objectproperties.Object_ID
    where t_objectproperties.Property = ‘meinTag’

  9. Oleg sagt:

    Danke!

    Kann man generell sagen, dass man Excel/VBA-Funktionen in SELECT queries verwenden kann?

  10. Horst Kargl sagt:

    Das kann ich ad hoc nicht pauschal beantworten.
    Alle Funktionen der DB sollten unterstützt werden,
    welche auch der DB Treiber den der EA intern verwendet unterstützt.

    Zum Beispiel bietet der MSSQL Server die Möglichkeit rekursives SQL zu schreiben.
    Direkt am SQL Server kann so eine Abfrage in einer EADB ausgeführt werden.

    Über den EA erhält man eine Fehlermeldung.

  11. Tanja sagt:

    Hallo, ich bin EA-Anfänger und brauche dringend Hilfe für meine Arbeit.

    ich möchte gerne mit Hilfe einer Suche alle Attribute aller Klassen ausgeben lassen, die ein bestimmtes Tagged Value haben.

    Also ich möchte die folgenden Spalten haben:
    Name-Klasse Name-Attribut Datentyp Stereotyp MyTaggedValue

    In der Spalte von MyTaggedValue soll dann der jeweilige Wert des Tagged Values ausgegeben werden.

    Ich hoffe ihr könnt mir weiterhelfen.

    Vielen Dank im Voraus.

    Viele Grüße

  12. H.Kargl sagt:

    Hallo Tanja,

    ja, so eine Suche ist möglich!
    Das interessante dabei ist, dass das TaggedValue als eigene Spalte ausgegeben werden soll,
    was allerdings nur funktioniert, wenn man bestimmte Tagged Values ausgeben möchte.
    Alle vorhandenen TaggedValues können nicht einfach als Spalte ausgegeben werden.

    Hier die gewünschte Abfragfe:

    SELECT
    t_attribute.ea_guid as CLASSGUID,
    "Attribute" as CLASSTYPE,
    t_object.Name as [Class Name],
    t_attribute.Name as [Attribute Name],
    t_attribute.Type,
    t_attributetag.VALUE as [MyTag]
    FROM (t_object
    inner join t_attribute on t_object.Object_ID = t_attribute.Object_ID)
    left join t_attributetag on (t_attribute.ID = t_attributetag.ElementID and t_attributetag.Property = 'myTag')

    Mehr zu Tagged Values als Spaltern.

  13. Peter sagt:

    Hallo, ich möchte die gleiche Problemstellung wie “zheka” lösen nämlich die Beziehungen von Anforderungen mit SQL suchen. Konkret die Verbindungen zu test case Objekten.

    Wenn ich die vorgeschlagene Suche oben verwende bekomme ich folgende Fehlermeldung.

    —————————
    Enterprise Architect
    —————————
    DAO.QueryDef [3075]

    Syntax error in query expression ‘t_object.Object_ID NOT IN
    (SELECT t_connector.Start_Object_ID FROM t_connector )
    AND t_object.Object_ID NOT IN
    (SELECT t_connector.End_Object_ID FROM t_connector)
    AND t_object.Object_Type = ‚Requirement‘’.
    —————————
    [ OK ]
    —————————

    Ich benutze Enterprise Architect 13.

    Wäre super wenn Sie mir hierzu einen Hiweis geben könnten.

    Vielen Dank und beste Grüße

  14. T.Besorna sagt:

    Hallo Peter,

    Sollte in der letzten SQL Zeile anstelle von
    t_object.Object_Type = ‚Requirement‘‘
    nicht
    t_object.Object_Type = “Requirement”
    stehen?

  15. Fabian sagt:

    Hallo zusammen,

    ich hätte ebenfalls ein SQL Problem und zwar:
    Ich möchte Use-Cases ohne Stereotyp finden
    -> die SQL sieht hierbei so aus:

    SELECT ea_guid AS CLASSGUID, Object_Type AS CLASSTYPE, object_type, Name, Stereotype
    FROM t_object
    WHERE t_object.Object_Type = ‘UseCase’
    AND t_object.Stereotype is NULL

    Soweit so gut…
    Nun möchte ich aber nicht mein ganzes EA-Modell durchsuchen, sondern nur ein bestimmtes Package.
    Anbei mein konrketes Problem:
    Folgende Struktur habe ich in meinem Projekt Browser

    Package 1
    Package 1.1
    Package 1.2
    Package 2
    Package 2.1
    Package 2.1.1
    Package 2.1.2
    Package 2.2
    Package 2.3
    Package 3
    (Starr sind nur Package 1 – 3, die Unterpackages können beliebig tief gehen)

    Ich möchte aber nur die Use-Cases welche im gesamten Package 1 sind im SQL abfragen, die in Package 2 (egal welche Ebene) sind mir egal ob die Stereotypen haben oder nicht:)

    Kann mir wer helfen?

    Vielen Dank & viele Grüeß

  16. H.Kargl sagt:

    Hallo Fabian,

    diese Abfrage ist leider nicht in einer Abfrage möglich. Im EA Datenmodell speichert jedes Modell-Element unter t_object.Package_ID in welchem Paket es enthalten ist. Somit können wir lediglich die direkt in einem Paket enthaltenen Modell-Elemente überprüfen. Dabei ist es allerdings egal ob ein Modell-Element unter ein anderes Modell-Element geschachtelt ist, da trotzdem beide im selben Paket liegen und die selbe Package_ID haben.

    Enthält das Paket “Package1” z.B. noch ein Paket “Package1.1”, dann haben die darin enthaltenen Modell-Elemente die ID des “Package1.1”.

    Um diese Abfrage zu erstellen müsste sie also so aussehen:

    …. WHERE t_object.Package_ID IN ( LISTE ALLER PACKAGE_IDs UNTERHALB VON PACKAGE1, INKLUSIVE DER ID VON PACKAGE1 )

    Um diese Liste zu erhalten müssen wir den Modell-Zweig durchsuchen und alle Package_IDs sammeln. Dies können wir mit einem Script durchführen.
    Set EA 12 oder 13 gibt es dafür eine neue Script Gruppe. Enthaltene Scripte tauchen in der EA Modell-Suche in der Such-Kategorie “Script” auf.
    Hier ist die Vorgehensweise etwas genauer beschrieben.

  17. T. Duyar sagt:

    Hallo,

    vielen Dank erstmal für das Schema.

    Ich würde gerne ein Diagramm als Linked Diagrammframe in ein anderes Diagramm verlinken (welches sich unter einem anderen Root Element befindet). Beim generieren eines Dokumentes bräuchte ich jedoch die Szenarien bzw. Detail Informationen dieser Diagramme, z.b. UseCase Diagramm.

    Wie greife ich auf die UseCase-Szenarien per SQL zu?

    Ich bedanke mich im Voraus.

  18. H.Kargl sagt:

    Hallo Duyar,

    verstehe ich das richtig, in einem Modell-Zweig befindet sich in einem Diagramm eine Diagramm-Referenz (Diagramm per Drag&Drop in ein anderes Diagramm als Referenz einfügen).

    Beim Generieren des Dokuments soll nun der Inhalt des Diagramms, welche mittels Diagramm-Referenz eingefügt wurde, ebenfalls im Dokument ausgegeben werden!?

    Dabei ist die erste Hürde, dass die Diagramm-Referenz ein eigenes Modell-Element ist und beim Generieren des Dokuments als solches behandelt wird.

    D.h. das Bild des Diagramms erhält man einfach im generierten Dokument, da es ja einem Diagramm als Bild sichtbar ist und dieses Diagramm beim Generieren des Dokuments ausgegeben werden kann.

    Um nun auf die Inhalte des Diagramms, das als Diagramm-Reference (oder Diagramm-Frame) verlinkt ist, zugreifen zu können, muss:

    * Das verlinkte Diagramm gefunden werden. Die Diagramm_ID des verlinkten Diagramms wird bei Modell-Element “Diagramm-Referenz” oder “Diagramm-Frame” als t_object.PDATA1 abgespeichert.

    * Anschließend müssen alle Diagramm-Objekte dieses Diagramms abgearbeitet werden. Der Zusammenhang ist oben im DB-Schema ersichtlich.

    Im RTFTemplate kann nun unter dem Tag ein Fragment-Template aufgerufen werden. In dem auf Elemente vom Typ UMLDiagram gefiltert wird. (Diagramm-Reference / Diagramm-Frame) haben intern den Typ UMLDiagram.

    Nun berücksichtigen wir in unserem Fragment-Template lediglich Diagramm-References/Frames. Nun müssen wir aber auf die Modell-Elemente in den referenzierten Diagrammen zugreifen können. Dies können wir zwar mit SQL erledigen, das wird aber sehr kompliziert und wenn nun auch die Szenarien von UseCases ausgegeben werden sollen, welche in diesem referenzierten Diagramm enthalten sind, tauchen sicher noch andere Fallstricke auf. Daher würde ich mit einem Script über das Fragment-Template diese Information holen.

    Aber zur Beantwortung der Frage, die Szenarien sind in der Tabelle t_objectscenarios gespeichert. Der Scenario Text in der Spalte t_objectscenarios.XMLContent.

2 Pings/Trackbacks für "Suchen und Finden 2: Enterprise Architect DB-Schema"
  1. […] über das generische Metamodell von Enterprise Architect. Der Kern des DB-Schemas wurde bereits hier beschrieben. Beim Modellieren ist man allerdings mit der konkreten Syntax der Modelle konfrontiert […]

  2. […] Sure, you have to know the structure of the EA database. The most interesting tables can be found here. […]