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

ich verwende die Methode create_dynamic_table der Klasse cl_alv_table_create, um eine interne Tabelle zu erstellen. Die Hilfstabelle i_fcat will ich in einer WHILE-Schleife mit Tabellennamen und Feldnamen befüllen, weil ich nicht weiß, wieviele davon ich habe.

Ich habe also eine rel. komplizierte Struktur aus zwei verschachtelten Schleifen gebaut. Dabei kommt es zu einem Fehler, der augenscheinlich darauf zurückgeht, daß ein Feldsymbol, dem ich einmal einen Wert zuweise und dem ich eigtl. dann in einer IF-Schleife einen neuen Wert zuweisen will, das nicht mitmacht und die innere der beiden Schleifen somit nicht richtig durchgezählt wird - soweit konnte ich es jetzt durch schrittweises Durchlaufen im Debugger feststellen.

Kann mir da jemand weiterhelfen? Ich kann den Code gern posten oder anhängen - für einen Post ist es vieleicht etwas viel, die Schleife selbst und die dafür notwendigen Variablen, das ginge.

Danke vielmals!

Gruß,

Sappralott

Sappralott
vor 12 Jahre
Hi,

meine Schleife steht jetzt und funktioniert auch - wenn es so ist, wie der Code, den ich hier poste. Allerdings bin ich jetzt auf ein anderes Problem gestoßen: Ich habe mal experimentiert und nach und nach mehr Felder eingefügt - noch aus den gleichen vier Tabellen KNC1, KNB1, KNA1 und T001 - und bin drauf gestoßen, daß es Probleme gibt, wenn es zwei Felder gleichen Namens gibt. Das kommt aber im SAP-System eben relativ oft vor - ist ja auch praktischer so - und weil die Ergebnisse bei dem SELECT aktuell mit der Option INTO CORRESPONDING FIELDS reingestellt werden, wird es auch zu Problemen kommen, wenn ich die Namen abändere.

Hat da jemand eine Idee, wie man das vermeiden könnte?

Hier kommt mal der 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.

* The variables are of course to be taken from the dialogs;

* That works fine with the tables. The fields are not yet

* available as single variables, so we have to declare them here.

* DATA NrTbs TYPE i VALUE 4.

*DATA: Tab1 TYPE C LENGTH 4 VALUE 'KNC1',

* Tab2 LIKE Tab1 VALUE 'KNB1',

* Tab3 LIKE Tab1 VALUE 'KNA1',

* Tab4 LIKE Tab1 VALUE 'T001'.

DATA: F1 TYPE C LENGTH 5 VALUE 'KUNNR',

F2 LIKE F1 VALUE 'BUKRS',

F3 LIKE F1 VALUE 'GJAHR',

F4 LIKE F1 VALUE 'USNAM',

F5 LIKE F1 VALUE 'UMSAV',

F6 LIKE F1 VALUE 'UM01U',

F7 LIKE F1 VALUE 'AKONT',

F8 LIKE F1 VALUE 'NAME1',

F9 LIKE F1 VALUE 'NAME2',

F10 LIKE F1 VALUE 'ORT01',

F11 LIKE F1 VALUE 'ERDAT',

F12 LIKE F1 VALUE 'ERNAM'.

F13 LIKE F1 VALUE 'BUTXT',

F14 LIKE F1 VALUE 'WAERS',

F15 LIKE F1 VALUE 'SPRAS',

F16 LIKE F1 VALUE 'KOKFI'.

DATA Flds1 TYPE C VALUE '6'.

DATA Flds2 TYPE C VALUE '1'.

DATA Flds3 TYPE C VALUE '5'.

*DATA Flds4 TYPE C VALUE '4'.

* Before using the internal table i_fcat in the method called,

* it has to be declared with the usual four-step-process:

* 1) Linetype -> 2) Table_type 3) DATA_table -> DATA_wa.

*********** Declaration of the internal table i_fcat *******************

DATA i_fcat TYPE LVC_T_FCAT.

DATA wa_fcat TYPE LVC_S_FCAT.

************ Population of internal table i_fcat *******************

* This has to be done in a WHILE-clause lateron so that we can have

* as many rows here as the user has selected fields.

DATA v_tabctr TYPE i value 1. "TYPE C VALUE '1'.

DATA v_fieldctr TYPE i value 1. "C LENGTH 2 VALUE '1'.

DATA Flds_new TYPE i.

DATA v_currTab TYPE STRING.

DATA Flds_currTab TYPE STRING.

DATA v_currFld TYPE STRING.

FIELD-SYMBOLS .

FIELD-SYMBOLS .

FIELD-SYMBOLS .

* The running logic of this WHILE construction is the

* following: The outer loop runs through all the tables

* the user has entered in the dialogs, tab1 to tabX.

* => The inner loop runs through all the fields in

* one specific table (variable from one table to

* the next) before the inner loop is left and the

* next table is worked on.

* => Inside the inner loop, every table-field combination

* is appended to int. table i_fcat that goes into

* the method to be called further down.

WHILE v_tabctr <= NrTbs.

move v_tabctr TO v_currTab.

CONCATENATE 'Tab' v_currTab INTO v_currTab.

ASSIGN (v_currTab) TO .

move v_tabctr to Flds_currTab.

CONCATENATE 'Flds' Flds_currTab INTO Flds_currTab.

ASSIGN (Flds_currTab) TO .

Flds_new = v_fieldctr + - 1.

WHILE v_fieldctr <= flds_new.

move v_fieldctr to v_currFld.

CONCATENATE 'F' v_currFld INTO v_currFld.

ASSIGN (v_currFld) TO .

wa_fcat-tabname = .

wa_fcat-fieldname = .

APPEND wa_fcat TO i_fcat.

CLEAR wa_fcat.

v_fieldctr = v_fieldctr + 1.

ENDWHILE.

v_tabctr = v_tabctr + 1.

ENDWHILE.

************************** Done ************************

* Using the method create_dynamic_table (method of class

* cl_alv_table_create) it is possible to create a dynamic

* internal table based on a field_catalog i_fcat.

* This field_catalog is another internal table

CALL METHOD cl_alv_table_create=>create_dynamic_table

EXPORTING

it_fieldcatalog = i_fcat

* I_STYLE_TABLE ='X'

IMPORTING

ep_table = TAB_REF.

Wie gesagt, so wie es dasteht, funktioniert der Code. Ein Problem gibt es, wenn ich bspw. aus der Tabelle KNC1 noch das Feld ERDAT will (das müsste man dann oben direkt nach den anderen KNC1-Feldern anhängen und die lfd. Nummerierung entspr. anpassen).

Danke vielmals!

Gruß,

Sappralott

ahelm
vor 12 Jahre
Hallo Sappralott,

da musst du Aliasnamen aufbauen für gleichlautende Felder, also in dieser Form im SELECT:

select KNA1~ERDAT as KNA1_ERDAT KNB1~ERDAT as KNB1_ERDAT
  from ...
  into corresponding fields of table IT_TAB
  where ...

in der internen Tabelle müssen die Felder dann auch so heißen... Ansonsten "gewinnt" das Feld aus der letzten Tabelle im Join.

mfg Andreas