Bug 7319

Summary: DCC - RWB - Monitor - dynamische Findung der Indikatorengruppe zum Material - Filter-Optimierung
Product: [SCX/Suite] Controlling Reporter: cbr
Component: RWBAssignee: cbr
Status: RESOLVED FIXED QA Contact: Lenz, Florian <florian.lenz>
Severity: enhancement    
Priority: P5 CC: Felix.Grab, Marc.Bertelmann
Version: 6.0 SP3Keywords: Lupus, Monoceros, Vorabkorrektur
Hardware: All   
OS: All   
Whiteboard:
Kundennummer: Bestellnummer:
PV Übergabe: --- Phase Roadmap: ---
Erledigt mit: Monoceros SAP Release: ---
Transport: M27K901838;M37K900150 CRM-ID/Ticket:
Bug Depends on:    
Bug Blocks: 7030    

Description cbr 2017-03-22 15:01:34 CET
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.
Comment 4 cbr 2017-07-29 21:19:06 CEST
.
Comment 3 cbr 2017-06-30 14:35:14 CEST
Vorabkorrektur M37K900150 erstellt
Comment 2 cbr 2017-03-22 21:48:08 CET
Vorabkorrektur M27K901838 erstellt
Comment 1 cbr 2017-03-22 15:04:53 CET
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