Hallo,
zuerst würde ich empfehlen, auch beim ersten SELECT die Daten nicht in eine Struktur zu selektieren und diese dann einer Tabelle anzufügen, sondern gleich in die Tabelle zu schreiben:
Code: Alles auswählen.
SELECT bukrs blart bldat budat xblnr awkey awtyp cpudt
FROM bkpf
INTO CORRESPONDING FIELDS OF TABLE gt_bkpf
WHERE bukrs IN so_bukrs AND
blart IN so_blart AND
cpudt IN so_cpudt.
Beim Selektieren mit WHERE ... IN ... wird erwartet, dass entweder eine Auflistung von Einzelwerten (
https://help.sap.com/doc/abapdocu_752_i ... p_list.htm), eine Range-Tabelle etwa aus einer Selektionsoption (
https://help.sap.com/doc/abapdocu_752_i ... seltab.htm) oder eine Subquery (
https://help.sap.com/doc/abapdocu_752_i ... bquery.htm) folgt.
Bei dem ersten SELECT sind die internen Tabellen (so_...) Range-Tabellen (aus Selektionsoptionen?), die einen bestimmten Aufbau haben. Bei diesen speziellen Tabellen funktioniert die IN-Bedingung, da in diesen Tabellen pro Zeile ein Einzelwert oder Wertebereich mit entsprechenden Selektionsbedingungen steht, welcher von der Datenbankschnittstelle in eine Werteliste umgesetzt werden kann.
Um zu allen Einträgen in einer normalen internen Tabelle Daten hinzuzulesen, gibt es die Anweisung FOR ALL ENTRIES (
https://help.sap.com/doc/abapdocu_752_i ... p_itab.htm).
Diese entspricht in etwa einem Join zwischen einer internen Tabelle und einer Datenbanktabelle. Die übereinstimmenden Felder werden in der WHERE-Bedingung angegeben. In Deinem Programm würde es so aussehen:
Code: Alles auswählen.
SELECT objky kschl erdat vstat
FROM nast
FOR ALL ENTRIES IN gt_bkpf
INTO CORRESPONDING FIELDS OF TABLE gt_nast
WHERE objky EQ gt_bkpf-xblnr.
Damit hättest du dann in der internen Tabelle gt_nast alle Einträge aus der NAST stehen, die zu einem Beleg in der gt_bkpf passen.
Für die FOR-ALL-ENTRIES-Anweisung sollte allerdings vorher die Tabelle gt_bkpf sortiert und um Duplikate bereinigt werden (die ursprünglichen Daten sind dann ggf. nicht mehr vorhanden, also ggf. vorsichtshalber die Tabelle doppeln):
Code: Alles auswählen.
SORT gt_bkpf ASCENDING BY xblnr.
DELETE ADJACENT DUPLICATES FROM gt_bkpf COMPARING xblnr.
Außerdem sollte vor der Selektion geprüft werden, ob die Tabelle, nach deren Einträgen selektiert wird, leer ist. Sollte dies der Fall sein, wird nämlich die ganze NAST ausgelesen.
Eventuell kann es sich auch lohnen, einen echten Datenbank-Join einzubauen, je nachdem was das Ziel der Abfrage sein soll. Hierzu bietet die SAP-Dokumentation nützliche Hinweise und Beispiele:
https://help.sap.com/doc/abapdocu_752_i ... t_join.htm