‎2007 Aug 10 5:24 AM
Experts say "a mindshift" is required when coding business logic in ABAP OO...so let's find out the SDN-ers midshift towards it, shall we?
See simple report program below, its written using the classical ABAP procedural approach. How would you write the same program using ABAP OO without coding anything in procedural and keeping in mind the basic principles of OO, i.e. data encapsulation, instantiation etc. etc.
<b>Note: Logical database MSM is used for the current report but you can avoid it when converting to ABAP OO if you wish.</b>
I promise to reward a minimum of 6 points to anyone who gives it a try!!
Happy coding.
report z_matmas
message-id z001.
*----------------------------------------------------------------------*
*/Tables *
*----------------------------------------------------------------------*
tables: marav, "Database View for using Logical Database MSM
mbewv. "Structure View for using Logical Database MSM
*----------------------------------------------------------------------*
*/Data *
*----------------------------------------------------------------------*
type-pools: slis,
abap.
types: begin of ty_matmas,
matnr type matnr,
maktx type maktx,
ntgew type ntgew,
uom1 type gewei,
brgew type brgew,
uom2 type gewei,
volum type volum,
uom3 type voleh,
wunit type umrez,
wshpu type umrez,
wpalt type umrez,
mhdhb type mhdhb,
prdha type prodh_d,
werks type werks_d,
stprs type stprs,
uom4 type waers,
wwsal type kbetr,
uom5 type waers,
vmsta type vmsta,
end of ty_matmas.
data: wa_matmas type ty_matmas,
gt_matmas type standard table of ty_matmas,
wa_mvke type mvke,
gt_mvke type standard table of mvke,
gt_marm type standard table of marm.
data: werks_wa type werks_d,
vmsta_wa like tvms-vmsta.
data: gs_alv_fieldcat type slis_fieldcat_alv.
*-----------------------------------------------------------------------*
*/Macros *
*-----------------------------------------------------------------------*
define _set_fieldcat.
clear gs_alv_fieldcat.
gs_alv_fieldcat-tabname = &1.
gs_alv_fieldcat-fieldname = &2.
gs_alv_fieldcat-outputlen = &3.
gs_alv_fieldcat-seltext_l = &4.
gs_alv_fieldcat-key = space.
gs_alv_fieldcat-no_out = space.
end-of-definition.
*----------------------------------------------------------------------*
*/Parameters & Select-options *
*----------------------------------------------------------------------*
selection-screen begin of block cus with frame title text-s00.
select-options: s_werks for werks_wa obligatory default '1000',
s_vmsta for vmsta_wa.
selection-screen skip.
parameters: p_hrarcy as checkbox.
selection-screen end of block cus.
*----------------------------------------------------------------------*
*/Start-of-selection *
*----------------------------------------------------------------------*
start-of-selection.
perform: get_mvke,
get_weights_marm.
*----------------------------------------------------------------------*
*/GET *
*----------------------------------------------------------------------*
get marav.
*----------------------------------------------------------------------*
*/GET *
*----------------------------------------------------------------------*
get mbewv.
check mbewv-bwkey in s_werks.
perform collect_marav.
*----------------------------------------------------------------------*
*/End-of-selection *
*----------------------------------------------------------------------*
end-of-selection.
*----------------------------------------------------------------------*
* Display the report in ALV *
*----------------------------------------------------------------------*
perform disp_alv.
*&---------------------------------------------------------------------*
*& Form collect_marav
*&---------------------------------------------------------------------*
form collect_marav.
read table gt_mvke into wa_mvke with key matnr = marav-matnr
binary search.
if sy-subrc = 0.
* Transfer gross & net weight
perform trnsf_weights.
* Get Wholesale price
perform get_whsalprice.
* Get standard price for each plant
perform get_stdprice.
else.
reject 'MARAV'.
endif.
endform. "COLLECT_MARAV
*&---------------------------------------------------------------------*
*& Form get_whsalprice
*&---------------------------------------------------------------------*
form get_whsalprice.
data: l_kpein type kpein.
select k~kbetr k~kpein up to 1 rows
into (wa_matmas-wwsal, l_kpein)
from konp as k
inner join a304 as a
on k~knumh = a~knumh
where a~kappl = 'V' and
a~kschl = 'ZPRC' and
a~vkorg = wa_mvke-vkorg and
a~vtweg = wa_mvke-vtweg and
a~matnr = wa_mvke-matnr and
a~kfrst = space and
a~datbi >= sy-datum.
endselect.
check sy-subrc = 0.
wa_matmas-wwsal = wa_matmas-wwsal / l_kpein.
select single waers
into wa_matmas-uom5
from t001k as a
inner join t001 as b
on a~bukrs = b~bukrs
where a~bwkey = mbewv-bwkey.
endform. "GET_WHSALPRICE
*&---------------------------------------------------------------------*
*& Form get_stdprice
*&---------------------------------------------------------------------*
form get_stdprice.
if mbewv-bwtar is initial.
select single werks
from marc
into wa_matmas-werks
where matnr = marav-matnr
and werks = mbewv-bwkey.
wa_matmas-stprs = mbewv-stprs / mbewv-peinh.
if not wa_matmas-stprs is initial.
if not wa_matmas-uom5 is initial.
wa_matmas-uom4 = wa_matmas-uom5.
else.
select single waers
into wa_matmas-uom4
from t001k as a
inner join t001 as b
on a~bukrs = b~bukrs
where a~bwkey = mbewv-bwkey.
endif.
endif.
endif.
move wa_mvke-vmsta to wa_matmas-vmsta.
append wa_matmas to gt_matmas.
clear wa_matmas.
endform. "GET_STDPRICE
*&---------------------------------------------------------------------*
*& Form trnsf_weights
*&---------------------------------------------------------------------*
form trnsf_weights.
data: lw_marm type marm.
move-corresponding marav to wa_matmas.
if not wa_matmas-ntgew is initial.
move marav-gewei to wa_matmas-uom1.
endif.
if not wa_matmas-brgew is initial.
move marav-gewei to wa_matmas-uom2.
endif.
if not wa_matmas-volum is initial.
call function 'CONVERSION_EXIT_CUNIT_OUTPUT'
exporting
input = marav-voleh
language = sy-langu
importing
output = wa_matmas-uom3
exceptions
unit_not_found = 1
others = 2.
endif.
shift wa_matmas-matnr left deleting leading '0'.
check marav-meins = 'CS'.
loop at gt_marm into lw_marm where matnr = marav-matnr.
case lw_marm-meinh.
when 'EA'.
wa_matmas-wunit = lw_marm-umren / lw_marm-umrez.
when 'SHU'.
wa_matmas-wshpu = lw_marm-umrez / lw_marm-umren.
when 'SHP'.
wa_matmas-wpalt = lw_marm-umrez / lw_marm-umren.
when others.
endcase.
endloop.
endform. "TRNSF_WEIGHTS
*&---------------------------------------------------------------------*
*& Form disp_alv
*&---------------------------------------------------------------------*
form disp_alv .
data: ls_layout type slis_layout_alv,
lt_events type slis_t_event,
lt_fieldcat type slis_t_fieldcat_alv,
li_sort type slis_t_sortinfo_alv.
* Sort if user has opted to sort by Product Hierarchy
if not p_hrarcy is initial.
sort gt_matmas by prdha.
endif.
* Check to see that we have data
describe table gt_matmas[] lines sy-tfill.
if sy-tfill = 0.
message i016.
exit.
endif.
* Layout
perform get_layout changing ls_layout.
* Get the field catalog
perform get_fieldcat changing lt_fieldcat.
* Sorting
perform fill_sort changing li_sort.
* Display the report
call function 'REUSE_ALV_GRID_DISPLAY'
exporting
i_callback_program = sy-repid
i_callback_top_of_page = 'TOP_OF_PAGE'
is_layout = ls_layout
it_fieldcat = lt_fieldcat
i_save = 'A'
it_sort = li_sort
it_events = lt_events
tables
t_outtab = gt_matmas
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.
endform. " disp_alv
*&---------------------------------------------------------------------*
*& Form get_layout
*&---------------------------------------------------------------------*
form get_layout changing ps_layout type slis_layout_alv.
* Set the layout structure
ps_layout-zebra = abap_true.
ps_layout-get_selinfos = abap_true.
ps_layout-colwidth_optimize = abap_true.
endform. " get_layout
*&---------------------------------------------------------------------*
*& Form get_fieldcat
*&---------------------------------------------------------------------*
form get_fieldcat changing pt_fieldcat type slis_t_fieldcat_alv.
field-symbols:
<fs_sr> type abap_compdescr,
<fcat> type line of slis_t_fieldcat_alv.
data:
lv_pos type sy-tabix,
lo_strucdesc type ref to cl_abap_structdescr,
lt_fc_sr type abap_compdescr_tab,
lv_fieldcat type slis_t_fieldcat_alv.
* Read fields of structure 'wa_matmas'
lo_strucdesc ?= cl_abap_typedescr=>describe_by_data( wa_matmas ).
lt_fc_sr = lo_strucdesc->components.
loop at lt_fc_sr assigning <fs_sr>.
lv_pos = sy-tabix.
read table lv_fieldcat assigning <fcat>
with key fieldname = <fs_sr>-name.
if sy-subrc eq 0.
<fcat>-col_pos = lv_pos.
<fcat>-tabname = 'GT_MATMAS'.
append <fcat> to pt_fieldcat[].
else.
_set_fieldcat 'GT_matmas'
<fs_sr>-name
<fs_sr>-length
space.
gs_alv_fieldcat-col_pos = lv_pos.
case <fs_sr>-name.
when 'MATNR'.
gs_alv_fieldcat-reptext_ddic = 'Material Code'(801).
gs_alv_fieldcat-key = abap_true.
when 'MAKTX'.
gs_alv_fieldcat-reptext_ddic = 'Description'(802).
when 'NTGEW'.
gs_alv_fieldcat-reptext_ddic = 'Net Weight'(803).
gs_alv_fieldcat-no_zero = abap_true.
when 'UOM1' or 'UOM2' or 'UOM3'.
gs_alv_fieldcat-reptext_ddic = 'UoM'(824).
when 'UOM4' or 'UOM5'.
gs_alv_fieldcat-reptext_ddic = 'Currency'(825).
when 'BRGEW'.
gs_alv_fieldcat-reptext_ddic = 'Gross Weight'(804).
gs_alv_fieldcat-no_zero = abap_true.
when 'VOLUM'.
gs_alv_fieldcat-reptext_ddic = 'Case Volume'(805).
gs_alv_fieldcat-no_zero = abap_true.
when 'WUNIT'.
gs_alv_fieldcat-reptext_ddic = 'Each/Case'(806).
gs_alv_fieldcat-no_zero = abap_true.
when 'WSHPU'.
gs_alv_fieldcat-reptext_ddic = 'Case/Shipping Unit'(807).
gs_alv_fieldcat-no_zero = abap_true.
when 'WPALT'.
gs_alv_fieldcat-reptext_ddic = 'Case/Pallet'(808).
gs_alv_fieldcat-no_zero = abap_true.
when 'MHDHB'.
gs_alv_fieldcat-reptext_ddic = 'Total Shelf Life'(809).
gs_alv_fieldcat-no_zero = abap_true.
when 'PRDHA'.
gs_alv_fieldcat-reptext_ddic = 'Product Hierarchy'(810).
when 'WERKS'.
gs_alv_fieldcat-reptext_ddic = 'Delivery Plant'(811).
when 'STPRS'.
gs_alv_fieldcat-reptext_ddic = 'Standard Price'(812).
gs_alv_fieldcat-no_zero = abap_true.
when 'WWSAL'.
gs_alv_fieldcat-reptext_ddic = 'Wholesale Price'(815).
gs_alv_fieldcat-no_zero = abap_true.
when 'VMSTA'.
gs_alv_fieldcat-reptext_ddic = 'Sales Stat'(813).
endcase.
append gs_alv_fieldcat to pt_fieldcat[].
endif.
endloop.
endform. " get_fieldcat
*&---------------------------------------------------------------------*
*& Form top_of_page
*&---------------------------------------------------------------------*
form top_of_page.
call function 'Z_ALV_REPORT_HEADER'
exporting
report_name = sy-repid.
endform. "top_of_page
*&---------------------------------------------------------------------*
*& Form fill_sort
*&---------------------------------------------------------------------*
form fill_sort changing ci_sort type slis_t_sortinfo_alv.
data lw_sort type slis_sortinfo_alv.
* Sort by material number or product hierarchy
lw_sort-spos = 1.
if p_hrarcy is initial.
lw_sort-fieldname = 'MATNR'.
else.
lw_sort-fieldname = 'PRDHA'.
endif.
append lw_sort to ci_sort.
endform. " fill_sort
*&---------------------------------------------------------------------*
*& Form get_mvke
*&---------------------------------------------------------------------*
form get_mvke .
select * from mvke into table gt_mvke
where matnr in ms_matnr
and vmsta in s_vmsta
order by matnr.
endform. " get_mvke
*&---------------------------------------------------------------------*
*& Form get_weights_marm
*&---------------------------------------------------------------------*
form get_weights_marm .
select * from marm into table gt_marm
where matnr in ms_matnr
and meinh in ('EA', 'SHU', 'SHP')
order by matnr meinh.
endform. " get_weights_marm
‎2007 Aug 14 6:04 AM
Hello Sougata
I have somewhat elaborated my sample coding. Please note that there are still some flaws and shortcomings, e.g:
- itab MT_MATMAS of class LCL_MATMAS should be defined as READ-ONLY (However, when call method cl_salv_table=>factory the output itab must be changeable)
- the entire processing of the ALV list (including layout, fieldcatalog, variants) should be encapsulated within a separate class
Yet I hope the sample gives you a "taste" of OO-like coding.
When thinking about OO-programming think in terms of <b>responsibilities</b>.<i> "Is my class really responsible of knowing these details or being capable of doing something?"</i>
===================================================
REPORT zus_sdn_z_matmas_oo
MESSAGE-ID z001.
* NOTE: OO-Version of Z_MATMAS (SDN)
*----------------------------------------------------------------------*
*/Tables *
*----------------------------------------------------------------------*
TABLES: marav, "Database View for using Logical Database MSM
mbewv. "Structure View for using Logical Database MSM
*----------------------------------------------------------------------*
*/Data *
*----------------------------------------------------------------------*
TYPE-POOLS: slis,
abap.
INCLUDE zus_sdn_z_matmas_oo_c0. " class definition
INCLUDE zus_sdn_z_matmas_oo_c1. " class implementation
DATA:
go_matmas TYPE REF TO lcl_matmas,
go_alvgrid TYPE REF TO lcl_alvgrid.
TYPES: BEGIN OF ty_matmas,
matnr TYPE matnr,
maktx TYPE maktx,
ntgew TYPE ntgew,
uom1 TYPE gewei,
brgew TYPE brgew,
uom2 TYPE gewei,
volum TYPE volum,
uom3 TYPE voleh,
wunit TYPE umrez,
wshpu TYPE umrez,
wpalt TYPE umrez,
mhdhb TYPE mhdhb,
prdha TYPE prodh_d,
werks TYPE werks_d,
stprs TYPE stprs,
uom4 TYPE waers,
wwsal TYPE kbetr,
uom5 TYPE waers,
vmsta TYPE vmsta,
END OF ty_matmas.
DATA: wa_matmas TYPE ty_matmas,
gt_matmas TYPE STANDARD TABLE OF ty_matmas.
DATA: werks_wa TYPE werks_d,
vmsta_wa LIKE tvms-vmsta.
DATA: gs_alv_fieldcat TYPE slis_fieldcat_alv.
*-----------------------------------------------------------------------
*
*/Macros
*
*-----------------------------------------------------------------------
*
DEFINE _set_fieldcat.
clear gs_alv_fieldcat.
gs_alv_fieldcat-tabname = &1.
gs_alv_fieldcat-fieldname = &2.
gs_alv_fieldcat-outputlen = &3.
gs_alv_fieldcat-seltext_l = &4.
gs_alv_fieldcat-key = space.
gs_alv_fieldcat-no_out = space.
END-OF-DEFINITION.
*----------------------------------------------------------------------*
*/Parameters & Select-options *
*----------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK cus WITH FRAME TITLE text-s00.
SELECT-OPTIONS: s_werks FOR werks_wa OBLIGATORY DEFAULT '1000',
s_vmsta FOR vmsta_wa.
SELECTION-SCREEN SKIP.
PARAMETERS: p_hrarcy AS CHECKBOX.
SELECTION-SCREEN END OF BLOCK cus.
*----------------------------------------------------------------------*
*/Start-of-selection *
*----------------------------------------------------------------------*
START-OF-SELECTION.
** PERFORM: get_mvke,
** get_weights_marm.
* Replaced by:
CREATE OBJECT:
go_matmas,
go_alvgrid.
*----------------------------------------------------------------------*
*/GET *
*----------------------------------------------------------------------*
GET marav.
*----------------------------------------------------------------------*
*/GET *
*----------------------------------------------------------------------*
GET mbewv.
CHECK mbewv-bwkey IN s_werks.
** PERFORM collect_marav.
* Replaced by:
CALL METHOD go_matmas->collect_marav
EXPORTING
is_marav = marav
is_mbewv = mbewv
EXCEPTIONS
rejected = 1.
IF ( syst-subrc NE 0 ).
REJECT 'MARAV'.
ENDIF.
*----------------------------------------------------------------------*
*/End-of-selection *
*----------------------------------------------------------------------*
* Check to see that we have data
DESCRIBE TABLE go_matmas->mt_matmas.
IF sy-tfill = 0.
MESSAGE i016.
EXIT.
ENDIF.
go_matmas->sort_by_hierarchy( ).
END-OF-SELECTION.
*----------------------------------------------------------------------*
* Display the report in ALV *
*----------------------------------------------------------------------*
PERFORM disp_alv.
*&---------------------------------------------------------------------*
*& Form disp_alv
*&---------------------------------------------------------------------*
FORM disp_alv .
DATA: ls_layout TYPE slis_layout_alv,
lt_events TYPE slis_t_event,
lt_fieldcat TYPE slis_t_fieldcat_alv,
li_sort TYPE slis_t_sortinfo_alv.
*** Sort if user has opted to sort by Product Hierarchy
** IF NOT p_hrarcy IS INITIAL.
** SORT gt_matmas BY prdha.
** ENDIF.
DATA:
lo_table TYPE REF TO cl_salv_table.
TRY.
CALL METHOD cl_salv_table=>factory
* EXPORTING
* LIST_DISPLAY = IF_SALV_C_BOOL_SAP=>FALSE
* R_CONTAINER =
* CONTAINER_NAME =
IMPORTING
r_salv_table = lo_table
CHANGING
t_table = go_matmas->mt_matmas.
CATCH cx_salv_msg .
ENDTRY.
CHECK ( lo_table IS BOUND ).
lo_table->display( ).
*** Layout
** PERFORM get_layout CHANGING ls_layout.
**
*** Get the field catalog
** PERFORM get_fieldcat CHANGING lt_fieldcat.
**
*** Sorting
** PERFORM fill_sort CHANGING li_sort.
*** Display the report
** CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
** EXPORTING
** i_callback_program = sy-repid
** i_callback_top_of_page = 'TOP_OF_PAGE'
** is_layout = ls_layout
** it_fieldcat = lt_fieldcat
** i_save = 'A'
** it_sort = li_sort
** it_events = lt_events
** TABLES
** t_outtab = gt_matmas
** 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.
ENDFORM. " disp_alv
*&---------------------------------------------------------------------*
*& Form get_layout
*&---------------------------------------------------------------------*
FORM get_layout CHANGING ps_layout TYPE slis_layout_alv.
* Set the layout structure
ps_layout-zebra = abap_true.
ps_layout-get_selinfos = abap_true.
ps_layout-colwidth_optimize = abap_true.
ENDFORM. " get_layout
*&---------------------------------------------------------------------*
*& Form get_fieldcat
*&---------------------------------------------------------------------*
FORM get_fieldcat CHANGING pt_fieldcat TYPE slis_t_fieldcat_alv.
FIELD-SYMBOLS:
<fs_sr> TYPE abap_compdescr,
<fcat> TYPE LINE OF slis_t_fieldcat_alv.
DATA:
lv_pos TYPE sy-tabix,
lo_strucdesc TYPE REF TO cl_abap_structdescr,
lt_fc_sr TYPE abap_compdescr_tab,
lv_fieldcat TYPE slis_t_fieldcat_alv.
* Read fields of structure 'wa_matmas'
lo_strucdesc ?= cl_abap_typedescr=>describe_by_data( wa_matmas ).
lt_fc_sr = lo_strucdesc->components.
LOOP AT lt_fc_sr ASSIGNING <fs_sr>.
lv_pos = sy-tabix.
READ TABLE lv_fieldcat ASSIGNING <fcat>
WITH KEY fieldname = <fs_sr>-name.
IF sy-subrc EQ 0.
<fcat>-col_pos = lv_pos.
<fcat>-tabname = 'GT_MATMAS'.
APPEND <fcat> TO pt_fieldcat[].
ELSE.
_set_fieldcat 'GT_matmas'
<fs_sr>-name
<fs_sr>-length
space.
gs_alv_fieldcat-col_pos = lv_pos.
CASE <fs_sr>-name.
WHEN 'MATNR'.
gs_alv_fieldcat-reptext_ddic = 'Material Code'(801).
gs_alv_fieldcat-key = abap_true.
WHEN 'MAKTX'.
gs_alv_fieldcat-reptext_ddic = 'Description'(802).
WHEN 'NTGEW'.
gs_alv_fieldcat-reptext_ddic = 'Net Weight'(803).
gs_alv_fieldcat-no_zero = abap_true.
WHEN 'UOM1' OR 'UOM2' OR 'UOM3'.
gs_alv_fieldcat-reptext_ddic = 'UoM'(824).
WHEN 'UOM4' OR 'UOM5'.
gs_alv_fieldcat-reptext_ddic = 'Currency'(825).
WHEN 'BRGEW'.
gs_alv_fieldcat-reptext_ddic = 'Gross Weight'(804).
gs_alv_fieldcat-no_zero = abap_true.
WHEN 'VOLUM'.
gs_alv_fieldcat-reptext_ddic = 'Case Volume'(805).
gs_alv_fieldcat-no_zero = abap_true.
WHEN 'WUNIT'.
gs_alv_fieldcat-reptext_ddic = 'Each/Case'(806).
gs_alv_fieldcat-no_zero = abap_true.
WHEN 'WSHPU'.
gs_alv_fieldcat-reptext_ddic = 'Case/Shipping Unit'(807).
gs_alv_fieldcat-no_zero = abap_true.
WHEN 'WPALT'.
gs_alv_fieldcat-reptext_ddic = 'Case/Pallet'(808).
gs_alv_fieldcat-no_zero = abap_true.
WHEN 'MHDHB'.
gs_alv_fieldcat-reptext_ddic = 'Total Shelf Life'(809).
gs_alv_fieldcat-no_zero = abap_true.
WHEN 'PRDHA'.
gs_alv_fieldcat-reptext_ddic = 'Product Hierarchy'(810).
WHEN 'WERKS'.
gs_alv_fieldcat-reptext_ddic = 'Delivery Plant'(811).
WHEN 'STPRS'.
gs_alv_fieldcat-reptext_ddic = 'Standard Price'(812).
gs_alv_fieldcat-no_zero = abap_true.
WHEN 'WWSAL'.
gs_alv_fieldcat-reptext_ddic = 'Wholesale Price'(815).
gs_alv_fieldcat-no_zero = abap_true.
WHEN 'VMSTA'.
gs_alv_fieldcat-reptext_ddic = 'Sales Stat'(813).
ENDCASE.
APPEND gs_alv_fieldcat TO pt_fieldcat[].
ENDIF.
ENDLOOP.
ENDFORM. " get_fieldcat
*&---------------------------------------------------------------------*
*& Form top_of_page
*&---------------------------------------------------------------------*
FORM top_of_page.
** CALL FUNCTION 'Z_ALV_REPORT_HEADER'
** EXPORTING
** report_name = sy-repid.
ENDFORM. "top_of_page
*&---------------------------------------------------------------------*
*& Form fill_sort
*&---------------------------------------------------------------------*
FORM fill_sort CHANGING ci_sort TYPE slis_t_sortinfo_alv.
DATA lw_sort TYPE slis_sortinfo_alv.
* Sort by material number or product hierarchy
lw_sort-spos = 1.
IF p_hrarcy IS INITIAL.
lw_sort-fieldname = 'MATNR'.
ELSE.
lw_sort-fieldname = 'PRDHA'.
ENDIF.
APPEND lw_sort TO ci_sort.
ENDFORM. " fill_sort===============================================
*&---------------------------------------------------------------------*
*& Include ZUS_SDN_Z_MATMAS_OO_C0
*&---------------------------------------------------------------------*
*---------------------------------------------------------------------*
* CLASS lcl_matmas DEFINITION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS lcl_matmas DEFINITION.
PUBLIC SECTION.
TYPES: BEGIN OF ty_matmas,
matnr TYPE matnr,
maktx TYPE maktx,
ntgew TYPE ntgew,
uom1 TYPE gewei,
brgew TYPE brgew,
uom2 TYPE gewei,
volum TYPE volum,
uom3 TYPE voleh,
wunit TYPE umrez,
wshpu TYPE umrez,
wpalt TYPE umrez,
mhdhb TYPE mhdhb,
prdha TYPE prodh_d,
werks TYPE werks_d,
stprs TYPE stprs,
uom4 TYPE waers,
wwsal TYPE kbetr,
uom5 TYPE waers,
vmsta TYPE vmsta,
END OF ty_matmas.
CLASS-DATA:
mc_meins_cs TYPE meins VALUE 'CS' READ-ONLY,
mc_meinh_ea TYPE lrmei VALUE 'EA' READ-ONLY,
mc_meinh_shu TYPE lrmei VALUE 'SHU' READ-ONLY,
mc_meinh_shp TYPE lrmei VALUE 'SHP' READ-ONLY.
DATA:
ms_matmas TYPE ty_matmas,
mt_matmas TYPE STANDARD TABLE OF ty_matmas.
METHODS:
constructor
IMPORTING
value(id_calling_program) TYPE syrepid DEFAULT sy-repid,
collect_marav
IMPORTING
value(is_marav) TYPE marav
value(is_mbewv) TYPE mbewv
EXCEPTIONS
rejected,
sort_by_hierarchy.
PRIVATE SECTION.
DATA:
mt_selopts TYPE rsparams_tt,
ms_mvke TYPE mvke,
mt_mvke TYPE STANDARD TABLE OF mvke,
mt_marm TYPE STANDARD TABLE OF marm.
METHODS:
get_mvke,
get_weights_marm,
transfer_gross_and_net_weights
IMPORTING
value(is_marav) TYPE marav
RETURNING
value(rs_matmas) TYPE ty_matmas,
get_whsalprice
IMPORTING
value(is_mvke) TYPE mvke
value(id_bwkey) TYPE bwkey
CHANGING
value(cs_matmas) TYPE ty_matmas,
get_stdprice
IMPORTING
value(is_mbewv) TYPE mbewv
CHANGING
value(cs_matmas) TYPE ty_matmas.
ENDCLASS. "lcl_matmas DEFINITION
*---------------------------------------------------------------------*
* CLASS lcl_alvgrid DEFINITION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS lcl_alvgrid DEFINITION.
ENDCLASS. "lcl_alvgrid DEFINITION===========================================
*&---------------------------------------------------------------------*
*& Include ZUS_SDN_Z_MATMAS_OO_C1
*&---------------------------------------------------------------------*
*---------------------------------------------------------------------*
* CLASS lcl_matmas IMPLEMENTATION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS lcl_matmas IMPLEMENTATION.
METHOD: constructor.
CALL FUNCTION 'RS_REFRESH_FROM_SELECTOPTIONS'
EXPORTING
curr_report = id_calling_program
* IMPORTING
* SP =
TABLES
selection_table = me->mt_selopts
EXCEPTIONS
not_found = 1
no_report = 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.
get_mvke( ).
get_weights_marm( ).
ENDMETHOD. "constructor
METHOD get_mvke.
* define local data
DATA:
ls_rsparams TYPE rsparams,
lr_matnr TYPE RANGE OF matnr,
ls_rng_mat LIKE LINE OF lr_matnr,
lr_vmsta TYPE RANGE OF vmsta,
ls_rng_vms LIKE LINE OF lr_vmsta.
LOOP AT me->mt_selopts INTO ls_rsparams
WHERE ( selname = 'MS_MATNR' ).
MOVE-CORRESPONDING ls_rsparams TO ls_rng_mat.
APPEND ls_rng_mat TO lr_matnr.
ENDLOOP.
LOOP AT me->mt_selopts INTO ls_rsparams
WHERE ( selname = 'S_VMSTA' ).
MOVE-CORRESPONDING ls_rsparams TO ls_rng_vms.
APPEND ls_rng_vms TO lr_vmsta.
ENDLOOP.
DELETE lr_matnr WHERE ( table_line IS INITIAL ).
DELETE lr_vmsta WHERE ( table_line IS INITIAL ).
SELECT * FROM mvke INTO TABLE me->mt_mvke
WHERE matnr IN lr_matnr
AND vmsta IN lr_vmsta
ORDER BY matnr.
ENDMETHOD. "get_mvke
METHOD get_weights_marm.
* define local data
DATA:
ls_rsparams TYPE rsparams,
lr_matnr TYPE RANGE OF matnr,
ls_rng_mat LIKE LINE OF lr_matnr,
lr_vmsta TYPE RANGE OF vmsta,
ls_rng_vms LIKE LINE OF lr_vmsta.
LOOP AT me->mt_selopts INTO ls_rsparams
WHERE ( selname = 'MS_MATNR' ).
MOVE-CORRESPONDING ls_rsparams TO ls_rng_mat.
APPEND ls_rng_mat TO lr_matnr.
ENDLOOP.
DELETE lr_matnr WHERE ( table_line IS INITIAL ).
SELECT * FROM marm INTO TABLE me->mt_marm
WHERE matnr IN lr_matnr
** AND meinh IN ( 'EA', 'SHU', 'SHP')
AND ( meinh EQ mc_meinh_ea OR
meinh EQ mc_meinh_shu OR
meinh EQ mc_meinh_shp )
ORDER BY matnr meinh.
ENDMETHOD. "get_weights_marm
METHOD collect_marav.
* define local data
DATA:
ls_mvke TYPE mvke,
ls_matmas TYPE ty_matmas.
READ TABLE me->mt_mvke INTO ls_mvke
WITH KEY matnr = is_marav-matnr
BINARY SEARCH.
IF sy-subrc = 0.
* Transfer gross & net weight
ls_matmas = transfer_gross_and_net_weights( is_marav ).
* Get Wholesale price
CALL METHOD me->get_whsalprice
EXPORTING
is_mvke = ls_mvke
id_bwkey = is_mbewv-bwkey
CHANGING
cs_matmas = ls_matmas.
* Get standard price for each plant
CALL METHOD me->get_stdprice
EXPORTING
is_mbewv = is_mbewv
CHANGING
cs_matmas = ls_matmas.
MOVE ls_mvke-vmsta TO ls_matmas-vmsta.
APPEND ls_matmas TO me->mt_matmas.
CLEAR ls_matmas.
ELSE.
** REJECT 'MARAV'.
RAISE rejected.
ENDIF.
ENDMETHOD. "collect_marav
METHOD transfer_gross_and_net_weights.
" define local data
DATA:
ls_marm TYPE marm.
MOVE-CORRESPONDING is_marav TO rs_matmas.
IF ( rs_matmas-ntgew IS NOT INITIAL ).
MOVE is_marav-gewei TO rs_matmas-uom1.
ENDIF.
IF ( rs_matmas-brgew IS NOT INITIAL ).
MOVE is_marav-gewei TO rs_matmas-uom2.
ENDIF.
IF ( rs_matmas-volum IS NOT INITIAL ).
CALL FUNCTION 'CONVERSION_EXIT_CUNIT_OUTPUT'
EXPORTING
input = is_marav-voleh
language = sy-langu
IMPORTING
output = rs_matmas-uom3
EXCEPTIONS
unit_not_found = 1
OTHERS = 2.
ENDIF.
SHIFT rs_matmas-matnr LEFT DELETING LEADING '0'.
CHECK is_marav-meins = 'CS'.
LOOP AT me->mt_marm INTO ls_marm
WHERE ( matnr = is_marav-matnr ).
CASE ls_marm-meinh.
WHEN mc_meinh_ea.
rs_matmas-wunit = ls_marm-umren / ls_marm-umrez.
WHEN mc_meinh_shu.
rs_matmas-wshpu = ls_marm-umrez / ls_marm-umren.
WHEN 'SHP'.
rs_matmas-wpalt = ls_marm-umrez / ls_marm-umren.
WHEN OTHERS.
ENDCASE.
ENDLOOP.
ENDMETHOD. "transfer_gross_and_net_weights
METHOD get_whsalprice.
" define local data
DATA:
ld_kpein TYPE kpein.
SELECT k~kbetr k~kpein UP TO 1 ROWS
INTO (cs_matmas-wwsal, ld_kpein)
FROM konp AS k
INNER JOIN a304 AS a
ON k~knumh = a~knumh
WHERE a~kappl = 'V' AND
a~kschl = 'ZPRC' AND
a~vkorg = is_mvke-vkorg AND
a~vtweg = is_mvke-vtweg AND
a~matnr = is_mvke-matnr AND
a~kfrst = space AND
a~datbi >= sy-datum.
ENDSELECT.
CHECK sy-subrc = 0.
cs_matmas-wwsal = cs_matmas-wwsal / ld_kpein.
SELECT SINGLE waers
INTO cs_matmas-uom5
FROM t001k AS a
INNER JOIN t001 AS b
ON a~bukrs = b~bukrs
WHERE a~bwkey = id_bwkey.
ENDMETHOD. "get_whsalprice
METHOD get_stdprice.
IF ( is_mbewv-bwtar IS INITIAL ).
SELECT SINGLE werks
FROM marc
INTO cs_matmas-werks
** WHERE matnr = marav-matnr
WHERE matnr = cs_matmas-matnr
AND werks = is_mbewv-bwkey.
cs_matmas-stprs = is_mbewv-stprs / is_mbewv-peinh.
IF ( cs_matmas-stprs IS NOT INITIAL ).
IF ( cs_matmas-uom5 IS NOT INITIAL ).
cs_matmas-uom4 = cs_matmas-uom5.
ELSE.
SELECT SINGLE waers
INTO cs_matmas-uom4
FROM t001k AS a
INNER JOIN t001 AS b
ON a~bukrs = b~bukrs
WHERE a~bwkey = is_mbewv-bwkey.
ENDIF.
ENDIF.
ENDIF.
** MOVE wa_mvke-vmsta TO wa_matmas-vmsta.
** APPEND wa_matmas TO gt_matmas.
** CLEAR wa_matmas.
* NOTE: It is highly intransparent that the output entries
* are collected in a method called GET_STDPRICE.
* -> moved to calling method COLLECT_MARAV
ENDMETHOD. "get_stdprice
METHOD sort_by_hierarchy.
* Sort if user has opted to sort by Product Hierarchy
** IF NOT p_hrarcy IS INITIAL.
** SORT gt_matmas BY prdha.
** ENDIF.
* NOTE: replaced by...
DATA:
ls_params TYPE rsparams.
READ TABLE me->mt_selopts INTO ls_params
WITH KEY selname = 'P_HRARCY'.
CHECK ( syst-subrc = 0 ).
IF ( ls_params-low = abap_true ).
SORT me->mt_matmas BY prdha.
ENDIF.
ENDMETHOD. "sort_by_hierarchy
ENDCLASS. "lcl_matmas IMPLEMENTATION
*---------------------------------------------------------------------*
* CLASS lcl_alvgrid IMPLEMENTATION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS lcl_alvgrid IMPLEMENTATION.
ENDCLASS. "lcl_alvgrid IMPLEMENTATIONRegards
Uwe
‎2007 Aug 10 12:31 PM
I'd break the task down into stages.
First I'd get the ALV part into OO as this is relatively straight forward.
I'll assume you've got some sort of a structure where you can load your data in to --standard SAP.
OK here's the ALV part. I'd create a basic screen 100 (SE51) with a single custom container on it called CCONTAINER1. I'd create a standard STATUS as well (SE41) with the standard SAP buttons on it --bog standard --no need to code.
Then run this type of program.
I haven't shown the selection screens etc you need as this won't change.
You still need to get your data into a table to display it.
I've generated a dynamic table from your structure and then use a CLASS to display / manipulate it.
Program ZJIMBOTESTX.
Generic editable ALV prog with dynamic structure and FCAT.
Jimbo 2007.
DEFINE col_name.
READ TABLE it_fldcat INTO wa_it_fldcat INDEX &1.
wa_it_fldcat-coltext = &2.
wa_it_fldcat-outputlen = &3.
MODIFY it_fldcat FROM wa_it_fldcat INDEX &1.
END-OF-DEFINITION.
FIELD-SYMBOLS :
<fs1> TYPE ANY,
<dyn_table> TYPE STANDARD TABLE,
<orig_table> TYPE STANDARD TABLE,
<dyn_wa>.
INCLUDE ZZJIMBOXX_INCL.
INCLUDE <icon>.
TYPES: types: begin of ty_matmas,
matnr type matnr,
maktx type maktx,
ntgew type ntgew,
uom1 type gewei,
brgew type brgew,
uom2 type gewei,
volum type volum,
uom3 type voleh,
wunit type umrez,
wshpu type umrez,
wpalt type umrez,
mhdhb type mhdhb,
prdha type prodh_d,
werks type werks_d,
stprs type stprs,
uom4 type waers,
wwsal type kbetr,
uom5 type waers,
vmsta type vmsta,
end of ty_matmas.
data: wa_matmas type ty_matmas,
gt_matmas type standard table of ty_matmas.
DATA: z_object TYPE REF TO zcl_alv_test, "Instantiate our class
it_fldcat TYPE lvc_t_fcat,
i_gridtitle TYPE lvc_title,
wa_it_fldcat TYPE lvc_s_fcat,
new_table TYPE REF TO DATA,
dy_table TYPE REF TO DATA,
my_line TYPE wa_matmas,
inserted_tab TYPE lvc_t_moce,
deleted_tab TYPE LVC_T_MOCE,
changed_tab TYPE REF TO DATA,
modified_cells_tab TYPE LVC_T_MODI,
dy_line TYPE REF TO DATA.
START-OF-SELECTION.
CALL SCREEN 100.
END-OF-SELECTION.
MODULE status_0100 OUTPUT.
CREATE OBJECT z_object
EXPORTING z_object = z_object.
CALL METHOD z_object->build_dynamic_structures
EXPORTING
my_line = my_line
calling_program = sy-repid
IMPORTING
dy_table = dy_table
CHANGING
it_fldcat = it_fldcat.
Here before displaying you can change the field catalog to
adjust your own column names.
*col_name col-nr 'your name' output length.
change these to YOUR values you want in your column headings
you can add other bits to the macro if you want
other options such as no display etc.
expand the field-catalog table and add the variables
col_name 2 'Carrier' 5.
col_name 3 'Flt' 4.
col_name 4 'Dep Ctry' 8.
col_name 5 'Dep City' 8.
col_name 6 'Airport' 6.
fill dynmic table and display
PERFORM populate_dynamic_itab.
CALL METHOD z_object->display_grid
EXPORTING
g_outtab = <dyn_table>
g_fldcat = it_fldcat
CHANGING
it_fldcat = it_fldcat
gt_outtab = <dyn_table>.
SET PF-STATUS '001'.
SET TITLEBAR '000'.
ENDMODULE.
MODULE user_command_0100 INPUT.
CASE sy-ucomm.
WHEN 'BACK'.
LEAVE PROGRAM.
WHEN 'EXIT'.
LEAVE PROGRAM.
WHEN 'RETURN'.
LEAVE PROGRAM.
WHEN OTHERS.
ENDCASE.
ENDMODULE.
FORM populate_dynamic_itab.
ASSIGN dy_table->* TO <dyn_table>.
break-point 1.
CREATE DATA dy_line LIKE LINE OF <dyn_table>.
ASSIGN dy_line->* TO <dyn_wa>.
******************>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
SELECT *
UP TO 200 rows
FROM *************I
INTO CORRESPONDING FIELDS OF TABLE <dyn_table>.
Collect your data here
<dyn-table> at this point will have all the fields
of your structure for example <dyn-table>-werks
so you can fill it as per your program
*
**************************************************
save a copy (original table). Use same fcat as ist table.
create 2nd Dyn table to hold original data (optional)
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog = it_fldcat
IMPORTING
ep_table = dy_table.
ASSIGN dy_table->* TO <orig_table>.
CREATE DATA dy_line LIKE LINE OF <orig_table>.
ASSIGN dy_line->* TO <dyn_wa>.
<orig_table> = <dyn_table>.
ENDFORM.
FORM DATA_CHANGED
USING
changed_tab
inserted_tab
deleted_tab
modified_cells_tab.
break-point 1.
ASSIGN changed_tab->* TO <fs1>.
ENDFORM.
FORM process.
Orig table is in dynamic table <orig_table>
ALV GRID changed table is in <dyn_table>.
Loop AT <orig_table> INTO <dyn_wa>.
Do what you want
end
ENDLOOP.
ENDFORM.
FORM refresh.
break-point 1.
change data for example delete some lines.
DELETE <dyn_table> from 1 to 16.
CALL METHOD z_object->refresh_grid.
ENDFORM.
FORM dubbleklik
USING
e_row TYPE lvc_s_row
e_column TYPE lvc_s_col
es_row_no TYPE lvc_s_roid.
SET TITLEBAR '001'.
break-point 2.
i_gridtitle = 'Grid Title Changed'.
CALL METHOD z_object->change_title
EXPORTING
i_gridtitle = i_gridtitle.
PERFORM refresh.
ENDFORM.
Here's the class which you can modify to select your own events / procedures
(this is the INCLUDE component) -- You can add bits to the layout if you want 'ZEBRA' etc but the base class works well. There's also a built in DOWNLOAD to EXCEL which is often useful.
You should be able to use this class for almost ANY structure --DDIC or not so all your ABAP has to do is populate the table with data.
CLASS zcl_alv_test DEFINITION.
PUBLIC SECTION.
METHODS:
constructor
IMPORTING
z_object TYPE REF TO zcl_alv_test,
display_grid
IMPORTING
g_outtab TYPE STANDARD TABLE
g_fldcat TYPE lvc_t_fcat
CHANGING
it_fldcat TYPE lvc_t_fcat
GT_OUTTAB TYPE STANDARD TABLE,
change_title
IMPORTING
i_gridtitle TYPE lvc_title,
refresh_grid,
build_dynamic_structures
IMPORTING
my_line TYPE ANY
calling_program TYPE sy-repid
EXPORTING
dy_table TYPE REF TO DATA
CHANGING
it_fldcat TYPE lvc_t_fcat .
PRIVATE SECTION.
DATA:
lr_rtti_struc TYPE REF TO cl_abap_structdescr,
zog LIKE LINE OF lr_rtti_struc->components,
zogt LIKE table of zog,
wa_it_fldcat TYPE lvc_s_fcat,
it_fldcat TYPE lvc_t_fcat,
dy_table TYPE REF TO DATA,
dy_line TYPE REF TO DATA,
struct_grid_lset TYPE lvc_s_layo,
e_row TYPE lvc_s_row,
e_column TYPE lvc_s_col,
es_rowid TYPE lvc_s_roid,
grid_container1 TYPE REF TO cl_gui_custom_container,
grid1 TYPE REF TO cl_gui_alv_grid,
ls_layout TYPE kkblo_layout,
lt_fieldcat_wa TYPE kkblo_fieldcat,
gt_outtab TYPE REF TO DATA,
l_mode TYPE raw4,
celltab TYPE lvc_t_styl,
wa_celltab TYPE lvc_s_styl,
lt_fieldcat TYPE kkblo_t_fieldcat,
l_tabname TYPE slis_tabname,
ls_toolbar TYPE stb_button,
inserted_tab TYPE lvc_t_moce,
deleted_tab TYPE lvc_t_moce,
changed_tab TYPE REF TO DATA,
caller TYPE sy-repid,
modified_cells_tab TYPE lvc_t_modi,
g_outtab1 TYPE REF TO DATA,
g_fldcat1 TYPE REF TO DATA.
EVENTS: before_user_command.
METHODS:
on_user_command
FOR EVENT before_user_command OF cl_gui_alv_grid
IMPORTING
e_ucomm
sender,
on_toolbar
FOR EVENT toolbar OF cl_gui_alv_grid
IMPORTING
e_object
e_interactive,
on_dubbelklik
FOR EVENT double_click OF cl_gui_alv_grid
IMPORTING
e_row
e_column
es_row_no,
handle_data_changed
FOR EVENT data_changed OF cl_gui_alv_grid
IMPORTING
er_data_changed,
handle_data_changed_finished
FOR EVENT data_changed_finished OF cl_gui_alv_grid
IMPORTING
e_modified
et_good_cells,
process,
dubbelklik
IMPORTING
e_row TYPE lvc_s_row
e_column TYPE lvc_s_col
es_row_no TYPE lvc_s_roid,
return_structure
IMPORTING
my_line TYPE ANY,
create_dynamic_fcat
EXPORTING
it_fldcat TYPE lvc_t_fcat,
create_dynamic_table
IMPORTING
it_fldcat TYPE lvc_t_fcat
EXPORTING
dy_table TYPE REF TO DATA,
download_to_excel,
refresh.
ENDCLASS.
CLASS zcl_alv_test IMPLEMENTATION.
METHOD constructor.
CREATE OBJECT grid_container1
EXPORTING
container_name = 'CCONTAINER1'.
CREATE OBJECT grid1
EXPORTING
i_parent = grid_container1.
SET HANDLER z_object->on_user_command for grid1.
SET HANDLER z_object->on_toolbar for grid1.
SET HANDLER Z_OBJECT->handle_data_changed FOR grid1.
SET HANDLER Z_OBJECT->handle_data_changed_finished FOR grid1.
SET HANDLER Z_OBJECT->on_dubbelklik FOR grid1.
CALL METHOD grid1->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_enter.
ENDMETHOD.
METHOD on_dubbelklik.
CALL METHOD me->dubbelklik
EXPORTING
e_row = e_row
e_column = e_column
es_row_no = es_row_no.
break-point 1.
ENDMETHOD.
METHOD handle_data_changed.
Insert user code here if required
this METHOD is entered if user ENTERS DATA.
break-point 2.
changed_tab = er_data_changed->mp_mod_rows.
inserted_tab = er_data_changed->mt_inserted_rows.
deleted_tab = er_data_changed->mt_deleted_rows.
modified_cells_tab = er_data_changed->mt_mod_cells.
PERFORM data_changed IN PROGRAM (caller) IF FOUND
USING changed_tab
inserted_tab
deleted_tab
modified_cells_tab.
ENDMETHOD.
METHOD handle_data_changed_finished.
Insert user code here if required
METHOD entered here after data entry has finished.
ENDMETHOD.
METHOD return_structure.
lr_rtti_struc ?= cl_abap_structdescr=>DESCRIBE_BY_DATA( my_line ).
zogt[] = lr_rtti_struc->components.
ENDMETHOD.
METHOD create_dynamic_fcat.
LOOP AT zogt INTO zog.
CLEAR wa_it_fldcat.
wa_it_fldcat-fieldname = zog-name .
wa_it_fldcat-dataTYPE = zog-TYPE_kind.
wa_it_fldcat-intTYPE = zog-TYPE_kind.
wa_it_fldcat-intlen = zog-length.
wa_it_fldcat-decimals = zog-decimals.
wa_it_fldcat-coltext = zog-name.
wa_it_fldcat-lowercase = 'X'.
APPEND wa_it_fldcat TO it_fldcat .
ENDLOOP.
ENDMETHOD.
METHOD download_to_excel.
field-symbols:
<fs0> TYPE standard table,
<fs1> TYPE standard table.
assign g_outtab1->* to <fs0>.
assign g_fldcat1->* to <fs1>.
break-point 5.
CALL FUNCTION 'LVC_TRANSFER_TO_KKBLO'
EXPORTING
it_fieldcat_lvc = <fs1>
is_layout_lvc = m_cl_variant->ms_layout
is_tech_complete = ' '
IMPORTING
es_layout_kkblo = ls_layout
et_fieldcat_kkblo = lt_fieldcat.
LOOP AT lt_fieldcat INTO lt_fieldcat_wa.
CLEAR lt_fieldcat_wa-tech_complete.
IF lt_fieldcat_wa-tabname IS initial.
lt_fieldcat_wa-tabname = '1'.
MODIFY lt_fieldcat FROM lt_fieldcat_wa.
ENDIF.
l_tabname = lt_fieldcat_wa-tabname.
ENDLOOP.
CALL FUNCTION 'ALV_XXL_CALL'
EXPORTING
i_tabname = l_tabname
is_layout = ls_layout
it_fieldcat = lt_fieldcat
i_title = sy-title
TABLES
it_outtab = <fs0>
EXCEPTIONS
fatal_error = 1
no_display_possible = 2
others = 3.
IF sy-subrc <> 0.
message id sy-msgid TYPE 'S' number sy-msgno
with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDMETHOD.
METHOD CHANGE_TITLE.
CALL METHOD grid1->set_gridtitle
EXPORTING
i_gridtitle = i_gridtitle.
ENDMETHOD.
METHOD create_dynamic_table.
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog = it_fldcat
IMPORTING
ep_table = dy_table.
ENDMETHOD.
METHOD build_dynamic_structures.
caller = calling_program.
CALL METHOD me->return_structure
EXPORTING
my_line = my_line.
CALL METHOD me->create_dynamic_fcat
IMPORTING
it_fldcat = it_fldcat.
CALL METHOD me->create_dynamic_table
EXPORTING
it_fldcat = it_fldcat
IMPORTING
dy_table = dy_table.
ENDMETHOD.
METHOD display_grid.
break-point 1.
GET REFERENCE OF g_outtab INTO g_outtab1.
GET REFERENCE OF g_fldcat INTO g_fldcat1.
struct_grid_lset-edit = 'X'. "To enable editing in ALV
struct_grid_lset-grid_title = 'TEST ALV USE generic class'.
struct_grid_lset-ctab_fname = 'T_CELLCOLORS'.
struct_grid_lset-stylefname = 'CELLTAB'.
CALL METHOD grid1->set_ready_for_input
EXPORTING
i_ready_for_input = '1'.
CALL METHOD grid1->set_table_for_first_display
EXPORTING
is_layout = struct_grid_lset
CHANGING
it_outtab = gt_outtab
it_fieldcatalog = it_fldcat.
ENDMETHOD.
METHOD on_user_command.
break-point 2.
CASE e_ucomm.
WHEN 'EXIT'.
LEAVE PROGRAM.
WHEN 'EXCEL'.
CALL METHOD me->download_to_excel.
WHEN 'SAVE'.
WHEN 'PROC'.
CALL METHOD me->process.
WHEN 'REFR'.
CALL METHOD me->refresh.
ENDCASE.
ENDMETHOD.
METHOD on_toolbar.
CLEAR ls_toolbar.
MOVE 0 TO ls_toolbar-butn_TYPE.
MOVE 'EXIT' TO ls_toolbar-function.
MOVE SPACE TO ls_toolbar-disabled.
MOVE icon_system_end TO ls_toolbar-icon.
MOVE 'Click2Exit' TO ls_toolbar-quickinfo.
APPEND ls_toolbar TO e_object->mt_toolbar.
CLEAR ls_toolbar.
MOVE 0 TO ls_toolbar-butn_TYPE.
MOVE 'SAVE' TO ls_toolbar-function.
MOVE SPACE TO ls_toolbar-disabled.
MOVE icon_system_save TO ls_toolbar-icon.
MOVE 'Save data' TO ls_toolbar-quickinfo.
APPEND ls_toolbar TO e_object->mt_toolbar.
CLEAR ls_toolbar.
MOVE 0 TO ls_toolbar-butn_TYPE.
MOVE 'EDIT' TO ls_toolbar-function.
MOVE SPACE TO ls_toolbar-disabled.
MOVE icon_toggle_display_change TO ls_toolbar-icon.
MOVE 'Edit data' TO ls_toolbar-quickinfo.
MOVE 'EDIT' TO ls_toolbar-text.
APPEND ls_toolbar TO e_object->mt_toolbar.
CLEAR ls_toolbar.
MOVE 0 TO ls_toolbar-butn_TYPE.
MOVE 'PROC' TO ls_toolbar-function.
MOVE SPACE TO ls_toolbar-disabled.
MOVE icon_businav_process to ls_toolbar-icon.
MOVE 'Process.' TO ls_toolbar-quickinfo.
MOVE 'PROC' TO ls_toolbar-text.
APPEND ls_toolbar TO e_object->mt_toolbar.
CLEAR ls_toolbar.
MOVE 0 TO ls_toolbar-butn_TYPE.
MOVE 'EXCEL' TO ls_toolbar-function.
MOVE SPACE TO ls_toolbar-disabled.
MOVE icon_xxl TO ls_toolbar-icon.
MOVE 'Excel' TO ls_toolbar-quickinfo.
MOVE 'EXCEL' TO ls_toolbar-text.
APPEND ls_toolbar TO e_object->mt_toolbar.
MOVE 0 TO ls_toolbar-butn_TYPE.
MOVE 'REFR' TO ls_toolbar-function.
MOVE SPACE TO ls_toolbar-disabled.
MOVE icon_refresh TO ls_toolbar-icon.
MOVE 'Refresh' TO ls_toolbar-quickinfo.
MOVE 'REFR' TO ls_toolbar-text.
APPEND ls_toolbar TO e_object->mt_toolbar.
ENDMETHOD.
METHOD refresh_grid.
CALL METHOD cl_gui_cfw=>flush.
CALL METHOD grid1->refresh_table_display.
ENDMETHOD.
METHOD refresh.
PERFORM refresh IN PROGRAM (caller) IF FOUND.
ENDMETHOD.
METHOD process.
PERFORM process IN PROGRAM (caller) IF FOUND.
LEAVE PROGRAM.
ENDMETHOD.
METHOD dubbelklik.
perform dubbelklik IN PROGRAM (caller) IF FOUND.
ENDMETHOD.
ENDCLASS.
You can use the CLASS over and over again in almost any program where you want to display / edit a table.
Cheers
Jimbo
‎2007 Aug 13 12:50 AM
Thanks for your input James but what I'm after is coding the business logic in OO methodology.
Anyone else wants to contribute?
<b>Any (useful) post earns 6 points minimum!</b>
‎2007 Aug 13 6:03 AM
Hello Sougata
Here is a partially converted version of the report which hopefully shows you how you could proceed.
REPORT zus_sdn_z_matmas_oo
MESSAGE-ID z001.
* NOTE: OO-Version of Z_MATMAS (SDN)
*----------------------------------------------------------------------*
*/Tables *
*----------------------------------------------------------------------*
TABLES: marav, "Database View for using Logical Database MSM
mbewv. "Structure View for using Logical Database MSM
*----------------------------------------------------------------------*
*/Data *
*----------------------------------------------------------------------*
TYPE-POOLS: slis,
abap.
INCLUDE zus_sdn_z_matmas_oo_c0. " class definition
INCLUDE zus_sdn_z_matmas_oo_c1. " class implementation
DATA:
go_matmas TYPE REF TO lcl_matmas,
go_alvgrid TYPE REF TO lcl_alvgrid.
TYPES: BEGIN OF ty_matmas,
matnr TYPE matnr,
maktx TYPE maktx,
ntgew TYPE ntgew,
uom1 TYPE gewei,
brgew TYPE brgew,
uom2 TYPE gewei,
volum TYPE volum,
uom3 TYPE voleh,
wunit TYPE umrez,
wshpu TYPE umrez,
wpalt TYPE umrez,
mhdhb TYPE mhdhb,
prdha TYPE prodh_d,
werks TYPE werks_d,
stprs TYPE stprs,
uom4 TYPE waers,
wwsal TYPE kbetr,
uom5 TYPE waers,
vmsta TYPE vmsta,
END OF ty_matmas.
DATA: wa_matmas TYPE ty_matmas,
gt_matmas TYPE STANDARD TABLE OF ty_matmas,
wa_mvke TYPE mvke,
gt_mvke TYPE STANDARD TABLE OF mvke,
gt_marm TYPE STANDARD TABLE OF marm.
DATA: werks_wa TYPE werks_d,
vmsta_wa LIKE tvms-vmsta.
DATA: gs_alv_fieldcat TYPE slis_fieldcat_alv.
*-----------------------------------------------------------------------
*
*/Macros
*
*-----------------------------------------------------------------------
*
DEFINE _set_fieldcat.
clear gs_alv_fieldcat.
gs_alv_fieldcat-tabname = &1.
gs_alv_fieldcat-fieldname = &2.
gs_alv_fieldcat-outputlen = &3.
gs_alv_fieldcat-seltext_l = &4.
gs_alv_fieldcat-key = space.
gs_alv_fieldcat-no_out = space.
END-OF-DEFINITION.
*----------------------------------------------------------------------*
*/Parameters & Select-options *
*----------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK cus WITH FRAME TITLE text-s00.
SELECT-OPTIONS: s_werks FOR werks_wa OBLIGATORY DEFAULT '1000',
s_vmsta FOR vmsta_wa.
SELECTION-SCREEN SKIP.
PARAMETERS: p_hrarcy AS CHECKBOX.
SELECTION-SCREEN END OF BLOCK cus.
*----------------------------------------------------------------------*
*/Start-of-selection *
*----------------------------------------------------------------------*
START-OF-SELECTION.
** PERFORM: get_mvke,
** get_weights_marm.
* Replaced by:
CREATE OBJECT:
go_matmas,
go_alvgrid.
*----------------------------------------------------------------------*
*/GET *
*----------------------------------------------------------------------*
GET marav.
*----------------------------------------------------------------------*
*/GET *
*----------------------------------------------------------------------*
GET mbewv.
CHECK mbewv-bwkey IN s_werks.
** PERFORM collect_marav.
* Replaced by:
CALL METHOD go_matmas->collect_marav
EXPORTING
is_marav = marav
EXCEPTIONS
rejected = 1.
IF ( syst-subrc NE 0 ).
REJECT 'MARAV'.
ENDIF.
...&----
*& Include ZUS_SDN_Z_MATMAS_OO_C0
&----
*---------------------------------------------------------------------*
* CLASS lcl_matmas DEFINITION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS lcl_matmas DEFINITION.
PUBLIC SECTION.
CLASS-DATA:
md_meinh_ea TYPE lrmei VALUE 'EA',
md_meinh_shu TYPE lrmei VALUE 'SHU',
md_meinh_shp TYPE lrmei VALUE 'SHP'.
METHODS:
constructor
IMPORTING
value(id_calling_program) TYPE syrepid DEFAULT sy-repid,
collect_marav
IMPORTING
value(is_marav) TYPE marav
EXCEPTIONS
rejected.
PRIVATE SECTION.
TYPES: BEGIN OF ty_matmas,
matnr TYPE matnr,
maktx TYPE maktx,
ntgew TYPE ntgew,
uom1 TYPE gewei,
brgew TYPE brgew,
uom2 TYPE gewei,
volum TYPE volum,
uom3 TYPE voleh,
wunit TYPE umrez,
wshpu TYPE umrez,
wpalt TYPE umrez,
mhdhb TYPE mhdhb,
prdha TYPE prodh_d,
werks TYPE werks_d,
stprs TYPE stprs,
uom4 TYPE waers,
wwsal TYPE kbetr,
uom5 TYPE waers,
vmsta TYPE vmsta,
END OF ty_matmas.
DATA:
ms_matmas TYPE ty_matmas,
mt_matmas TYPE STANDARD TABLE OF ty_matmas.
DATA:
mt_selopts TYPE rsparams_tt,
ms_mvke TYPE mvke,
mt_mvke TYPE STANDARD TABLE OF mvke,
mt_marm TYPE STANDARD TABLE OF marm.
METHODS:
get_mvke,
get_weights_marm,
transfer_gross_and_net_weights
IMPORTING
value(is_marav) TYPE marav
RETURNING
value(rs_matmas) TYPE ty_matmas.
ENDCLASS. "lcl_matmas DEFINITION
*---------------------------------------------------------------------*
* CLASS lcl_alvgrid DEFINITION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS lcl_alvgrid DEFINITION.
ENDCLASS. "lcl_alvgrid DEFINITION&----
*& Include ZUS_SDN_Z_MATMAS_OO_C1
&----
*---------------------------------------------------------------------*
* CLASS lcl_matmas IMPLEMENTATION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS lcl_matmas IMPLEMENTATION.
METHOD: constructor.
CALL FUNCTION 'RS_REFRESH_FROM_SELECTOPTIONS'
EXPORTING
curr_report = id_calling_program
* IMPORTING
* SP =
TABLES
selection_table = me->mt_selopts
EXCEPTIONS
not_found = 1
no_report = 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.
get_mvke( ).
get_weights_marm( ).
ENDMETHOD. "constructor
METHOD get_mvke.
* define local data
DATA:
ls_rsparams TYPE rsparams,
lr_matnr TYPE RANGE OF matnr,
ls_rng_mat LIKE LINE OF lr_matnr,
lr_vmsta TYPE RANGE OF vmsta,
ls_rng_vms LIKE LINE OF lr_vmsta.
LOOP AT me->mt_selopts INTO ls_rsparams
WHERE ( selname = 'MS_MATNR' ).
MOVE-CORRESPONDING ls_rsparams TO ls_rng_mat.
APPEND ls_rng_mat TO lr_matnr.
ENDLOOP.
LOOP AT me->mt_selopts INTO ls_rsparams
WHERE ( selname = 'S_VMSTA' ).
MOVE-CORRESPONDING ls_rsparams TO ls_rng_vms.
APPEND ls_rng_vms TO lr_vmsta.
ENDLOOP.
SELECT * FROM mvke INTO TABLE me->mt_mvke
WHERE matnr IN lr_matnr
AND vmsta IN lr_vmsta
ORDER BY matnr.
ENDMETHOD. "get_mvke
METHOD get_weights_marm.
* define local data
DATA:
ls_rsparams TYPE rsparams,
lr_matnr TYPE RANGE OF matnr,
ls_rng_mat LIKE LINE OF lr_matnr,
lr_vmsta TYPE RANGE OF vmsta,
ls_rng_vms LIKE LINE OF lr_vmsta.
LOOP AT me->mt_selopts INTO ls_rsparams
WHERE ( selname = 'MS_MATNR' ).
MOVE-CORRESPONDING ls_rsparams TO ls_rng_mat.
APPEND ls_rng_mat TO lr_matnr.
ENDLOOP.
SELECT * FROM marm INTO TABLE me->mt_marm
WHERE matnr IN lr_matnr
** AND meinh IN ( 'EA', 'SHU', 'SHP')
AND ( meinh EQ md_meinh_ea OR
meinh EQ md_meinh_shu OR
meinh EQ md_meinh_shp )
ORDER BY matnr meinh.
ENDMETHOD. "get_weights_marm
METHOD collect_marav.
* define local data
DATA:
ls_mvke TYPE mvke,
ls_matmas TYPE ty_matmas.
READ TABLE me->mt_mvke INTO ls_mvke
WITH KEY matnr = is_marav-matnr
BINARY SEARCH.
IF sy-subrc = 0.
* Transfer gross & net weight
ls_matmas = transfer_gross_and_net_weights( is_marav ).
* Get Wholesale price
PERFORM get_whsalprice.
* Get standard price for each plant
PERFORM get_stdprice.
ELSE.
** REJECT 'MARAV'.
RAISE rejected.
ENDIF.
ENDMETHOD. "collect_marav
METHOD transfer_gross_and_net_weights.
ENDMETHOD. "transfer_gross_and_net_weights
ENDCLASS. "lcl_matmas IMPLEMENTATION
*---------------------------------------------------------------------*
* CLASS lcl_alvgrid IMPLEMENTATION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS lcl_alvgrid IMPLEMENTATION.
ENDCLASS. "lcl_alvgrid IMPLEMENTATION
Regards
Uwe
‎2007 Aug 14 6:04 AM
Hello Sougata
I have somewhat elaborated my sample coding. Please note that there are still some flaws and shortcomings, e.g:
- itab MT_MATMAS of class LCL_MATMAS should be defined as READ-ONLY (However, when call method cl_salv_table=>factory the output itab must be changeable)
- the entire processing of the ALV list (including layout, fieldcatalog, variants) should be encapsulated within a separate class
Yet I hope the sample gives you a "taste" of OO-like coding.
When thinking about OO-programming think in terms of <b>responsibilities</b>.<i> "Is my class really responsible of knowing these details or being capable of doing something?"</i>
===================================================
REPORT zus_sdn_z_matmas_oo
MESSAGE-ID z001.
* NOTE: OO-Version of Z_MATMAS (SDN)
*----------------------------------------------------------------------*
*/Tables *
*----------------------------------------------------------------------*
TABLES: marav, "Database View for using Logical Database MSM
mbewv. "Structure View for using Logical Database MSM
*----------------------------------------------------------------------*
*/Data *
*----------------------------------------------------------------------*
TYPE-POOLS: slis,
abap.
INCLUDE zus_sdn_z_matmas_oo_c0. " class definition
INCLUDE zus_sdn_z_matmas_oo_c1. " class implementation
DATA:
go_matmas TYPE REF TO lcl_matmas,
go_alvgrid TYPE REF TO lcl_alvgrid.
TYPES: BEGIN OF ty_matmas,
matnr TYPE matnr,
maktx TYPE maktx,
ntgew TYPE ntgew,
uom1 TYPE gewei,
brgew TYPE brgew,
uom2 TYPE gewei,
volum TYPE volum,
uom3 TYPE voleh,
wunit TYPE umrez,
wshpu TYPE umrez,
wpalt TYPE umrez,
mhdhb TYPE mhdhb,
prdha TYPE prodh_d,
werks TYPE werks_d,
stprs TYPE stprs,
uom4 TYPE waers,
wwsal TYPE kbetr,
uom5 TYPE waers,
vmsta TYPE vmsta,
END OF ty_matmas.
DATA: wa_matmas TYPE ty_matmas,
gt_matmas TYPE STANDARD TABLE OF ty_matmas.
DATA: werks_wa TYPE werks_d,
vmsta_wa LIKE tvms-vmsta.
DATA: gs_alv_fieldcat TYPE slis_fieldcat_alv.
*-----------------------------------------------------------------------
*
*/Macros
*
*-----------------------------------------------------------------------
*
DEFINE _set_fieldcat.
clear gs_alv_fieldcat.
gs_alv_fieldcat-tabname = &1.
gs_alv_fieldcat-fieldname = &2.
gs_alv_fieldcat-outputlen = &3.
gs_alv_fieldcat-seltext_l = &4.
gs_alv_fieldcat-key = space.
gs_alv_fieldcat-no_out = space.
END-OF-DEFINITION.
*----------------------------------------------------------------------*
*/Parameters & Select-options *
*----------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK cus WITH FRAME TITLE text-s00.
SELECT-OPTIONS: s_werks FOR werks_wa OBLIGATORY DEFAULT '1000',
s_vmsta FOR vmsta_wa.
SELECTION-SCREEN SKIP.
PARAMETERS: p_hrarcy AS CHECKBOX.
SELECTION-SCREEN END OF BLOCK cus.
*----------------------------------------------------------------------*
*/Start-of-selection *
*----------------------------------------------------------------------*
START-OF-SELECTION.
** PERFORM: get_mvke,
** get_weights_marm.
* Replaced by:
CREATE OBJECT:
go_matmas,
go_alvgrid.
*----------------------------------------------------------------------*
*/GET *
*----------------------------------------------------------------------*
GET marav.
*----------------------------------------------------------------------*
*/GET *
*----------------------------------------------------------------------*
GET mbewv.
CHECK mbewv-bwkey IN s_werks.
** PERFORM collect_marav.
* Replaced by:
CALL METHOD go_matmas->collect_marav
EXPORTING
is_marav = marav
is_mbewv = mbewv
EXCEPTIONS
rejected = 1.
IF ( syst-subrc NE 0 ).
REJECT 'MARAV'.
ENDIF.
*----------------------------------------------------------------------*
*/End-of-selection *
*----------------------------------------------------------------------*
* Check to see that we have data
DESCRIBE TABLE go_matmas->mt_matmas.
IF sy-tfill = 0.
MESSAGE i016.
EXIT.
ENDIF.
go_matmas->sort_by_hierarchy( ).
END-OF-SELECTION.
*----------------------------------------------------------------------*
* Display the report in ALV *
*----------------------------------------------------------------------*
PERFORM disp_alv.
*&---------------------------------------------------------------------*
*& Form disp_alv
*&---------------------------------------------------------------------*
FORM disp_alv .
DATA: ls_layout TYPE slis_layout_alv,
lt_events TYPE slis_t_event,
lt_fieldcat TYPE slis_t_fieldcat_alv,
li_sort TYPE slis_t_sortinfo_alv.
*** Sort if user has opted to sort by Product Hierarchy
** IF NOT p_hrarcy IS INITIAL.
** SORT gt_matmas BY prdha.
** ENDIF.
DATA:
lo_table TYPE REF TO cl_salv_table.
TRY.
CALL METHOD cl_salv_table=>factory
* EXPORTING
* LIST_DISPLAY = IF_SALV_C_BOOL_SAP=>FALSE
* R_CONTAINER =
* CONTAINER_NAME =
IMPORTING
r_salv_table = lo_table
CHANGING
t_table = go_matmas->mt_matmas.
CATCH cx_salv_msg .
ENDTRY.
CHECK ( lo_table IS BOUND ).
lo_table->display( ).
*** Layout
** PERFORM get_layout CHANGING ls_layout.
**
*** Get the field catalog
** PERFORM get_fieldcat CHANGING lt_fieldcat.
**
*** Sorting
** PERFORM fill_sort CHANGING li_sort.
*** Display the report
** CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
** EXPORTING
** i_callback_program = sy-repid
** i_callback_top_of_page = 'TOP_OF_PAGE'
** is_layout = ls_layout
** it_fieldcat = lt_fieldcat
** i_save = 'A'
** it_sort = li_sort
** it_events = lt_events
** TABLES
** t_outtab = gt_matmas
** 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.
ENDFORM. " disp_alv
*&---------------------------------------------------------------------*
*& Form get_layout
*&---------------------------------------------------------------------*
FORM get_layout CHANGING ps_layout TYPE slis_layout_alv.
* Set the layout structure
ps_layout-zebra = abap_true.
ps_layout-get_selinfos = abap_true.
ps_layout-colwidth_optimize = abap_true.
ENDFORM. " get_layout
*&---------------------------------------------------------------------*
*& Form get_fieldcat
*&---------------------------------------------------------------------*
FORM get_fieldcat CHANGING pt_fieldcat TYPE slis_t_fieldcat_alv.
FIELD-SYMBOLS:
<fs_sr> TYPE abap_compdescr,
<fcat> TYPE LINE OF slis_t_fieldcat_alv.
DATA:
lv_pos TYPE sy-tabix,
lo_strucdesc TYPE REF TO cl_abap_structdescr,
lt_fc_sr TYPE abap_compdescr_tab,
lv_fieldcat TYPE slis_t_fieldcat_alv.
* Read fields of structure 'wa_matmas'
lo_strucdesc ?= cl_abap_typedescr=>describe_by_data( wa_matmas ).
lt_fc_sr = lo_strucdesc->components.
LOOP AT lt_fc_sr ASSIGNING <fs_sr>.
lv_pos = sy-tabix.
READ TABLE lv_fieldcat ASSIGNING <fcat>
WITH KEY fieldname = <fs_sr>-name.
IF sy-subrc EQ 0.
<fcat>-col_pos = lv_pos.
<fcat>-tabname = 'GT_MATMAS'.
APPEND <fcat> TO pt_fieldcat[].
ELSE.
_set_fieldcat 'GT_matmas'
<fs_sr>-name
<fs_sr>-length
space.
gs_alv_fieldcat-col_pos = lv_pos.
CASE <fs_sr>-name.
WHEN 'MATNR'.
gs_alv_fieldcat-reptext_ddic = 'Material Code'(801).
gs_alv_fieldcat-key = abap_true.
WHEN 'MAKTX'.
gs_alv_fieldcat-reptext_ddic = 'Description'(802).
WHEN 'NTGEW'.
gs_alv_fieldcat-reptext_ddic = 'Net Weight'(803).
gs_alv_fieldcat-no_zero = abap_true.
WHEN 'UOM1' OR 'UOM2' OR 'UOM3'.
gs_alv_fieldcat-reptext_ddic = 'UoM'(824).
WHEN 'UOM4' OR 'UOM5'.
gs_alv_fieldcat-reptext_ddic = 'Currency'(825).
WHEN 'BRGEW'.
gs_alv_fieldcat-reptext_ddic = 'Gross Weight'(804).
gs_alv_fieldcat-no_zero = abap_true.
WHEN 'VOLUM'.
gs_alv_fieldcat-reptext_ddic = 'Case Volume'(805).
gs_alv_fieldcat-no_zero = abap_true.
WHEN 'WUNIT'.
gs_alv_fieldcat-reptext_ddic = 'Each/Case'(806).
gs_alv_fieldcat-no_zero = abap_true.
WHEN 'WSHPU'.
gs_alv_fieldcat-reptext_ddic = 'Case/Shipping Unit'(807).
gs_alv_fieldcat-no_zero = abap_true.
WHEN 'WPALT'.
gs_alv_fieldcat-reptext_ddic = 'Case/Pallet'(808).
gs_alv_fieldcat-no_zero = abap_true.
WHEN 'MHDHB'.
gs_alv_fieldcat-reptext_ddic = 'Total Shelf Life'(809).
gs_alv_fieldcat-no_zero = abap_true.
WHEN 'PRDHA'.
gs_alv_fieldcat-reptext_ddic = 'Product Hierarchy'(810).
WHEN 'WERKS'.
gs_alv_fieldcat-reptext_ddic = 'Delivery Plant'(811).
WHEN 'STPRS'.
gs_alv_fieldcat-reptext_ddic = 'Standard Price'(812).
gs_alv_fieldcat-no_zero = abap_true.
WHEN 'WWSAL'.
gs_alv_fieldcat-reptext_ddic = 'Wholesale Price'(815).
gs_alv_fieldcat-no_zero = abap_true.
WHEN 'VMSTA'.
gs_alv_fieldcat-reptext_ddic = 'Sales Stat'(813).
ENDCASE.
APPEND gs_alv_fieldcat TO pt_fieldcat[].
ENDIF.
ENDLOOP.
ENDFORM. " get_fieldcat
*&---------------------------------------------------------------------*
*& Form top_of_page
*&---------------------------------------------------------------------*
FORM top_of_page.
** CALL FUNCTION 'Z_ALV_REPORT_HEADER'
** EXPORTING
** report_name = sy-repid.
ENDFORM. "top_of_page
*&---------------------------------------------------------------------*
*& Form fill_sort
*&---------------------------------------------------------------------*
FORM fill_sort CHANGING ci_sort TYPE slis_t_sortinfo_alv.
DATA lw_sort TYPE slis_sortinfo_alv.
* Sort by material number or product hierarchy
lw_sort-spos = 1.
IF p_hrarcy IS INITIAL.
lw_sort-fieldname = 'MATNR'.
ELSE.
lw_sort-fieldname = 'PRDHA'.
ENDIF.
APPEND lw_sort TO ci_sort.
ENDFORM. " fill_sort===============================================
*&---------------------------------------------------------------------*
*& Include ZUS_SDN_Z_MATMAS_OO_C0
*&---------------------------------------------------------------------*
*---------------------------------------------------------------------*
* CLASS lcl_matmas DEFINITION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS lcl_matmas DEFINITION.
PUBLIC SECTION.
TYPES: BEGIN OF ty_matmas,
matnr TYPE matnr,
maktx TYPE maktx,
ntgew TYPE ntgew,
uom1 TYPE gewei,
brgew TYPE brgew,
uom2 TYPE gewei,
volum TYPE volum,
uom3 TYPE voleh,
wunit TYPE umrez,
wshpu TYPE umrez,
wpalt TYPE umrez,
mhdhb TYPE mhdhb,
prdha TYPE prodh_d,
werks TYPE werks_d,
stprs TYPE stprs,
uom4 TYPE waers,
wwsal TYPE kbetr,
uom5 TYPE waers,
vmsta TYPE vmsta,
END OF ty_matmas.
CLASS-DATA:
mc_meins_cs TYPE meins VALUE 'CS' READ-ONLY,
mc_meinh_ea TYPE lrmei VALUE 'EA' READ-ONLY,
mc_meinh_shu TYPE lrmei VALUE 'SHU' READ-ONLY,
mc_meinh_shp TYPE lrmei VALUE 'SHP' READ-ONLY.
DATA:
ms_matmas TYPE ty_matmas,
mt_matmas TYPE STANDARD TABLE OF ty_matmas.
METHODS:
constructor
IMPORTING
value(id_calling_program) TYPE syrepid DEFAULT sy-repid,
collect_marav
IMPORTING
value(is_marav) TYPE marav
value(is_mbewv) TYPE mbewv
EXCEPTIONS
rejected,
sort_by_hierarchy.
PRIVATE SECTION.
DATA:
mt_selopts TYPE rsparams_tt,
ms_mvke TYPE mvke,
mt_mvke TYPE STANDARD TABLE OF mvke,
mt_marm TYPE STANDARD TABLE OF marm.
METHODS:
get_mvke,
get_weights_marm,
transfer_gross_and_net_weights
IMPORTING
value(is_marav) TYPE marav
RETURNING
value(rs_matmas) TYPE ty_matmas,
get_whsalprice
IMPORTING
value(is_mvke) TYPE mvke
value(id_bwkey) TYPE bwkey
CHANGING
value(cs_matmas) TYPE ty_matmas,
get_stdprice
IMPORTING
value(is_mbewv) TYPE mbewv
CHANGING
value(cs_matmas) TYPE ty_matmas.
ENDCLASS. "lcl_matmas DEFINITION
*---------------------------------------------------------------------*
* CLASS lcl_alvgrid DEFINITION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS lcl_alvgrid DEFINITION.
ENDCLASS. "lcl_alvgrid DEFINITION===========================================
*&---------------------------------------------------------------------*
*& Include ZUS_SDN_Z_MATMAS_OO_C1
*&---------------------------------------------------------------------*
*---------------------------------------------------------------------*
* CLASS lcl_matmas IMPLEMENTATION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS lcl_matmas IMPLEMENTATION.
METHOD: constructor.
CALL FUNCTION 'RS_REFRESH_FROM_SELECTOPTIONS'
EXPORTING
curr_report = id_calling_program
* IMPORTING
* SP =
TABLES
selection_table = me->mt_selopts
EXCEPTIONS
not_found = 1
no_report = 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.
get_mvke( ).
get_weights_marm( ).
ENDMETHOD. "constructor
METHOD get_mvke.
* define local data
DATA:
ls_rsparams TYPE rsparams,
lr_matnr TYPE RANGE OF matnr,
ls_rng_mat LIKE LINE OF lr_matnr,
lr_vmsta TYPE RANGE OF vmsta,
ls_rng_vms LIKE LINE OF lr_vmsta.
LOOP AT me->mt_selopts INTO ls_rsparams
WHERE ( selname = 'MS_MATNR' ).
MOVE-CORRESPONDING ls_rsparams TO ls_rng_mat.
APPEND ls_rng_mat TO lr_matnr.
ENDLOOP.
LOOP AT me->mt_selopts INTO ls_rsparams
WHERE ( selname = 'S_VMSTA' ).
MOVE-CORRESPONDING ls_rsparams TO ls_rng_vms.
APPEND ls_rng_vms TO lr_vmsta.
ENDLOOP.
DELETE lr_matnr WHERE ( table_line IS INITIAL ).
DELETE lr_vmsta WHERE ( table_line IS INITIAL ).
SELECT * FROM mvke INTO TABLE me->mt_mvke
WHERE matnr IN lr_matnr
AND vmsta IN lr_vmsta
ORDER BY matnr.
ENDMETHOD. "get_mvke
METHOD get_weights_marm.
* define local data
DATA:
ls_rsparams TYPE rsparams,
lr_matnr TYPE RANGE OF matnr,
ls_rng_mat LIKE LINE OF lr_matnr,
lr_vmsta TYPE RANGE OF vmsta,
ls_rng_vms LIKE LINE OF lr_vmsta.
LOOP AT me->mt_selopts INTO ls_rsparams
WHERE ( selname = 'MS_MATNR' ).
MOVE-CORRESPONDING ls_rsparams TO ls_rng_mat.
APPEND ls_rng_mat TO lr_matnr.
ENDLOOP.
DELETE lr_matnr WHERE ( table_line IS INITIAL ).
SELECT * FROM marm INTO TABLE me->mt_marm
WHERE matnr IN lr_matnr
** AND meinh IN ( 'EA', 'SHU', 'SHP')
AND ( meinh EQ mc_meinh_ea OR
meinh EQ mc_meinh_shu OR
meinh EQ mc_meinh_shp )
ORDER BY matnr meinh.
ENDMETHOD. "get_weights_marm
METHOD collect_marav.
* define local data
DATA:
ls_mvke TYPE mvke,
ls_matmas TYPE ty_matmas.
READ TABLE me->mt_mvke INTO ls_mvke
WITH KEY matnr = is_marav-matnr
BINARY SEARCH.
IF sy-subrc = 0.
* Transfer gross & net weight
ls_matmas = transfer_gross_and_net_weights( is_marav ).
* Get Wholesale price
CALL METHOD me->get_whsalprice
EXPORTING
is_mvke = ls_mvke
id_bwkey = is_mbewv-bwkey
CHANGING
cs_matmas = ls_matmas.
* Get standard price for each plant
CALL METHOD me->get_stdprice
EXPORTING
is_mbewv = is_mbewv
CHANGING
cs_matmas = ls_matmas.
MOVE ls_mvke-vmsta TO ls_matmas-vmsta.
APPEND ls_matmas TO me->mt_matmas.
CLEAR ls_matmas.
ELSE.
** REJECT 'MARAV'.
RAISE rejected.
ENDIF.
ENDMETHOD. "collect_marav
METHOD transfer_gross_and_net_weights.
" define local data
DATA:
ls_marm TYPE marm.
MOVE-CORRESPONDING is_marav TO rs_matmas.
IF ( rs_matmas-ntgew IS NOT INITIAL ).
MOVE is_marav-gewei TO rs_matmas-uom1.
ENDIF.
IF ( rs_matmas-brgew IS NOT INITIAL ).
MOVE is_marav-gewei TO rs_matmas-uom2.
ENDIF.
IF ( rs_matmas-volum IS NOT INITIAL ).
CALL FUNCTION 'CONVERSION_EXIT_CUNIT_OUTPUT'
EXPORTING
input = is_marav-voleh
language = sy-langu
IMPORTING
output = rs_matmas-uom3
EXCEPTIONS
unit_not_found = 1
OTHERS = 2.
ENDIF.
SHIFT rs_matmas-matnr LEFT DELETING LEADING '0'.
CHECK is_marav-meins = 'CS'.
LOOP AT me->mt_marm INTO ls_marm
WHERE ( matnr = is_marav-matnr ).
CASE ls_marm-meinh.
WHEN mc_meinh_ea.
rs_matmas-wunit = ls_marm-umren / ls_marm-umrez.
WHEN mc_meinh_shu.
rs_matmas-wshpu = ls_marm-umrez / ls_marm-umren.
WHEN 'SHP'.
rs_matmas-wpalt = ls_marm-umrez / ls_marm-umren.
WHEN OTHERS.
ENDCASE.
ENDLOOP.
ENDMETHOD. "transfer_gross_and_net_weights
METHOD get_whsalprice.
" define local data
DATA:
ld_kpein TYPE kpein.
SELECT k~kbetr k~kpein UP TO 1 ROWS
INTO (cs_matmas-wwsal, ld_kpein)
FROM konp AS k
INNER JOIN a304 AS a
ON k~knumh = a~knumh
WHERE a~kappl = 'V' AND
a~kschl = 'ZPRC' AND
a~vkorg = is_mvke-vkorg AND
a~vtweg = is_mvke-vtweg AND
a~matnr = is_mvke-matnr AND
a~kfrst = space AND
a~datbi >= sy-datum.
ENDSELECT.
CHECK sy-subrc = 0.
cs_matmas-wwsal = cs_matmas-wwsal / ld_kpein.
SELECT SINGLE waers
INTO cs_matmas-uom5
FROM t001k AS a
INNER JOIN t001 AS b
ON a~bukrs = b~bukrs
WHERE a~bwkey = id_bwkey.
ENDMETHOD. "get_whsalprice
METHOD get_stdprice.
IF ( is_mbewv-bwtar IS INITIAL ).
SELECT SINGLE werks
FROM marc
INTO cs_matmas-werks
** WHERE matnr = marav-matnr
WHERE matnr = cs_matmas-matnr
AND werks = is_mbewv-bwkey.
cs_matmas-stprs = is_mbewv-stprs / is_mbewv-peinh.
IF ( cs_matmas-stprs IS NOT INITIAL ).
IF ( cs_matmas-uom5 IS NOT INITIAL ).
cs_matmas-uom4 = cs_matmas-uom5.
ELSE.
SELECT SINGLE waers
INTO cs_matmas-uom4
FROM t001k AS a
INNER JOIN t001 AS b
ON a~bukrs = b~bukrs
WHERE a~bwkey = is_mbewv-bwkey.
ENDIF.
ENDIF.
ENDIF.
** MOVE wa_mvke-vmsta TO wa_matmas-vmsta.
** APPEND wa_matmas TO gt_matmas.
** CLEAR wa_matmas.
* NOTE: It is highly intransparent that the output entries
* are collected in a method called GET_STDPRICE.
* -> moved to calling method COLLECT_MARAV
ENDMETHOD. "get_stdprice
METHOD sort_by_hierarchy.
* Sort if user has opted to sort by Product Hierarchy
** IF NOT p_hrarcy IS INITIAL.
** SORT gt_matmas BY prdha.
** ENDIF.
* NOTE: replaced by...
DATA:
ls_params TYPE rsparams.
READ TABLE me->mt_selopts INTO ls_params
WITH KEY selname = 'P_HRARCY'.
CHECK ( syst-subrc = 0 ).
IF ( ls_params-low = abap_true ).
SORT me->mt_matmas BY prdha.
ENDIF.
ENDMETHOD. "sort_by_hierarchy
ENDCLASS. "lcl_matmas IMPLEMENTATION
*---------------------------------------------------------------------*
* CLASS lcl_alvgrid IMPLEMENTATION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS lcl_alvgrid IMPLEMENTATION.
ENDCLASS. "lcl_alvgrid IMPLEMENTATIONRegards
Uwe
‎2007 Aug 14 6:06 AM
Hello Sougata
Have forgotten to mention the following link:
<a href="https://wiki.sdn.sap.com/wiki/display/profile/2007/07/09/UnderstandingABAPObjects">Understanding ABAP Objects</a>
Regards
Uwe
‎2007 Aug 15 1:49 AM