Massendatenverarbeitung -> Probleme im Select => Help

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
8 Beiträge • Seite 1 von 1
8 Beiträge Seite 1 von 1

Massendatenverarbeitung -> Probleme im Select => Help

Beitrag von hfahrian (ForumUser / 53 / 7 / 0 ) »
Hallo zusammen,
mein Ziel ist eine Massenverarbeitung mehrerer Tabellen im ISU zu realisieren. Die Tabellen sind aus dem Abrechnungsbereich und beinhalten zwischen 10 und 50 Millionen Datensätze.
Beispiel Tabelle ERCH(Abrechnungsbelege):
Je Datensatz möchte ich einen FUBA / Report aufrufen, den ich selber programmiert habe.
Erste Idee:
SELECT / ENDSELECT über die Tabelle und aufrufen des Reports/FUBAs in dieser Selectschleife. Problem: Sobald irgendein COMMIT auf die Datenbank erfolgt, kommt es zu einem Dump mit Hinweis, dass alle Steps innerhalb eines Select/Endselect Bereiches vor einem Commit abgeschlossen sein müßen (==> Grund: Der Datenbankzeiger geht verloren, und das obwohl nicht auf die Tabelle ein Commit erfolgt).:-(

Zweite Idee:
Lesen der Datensätze in eine interne Tabelle und nachfolgend die Verarbeitung auf Ebene eines Loop über die interne Tabelle. Das funktioniert alle soweit aber sobald ich auf das produktive System gehe und alle Datensätze in die ITAB hole kommt es ebenefalls zum Dump, da die ITAB natürlich zu groß wird :-(

Dritte Idee:
Ich reduziere die Datensatzanzahl der interne Tabelle und mache entsprechend viele Durchläufe, indem ich immer wieder ein Datenpaket aus der Datenbanktabelle lese, in die ITAB schreibe und dann diese ITAb verarbeite.
ABER: Wie mache ich so was am Besten? Derzeit merkle ich mir immer den "sy-dbcnt" am Ende eines Verarbeitungsblocks und im nachfolgenden Block Lese ich die Datenbanktabelle bis zum alten "sy-dbcnt", dann lese ich ab da wieder in die ITAB, merke mir wieder den "sy-dbcnt" usw. usw. .

Diese Lösung funktioniert zwar, :-) aber ich denke sie ist nicht so optimal. Daher meine Fragen:
Wie kann man eine derartige Massenverarbeitung am Besten realisieren oder gibt es eine Möglichkeit die Selektion einer Datenbanktabelle sinnvoll in einzelne Blöcke splitten?

Wenn jemand hier schon mal seine Erfahrungen gemacht hat un mir etwas helfen könnte wäre ich sehr dankbar!

Gruß, Henry :-) :-) :-)

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Beitrag von babap (Expert / 681 / 1 / 1 ) »
Hallo,

für die blockweise Bearbeitung von Massendaten aus Tabellen gibt es die Möglichkeit einen Datenbank-Curosr zu öffnen.

OPEN CURSOR ... (Syntax bitte in Hilfe nachsehen).

Der Cursor ist ein Datenfeld.
Dann liest man eine Portion (z.B. 1000) Sätze und verarbeitet diese (Select Endselect oder INTO ITAB ...).

Beim nächsten Zugriff auf die Tabelle bekommt man den nächsten Schwung Daten geliefert.


Rein fachlich scheint mir die Vorgehensweise, bei 10 bis 50 Millionen Datensätzen für jeden Datensatz einen Report oder einen FU-BA aufzurufen doch ziemlich aufwendig.

Hier würde mich mal die Anforderung interessieren: Was macht dein Programm oder Fu-BA mit dem Datensatz????
Vielleicht kannst Du ja mal was schreiben.

Gruß
babap

Beitrag von Asaph (Expert / 580 / 6 / 1 ) »
Hi Henry,

ich würde die Verarbeitung nach Organisationseinheiten durchführen.

