Вот основные функции программы:
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