SAP Jobsuche bei DV-Treff
Sappralott
vor 12 Jahre
Hi,

ich arbeite daran, eine interne Tabelle dynamisch aufzubauen, so daß ich nicht spezifizieren muss, welche Felder sie hat und sie sich im Idealfall an das anpasst, was ein danach folgendes SELECT liefert (Zusammenstellung von Feldern aus mehreren Tabellen).

Für die Deklaration hab ich folgenden Code:

*&---------------------------------------------------------------------*

*& Include ZFH_INTTAB_JOIN4_DX_DYNDECL *

*&---------------------------------------------------------------------*

* Hereby, an internal table is created fully dynamically so it will

* adapt to whatever data the SELECT statement that is yet to come

* will provide.

* Before we can use the CREATE DATA statement, we must declare the

* type of this internal-table-to-be.

* TYPES T_LINE.

* TYPES T_ITAB TYPE STANDARD TABLE OF T_LINE.

DATA TAB_REF TYPE REF TO DATA.

DATA T_LINE_REF TYPE REF TO DATA.

* Field-symbols are just placeholders; They reserve physical memory+

* space for something still to come.

FIELD-SYMBOLS TYPE ANY TABLE.

FIELD-SYMBOLS TYPE ANY.

* A data object (here an internal table) is created, taking on

* all the attributes of the DB table KNA1.

CREATE DATA TAB_REF TYPE ANY TABLE.

* This data object is assigned the memory space we have

* beforehand reserved using this field-symbol.

ASSIGN TAB_REF->* TO .

* Another data object is created that has all the attributes

* of one line of the table (structure) that is now assigned

* to the field-symbol.

CREATE DATA T_LINE_REF LIKE LINE OF .

* This new data object is now assigned to the second

* field-symbol.

ASSIGN T_LINE_REF->* TO .

Das funktioniert auch soweit, das Problem ist nur: Ich hab für den Typ des Datenobjekts, das ich da generiere, auf KNA1 gezeigt - damit übernimmt die interne Tabelle erst mal die Felder, die in KNA1 vorkommen. So weit so gut - aber wenn mein SELECT kommt, passt sich die Tabelle nicht an, es werden nur die Daten eingefüllt, wo die Feldnamen zufällig passen, weil es eben Felder aus der KNA1 sind. Alles andere wird ignoriert.

Das ist ja nicht der Sinn der Sache.

Kann mir einer sagen, wie ich diesem Datenobjekt einen generischen Typ mitgebe, so daß es sich anpasst?

Danke vielmals!

Gruß,

Sappralott

Sappralott
vor 12 Jahre
Okay,

ich hab das jetzt anders gemacht und zwar mit

CALL METHOD cl_alv_table=>create_dynamic_table.

EXPORTING

it_fieldcatalog = i_fcat

IMPORTING

ep_table = dy_table.

Die interne Tabelle i_fcat hab ich auch deklariert und mit Werten gefüllt, die als Variablen aus meinem Dialog kommen. So weit so gut - aber wie muss ich jetzt it_fieldcatalog deklarieren?

Momentan meldet ABAP da eine Typ-Inkompatibilität und der Debugger kennt it_fieldcatalog gar nicht, weder als Feld noch als Tabelle.

Kann mir da jemand helfen?

Vielen Dank!

Gruß,

Sappralott

Sappralott
vor 12 Jahre
Hi,

auch das ist jetzt geschafft: Immer noch mit dieser Methode, aber ich hab jetzt den dieser Methode zugrundeliegenden Zeilentyp verwendet.

Jetzt wird die interne Tabelle - die, wo durch den SeLECT meine Daten reinkommen sollen - richtig aufgebaut, mit genau den Feldern, die der User im Dialog spezifiziert hat.

Das Problem ist - ich kann es leider bloß vermuten, weil ich den Datentyp der Felder im Debugger nicht sehe, bloß die Tabelle als solche - daß der Datentyp noch nicht stimmt: Eins meiner Felder ist ERDAT aus der Tabelle KNA1, das hat den Datentyp D. Wenn ich jetzt das INCLUDE mit meinem SELECT drin aktiviere, dann krieg ich einen Laufzeitfehler, was ich der Info-Seite entnehmen kann, ist, daß ein SELECT Daten in ein Feld stellen wollte, wo sie nicht reingepasst haben. Ich vermute daher - weil es vorher schon mal passiert ist - daß das Feld ERDAT eben nicht den Datentyp D hat wie es soll.

Kann mir jemand sagen, wie ich das hinkriege (möglichst dynamisch, weil ich vom User nicht erwarten kann, daß er zu jedem Feld den Datentyp mit angibt)?

Danke vielmals!

Gruß,

Sappralott

ahelm
vor 12 Jahre
Hallo,

prüfe mit dem Debugger die Tabelle I_FCAT in deinem Beispielaufruf aus Post 2, der Datentyp für ERDAT, der hier drinnen steht, wird in der dynamischen Tabelle verwendet. Der muss zu dem aus dem SELECT passen.

mfg Andreas

Sappralott
vor 12 Jahre
Hallo,

die interne Tabelle wird jetzt grundsätzlich schön auf Basis der Variablen aus dem Dialog in einer Schleife aufgebaut, so daß es egal ist, wie viele Felder aus wie vielen (und welchen) Tabellen ich da drinhaben möchte.

Aber wie das immer so ist, für ein gelöstes Problem kommen zwei nach:

1) Das Feld KNC1-GJAHR hat laut DD03L (die befrage ich jetzt zum Datentyp jedes Feldes) den Datentyp 'N' und die Länge 4 - der Datentyp hat aber wohl die Standardlänge 1, jedenfalls kommt da nur eine einstellige Nummer raus.

2) Ich hab auch ein numerisches Feld in meinem Beispiel, KNC1-UM01U. Da muss ich wahrscheinlich noch ein feld spezifizieren, damit das mit zwei Dezimalstellen rauskommt, oder?

Kann mir da irgendjemand weiterhelfen?

Vielen Dank!

Gruß,

Sappralott