Leider habe ich keinen Zugriff auf ein ISU-System.
Aber es gibt doch auch bestimmt in der Tabelle ERCH Org-einheiten (-am besten ein indiziertes Feld- Geschäftsbereich, Verkaufsorg., Werk,Buchungskreis, Abrechnungskreis oder Kostenrechnungskreis,...).

Für eine geeignete Org. (Bsp. gsber) würde ich alle Geschäftsbereiche in die Tabelle I_org stellen .

und folgendermaßen vorgehen:

sort i_org.

loop at i_org.

free itab.

select (benötigte Felder) into table itab
from erch
where gsber = i_org-gsber
...

...
*Verarbeitung.
loop at itab into wa.
...
endloop.

commit work.

endloop.

-> schreibe eine Protokollierung / Statistik / Fehlerbericht pro Org-einheit.
Bei einem Abbruch kannst du nach dem letzten verarb.
gsber wieder aufsetzen !


Gruß Andreas

Beitrag von Gast ( / / 0 / 3 ) »
Hallo Henry,

mein Lösungsvorschlag funktioniert nur, wenn die zu verarbeitenden Daten mit einem eindeutigen DB-Schlüssel abgreifbar sind. Dann könntest du blockweise arbeiten. Im folgenden Beispielcoding wird das anhand der MARA gezeigt.


DATA: itmara LIKE STANDARD TABLE OF mara.
DATA: wamara_lo LIKE LINE OF itmara.
DATA: wamara_hi LIKE LINE OF itmara.
DATA: from_matnr LIKE mara-matnr.

PARAMETERS: p_rows LIKE sy-dbcnt DEFAULT 10.
SELECT-OPTIONS: s_mtart FOR wamara_lo-mtart DEFAULT 'FERT'.

DO.
SELECT *
FROM mara
INTO TABLE itmara
UP TO p_rows ROWS
WHERE mtart IN s_mtart
AND matnr GT from_matnr
ORDER BY matnr.

IF sy-dbcnt EQ 0 . EXIT. ENDIF.

READ TABLE itmara INDEX 1 INTO wamara_lo.
READ TABLE itmara INDEX sy-tfill INTO wamara_hi.
WRITE: /01 sy-index, 'low =', wamara_lo-matnr,
'high =', wamara_hi-matnr.
MOVE wamara_hi-matnr TO from_matnr.

ENDDO.


mfg dele

Beitrag von Miri (ForumUser / 27 / 0 / 0 ) »
Hi,

ich hatte mal selbiges Problem, finde aber leider momentan den Report nicht.
Versuch es mal mit der F1 bei Package-Size.

L.G.
Miri

Beitrag von Miri (ForumUser / 27 / 0 / 0 ) »
Hi,

ich nochmal.

so funktioniert es:

DATA: i_bsid LIKE bsid OCCURS 0.
SELECT * FROM bsid INTO TABLE i_bsid PACKAGE SIZE 20.
ENDSELECT.

Hoffe das hilft weiter.

Grüße
Miri

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
Miri hat geschrieben:Hi,

ich nochmal.

so funktioniert es:

DATA: i_bsid LIKE bsid OCCURS 0.
SELECT * FROM bsid INTO TABLE i_bsid PACKAGE SIZE 20.
ENDSELECT.

Hoffe das hilft weiter.

Grüße
Miri
es wird in seinem Beispiel nicht reichen.

mit nachfolgendem Beispiel werden immer 1000 Einträge in die interne Tabelle geschrieben und dort per LOOP weiterverarbeitet.

Code: Alles auswählen.

  DATA:
    gt_erch TYPE TABLE OF erch,
    g_cursor TYPE cursor.

  FIELD-SYMBOLS:
    <gs_erch> LIKE LINE OF gt_erch.

  OPEN CURSOR g_cursor FOR
    SELECT *
      FROM erch.

  DO.
    FETCH NEXT CURSOR g_cursor 
      INTO TABLE gt_erch
      PACKAGE SIZE 1000.
    IF sy-subrc NE 0.
      CLOSE CURSOR g_cursor.
      EXIT.
    ENDIF.
    LOOP AT gt_erch ASSIGNING <gs_erch>.
