Wer ein SELECT innerhalb eines LOOPS macht, bekommt was auf die Finger, hat mein ABAP-Lehrer immer gesagt. Glücklicherweise funktioniert das in deinem Programm eh nicht, da die internen Tabellen zu Beginn leer sind, und der LOOP nicht durchlaufen wird.
Rätselhaft ist mir auch, warum du 2 PARAMETRRS, lv_dsdat und lv_werks deklarierst, diese aber gar nicht weiter benutzt. Ebenfalls bleibt wohl dein Geheimnis, wieso du im Kommentar ein Datum sy-datum - 365 berechnest, im Quellcode aber auf sy-datum -840 kommst. Verstehe ich nicht so ganz.
Wie dem auch sei: in der ersten Runde lässt du das LOOP einfach weg und nimmst ein
Code: Alles auswählen.
SELECT * FROM zzt_mdkp1 INTO TABLE lt_mdkp1
WHERE dsdat < lv_datum.
Wenn du es quick and dirty haben willst., reicht ein LOOP über diese eine Tabelle, in dem du ein LOOP machst und alles aus zzt_mdtb löschst, was an dtnum entspricht.
Also
Code: Alles auswählen.
LOOP AT lt_mdkp1 INTO ls_mdkp1.
lv_tabix = sy-tabix.
DELETE FROM zzt_mdtb WHERE dtnum = ls_mdkp1-dtnum.
IF sy-subrc NE 0.
DELETE lt_mdkp1 INDEX lv_tabix.
ENDIF.
ENDLOOP.
Und zum Schluss noch die übrigen Einträge aus zzt_mdkp1 löschen:
Code: Alles auswählen.
IF NOT lt_mdkp1 IS INITIAL.
DELETE zzt_mdkp1 FROM TABLE lt_mdkp1.
ENDIF.
Wie schon gesagt: Alles ziemlich old-school und recht quick and dirty.
Von der Architektur her, würde man eigentlich eine Datenbanksperre auf die Einträge erwarten. Außerdem sollte man die Logik in einen Verbucherfunktionsbaustein kapseln und den im Report verwenden.
Old-School ist Verwendung von festen Strukturen als Arbeitsbereichen, da nimmt man heutzutage ein FELD-SYMBOL zur Laufzeit.