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#) WHERE 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:

 

Aktuell ist es leider nicht möglich eine bestimmtes Paket als Wurzel festzulegen!
#Branch={PACKAGE_GUID}# ist also aktuell nicht möglich.

Daher können wir noch kein Dashboard erstellen in dem wir Ergebnisse aus unterschiedlichen Paket-Zweigen zeigen.
Ein Workaround ist, die Liste der Package_IDs manuell zu erstellen und in der SQL Abfrage zu verwende.
Wird die Modell-Struktur umgebaut, müssen wir dann allerdings auch die Abfrage anpassen.

Mittels Script oder Add-In könnten wir uns hier Abhilfe schaffen und selbst die Liste der IDs berechnen. Damit hätten wir 
sogar noch mehr Möglichkeiten!

Veröffentlicht unter Modell-Suche
Schlagworte: