Voraussetzung hierbei ist natürlich, dass die Anzahl (und Verwendung) der vorkommenden verschiedenen Zeitarten klar definiert ist....ob es nicht besser wäre, die Tabelle erstmal in eine Kennzahlenform zu mappen und die Berechnungen über direkt adressierbare Felder je Datensatz durchführen zu können.
..schüssel der Tabelle ist PERNR (hatte mich vertan) und der Kalendertag -> Schüssel ist nicht eindeutig, jedoch kommt jede Zeitart pro Tag nur einmal mit.Schlüssel der internen Tabelle ist Z_EMPLOYEE Z_DATE ZEITART. (Ist der Schlüssel eigentlich eindeutig, oder könnte ein Mitarbeiter an einem Tag z.B. auch zwei Sätze mit Zeitart Z1 haben?)
...genau so in etwas ist es gedacht. Abgelegt werden die modifizierten Datensätze in einer neuen Tabelle bzw. dem Ziel der Transformation im BW.Für jeden Mitarbeiter Z_EMPLOYEE und jeden Tag Z_DATE soll die Z_STUNDEN-Zahl von Z1 von Z3 abgezogen und die von Z2 zu Z3 addiert werden. Wo soll das Ergebnis abgelegt werden? Soll einfach der Wert von Z3 in der Tabelle verändert werden?
Code: Alles auswählen.
<SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_HR_BW_ROUT_END_ZREPTT->GET_WORKING_HOURS
* +-------------------------------------------------------------------------------------------------+
* | [<-->] CS_DATA TYPE _TY_S_TG_1
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD get_working_hours.
TYPES: BEGIN OF ty_lt_pt2,
/bic/zgp_im01 TYPE /bic/oizgp_im01,
calday TYPE /bi0/oicalday,
/bic/zreptt TYPE /bic/oizreptt,
dur_actual TYPE /bi0/oidur_actual,
END OF ty_lt_pt2.
DATA: lt_pt2 TYPE TABLE OF ty_lt_pt2.
IF lt_pt2 IS INITIAL.
SELECT /bic/zgp_im01, calday, /bic/zreptt, dur_actual
FROM /bic/lt_pt_2
WHERE /bic/zreptt = 'Z0000002' OR /bic/zreptt = 'Z0000012'
INTO TABLE @lt_pt2 .
ENDIF.
IF cs_data-/bic/zreptt = 'Z0000015'.
LOOP AT lt_pt2 ASSIGNING FIELD-SYMBOL(<fs_pt2>).
IF line_exists( lt_pt2[ /bic/zgp_im01 = cs_data-/bic/zgp_im01
calday = cs_data-calday
/bic/zreptt = 'Z0000002' ] ).
ADD <fs_pt2>-dur_actual TO cs_data-dur_actual.
ENDIF.
ENDLOOP.
ENDIF.
...so hab ich´s jetzt auch erstmal gebaut, würde aber gern, da die Datensätze ja schon in Kontenform aus der Quelle kommen, den "zusätzlichen" Schritt umgehen.Aus Gründen der Übersichtlichkeit und der einfacheren Weiterverarbeitkeit (eben für Berechnungen und auch zur zeilenweise Ausgabe bspw. in einem ALV) würde ich genauso vorgehen:
Code: Alles auswählen.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Static Public Method ZCL_ROUT_END_ZREPTT=>CLASS_CONSTRUCTOR
* +-------------------------------------------------------------------------------------------------+
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD class_constructor.
SELECT /bic/zgp_im01, calday, /bic/zreptt, dur_actual
FROM /bic/azgp_io1400
INTO CORRESPONDING FIELDS OF TABLE @st_pt2.
ENDMETHOD.
<SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCL_ROUT_END_ZREPTT->GET_WORKING_HOURS
* +-------------------------------------------------------------------------------------------------+
* | [<-->] CS_DATA TYPE _TY_S_TG_1
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD get_working_hours.
IF cs_data-/bic/zreptt = 'Z0000015'.
READ TABLE st_pt2 WITH TABLE KEY
/bic/zgp_im01 = cs_data-/bic/zgp_im01
calday = cs_data-calday
/bic/zreptt = 'Z0000002'
ASSIGNING FIELD-SYMBOL(<fs_pt2_z0000002>) .
IF sy-subrc = 0.
ADD <fs_pt2_z0000002>-dur_actual TO cs_data-dur_actual.
ENDIF.
READ TABLE st_pt2 WITH TABLE KEY
/bic/zgp_im01 = cs_data-/bic/zgp_im01
calday = cs_data-calday
/bic/zreptt = 'Z0000012' ASSIGNING FIELD-SYMBOL(<fs_pt2_z0000012>).
IF sy-subrc = 0.
SUBTRACT <fs_pt2_z0000012>-dur_actual FROM cs_data-dur_actual.
ENDIF.
ENDIF.
lv_refdate = cs_data-calday.
lv_empl = cs_data-/bic/zgp_im01.
ENDMETHOD.
Code: Alles auswählen.
lv_refdate = cs_data-calday.
lv_empl = cs_data-/bic/zgp_im01.