Code: Alles auswählen.
METHOD GENERATE_IT9001_RECORDS.
* RETURNING VALUE(IT9001_RECORDS)
* Geht durch die interne Tabelle M und baut aus deren Untertabellen M-IT9001 die final in die Datenbank zu schreibenden
* Datensätze auf. Vorher wird noch als Optimierung geprüft, ob es vom Zeitraum her unmittelbar aneinandergrenzende
* Zeiträume gleichen Inhalts gibt. Wenn ja, dann werden diese zu einem großen Zeitraum fusioniert.
DATA: LETZTE_PERNR TYPE PERSNO,
LETZTES_ENDDA TYPE D,
LETZTE_NUTZDATEN TYPE PS9001,
AKTUELLE_NUTZDATEN TYPE PS9001.
LOOP AT M ASSIGNING FIELD-SYMBOL(<M>).
INSERT LINES OF <M>-IT9001 INTO TABLE IT9001_RECORDS.
ENDLOOP.
* Aneinandergrenzende Zeiträume gleichen Inhalts fusionieren.
LOOP AT IT9001_RECORDS ASSIGNING FIELD-SYMBOL(<IT9001_RECORDS>).
IF <IT9001_RECORDS>-PERNR <> LETZTE_PERNR. " andere Personalnummer -> nicht fusionieren
LETZTE_PERNR = <IT9001_RECORDS>-PERNR.
LETZTES_ENDDA = <IT9001_RECORDS>-ENDDA.
MOVE-CORRESPONDING <IT9001_RECORDS> TO LETZTE_NUTZDATEN.
CONTINUE. " LOOP
ELSEIF <IT9001_RECORDS>-BEGDA - 1 <> CONV I( LETZTES_ENDDA ). " Zeiträume grenzen nicht aneinander -> nicht fusionieren.
LETZTES_ENDDA = <IT9001_RECORDS>-ENDDA.
MOVE-CORRESPONDING <IT9001_RECORDS> TO LETZTE_NUTZDATEN.
CONTINUE. " LOOP
ENDIF.
* Wenn wir hier ankommen, dann grenzt der aktuelle Datensatz zeitlich an den vorhergehenden an und gehört auch zu derselben
* Personalnummer. Jetzt müssen wir nur noch prüfen, ob auch die Nutzdaten (also die Nichtheaderdaten) identisch sind.
MOVE-CORRESPONDING <IT9001_RECORDS> TO AKTUELLE_NUTZDATEN.
IF LETZTE_NUTZDATEN <> AKTUELLE_NUTZDATEN. " Nutzdaten stimmen nicht überein
LETZTES_ENDDA = <IT9001_RECORDS>-ENDDA.
LETZTE_NUTZDATEN = AKTUELLE_NUTZDATEN.
CONTINUE. " LOOP
ENDIF.
* Alles passt: Aktuellen Datensatz mit vorangegangenem fusionieren!
ASSIGN IT9001_RECORDS{ SY-TABIX - 1 }-ENDDA TO FIELD-SYMBOL(<ENDDATUM_DES_VORIGEN_SATZES>).
<ENDDATUM_DES_VORIGEN_SATZES> = <IT9001_RECORDS>-ENDDA.
DELETE IT9001_RECORDS.
ENDLOOP.
ENDMETHOD.