Code: Alles auswählen.
TYPE-POOLS slis.
TABLES: lfa1, bseg, bkpf, bsik, bsak, zdlkz_t.
DATA: BEGIN OF itab_sumla OCCURS 10,
lifnr LIKE lfa1-lifnr,
land1 LIKE lfa1-land1,
diekz LIKE bsak-diekz,
belnr LIKE bsak-belnr,
zuonr LIKE bsak-zuonr,
blart LIKE bsak-blart,
bukrs LIKE bsak-bukrs,
monat LIKE bsak-monat,
gjahr LIKE bsak-gjahr,
shkzg LIKE bsak-shkzg,
bschl LIKE bsak-bschl,
dmbtr LIKE bsak-dmbtr,
wrbtr LIKE bsak-wrbtr,
zdlkz LIKE zdlkz_t-zdlkz,
bezeichnung LIKE zdlkz_t-bezeichnung,
soha TYPE p DECIMALS 2,
soll TYPE p DECIMALS 2,
haben TYPE p DECIMALS 2,
zahler TYPE i,
END OF itab_sumla.
* Zweite interne Tabelle für "READ" - Spalten Vergleich
DATA: BEGIN OF itab_zdlkz_t OCCURS 10,
zdlkz LIKE zdlkz_t-zdlkz,
bezeichnung LIKE zdlkz_t-bezeichnung,
END OF itab_zdlkz_t.
DATA: wa_soha LIKE LINE OF itab_sumla,
wa_zdlkz LIKE LINE OF itab_zdlkz_t.
* zum sy-subrc Auswerten der beiden JOINS
DATA: lv_subrc TYPE sy-subrc.
DATA: my_fieldcat TYPE slis_t_fieldcat_alv,
wa_layout TYPE slis_layout_alv,
wa_fieldcat LIKE LINE OF my_fieldcat,
repid TYPE sy-repid.
SELECT-OPTIONS: so_land FOR lfa1-land1,
so_perio FOR bkpf-monat.
PARAMETERS pa_gj LIKE bseg-gjahr.
SELECT-OPTIONS: so_dlkz FOR zdlkz_t-zdlkz.
* damit die Selektion Geschäftsjahr funktioniert
RANGES: range FOR bseg-gjahr.
IF NOT pa_gj IS INITIAL.
range-sign = 'I'.
range-option = 'EQ'.
range-low = pa_gj.
APPEND range.
ELSE.
REFRESH range.
ENDIF.
START-OF-SELECTION.
*##################
* GUI-Titel anlegen
SET TITLEBAR 'T_SOHA'.
SELECT zdlkz bezeichnung
FROM zdlkz_t INTO CORRESPONDING FIELDS OF TABLE itab_zdlkz_t
WHERE zdlkz IN so_dlkz.
IF sy-subrc <> 0.
MESSAGE i114(gu) WITH 'DlKz' so_dlkz.
* Falsche Werteingabe (Pos.DlKz --> so_dlkz)
EXIT.
ENDIF.
SELECT a~lifnr a~land1 b~diekz b~belnr b~zuonr b~blart b~bukrs b~monat
b~gjahr b~shkzg b~bschl b~dmbtr b~wrbtr
INTO CORRESPONDING FIELDS OF TABLE itab_sumla
FROM ( lfa1 AS a
INNER JOIN bsak AS b
ON a~lifnr = b~lifnr )
WHERE bukrs IN ('1001')
AND blart IN ('A1', 'A2', 'A3')
AND land1 IN so_land
AND gjahr IN range
AND monat IN so_perio.
IF sy-subrc <> 0.
lv_subrc = sy-subrc.
ENDIF.
SELECT a~lifnr a~land1 b~diekz b~belnr b~zuonr b~blart b~bukrs b~monat
b~gjahr b~shkzg b~bschl b~dmbtr b~wrbtr
APPENDING CORRESPONDING FIELDS OF TABLE itab_sumla
FROM ( lfa1 AS a
INNER JOIN bsik AS b
ON a~lifnr = b~lifnr )
WHERE bukrs IN ('1001')
AND blart IN ('A1', 'A2', 'A3')
AND land1 IN so_land
AND gjahr IN range
AND monat IN so_perio.
IF sy-subrc <> 0 OR lv_subrc <> 0.
MESSAGE i819(3f).
* Keine Daten im gewählten Zeitraum vorhanden / EXIT, weil Message
* Typ i sonst Daten zeigen würde, die in einen der Select´s wären !!!
EXIT.
ENDIF.
* wa_soha-.... weil durch DATA Deklaration wa_soha
LOOP AT itab_sumla INTO wa_soha.
IF wa_soha-shkzg = 'H'.
wa_soha-haben = wa_soha-dmbtr.
ELSE.
wa_soha-soll = wa_soha-dmbtr.
ENDIF.
wa_soha-soha = wa_soha-haben - wa_soha-soll.
* Spalten Vergleich
IF wa_soha-zuonr = space.
wa_soha-zdlkz = space.
ELSE.
READ TABLE itab_zdlkz_t INTO wa_zdlkz WITH KEY zdlkz =
wa_soha-zuonr.
IF sy-subrc = 0.
wa_soha-zdlkz = wa_zdlkz-zdlkz.
wa_soha-bezeichnung = wa_zdlkz-bezeichnung.
ENDIF.
ENDIF.
* Zähler für keine Einträge in DlKz
IF wa_soha-zdlkz = space.
wa_soha-zahler = 1.
ELSE.
wa_soha-zahler = 0.
ENDIF.
MODIFY itab_sumla FROM wa_soha TRANSPORTING soll haben soha zahler
zdlkz bezeichnung.
ENDLOOP.
IF wa_zdlkz-zdlkz = space.
MESSAGE i819(3f).
* Keine Daten im gewählten Zeitraum vorhanden / EXIT, weil Message
* Typ i sonst Daten zeigen würde, die in einen der Select´s wären !!!
EXIT.
ENDIF.
Der Delete löscht die aktuelle Zeile deiner Itab wo du mit dem LOOP gerade bist.robin1at hat geschrieben:Hallo Death!
Danke für Deine Hilfe!
Was macht der Delete denn dann?
Was wird dann gelöscht?
Danke
Robin
Code: Alles auswählen.
REPORT zsumla.
TYPE-POOLS slis.
TABLES: lfa1, bseg, bkpf, bsik, bsak, zdlkz_t.
DATA: BEGIN OF itab_sumla OCCURS 10,
lifnr LIKE lfa1-lifnr,
land1 LIKE lfa1-land1,
diekz LIKE bseg-diekz,
belnr LIKE bseg-belnr,
zuonr LIKE bseg-zuonr,
blart LIKE bkpf-blart,
bukrs LIKE bseg-bukrs,
monat LIKE bkpf-monat,
gjahr LIKE bseg-gjahr,
shkzg LIKE bseg-shkzg,
bschl LIKE bseg-bschl,
dmbtr LIKE bseg-dmbtr,
wrbtr LIKE bseg-wrbtr,
zdlkz LIKE zdlkz_t-zdlkz,
bezeichnung LIKE zdlkz_t-bezeichnung,
soha TYPE p DECIMALS 2,
soll TYPE p DECIMALS 2,
haben TYPE p DECIMALS 2,
zahler TYPE i,
END OF itab_sumla.
* Zweite interne Tabelle für "READ" - Spalten Vergleich
DATA: BEGIN OF itab_zdlkz_t OCCURS 10,
zdlkz LIKE zdlkz_t-zdlkz,
bezeichnung LIKE zdlkz_t-bezeichnung,
END OF itab_zdlkz_t.
DATA: wa_soha LIKE LINE OF itab_sumla,
wa_zdlkz LIKE LINE OF itab_zdlkz_t.
DATA: itab_lfa1 TYPE TABLE OF lfa1,
itab_bseg TYPE TABLE OF bseg,
itab_bkpf TYPE TABLE OF bkpf.
DATA: wa_lfa1 LIKE LINE OF itab_lfa1,
wa_bseg LIKE LINE OF itab_bseg,
wa_bkpf LIKE LINE OF itab_bkpf.
DATA: my_fieldcat TYPE slis_t_fieldcat_alv,
wa_layout TYPE slis_layout_alv,
wa_fieldcat LIKE LINE OF my_fieldcat,
repid TYPE sy-repid.
SELECT-OPTIONS: so_land FOR lfa1-land1,
so_perio FOR bkpf-monat.
PARAMETERS pa_gj LIKE bseg-gjahr.
SELECT-OPTIONS: so_dlkz FOR zdlkz_t-zdlkz.
START-OF-SELECTION.
*##################
* GUI-Titel anlegen
SET TITLEBAR 'T_SOHA'.
SELECT land1 lifnr
INTO wa_lfa1 FROM lfa1
WHERE land1 IN so_land.
APPEND wa_lfa1 TO itab_sumla.
SELECT diekz belnr zuonr bukrs gjahr shkzg bschl dmbtr wrbtr
INTO wa_bseg FROM bseg
WHERE bukrs IN ('1001')
and gjahr = pa_gj.
APPEND wa_bseg TO itab_sumla.
SELECT blart monat gjahr
INTO wa_bkpf FROM bkpf
WHERE blart IN ('A1', 'A2', 'A3')
AND monat IN so_perio.
APPEND wa_bkpf TO itab_sumla.
SELECT zdlkz bezeichnung
INTO wa_zdlkz FROM zdlkz_t
WHERE zdlkz IN so_dlkz.
APPEND wa_zdlkz TO itab_zdlkz_t.
ENDSELECT.
ENDSELECT.
ENDSELECT.
ENDSELECT.
IF sy-subrc <> 0.
MESSAGE i819(3f).
* Keine Daten im gewählten Zeitraum vorhanden / EXIT, weil Message
* Typ i sonst Daten zeigen würde, die in einen der Select´s wären !!!
EXIT.
ENDIF.
Code: Alles auswählen.
IF sy-subrc <> 0 UND lv_subrc <> 0. "logisches UND, dass beide Abfrage keinen Erfolg hatten
MESSAGE i819(3f).
* Keine Daten im gewählten Zeitraum vorhanden / EXIT, weil Message
* Typ i sonst Daten zeigen würde, die in einen der Select´s wären !!!
EXIT.
ENDIF.
Code: Alles auswählen.
IF LINES( itab_sumla ) EQ 0.
IF itab_sumla[] IS NOT INITIAL. "bzw. IF NOT itab_sumla[] IS INITIAL.
DESCRIBE TABLE itab_sumla LINES var_ln_cnt.
IF var_ln_cnt EQ 0.
Code: Alles auswählen.
IF sy-subrc <> 0 OR lv_subrc <> 0.
MESSAGE i819(3f).
* Keine Daten im gewählten Zeitraum vorhanden
EXIT.
ENDIF.
Code: Alles auswählen.
IF sy-subrc <> 0 AND lv_subrc <> 0.
MESSAGE i819(3f).
* Keine Daten im gewählten Zeitraum vorhanden
EXIT.
ENDIF.