Modell-Suche in Package-Branch

Das Modell-Repositorium von Enterprise Architect ist eine Datenbank. Datenbanken können einfach mit SQL durchsucht werden. Damit ergeben sich eine Fülle an Möglichkeiten. Ein kleines Problem dabei sind Rekursionen! Siehe diesen Blog-Artikel.
Die Struktur im ProjectBrowser – dem Modell-Baum – entspricht einer ParentID, welche in der Zeile des Child gespeichert ist. Um hier nun eine rekursive Abfrage zu erstellen, brauchen wir rekursives SQL, was einige Datenbanken unterstützen.

Beispiel für rekursives SQL im MSSQL Server:

GO
WITH MyCTE( Object_ID, Name) AS
  SELECT t_object.Object_ID, t_object.Name
  FROM t_object
  WHERE t_object.Name = 'HorstKargl'
UNION ALL
  SELECT A.Object_ID, A.Name
  FROM t_object A INNER JOIN MyCTE B
  ON B.Object_ID = A.ParentID
)

SELECT
*
FROM MyCTE

 

Aus einer EA Modell-Suche kann leider kein rekursives SQL aufgerufen werden. Schade. Es gibt aber Abhilfe!

Der EA bietet einige Schlüsselwörter, welche bei einer Modell-Suche, bevor diese ausgeführt wird, ersetzt werden. Mit dem Schlüsselwort:

  • #Author#
  • #Branch#:  Gets the IDs of the child Packages of the currently-selected Package, working recursively down to the lowest level of sub-Package. For example: t_object.Package_ID IN (#Branch#)
  • #Concat value1, value2 …#
  • #Datepart , column#
  • #CurentElementGUID#
  • #CurrentElementID#
  • #DB=#
  • #Now#
  • #Package#
  • #UserName#
  • #WC#. Gets the appropriate wild card for the current database, so the search can be performed on models on different databases. 

Damit können wir:

  1. Möglichst DB uns SQL Syntax unabhängige Abfragen erstellen.
  2. Speziell mit #Branch# einen speziellen Paket-Zweig durchsuchen.

Jedes Modell-Element speichert die ID des Paketes in dem es liegt. Die t_object.Package_ID ist also das Parent in dem das Modell-Element liegt. Verwenden wir das Schlüsselwort #Branch# werden die PackageIds des aktuell im Project Browser selektierten Paketes berechnet und zurückgeliefert. 

Die SQL Abfrage:

SELECT * FROM t_object WHERE t_object.Package_ID IN (#Branch#) AND t_object.Status = 'Proposed'

liefert also alle Modell-Element mit Status 'Proposed', welche in dem gerade selektierten Paket im Project Browser enthalten sind.

Mit folgender Abfrage können wir ein Model-Chart im EA befüllen und uns nur auf einen bestimmten Modell-Zweig beschränken:

SELECT t_object.Status AS GroupName, t_object.Author AS Series FROM t_object WHERE t_object.Package_ID IN (#Branch#)

Als Ergebnis erhalten wir folgende Charts, abhängig was im Project Browser gerade selektiert ist. Auch wenn kein Paket selektiert ist, wird die Package_ID des Paketes herangezogen, in dem sich das selektierte Modell-Element oder Diagramm gerade befindet:

 

Das Wild-Card #Branch# gibt es auch in drei Permutationen:

  • #Branch#: Liefert alle IDs der Sub-Pakete des gerade selektierten Paketes im Project Browser.
  • #Branch=<GUID># oder #Branch=<ID>#: Liefert alle IDs der Sub-Pakete des Paketes mit der angegebenen GUID. Die GUID mit geschwungenen Klammern angeben!  
    Zum Beispiel: #Branch={97C2EAE0-3C4D-4d0d-94DD-E7719B6119A2}#
  • #Branch=<ID>, <ID>,<ID> #: Liefert alle IDs aller Sub-Pakete alle Pakete mit der angegebenen Package-ID. 

 

 

Veröffentlicht unter Modell-Suche
Schlagworte: