Ansicht
Dokumentation

ABENCDS_CYCLE_PROBLEMS - CDS CYCLE PROBLEMS

ABENCDS_CYCLE_PROBLEMS - CDS CYCLE PROBLEMS

CPI1466 during Backup   SUBST_MERGE_LIST - merge external lists to one complete list with #if... logic for R3up  
Diese Dokumentation steht unter dem Copyright der SAP AG.
SAP E-Book

- Zyklische Abhängigkeiten

In den ABAP CDS können CDS-Entitäten mit gegenseitigen Abhängigkeiten definiert werden. Beispielsweise greift eine CDS-VIEW auf eine andere CDS-Entität als Datenquelle zu oder exponiert eine CDS-View in einer CDS-Assoziation. Eine CDS-Entität, die eine andere CDS-Entität verwendet, ist von der verwendeten Entität abhängig. Dabei sind zu unterscheiden:

  • technische Abhängigkeiten
CDS-Entitäten sind technisch voneinander abhängig, wenn auch die bei ihrer Aktivierung erzeugten Datenbank-Entitäten voneinander abhängig sind.
  • semantische Abhängigkeiten
CDS-Entitäten sind semantisch voneinander abhängig, wenn die Abhängigkeit durch Metadaten entsteht, die sich nicht in den erzeugten Datenbank-Entitäten widerspiegelt.

Eine zyklische Abhängigkeit bzw. ein Zyklus liegt vor, wenn eine von einer CDS-Entität ausgehende Verfolgung der Abhängigkeiten wieder zur gleichen CDS-Entität führt. Es können zwei Arten von zyklische Abhängigkeiten unterschieden werden:

  • Zyklus von technischen Abhängigkeiten
Nach einer Aktivierung der beteiligten Entitäten käme es aufgrund der technischen Abhängigkeiten auch zu einer zyklischen Abhängigkeit der generierten Datenbank-Entitäten. Eine zyklische Abhängigkeit von Entitäten kann auf Datenbank nicht ausgeprägt werden und eine Menge solcherart voneinander abhängiger Entitäten ist prinzipiell nicht aktivierbar. Beispiele:
  • CDS-Views in denen eine CDS-Entität als direkte Datenquelle verwendet wird, von der die CDS-View direkt oder indirekt abhängt. In der Regel sind solche CDS-Entitäten schon durch Syntaxfehler zu erkennen, da die darin verwendeten Entitäten nicht aktiv vorhanden sein können.

  • Eine CDS-View verwendet eine CDS-Assoziation einer anderen View in einem Pfadausdruck und bei der Verwandlung des Pfadausdrucks in einen Join-Ausdruck der Datenbank wird eine zyklische Abhängigkeit erkannt. In der Regel kommt es hierbei erst bei der Aktivierung zu einem Fehler.

  • Zyklus durch semantische Abhängigkeiten
Wenn ein Zyklus semantische Abhängigkeiten enthält und ein Weglassen der semantische Abhängigkeiten die zyklische Abhängigkeit aufheben würde, führt eine Aktivierung der beteiligten Entitäten nicht zu einer zyklischen Abhängigkeit zwischen den zugehörigen Datenbank-Entitäten. Dieser Fall kann vorliegen, wenn CDS-Views zwar über CDS-Assoziationen miteinander verknüpft sind, aber nicht alle CDS-Assoziationen durch die Verwendung von Pfadausdrücken ausgeprägt werden. Eine Menge solcherart voneinander abhängiger Entitäten ist prinzipiell aktivierbar.

Eine Menge von CDS-Entitäten, für die ein semantischer Zyklus vorliegt, kann nicht in einem Schritt aktiviert werden:

  • Bei einer Massenaktivierung wird versucht, eine solche Menge so weit wie möglich in Teilschritten zu aktivieren, wobei erst eine Aktivierung unter Weglassung der semantischen Beziehungen und danach eine Aktivierung inklusive der semantischen Beziehungen durchgeführt wird. Dies funktioniert derzeit noch nicht vollständig.
  • Wenn die automatische Auflösung einer semantischen zyklischen Abhängigkeit durch schrittweise Aktivierung nicht möglich ist, liegt ein Zyklenproblem vor, das nur durch manuelle Eingriffe in die Aktivierung gelöst werden kann. Dabei müssten CDS-Quelltexte vor einzelnen Aktivierungsschritte manuell geändert werden, um störende semantische Abhängigkeiten temporär aufzuheben.

Bei der manuellen Lösung eines Zyklenproblems in einem System ist zu beachten, dass nach einem Transport zyklisch voneinander abhängiger CDS-Entitäten die gleichen Probleme im Zielsystem wieder auftreten werden, so dass aufeinander folgende Transporte von Teilmengen nötig werden. Wenn dies nicht möglich ist, d.h. wenn Zyklenprobleme auch manuell nicht gelöst werden können, müssen die betreffenden zyklischen Abhängigkeiten aus dem Datenmodell entfernt werden. Beispielsweise kann die Verwendung von CDS-Assoziationen durch explizite Join-Ausdrücke ersetzt werden, die dann nur dort für Abhängigkeiten führen, wo es sie auch tatsächlich gibt.

