DCC - RWB - Monitor - dynamische Findung der Indikatorengruppe zum Material - Filter-Optimierung Symthom: Sehr viele Indikatorengruppen mit mehreren Indikatoren führen zum Überlauf in der dynamischen Zuweisung der Datenreferenzen. Die maximale Größe des zur Verfügung stehenden Speichers wird überschritten. Es werden Laufzeitfehler erzeugt: "SYSTEM_NO_MEMORY" "CL_ABAP_TABLEDESCR============CP" bzw. CL_ABAP_TABLEDESCR============CM006 "CREATE_XTYP_FROM_ITAB_DESC" "SYSTEM_NO_ROLL" "????????????????????????????????????????" bzw. " " Einhergehend damit ist auch eine spürbare Verschlechterung der Performance zu verzeichnen, da das System mit dem Allokieren von weiterem Speicherplatz beschäftigt ist. Verarbeitungslogik der Findung: Die dynamische Findung der Filterkriterien basiert auf den Einträgen der Tabelle /GIB/DCC_BR005 (Regelwerk - Ausprägung Indikatoren der Findungsstufe). Pro Findungsstufe (Indikatorengruppe) und pro Filterkriterium (Tabelle, Feld) wird die dynamische Zuordnung durchgeführt. Das Ergebnis ist eine RANGE-Tabelle, mit der dann die Datenermittlung stattfinden kann. Die dynamische Findung der Filter-Kriterien erfolgt mittels der Klasse CL_ABAP_DATADESCR Klasse: CL_ABAP_TYPEDESCR Methode: DESCRIBE_BY_NAME Beschreibung des Typs über relativen/absoluten Namen Klasse: CL_ABAP_STRUCTDESCR Methode: CREATE Factory-Methode zur Strukturtyperzeugung ohne Reuse Klasse: CL_ABAP_TABLEDESCR Methode: CREATE Factory-Methode zur Tabellentyperzeugung ohne Reuse Hier wird pro Filterkriterium eine Datenreferenz ermittelt und fortgeschrieben. Das Ergebnis (die Daten-Referenzen) wird in der globalen Tabelle ADMIN_TAB der Klasse hinterlegt. Die Methode CL_ABAP_TYPEDESCR-->DESCRIBE_BY_NAME schreibt nur dann einen neuen Satz in die Tabelle ADMIN_TAB, wenn eine neue Referenz erkannt wird. Anders verhält es sich bei bei den Methoden CL_ABAP_STRUCTDESCR-->CREATE und CL_ABAP_TABLEDESCR-->CREATE: Hier wird für jedes Filterkriterium (Tabelle, Feldname) eine neue Referenz in die Tabelle ADMIN_TAB geschrieben (Struktur: Methode CREATE_XTYP_FROM_STRUC_DESC, Tabelle: Methode CREATE_XTYP_FROM_ITAB_DESC), unabhängig davon, ob das Kriterium bereits einmal im Zugriff war. Die Tabelle ADMIN_TAB kann nicht von außen initialisiert werden. Sie bleibt während des gesamten Prozesses (LUW) erhalten. Die LUW wird in der Verarbeitungslogik nicht unterbrochen, deshalb wird diese Tabelle immer größer und erzeugt dann auch den o.g. Speicherüberlauf. Lösung: In der Klasse /GIB/DCC_BR_PROCESS wird eine interne globale Tabelle mit den Datenreferenzen zum Filter (Tabelle, Feld) erstellt. Diese Tabelle enthält jede Datenreferenz zum Filter nur einmal. Bevor eine neue Referenz angefordert wird, wird nun zunächst geprüft, ob sie bereits in der Tabelle vorhanden ist. Wenn ja, wird sie aus dieser Tabelle geholt, wenn nein, wird die Datenreferenz neu erstellt (siehe o.g. Methoden CL_ABAP_STRUCTDESCR-->CREATE und CL_ABAP_TABLEDESCR-->CREATE) und in die Tabelle geschrieben. Das heißt, jedes Filterkriterium kommt jetzt auch nur noch einmal in der Tabelle ADMIN_TAB vor.
.
Vorabkorrektur M37K900150 erstellt
Vorabkorrektur M27K901838 erstellt
Klasse: /GIB/CL_DCC_BR_PROCESS Methode: CHECK_FILTER_DATA Attribut: GT_ADMIN_TAB (globale Tabelle der Datenreferenzen) interner Typ: TS_ADMIN_TAB TT_ADMIN_TAB