Вот основные функции программы:
Code:
report z_xxx.
class lcl_event_receiver definition deferred.
"Объявления переменных
include z_oborot_nks_data.
"Селекционный экран
include z_oborot_nks_scr.
"Класс для ALV
include z_oborot_nks_lcl.
initialization.
x_save = 'A'.
at selection-screen output.
"найдем формат по умолчанию
clear def_layout.
move sy-repid to def_layout-report.
call function 'LVC_VARIANT_DEFAULT_GET'
exporting
i_save = x_save
changing
cs_variant = def_layout
exceptions
not_found = 2.
if sy-subrc = 0.
p_var = def_layout-variant.
move-corresponding def_layout to spec_layout.
endif.
at selection-screen on value-request for p_var.
clear x_layout.
move sy-repid to x_layout-report.
call function 'LVC_VARIANT_F4'
exporting
is_variant = x_layout
i_save = x_save
importing
e_exit = g_exit
es_variant = spec_layout
exceptions
not_found = 1
others = 2.
if sy-subrc ne 0.
message id sy-msgid type sy-msgty number sy-msgno
with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
else.
if g_exit ne 'X'.
p_var = spec_layout-variant.
endif.
endif.
at selection-screen.
if s_astnr is initial and s_psphi is initial and s_pspnr is initial and sy-ucomm = 'ONLI'.
message e009(z_fi).
endif.
if p_var is not initial.
clear spec_layout.
move p_var to spec_layout-variant.
move sy-repid to spec_layout-report.
call function 'LVC_VARIANT_EXISTENCE_CHECK'
exporting
i_save = x_save
changing
cs_variant = spec_layout
exceptions
wrong_input = 1
not_found = 2
program_error = 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.
endif.
start-of-selection.
"проверим полномочия по БЕ
perform func_check_authority.
"заполним начальную и конечную даты периода
perform get_dates.
"находим все СПП-элементы
perform get_objects.
"заполняем основную таблицу с данными
perform get_data.
end-of-selection.
create object event_rcv.
if p_alv = 'X'. "вывод в ALV
perform print_alv.
endif.
if p_xls = 'X'. "вывод в Excel
perform print_xls.
endif.
Подпрограмма вывода ALV:
Code:
form print_alv .
call screen '0100'.
endform. " PRINT_ALV
module status_0100 output.
data: lt_data type table of t_data,
lt_itog_spp type table of t_data.
field-symbols: <fs_data> type t_data,
<fs_data_spp> type t_data.
set pf-status 'MAIN100'.
set titlebar 'MAIN100'.
if g_container is initial.
create object g_container
exporting
container_name = 'CONTAINER'.
create object g_grid
exporting
i_parent = g_container.
perform set_settings.
"set handler event_rcv->on_after_refresh for g_grid.
"если установлен флаг вывода неправильных оборотов
if p_wrong is not initial.
"сформируем итоги по СПП
sort gt_data by astnr psphi pspnr.
loop at gt_data assigning <fs_data> where pspnr is not initial.
at new pspnr.
insert initial line into table lt_itog_spp assigning <fs_data_spp>.
<fs_data_spp>-astnr = <fs_data>-astnr.
<fs_data_spp>-psphi = <fs_data>-psphi.
<fs_data_spp>-prj_name = <fs_data>-prj_name.
<fs_data_spp>-pspnr = <fs_data>-pspnr.
<fs_data_spp>-spp_name = <fs_data>-spp_name.
endat.
if <fs_data_spp> is assigned.
<fs_data_spp>-debetn = <fs_data_spp>-debetn + <fs_data>-debetn.
<fs_data_spp>-debet = <fs_data_spp>-debet + <fs_data>-debet.
<fs_data_spp>-kredit = <fs_data_spp>-kredit + <fs_data>-kredit.
<fs_data_spp>-debetk = <fs_data_spp>-debetk + <fs_data>-debetk.
endif.
endloop.
unassign: <fs_data>, <fs_data_spp>.
"проверка сумма Кт
call method event_rcv->calculate_kredit
changing
total = lt_itog_spp.
"убираем правильные строки
loop at lt_itog_spp assigning <fs_data_spp> where light = '3'.
delete gt_data where pspnr = <fs_data_spp>-pspnr.
endloop.
endif.
lt_data = gt_data.
delete gt_data where debetn = 0 and debet = 0 and kredit = 0 and debetk = 0 and kreditk = 0.
call method g_grid->set_table_for_first_display
exporting
"i_structure_name = 'GT_DATA'
i_save = x_save
i_default = 'X'
"is_layout = gs_oo_layout
is_variant = gs_variant
changing
it_fieldcatalog = gt_oo_fieldcat
"it_sort = gt_oo_sort
it_outtab = gt_data.
endif.
endmodule. " STATUS_0100 OUTPUT
Класс-перехватчик событий ALV. Здесь перехватывается событие after_refresh, но как видно выше, оно пока отключено.
Code:
class lcl_event_receiver definition.
public section.
methods:
on_after_refresh for event after_refresh of cl_gui_alv_grid,
calculate_kredit changing total type tt_data.
endclass. "lcl_event_receiver DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_event_receiver IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
class lcl_event_receiver implementation.
method on_after_refresh.
data:
total type ref to data,
subtotal1 type ref to data,
subtotal2 type ref to data,
subtotal3 type ref to data.
field-symbols:
<total> type tt_data.
if rf <> space.
rf = space.
return.
endif.
call method g_grid->get_subtotals
importing
ep_collect00 = total
ep_collect01 = subtotal1
ep_collect02 = subtotal2
ep_collect03 = subtotal3.
assign total->* to <total>.
call method calculate_kredit
changing
total = <total>.
assign subtotal1->* to <total>.
call method calculate_kredit
changing
total = <total>.
assign subtotal2->* to <total>.
call method calculate_kredit
changing
total = <total>.
assign subtotal3->* to <total>.
call method calculate_kredit
changing
total = <total>.
rf = 'X'.
call method g_grid->refresh_table_display
exporting
i_soft_refresh = 'X'.
endmethod. "on_after_refresh
method calculate_kredit.
data: l_anbtr type anep-anbtr,
r_datum type range of d,
s_datum like line of r_datum,
l_datum1 type d,
l_datum2 type d,
l_pspnr type ps_poski.
field-symbols: <fs_tot> type t_data,
<fs_obj> type t_obj.
loop at total assigning <fs_tot>. "where psphi is not initial.
write <fs_tot>-pspnr to l_pspnr.
<fs_tot>-debetk = <fs_tot>-debetn + <fs_tot>-debet - <fs_tot>-kredit.
check <fs_tot>-pspnr is not initial.
"определим диапазон дат для выборки оборотов
read table gt_objects assigning <fs_obj> with key pspnr = <fs_tot>-pspnr.
if sy-subrc <> 0.
continue.
endif.
clear: l_datum1, l_datum2.
select single max( abwda ) from coepd into l_datum1
where objnr = <fs_obj>-objnr
and abwda < gv_begdate.
if <fs_obj>-abwda > gv_enddate.
l_datum2 = gv_enddate.
else.
l_datum2 = <fs_obj>-abwda.
endif.
refresh r_datum. clear s_datum.
if l_datum1 is not initial.
s_datum-sign = 'I'.
s_datum-option = 'BT'.
s_datum-low = l_datum1.
s_datum-high = l_datum2.
else.
s_datum-sign = 'I'.
s_datum-option = 'LT'.
s_datum-low = l_datum2.
s_datum-high = ''.
endif.
append s_datum to r_datum.
select single sum( anep~anbtr ) into l_anbtr
from anep inner join anek on anep~anln1 = anek~anln1 and anep~belnr = anek~belnr
inner join anla on anek~anln1 = anla~anln1
where anla~posnr = l_pspnr
and anla~anlkl in (gc_anlkl_02, gc_anlkl_04)
and anek~budat in r_datum
and ( anep~bwasl like gc_bwasl_tmpl_z
or anep~bwasl like gc_bwasl_tmpl_3p )
and anep~afabe = gc_afabe_01
and anep~lnsan = gc_lnsan_null
and anep~augln = gc_lnsan_null.
if l_anbtr <> <fs_tot>-debetk and <fs_tot>-kredit is not initial.
<fs_tot>-light = '1'.
else.
<fs_tot>-light = '3'.
endif.
endloop.
endmethod. "calculate_kredit
endclass. "lcl_event_receiver IMPLEMENTATION
Заполнение настроек для ALV.
Code:
form set_settings .
"настроим fieldcatalog
data: ls_fieldcat type lvc_s_fcat.
refresh gt_oo_fieldcat.
clear ls_fieldcat.
ls_fieldcat-icon = 'X'.
ls_fieldcat-ref_table = 'ICON'.
ls_fieldcat-ref_field = 'LIGHT'.
ls_fieldcat-fieldname = 'LIGHT'.
ls_fieldcat-coltext = '!'.
ls_fieldcat-key = 'X'.
ls_fieldcat-datatype = 'DEC'.
append ls_fieldcat to gt_oo_fieldcat.
clear ls_fieldcat.
ls_fieldcat-tabname = 'GT_DATA'.
ls_fieldcat-fieldname = 'ASTNR'.
ls_fieldcat-coltext = text-005.
ls_fieldcat-no_zero = 'X'.
ls_fieldcat-key = 'X'.
* ls_fieldcat-txt_field = 'ASTNA'.
append ls_fieldcat to gt_oo_fieldcat.
clear ls_fieldcat.
ls_fieldcat-tabname = 'GT_DATA'.
ls_fieldcat-fieldname = 'ASTNA'.
ls_fieldcat-coltext = text-006.
ls_fieldcat-no_zero = 'X'.
ls_fieldcat-key = 'X'.
append ls_fieldcat to gt_oo_fieldcat.
clear ls_fieldcat.
ls_fieldcat-tabname = 'GT_DATA'.
ls_fieldcat-fieldname = 'PSPHI'.
ls_fieldcat-coltext = text-007.
ls_fieldcat-no_zero = 'X'.
ls_fieldcat-key = 'X'.
ls_fieldcat-txt_field = 'PRJ_NAME'.
append ls_fieldcat to gt_oo_fieldcat.
clear ls_fieldcat.
ls_fieldcat-tabname = 'GT_DATA'.
ls_fieldcat-fieldname = 'PRJ_NAME'.
ls_fieldcat-coltext = text-008.
ls_fieldcat-no_zero = 'X'.
ls_fieldcat-key = 'X'.
append ls_fieldcat to gt_oo_fieldcat.
clear ls_fieldcat.
ls_fieldcat-tabname = 'GT_DATA'.
ls_fieldcat-fieldname = 'PSPNR'.
ls_fieldcat-coltext = text-009.
ls_fieldcat-no_zero = 'X'.
ls_fieldcat-key = 'X'.
ls_fieldcat-txt_field = 'SPP_NAME'.
append ls_fieldcat to gt_oo_fieldcat.
clear ls_fieldcat.
ls_fieldcat-tabname = 'GT_DATA'.
ls_fieldcat-fieldname = 'SPP_NAME'.
ls_fieldcat-coltext = text-010.
ls_fieldcat-no_zero = 'X'.
ls_fieldcat-key = 'X'.
append ls_fieldcat to gt_oo_fieldcat.
clear ls_fieldcat.
ls_fieldcat-tabname = 'GT_DATA'.
ls_fieldcat-fieldname = 'LIFNR'.
ls_fieldcat-coltext = text-011.
ls_fieldcat-no_zero = 'X'.
append ls_fieldcat to gt_oo_fieldcat.
clear ls_fieldcat.
ls_fieldcat-tabname = 'GT_DATA'.
ls_fieldcat-fieldname = 'LFA_NAME'.
ls_fieldcat-coltext = text-012.
ls_fieldcat-no_zero = 'X'.
append ls_fieldcat to gt_oo_fieldcat.
clear ls_fieldcat.
ls_fieldcat-tabname = 'GT_DATA'.
ls_fieldcat-fieldname = 'HKONTB'.
ls_fieldcat-coltext = text-013.
ls_fieldcat-no_zero = 'X'.
ls_fieldcat-just = 'R'.
append ls_fieldcat to gt_oo_fieldcat.
clear ls_fieldcat.
ls_fieldcat-tabname = 'GT_DATA'.
ls_fieldcat-fieldname = 'HKONTK'.
ls_fieldcat-coltext = text-014.
ls_fieldcat-no_zero = 'X'.
ls_fieldcat-just = 'R'.
append ls_fieldcat to gt_oo_fieldcat.
clear ls_fieldcat.
ls_fieldcat-tabname = 'GT_DATA'.
ls_fieldcat-fieldname = 'XBLNR'.
ls_fieldcat-coltext = text-015.
ls_fieldcat-no_zero = 'X'.
ls_fieldcat-just = 'R'.
append ls_fieldcat to gt_oo_fieldcat.
clear ls_fieldcat.
ls_fieldcat-tabname = 'GT_DATA'.
ls_fieldcat-fieldname = 'BLDAT'.
ls_fieldcat-coltext = text-016.
ls_fieldcat-no_zero = 'X'.
ls_fieldcat-just = 'R'.
append ls_fieldcat to gt_oo_fieldcat.
clear ls_fieldcat.
ls_fieldcat-tabname = 'GT_DATA'.
ls_fieldcat-fieldname = 'DEBETN'.
ls_fieldcat-do_sum = 'X'.
ls_fieldcat-coltext = text-017.
ls_fieldcat-no_zero = 'X'.
ls_fieldcat-datatype = 'CURR'.
ls_fieldcat-just = 'R'.
append ls_fieldcat to gt_oo_fieldcat.
clear ls_fieldcat.
ls_fieldcat-tabname = 'GT_DATA'.
ls_fieldcat-fieldname = 'DEBET'.
ls_fieldcat-do_sum = 'X'.
ls_fieldcat-coltext = text-018.
ls_fieldcat-no_zero = 'X'.
ls_fieldcat-datatype = 'CURR'.
ls_fieldcat-just = 'R'.
append ls_fieldcat to gt_oo_fieldcat.
clear ls_fieldcat.
ls_fieldcat-tabname = 'GT_DATA'.
ls_fieldcat-fieldname = 'KREDIT'.
ls_fieldcat-do_sum = 'X'.
ls_fieldcat-coltext = text-019.
ls_fieldcat-no_zero = 'X'.
ls_fieldcat-datatype = 'CURR'.
ls_fieldcat-just = 'R'.
append ls_fieldcat to gt_oo_fieldcat.
clear ls_fieldcat.
ls_fieldcat-tabname = 'GT_DATA'.
ls_fieldcat-fieldname = 'DEBETK'.
ls_fieldcat-do_sum = 'X'.
ls_fieldcat-coltext = text-020.
ls_fieldcat-no_zero = 'X'.
ls_fieldcat-datatype = 'CURR'.
ls_fieldcat-just = 'R'.
append ls_fieldcat to gt_oo_fieldcat.
"настроим layout
gs_oo_layout-zebra = 'X'.
* gs_oo_layout-no_input = 'X'.
gs_oo_layout-excp_fname = gc_lights_name.
gs_oo_layout-excp_led = 'X'.
gs_oo_layout-cwidth_opt = 'X'.
gs_oo_layout-sel_mode = 'A'.
gs_oo_layout-no_totexp = 'X'.
* gs_oo_layout-totals_bef = 'X'.
"настроим sort
data: ls_sort type lvc_s_sort.
clear ls_sort.
ls_sort-spos = '01'.
ls_sort-fieldname = 'ASTNR'.
* ls_sort-subtot = 'X'.
append ls_sort to gt_oo_sort.
clear ls_sort.
ls_sort-spos = '02'.
ls_sort-fieldname = 'PSPHI'.
ls_sort-subtot = 'X'.
* ls_sort-expa = 'X'.
append ls_sort to gt_oo_sort.
clear ls_sort.
ls_sort-spos = '03'.
ls_sort-fieldname = 'PSPNR'.
ls_sort-subtot = 'X'.
* ls_sort-expa = 'X'.
append ls_sort to gt_oo_sort.
"вариант
move-corresponding spec_layout to gs_variant.
gs_variant-report = sy-repid.
endform. " SET_SETTINGS