Code: Alles auswählen.
DATA: go_container TYPE REF TO cl_gui_custom_container.
DATA: go_grid TYPE REF TO cl_gui_alv_grid.
DATA: go_event_receiver TYPE REF TO lcl_event_receiver.
DATA: gv_variant TYPE disvariant.
DATA: gv_layout TYPE lvc_s_layo.
IF go_container IS INITIAL.
* Create custom controller
CREATE OBJECT go_container
EXPORTING
container_name = 'MY_CONTAINER'.
* Create grid in the container
CREATE OBJECT go_grid
EXPORTING
i_parent = go_container.
gv_layout-zebra = 'X'.
gv_layout-cwidth_opt = 'X'.
gv_variant-report = sy-repid.
CALL METHOD go_grid->set_table_for_first_display
EXPORTING
i_structure_name = 'Z_S_OUTPUT'
i_save = 'A'
is_variant = gv_variant
is_layout = gv_layout
CHANGING
it_outtab = it_out.
CREATE OBJECT go_event_receiver.
SET HANDLER go_event_receiver->handle_double_click FOR go_grid.
ELSE.
CALL METHOD go_grid->refresh_table_display.
ENDIF.
Code: Alles auswählen.
CLASS lcl_event_receiver DEFINITION.
PUBLIC SECTION.
METHODS:
handle_double_click
FOR EVENT double_click OF cl_gui_alv_grid
IMPORTING e_row e_column.
ENDCLASS.
CLASS lcl_event_receiver IMPLEMENTATION.
METHOD handle_double_click.
CHECK e_row-rowtype IS INITIAL.
CHECK NOT e_row-index IS INITIAL.
READ TABLE it_out INDEX e_row-index INTO wa_out.
CHECK NOT wa_out-ebeln IS INITIAL.
SET PARAMETER ID 'BES' FIELD wa_out-ebeln.
CALL TRANSACTION 'ME23N'.
ENDMETHOD.
ENDCLASS.
Code: Alles auswählen.
TABLES: mara,ekko,ekpo,ekab,lfa1, eine,koth006,bpbk,b061,b223,rm06e,t161,mard, zzz_kontrakt1, resb, eket.
DATA it_resb1 LIKE STANDARD TABLE OF resb.
DATA wa_resb1 LIKE LINE OF it_resb1.
DATA it_resb2 LIKE STANDARD TABLE OF resb.
DATA wa_resb2 LIKE LINE OF it_resb2.
DATA icmt TYPE matnr.
DATA: it_mard LIKE TABLE OF mard.
DATA: wa_mard LIKE LINE OF it_mard.
DATA: it_ekab LIKE STANDARD TABLE OF ekab.
DATA: wa_ekab LIKE LINE OF it_ekab.
DATA: it_resb LIKE STANDARD TABLE OF resb.
DATA: wa_resb LIKE LINE OF it_resb.
*
*DATA: it_ekko LIKE STANDARD TABLE OF zzz_kontrakt1.
*DATA: wa_ekko LIKE LINE OF it_ekko.
DATA: it_kont LIKE STANDARD TABLE OF zzz_kontrakt.
DATA: wa_kont LIKE LINE OF it_kont.
DATA: it_eket LIKE STANDARD TABLE OF eket.
DATA: wa_eket LIKE LINE OF it_eket.
DATA: it_mara LIKE STANDARD TABLE OF mara.
DATA: wa_mara LIKE LINE OF it_mara.
TYPE-POOLS: slis.
DATA: lt_fc2 TYPE slis_t_fieldcat_alv,
it_ekko TYPE TABLE OF zzz_kontrakt1 ,
wa_ekko LIKE LINE OF it_ekko.
data: gt_events type slis_t_event.
DATA: G_REPID LIKE SY-REPID.
DATA:
bestmng TYPE i , matnr TYPE c LENGTH 18, konnr TYPE c LENGTH 20, ebelp TYPE c LENGTH 36,
bestmngo TYPE i , erg1 TYPE i , erg2 TYPE i , ofmng TYPE i, tatofmng TYPE i , mtart1 TYPE c, int TYPE i.
DATA: ktmng LIKE ekpo-ktmng.
SELECT-OPTIONS:
ekorg1 FOR b223-ekorg,
ekbel FOR ekko-ebeln ,
p_matnr FOR mara-matnr ,
lfnr FOR lfa1-lifnr ,
ekgrup FOR b061-ekgrp.
*PARAMETERS: detinf AS CHECKBOX.
SELECT ekko~ebeln ekko~kdatb ekko~kdate ekko~lifnr ekko~ekorg ekko~ekgrp ekpo~ebelp ekpo~matnr ekpo~ktmng FROM ekko INNER JOIN ekpo ON ekko~ebeln = ekpo~ebeln "ekpo~ebelp
INTO CORRESPONDING FIELDS OF TABLE it_ekko WHERE ekko~bsart = 'MK' AND ekpo~loekz <> 'L'.
LOOP AT it_ekko INTO wa_ekko.
DATA: labst LIKE mard-labst, menge LIKE ekab-menge, wemng LIKE eket-wemng, bdmng LIKE resb-bdmng, save1 LIKE resb-bdmng, save2 LIKE resb-bdmng.
CLEAR: labst, menge, wemng, bdmng, save1, save2.
SELECT SINGLE SUM( mard~labst ) FROM mard INTO labst WHERE matnr EQ wa_ekko-matnr GROUP BY labst.
SELECT SINGLE SUM( ekab~menge ) FROM ekab INTO menge WHERE konnr EQ wa_ekko-ebeln GROUP BY menge.
SELECT eket~wemng FROM eket
INNER JOIN ekpo
ON eket~ebeln = ekpo~ebeln
AND eket~ebelp = ekpo~ebelp
INTO CORRESPONDING FIELDS OF TABLE it_eket
WHERE ekpo~matnr EQ wa_ekko-matnr
GROUP BY wemng.
LOOP AT it_eket INTO wa_eket.
ADD wa_eket-wemng TO wemng.
ENDLOOP.
SELECT resb~bdmng resb~bdter
FROM resb INTO CORRESPONDING FIELDS OF TABLE it_resb WHERE matnr EQ wa_ekko-matnr AND bdart = 'SB'.
LOOP AT it_resb INTO wa_resb.
save1 = wa_resb-bdmng .
wa_ekko-bdterm = wa_resb-bdter.
ENDLOOP.
zzz_kontrakt1-bdterm = wa_ekko-bdterm.
SELECT resb~bdmng resb~bdter
FROM resb INTO CORRESPONDING FIELDS OF TABLE it_resb1 WHERE matnr EQ wa_ekko-matnr AND bdart = 'AR'.
LOOP AT it_resb1 INTO wa_resb1.
save2 = wa_resb1-bdmng.
wa_ekko-bdterm = wa_resb1-bdter.
ENDLOOP.
wa_ekko-bdmgalg = save1 + save2.
wa_ekko-labst = labst.
wa_ekko-menge = menge .
bestmngo = wa_ekko-menge - wemng.
*
erg1 = bestmngo + labst .
**
erg2 = erg1 - wa_ekko-bdmgalg.
wa_ekko-ofmng = wa_ekko-ktmng - wa_ekko-menge.
**
IF erg2 < '0'. erg2 = '0' - erg2 . ENDIF.
tatofmng = wa_ekko-ofmng - erg2.
zzz_kontrakt1-bdterm = wa_ekko-bdterm.
zzz_kontrakt1-ebeln = wa_ekko-ebeln.
zzz_kontrakt1-ebelp = wa_ekko-ebelp.
zzz_kontrakt1-bdmgalg = wa_ekko-bdmgalg.
zzz_kontrakt1-kdatb = wa_ekko-kdatb.
zzz_kontrakt1-kdate = wa_ekko-kdate.
zzz_kontrakt1-matnr = wa_ekko-matnr.
zzz_kontrakt1-ktmng = wa_ekko-ktmng.
zzz_kontrakt1-labst = wa_ekko-labst.
zzz_kontrakt1-menge = wa_ekko-menge.
zzz_kontrakt1-ofmng = wa_ekko-ofmng.
zzz_kontrakt1-tatom = tatofmng.
zzz_kontrakt1-ekorg = wa_ekko-ekorg.
zzz_kontrakt1-ekgrp = wa_ekko-ekgrp.
zzz_kontrakt1-lifnr = wa_ekko-lifnr.
MODIFY zzz_kontrakt1 .
ENDLOOP.
DELETE FROM zzz_kontrakt1 WHERE ebelp = ''.
CLEAR it_ekko.
*select zzz_kontrakt1~ebeln zzz_kontrakt1~kdatb zzz_kontrakt1~kdate zzz_kontrakt1~matnr zzz_kontrakt1~ktmng zzz_kontrakt1~labst zzz_kontrakt1~menge
SELECT *
FROM zzz_kontrakt1 INTO CORRESPONDING FIELDS OF TABLE it_ekko WHERE ekorg IN ekorg1 AND ebeln IN ekbel AND matnr IN p_matnr AND lifnr IN lfnr AND ekgrp IN ekgrup.
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
* I_PROGRAM_NAME = sy-cprog
* I_INTERNAL_TABNAME =
i_structure_name = 'ZZZ_KONTRAKT1'
* I_CLIENT_NEVER_DISPLAY = 'X'
* I_INCLNAME =
* I_BYPASSING_BUFFER =
* I_BUFFER_ACTIVE =
CHANGING
ct_fieldcat = lt_fc2
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.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
* I_INTERFACE_CHECK = ' '
* I_BYPASSING_BUFFER = ' '
* I_BUFFER_ACTIVE = ' '
i_callback_program = G_REPID
* I_CALLBACK_PF_STATUS_SET = ' '
* I_CALLBACK_USER_COMMAND = ' '
* I_CALLBACK_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_END_OF_LIST = ' '
* I_STRUCTURE_NAME =
* I_BACKGROUND_ID = ' '
* I_GRID_TITLE =
* I_GRID_SETTINGS =
* IS_LAYOUT =
it_fieldcat = lt_fc2
* IT_EXCLUDING =
* IT_SPECIAL_GROUPS =
* IT_SORT =
* IT_FILTER =
* IS_SEL_HIDE =
* I_DEFAULT = ' '
i_save = 'A'
* IS_VARIANT = 'A'
IT_EVENTS = gt_events[]
* IT_EVENT_EXIT =
* IS_PRINT =
* IS_REPREP_ID =
* I_SCREEN_START_COLUMN = 0
* I_SCREEN_START_LINE = 0
* I_SCREEN_END_COLUMN = 0
* I_SCREEN_END_LINE = 0
* I_HTML_HEIGHT_TOP = 0
* I_HTML_HEIGHT_END = 0
* IT_ALV_GRAPHICS =
* IT_HYPERLINK =
* IT_ADD_FIELDCAT =
* IT_EXCEPT_QINFO =
* IR_SALV_FULLSCREEN_ADAPTER =
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER =
* ES_EXIT_CAUSED_BY_USER =
TABLES
t_outtab = it_ekko
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
Code: Alles auswählen.
is_variant-report = sy-repid.
is_variant-handle = '0001'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = is_variant-report
i_callback_pf_status_set = 'ALV_STATUS_SET'
i_callback_user_command = 'ALV_USER_COMMAND'
is_variant = is_variant
is_layout_lvc = is_layout
it_fieldcat_lvc = it_fieldcat
i_default = 'X'
i_save = 'A'
* I_GRID_TITLE = 'Hugo'
TABLES
t_outtab = gt_data
EXCEPTIONS
program_error = 1
OTHERS = 2.
ENDFORM. " SHOW_DATA
*---------------------------------------------------------------------*
* FORM ALV_STATUS_SET *
*---------------------------------------------------------------------*
FORM alv_status_set USING rt_extab TYPE slis_t_extab. "#EC CALLED
SET PF-STATUS 'ALV' EXCLUDING rt_extab.
ENDFORM. "ALV_STATUS_SET
*---------------------------------------------------------------------*
* FORM ALV_USER_COMMAND *
*---------------------------------------------------------------------*
FORM alv_user_command CHANGING r_ucomm LIKE sy-ucomm "#EC CALLED
rs_selfield TYPE slis_selfield.
DATA: wa_data LIKE LINE OF gt_data.
CASE r_ucomm.
WHEN 'CREATE_LGORT'.
PERFORM create_data_all CHANGING gt_data.
rs_selfield-refresh = 'X'.
WHEN OTHERS.
break-point.
ENDCASE.
IF rs_selfield-refresh = 'X'.
rs_selfield-col_stable = 'X'.
rs_selfield-row_stable = 'X'.
ENDIF.
ENDFORM. "alv_user_commandCode: Alles auswählen.
G_REPID = sy-repid.
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
* I_PROGRAM_NAME = sy-cprog
* I_INTERNAL_TABNAME =
i_structure_name = 'ZZZ_KONTRAKT1'
* I_CLIENT_NEVER_DISPLAY = 'X'
* I_INCLNAME =
* I_BYPASSING_BUFFER =
* I_BUFFER_ACTIVE =
CHANGING
ct_fieldcat = lt_fc2
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.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
* I_INTERFACE_CHECK = ' '
* I_BYPASSING_BUFFER = ' '
* I_BUFFER_ACTIVE = ' '
i_callback_program = G_REPID
* I_CALLBACK_PF_STATUS_SET = ' '
I_CALLBACK_USER_COMMAND = ' ALV_USER_COMMAND '
* I_CALLBACK_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_END_OF_LIST = ' '
* I_STRUCTURE_NAME =
* I_BACKGROUND_ID = ' '
* I_GRID_TITLE =
* I_GRID_SETTINGS =
* IS_LAYOUT =
it_fieldcat = lt_fc2
* IT_EXCLUDING =
* IT_SPECIAL_GROUPS =
* IT_SORT =
* IT_FILTER =
* IS_SEL_HIDE =
* I_DEFAULT = ' '
I_SAVE = 'A'
* IS_VARIANT = 'A'
* IT_EVENTS = gt_events[]
* IT_EVENT_EXIT =
* IS_PRINT =
* IS_REPREP_ID =
* I_SCREEN_START_COLUMN = 0
* I_SCREEN_START_LINE = 0
* I_SCREEN_END_COLUMN = 0
* I_SCREEN_END_LINE = 0
* I_HTML_HEIGHT_TOP = 0
* I_HTML_HEIGHT_END = 0
* IT_ALV_GRAPHICS =
* IT_HYPERLINK =
* IT_ADD_FIELDCAT =
* IT_EXCEPT_QINFO =
* IR_SALV_FULLSCREEN_ADAPTER =
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER =
* ES_EXIT_CAUSED_BY_USER =
TABLES
t_outtab = it_ekko
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
FORM alv_user_command CHANGING r_ucomm LIKE sy-ucomm "#EC CALLED
rs_selfield TYPE slis_selfield.
DATA: wa_data LIKE LINE OF gt_data.
CASE r_ucomm.
WHEN 'CREATE_LGORT'. ""Habe hier meine eigenen Felder mal eingegeben, kann ich bestimmt auch Zeilennummern eingeben?
PERFORM create_data_all changing gt_data. ""Muss hier eine Routine performt werden? Kann ich auch einfach zb. select * from mara inot c. f. o. it_ekko einfügen?
rs_selfield-REFRESH = 'X'.
WHEN OTHERS.
BREAK-POINT.
ENDCASE.
IF rs_selfield-REFRESH = 'X'.
rs_selfield-col_stable = 'X'.
rs_selfield-row_stable = 'X'.
ENDIF.
ENDFORM. "alv_user_command
form create_data_all.
select * from mara into corresponding fields of table it_ekko.
endform. Und was macht ein OO-Experte wenn er ganz normale prozedural Programme ändern soll?weigo hat geschrieben:Hi,
also ob du es nun prozedural oder OO machst, dass ist natürlich dir überlassen.
Viele mögen OO nicht, dabei ist es ziemlich einfach und wichtig, wenn du mit neueren Themen zu tun haben wirst, wie z.B. WebDynpro.
Daher rate ich jedem der mit ABAP anfängt sich mit OO auseinanderzusetzen und auch einfache Reporte OO zu programmieren.
Selbst wenn das vielleicht in manchen Situationen etwas Mehraufwand bedeutet.
Bei ALV Reports ist das eigentlich nicht der Fall, da man keinen Fieldcat braucht und mit einer Handvoll Klassen ein gutes Ergebnis erzielen kann.
Code: Alles auswählen.
i_callback_program = G_REPID
* I_CALLBACK_PF_STATUS_SET = ' '
I_CALLBACK_USER_COMMAND = ' ALV_USER_COMMAND '
Code: Alles auswählen.
i_callback_program = G_REPID
* I_CALLBACK_PF_STATUS_SET = ' '
I_CALLBACK_USER_COMMAND = 'ALV_USER_COMMAND'
Code: Alles auswählen.
CASE r_ucomm.
WHEN 'CREATE_LGORT'. ""Habe hier meine eigenen Felder mal eingegeben, kann ich bestimmt auch Zeilennummern eingeben?
PERFORM create_data_all changing gt_data. ""Muss hier eine Routine performt werden? Kann ich auch einfach zb. select * from mara inot c. f. o. it_ekko einfügen?
rs_selfield-REFRESH = 'X'.
WHEN OTHERS.
BREAK-POINT.
ENDCASE.Also ich behaupte, dass fast jeder prozedural programmieren kann und besonders in ABAP kommt man daran nicht vorbei, keine Frage.Unit605 hat geschrieben:Und was macht ein OO-Experte wenn er ganz normale prozedural Programme ändern soll?weigo hat geschrieben:Hi,
also ob du es nun prozedural oder OO machst, dass ist natürlich dir überlassen.
Viele mögen OO nicht, dabei ist es ziemlich einfach und wichtig, wenn du mit neueren Themen zu tun haben wirst, wie z.B. WebDynpro.
Daher rate ich jedem der mit ABAP anfängt sich mit OO auseinanderzusetzen und auch einfache Reporte OO zu programmieren.
Selbst wenn das vielleicht in manchen Situationen etwas Mehraufwand bedeutet.
Bei ALV Reports ist das eigentlich nicht der Fall, da man keinen Fieldcat braucht und mit einer Handvoll Klassen ein gutes Ergebnis erzielen kann.
Also ich hatte es ja schon vorher erwähnt, jeder sollte selbst entscheiden und es stimmt, dass es natürlich alte Systeme gibt oder alte Programme, die man sicher nicht umstellen braucht.black_adept hat geschrieben:@weigo:
Ich die Erfahrung gemacht, dass die alte Methodik via den REUSE-Bausteinen durchaus noch seine Daseinsberechtigung hat.
Bei mir kommt es von Zeit zu Zeit vor, dass ein Report, der eigentlich nur eine ALV-Ausgabe rausgeben sollte sich im Laufe der Zeit verändert und zwar so, dass jemand auf die Idee kommt, den Report im Hintergrund laufen zu lassen um einen Spool zu erzeugen. Bei Verwendung der REUSE-Bausteine ist in diesem Fall keine Programmänderung mehr nötig - das liefert alles der Standard.
Desweiteren gibt es auf sehr vielen System noch viele Programme aus alten R/3 Zeiten, zu denen es noch gar keine OO-Grids gab. Und wenn ich so ein Programm anpassen muss, werde ich den Teufel tun und es auf OO umstellen, sondern höchstens mal von REUSE...LIST auf REUSE...GRID umstellen. Wird einfach zu teuer für den Kunden und es gibt auch nur wenig, das mit dem OO geht, was mit dem REUSE... nicht auch funktioniert.
Grundsätzlich muss ich dir ja recht geben - OO ist der Weg, den man heutzutage beherrschen sollte. Aber wenn es 2 Möglichkeiten gibt etwas zu realisieren, muss halt jeder für sich entscheiden welches der Weg ist den er beschreitet.
Und im hier vorliegenden Fall würde ich auf jeden Fall zu der prozeduralen Methodik raten weil
a) - das Programm schon so begonnen wurde
und
b) - wenn jemand noch nicht so firm ist in ABAP, ist es einfacher mit den REUSE-Bausteinen. Und wenn ich mir das letzte Posting von Manu anschaue kämpft er/sie momentan noch mehr mit dem ABAP an sich. Für die OO-Variante muss ich doch schon mehr wissen um im Fehlerfall herauszufinden wo ich etwas vergessen habe. ( Handlerklasse anlegen, Events registrieren falls nicht automatisch registriert, Handler registrieren ).