Code: Alles auswählen.
Types: begin of tt_data.
INCLUDE STRUCTURE EINA AS EINA.
INCLUDE STRUCTURE EINE as eine.
TYPES: mtart type mara-mtart,
end of tt_data.
Code: Alles auswählen.
Types: begin of tt_data
t_eina type eina,
t_eine type eine,
mtart type mara-mtart,
end of tt_data.
Code: Alles auswählen.
SELECT * FROM
EINA as a
Inner Join EINE as b on a~infnr = b~infnr
inner join MARA as c on a~matnr = c~matnr
INTO CORRESPONDING FIELDS OF TABLE IT_DATA
WHERE LIFNR = '0000000001'.
Code: Alles auswählen.
Data: it_fieldcat type STANDARD TABLE OF LVC_s_FCAT.
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
* I_BUFFER_ACTIVE =
I_STRUCTURE_NAME = 'tt_data'
* I_CLIENT_NEVER_DISPLAY = 'X'
* I_BYPASSING_BUFFER =
* I_INTERNAL_TABNAME = 'EINA'
CHANGING
ct_fieldcat = it_fieldcat
EXCEPTIONS
INCONSISTENT_INTERFACE = 1
PROGRAM_ERROR = 2
OTHERS = 3
.
"Aufruf des ALV
CALL METHOD go_grid->set_table_for_first_display
EXPORTING
i_structure_name = 'tt_data'
CHANGING
it_outtab = it_data
it_fieldcatalog = it_fieldcat
.
Code: Alles auswählen.
SELECT *
FROM EINA as a Inner Join eine as b on a~infnr = b~infnr
inner join mara as c on a~matnr = c~matnr
INTO CORRESPONDING FIELDS of wa_DATA-t_eina
WHERE LIFNR = '0000000001'.
append wa_data to it_data.
endselect.
Code: Alles auswählen.
Types: begin of tt_data,
t_eina type EINA,
t_eine type eine,
end of tt_data.
DATA: ok_code LIKE sy-ucomm,
it_data Type Table of tt_data,
wa_data like line of it_data,
it_fieldcat type LVC_T_FCAT,
it_fieldcat2 type lvc_t_fcat,
wa_fieldcat like line of it_fieldcat.
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
* I_BUFFER_ACTIVE =
I_STRUCTURE_NAME = 'EINA'
* I_CLIENT_NEVER_DISPLAY = 'X'
* I_BYPASSING_BUFFER =
* I_INTERNAL_TABNAME = 'EINA'
CHANGING
ct_fieldcat = it_fieldcat
EXCEPTIONS
INCONSISTENT_INTERFACE = 1
PROGRAM_ERROR = 2
OTHERS = 3
.
IF sy-subrc <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
clear it_fieldcat2.
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
* I_BUFFER_ACTIVE =
I_STRUCTURE_NAME = 'EINE'
* I_CLIENT_NEVER_DISPLAY = 'X'
* I_BYPASSING_BUFFER =
* I_INTERNAL_TABNAME = 'EINE'
CHANGING
ct_fieldcat = it_fieldcat2
EXCEPTIONS
INCONSISTENT_INTERFACE = 1
PROGRAM_ERROR = 2
OTHERS = 3
.
IF sy-subrc <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
loop at it_fieldcat2 into wa_fieldcat.
append wa_fieldcat to it_fieldcat.
endloop.
Code: Alles auswählen.
CALL METHOD go_grid->set_table_for_first_display
* EXPORTING
CHANGING
it_outtab = it_data
it_fieldcatalog = it_fieldcat
EXCEPTIONS
invalid_parameter_combination = 1
program_error = 2
too_many_lines = 3
others = 4
.
IF sy-subrc <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
Wäre ja auch zu schön gewesena-dead-trousers hat geschrieben:Beide Fehler haben dieselbe Ursache:
Darfst bei deiner Struktur keine FELDER vom Typ EINE oder EINA anlegen, sondern du musst mit INCLUDE TYPE arbeiten.
Nur so funktioniert das INTO CORRESPONDING FIELDS da es per NAME geht und das MANDT-Feld zu EINA in deiner Struktur heißt derzeit eigentlich T_EINA-MANDT. Deswegen auch der Pointer-Fehler im ALV.
Was du vorhast funktioniert so nicht
Code: Alles auswählen.
Types: begin of tt_data.
include structure eina as t_eina.
include structure eine as t_eine.
types: end of tt_data.
Code: Alles auswählen.
Types: begin of tt_data.
include type eina as t_eina.
include type eine as t_eine.
types: end of tt_data.
Brauche ich die 4 aufgeführten Punkte von dir auch, wenn ich einen SALV verwende?So leid es mir tut, du wirst dir wohl oder über eine neue Struktur für die Abfrage und Anzeige basteln müssen.
Entweder statisch
Oder dynamisch mit RTTI/RTTC
Schau dir zu dem Thema folgende Dinge genauer an:Den SALV würd ich dir deswegen wärmstens empfehlen, da du dann die Sache mit dem Feldkatalog nicht mehr brauchst.
- Befehl CREATE DATA ... TYPE HANDLE ...
- Befehl ASSIGN ...->* TO
- Klasse CL_ABAP_TYPEDESCR und die Subklassen
- Klasse CL_SALV_TABLE
lg ADT
Code: Alles auswählen.
Types: begin of tt_data.
t_eina type eina,
t_eine type eine,
end of tt_data.
Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
km216
Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
km216
Da die Daten nach Excel gezogen, dort editiert und dann wieder importiert werden sollen, ist das für mich auch nicht nötig.a-dead-trousers hat geschrieben:Das einzige was SALV im Gegensatz zum reinen ALV nicht kann, ist die angezeigten Daten zu editieren.
Das geht definitiv nicht und ist ja auch beim ALV nur recht "halbherzig" implementiert worden.
Da wir an der Uni mit Java programmieren müssen und meine einzige ABAP-Schulung (ohne jeglichen vorherigen Kenntnisse) eine 3 Tage ABAP OO-Schulung war, komme ich damit hoffentlich zurechta-dead-trousers hat geschrieben: - Das OO-Interface ist für Anfänger (und ABAP/4 Programmierer) die bislang nichts mit Klassen gemacht haben gewöhnungsbedürftig.
Code: Alles auswählen.
DATA: lr_typedescr_ref TYPE REF TO cl_abap_typedescr,
lr_strucdescr_ref TYPE REF TO cl_abap_structdescr,
lr_tabledescr_ref type ref to cl_abap_tabledescr,
lr_datadescr_ref type ref to cl_abap_datadescr,
it_components TYPE cl_abap_structdescr=>component_table,
lr_data type ref to data.
FIELD-SYMBOLS: <fs_components> LIKE LINE OF it_components,
<fs_data> type any table.
lr_typedescr_ref = cl_abap_typedescr=>describe_by_name( 'EINA' ).
lr_strucdescr_ref ?= lr_typedescr_ref.
it_components = lr_strucdescr_ref->get_components( ).
TRY.
CALL METHOD cl_abap_structdescr=>create
EXPORTING
p_components = it_components
* p_strict = TRUE
receiving
p_result = lr_strucdescr_ref
.
CATCH cx_sy_struct_creation .
ENDTRY.
TRY.
CALL METHOD cl_abap_tabledescr=>create
EXPORTING
p_line_type = lr_strucdescr_ref
* p_table_kind = TABLEKIND_STD
* p_unique = ABAP_FALSE
* p_key =
* p_key_kind = KEYDEFKIND_DEFAULT
receiving
p_result = lr_tabledescr_ref
.
CATCH cx_sy_table_creation .
ENDTRY.
CREATE DATA lr_data TYPE HANDLE lr_tabledescr_ref.
assign lr_data->* to <fs_data>.
SELECT *
FROM eina AS a
INNER JOIN eine AS b ON a~infnr = b~infnr
INTO CORRESPONDING FIELDS OF table <fs_data>
WHERE lifnr = '0000000001'.
Du meinst damit doch das ansprechen der einzelnen Spalten meiner Tabelle, oder?a-dead-trousers hat geschrieben: Ein Zugriff auf einzelne Componenten ist übrigens nur mittels ASSIGN COMPONENT ... OF STRUCTURE möglich!
Code: Alles auswählen.
<fs_data> type standard table,
<fs_datensatz> type any,
<fs_daten> type any.
Code: Alles auswählen.
read table <fs_data> index 1 assigning <fs_datensatz>.
WHILE sy-subrc = 0.
ASSIGN COMPONENT sy-index OF STRUCTURE <fs_datensatz> TO <fs_daten>.
write <fs_daten>.
endwhile.
Code: Alles auswählen.
loop at it_components assigning <fs_components>.
assign component <fs_components>-name of structure <fs_datensatz> TO <fs_daten>.
...
endloop.