* Verarbeitung
    ENDLOOP.
  ENDDO.
das grundsätzliche Problem, dass in seiner Verarbeitung Datenbankoperationen stattfinden, lässt sich nur umgehen, wenn man diese Operationen vom SELECT trennen kann und hinter die Selektion verlagert.
siehe dazu auch die Hilfe zu OPEN CURSOR, FETCH, ...INTO TABLE itab PACKAGE SIZE n...

Vielen Dank für die Hilfe

Beitrag von hfahrian (ForumUser / 53 / 7 / 0 ) »
Hallo zusammen,

danke für die umfangreiche Hilfe.
Ich werde versuchen mein Problem mit den Ideen zu lösen.

Da ich gefragt wurde, welche Anförderung dahintersteht nich ein paar Infos zur fachlichen Anförderung:

Ich bin dabei Lösungsansätze für ein von der SAP Workbench unabhängigen Migrationstool zu erarbeiten. Ähnlich der SAP SLO Technologie. Dieser Geschäftsbereich wird in Zukunft extrem viel Projektgeschäft bieten (Regulierung im Energieversorgerumfeld, Mandantentrennung, Buchungskreistrennung ect.).
Aus aktuellen Projekterfahrungen (zusammen mit SAP Beratern) ist klar geworden, daß diese Umsetzung nicht so komplex ist, wie immer behauptet und daher versuche ich Lösungsansätze hierfür zu erarbeiten.

Der Hauptumfang liegt dabei in:
Datenextrakt (selektiv)
Datenfeldumschlüsselung
Datenharmonisierung
Datenimport (Datensatzebene , direkt auf Tabellenebene)

Dies wird erfolgen:
Quellsystem(Mandant) ==> Extrakt in ein Zwischensystem ==> Umschlüsselung und Harmonisierung im Zwischensystem ==> Extrakt aus dem Zwischensystem und abschließend Datenimport in das Zielsystem /Mandant.

Also soweit die Infos,

Henry :shock: :lol:

Seite 1 von 1

Vergleichbare Themen

2
Antw.
2763
Views
Persistente Klasse für Massendatenverarbeitung
von eschi78 » 18.02.2015 16:56 • Verfasst in ABAP Objects®
2
Antw.
1488
Views
Probleme mit dem Select
von just » 18.01.2006 23:18 • Verfasst in Basis
1
Antw.
1165
Views
Probleme mit select * where (table)
von Flo » 05.12.2006 16:49 • Verfasst in ABAP® Core
6
Antw.
4264
Views
Probleme mit PARAMETER und SELECT
von Gast » 07.02.2006 18:45 • Verfasst in ABAP® Core
1
Antw.
1170
Views
Select mit Open Cursor macht Probleme
von Wess » 21.02.2019 12:47 • Verfasst in ABAP® für Anfänger

Aktuelle Forenbeiträge

Trennen Strasse und Hausnummer
vor 12 Stunden von msfox 18 / 11039
Dialog-Container mit Toolbar/Status
vor 15 Stunden von black_adept gelöst 27 / 4145
IT0024 Qualifikationen CP-ID
vor 17 Stunden von ArjenR 1 / 127

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Aktuelle Forenbeiträge

Trennen Strasse und Hausnummer
vor 12 Stunden von msfox 18 / 11039
Dialog-Container mit Toolbar/Status
vor 15 Stunden von black_adept gelöst 27 / 4145
IT0024 Qualifikationen CP-ID
vor 17 Stunden von ArjenR 1 / 127

Unbeantwortete Forenbeiträge

IT0024 Qualifikationen CP-ID
vor 17 Stunden von ArjenR 1 / 127
aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 3063
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 9658