Hinweise

  • Um Probleme bei der Aktivierung zu vermeiden, sollten zyklische Abhängigkeiten möglichst vermieden werden, auch wenn die beteiligten CDS-Entitäten prinzipiell aktivierbar wären. Das Datenmodell sollte einen hierarchischen Blick auf die Daten zulassen, der zyklische Abhängigkeiten, selbst wenn sie nicht auf der Datenbank ausgeprägt werden, unnötig macht.
  • Die vollständige Auflösung semantischer zyklischer Abhängigkeiten durch schrittweise Aktivierung bei der Massenaktivierung von CDS-Entitäten ist in Entwicklung und für ein zukünftiges Release vorgesehen.
  • Dictionary-Objekte können zwar nicht technisch, aber semantisch voneinander abhängig sein. Beispielsweise können DDIC-Tabellen-Views keine anderen Views als Datenquellen enthalten. Semantische Bezüge sind aber beispielsweise durch Fremdschlüsselbeziehungen oder Wertetabellen möglich. Bei der Massenaktivierung von Dictionary-Objekten werden semantische zyklische Abhängigkeiten bereits vollständig durch die schrittweise Aktivierung aufgelöst.

Beispiel

Die folgenden mit CDS-verwalteten DDIC-Views verknüpften CDS-Views verwenden sich gegenseitig als Datenquellen und bilden damit einen technischen Zyklus. Jede der Views ist syntaktisch falsch und kann nicht aktiviert werden, solange die andere View nicht aktiv vorhanden ist. Man könnte nun versuchen, in einer View die Abhängigkeit von der anderen View zu entfernen und beide Views zu aktivieren. Wenn danach die Abhängigkeit wieder eingeführt wird, ist die View zwar syntaktisch korrekt, kann aber dennoch nicht aktiviert werden, da die zugehörigen CDS-verwalteten DDIC-Views nicht zyklisch abhängig sein dürfen.

@AbapCatalog.sqlViewName: 'TEST1'
define view test_view1 as
       select from
       test_view2
       { * }

@AbapCatalog.sqlViewName: 'TEST2'
define view test_view2 as
          select from
          test_view1
          { * }

Beispiel

Die zyklische Abhängigkeit der folgenden Views entsteht durch CDS-Assoziationen und ist semantisch bedingt.

  • Die View test_view1 definiert und exponiert eine CDS-Assoziation _assoc1 auf die View test_view2.
  • Die View test_view2 definiert und exponiert eine CDS-Assoziation _assoc2 auf die View test_view3.
  • Die View test_view3 verwendet test_view1 als Datenquelle und verwendet deren CDS-Assoziation _assoc1 in einer Pfadangabe.

Damit hängt test_view1 über test_view2 von test_view3 und diese wiederum von test_view1 ab. Da es in den Views aber keine Pfadausdrücke gibt, welche die Abhängigkeiten zwischen test_view1 und test_view2 und zwischen test_view2 und test_view3 als Join-Ausdrücke auf der Datenbank ausprägen, liegt kein technischer Zyklus vor und sie sind prinzipiell aktivierbar. Eine Massenaktivierung alle Views ist derzeit aber noch nicht möglich. Eine solche Situation tritt in der Regel nicht während der Entwicklung, sondern erst nach einem Transport in ein Zielsystem auf. Eine Aktivierung ist in diesem Fall nur manuell möglich, indem die Abhängigkeit der View test_view3 von test_view2 durch temporäres Löschen der CDS-Assoziation _assoc2 in test_view2 aufgehoben und nach dem Aktivieren der drei Views wieder eingeführt wird. Dies müsste dann in jedem Zielsystem eines Transports durchgeführt werden.

@AbapCatalog.sqlViewName: 'TEST1'
define view test_view1 as
       select from
       table1
       association to test_view2 as _assoc1
                      on table1.field =  _assoc1.field
       { _assoc1,
         field }

@AbapCatalog.sqlViewName: 'TEST2'
define view test_view2 as
       select from
       table2
       association to test_view3 as _assoc2
                      on table2.field =  _assoc2.field
       { _assoc2,
         field }

@AbapCatalog.sqlViewName: 'TEST3'
define view test_view3 as
       select from
       test_view1
       { _assoc1.field }






CL_GUI_FRONTEND_SERVICES - Frontend Services   CPI1466 during Backup  
Diese Dokumentation steht unter dem Copyright der SAP AG.

Length: 12764 Date: 20240523 Time: 154706     sap01-206 ( 201 ms )