Application Development and Automation Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

cl_alv_table_create=>create_dynamic_table Dump

Former Member
0 Likes
1,473

Hello,

I'm trying to use

cl_alv_table_create=>create_dynamic_table

but i receive a dump saying <i>Program " " not found </i>.

Here follows the code:


*&---------------------------------------------------------------------*
*& Include Z3DDR002TOP                                                 *
*&                                                                     *
*&---------------------------------------------------------------------*
PROGRAM z3ddr002 NO STANDARD PAGE HEADING.

TYPE-POOLS: slis.

.
.
.

* ALV
DATA: new_table TYPE REF TO data,
      new_line  TYPE REF TO data.

DATA: it_fldcat    TYPE lvc_t_fcat,
      wa_it_fldcat TYPE lvc_s_fcat.


*&---------------------------------------------------------------------*
*&      Form  constroi_fieldcatalog
*&---------------------------------------------------------------------*
FORM constroi_fieldcatalog.

  DATA: flds_count   TYPE i,
        cnt          TYPE i,
        x_datec(8)   TYPE c,
        x_date       LIKE sy-datum.

  ADD 1 TO flds_count.
  wa_it_fldcat-fieldname = 'BUKRS'.
  wa_it_fldcat-col_pos = flds_count.
  wa_it_fldcat-datatype = 'CHAR'.
  wa_it_fldcat-intlen = 4.
  wa_it_fldcat-outputlen = 4.
  APPEND wa_it_fldcat TO it_fldcat.

  PERFORM append_fieldcatalog USING 'BUKRS' '<dyn_table>' text-h00
                                      flds_count '' '' '' '' '' '' '' ''
                                      '' ''.

  ADD 1 TO flds_count.
  wa_it_fldcat-fieldname = 'SWENR'.
  wa_it_fldcat-col_pos = flds_count.
  wa_it_fldcat-datatype = 'CHAR'.
  wa_it_fldcat-intlen = 8.
  wa_it_fldcat-outputlen = 8.
  APPEND wa_it_fldcat TO it_fldcat.

  PERFORM append_fieldcatalog USING 'SWENR' '<dyn_table>' text-h01
                                      flds_count '' '' '' '' '' '' '' ''
                                      '' ''.

  ADD 1 TO flds_count.
  wa_it_fldcat-fieldname = 'SMIVE'.
  wa_it_fldcat-col_pos = flds_count.
  wa_it_fldcat-datatype = 'CHAR'.
  wa_it_fldcat-intlen = 13.
  wa_it_fldcat-outputlen = 13.
  APPEND wa_it_fldcat TO it_fldcat.

  PERFORM append_fieldcatalog USING 'SMIVE' '<dyn_table>' text-h02
                                      flds_count '' '' '' '' '' '' '' ''
                                      '' ''.

  ADD 1 TO flds_count.
  wa_it_fldcat-fieldname = 'SMENR'.
  wa_it_fldcat-col_pos = flds_count.
  wa_it_fldcat-datatype = 'CHAR'.
  wa_it_fldcat-intlen = 8.
  wa_it_fldcat-outputlen = 8.
  APPEND wa_it_fldcat TO it_fldcat.

  PERFORM append_fieldcatalog USING 'SMENR' '<dyn_table>' text-h03
                                      flds_count '' '' '' '' '' '' '' ''
                                      '' ''.

  ADD 1 TO flds_count.
  wa_it_fldcat-fieldname = 'ZZNMFAN'.
  wa_it_fldcat-col_pos = flds_count.
  wa_it_fldcat-datatype = 'CHAR'.
  wa_it_fldcat-intlen = 40.
  wa_it_fldcat-outputlen = 40.
  APPEND wa_it_fldcat TO it_fldcat.

  PERFORM append_fieldcatalog USING 'ZZNMFAN' '<dyn_table>' text-h04
                                     flds_count '' '' '' '' '' '' '' ''
                                      '' ''.

  ADD 1 TO flds_count.
  wa_it_fldcat-fieldname = 'ALT'.
  wa_it_fldcat-col_pos = flds_count.
  wa_it_fldcat-datatype = 'CHAR'.
  wa_it_fldcat-intlen = 3.
  wa_it_fldcat-outputlen = 3.
  APPEND wa_it_fldcat TO it_fldcat.

  PERFORM append_fieldcatalog USING 'ALT' '<dyn_table>' text-h05
                                      flds_count '' '' '' '' '' '' '' ''
                                      '' ''.
  ADD 1 TO flds_count.
  wa_it_fldcat-fieldname = 'DMIBEG'.
  wa_it_fldcat-col_pos = flds_count.
  wa_it_fldcat-datatype = 'DATS'.
  wa_it_fldcat-intlen = 8.
  wa_it_fldcat-outputlen = 8.
  APPEND wa_it_fldcat TO it_fldcat.

  PERFORM append_fieldcatalog USING 'DMIBEG' '<dyn_table>' text-h06
                                      flds_count '' '' '' '' '' '' '' ''
                                      '' ''.

  ADD 1 TO flds_count.
  wa_it_fldcat-fieldname = 'DMIEND'.
  wa_it_fldcat-col_pos = flds_count.
  wa_it_fldcat-datatype = 'DATS'.
  wa_it_fldcat-intlen = 8.
  wa_it_fldcat-outputlen = 8.
  APPEND wa_it_fldcat TO it_fldcat.

  PERFORM append_fieldcatalog USING 'DMIEND' '<dyn_table>' text-h07
                                      flds_count '' '' '' '' '' '' '' ''
                                      '' ''.

  ADD 1 TO flds_count.
  wa_it_fldcat-fieldname = 'DMIEND'.
  wa_it_fldcat-col_pos = flds_count.
  wa_it_fldcat-datatype = 'DATS'.
  wa_it_fldcat-intlen = 8.
  wa_it_fldcat-outputlen = 8.
  APPEND wa_it_fldcat TO it_fldcat.

  PERFORM append_fieldcatalog USING 'LAST_ACT' '<dyn_table>' text-h08
                                      flds_count '' '' '' '' '' '' '' ''
                                      '' ''.

  ADD 1 TO flds_count.
  wa_it_fldcat-fieldname = 'DMIEND'.
  wa_it_fldcat-col_pos = flds_count.
  wa_it_fldcat-datatype = 'DATS'.
  wa_it_fldcat-intlen = 8.
  wa_it_fldcat-outputlen = 8.
  APPEND wa_it_fldcat TO it_fldcat.

  PERFORM append_fieldcatalog USING 'P_DATE' '<dyn_table>' text-h09
                                      flds_count '' '' '' '' '' '' '' ''
                                      '' ''.

  ADD 1 TO flds_count.
  wa_it_fldcat-fieldname = 'BKOND'.
  wa_it_fldcat-col_pos = flds_count.
  wa_it_fldcat-currency = 'BRL'.
  wa_it_fldcat-datatype = 'CURR'.
  wa_it_fldcat-outputlen = 20.
  wa_it_fldcat-intlen = 15.
  APPEND wa_it_fldcat TO it_fldcat .

  PERFORM append_fieldcatalog USING 'BKOND' '<dyn_table>' text-h10
                                      flds_count '' '' '' '' '' '' '' ''
                                      '' ''.

  ADD 1 TO flds_count.
  wa_it_fldcat-fieldname = 'MONAT'.
  wa_it_fldcat-col_pos = flds_count.
  wa_it_fldcat-datatype = 'CHAR'.
  wa_it_fldcat-intlen = 16.
  wa_it_fldcat-outputlen = 16.
  APPEND wa_it_fldcat TO it_fldcat.

  PERFORM append_fieldcatalog USING 'MONAT' '<dyn_table>' text-h11
                                      flds_count '' '' '' '' '' '' '' ''
                                      '' ''.

  ADD 1 TO flds_count.
  wa_it_fldcat-fieldname = 'LINEAR'.
  wa_it_fldcat-col_pos = flds_count.
  wa_it_fldcat-currency = 'BRL'.
  wa_it_fldcat-datatype = 'CURR'.
  wa_it_fldcat-outputlen = 20.
  wa_it_fldcat-intlen = 15.
  APPEND wa_it_fldcat TO it_fldcat .

  PERFORM append_fieldcatalog USING 'LINEAR' '<dyn_table>' text-h12
                                     flds_count '' '' '' '' '' '' '' ''
                                      '' ''.

  ADD 1 TO flds_count.
  wa_it_fldcat-fieldname = 'DELTA'.
  wa_it_fldcat-col_pos = flds_count.
  wa_it_fldcat-currency = 'BRL'.
  wa_it_fldcat-datatype = 'CURR'.
  wa_it_fldcat-outputlen = 20.
  wa_it_fldcat-intlen = 15.
  APPEND wa_it_fldcat TO it_fldcat .

  PERFORM append_fieldcatalog USING 'DELTA' '<dyn_table>' text-h13
                                      flds_count '' '' '' '' '' '' '' ''
                                      '' ''.

  ADD 1 TO flds_count.
  wa_it_fldcat-fieldname = 'CONTROL'.
  wa_it_fldcat-col_pos = flds_count.
  wa_it_fldcat-currency = 'BRL'.
  wa_it_fldcat-datatype = 'CURR'.
  wa_it_fldcat-outputlen = 20.
  wa_it_fldcat-intlen = 15.
  APPEND wa_it_fldcat TO it_fldcat .

  PERFORM append_fieldcatalog USING 'CONTROL' '<dyn_table>' text-h14
                                      flds_count '' '' '' '' '' '' '' ''
                                      '' ''.

  ADD 1 TO flds_count.
  MOVE '01' TO p_date+6(2).
*** Dado de teste
  MOVE 2 TO max_months.
*** Dado de teste
  DO max_months TIMES.
    CLEAR wa_it_fldcat.


    CALL FUNCTION 'RE_ADD_MONTH_TO_DATE'
         EXPORTING
              months  = cnt
              olddate = p_date
         IMPORTING
              newdate = x_date.


    CONCATENATE x_date+4(2) '-' x_date(4) INTO x_mes_ano.
    WRITE x_mes_ano TO wa_it_fldcat-fieldname.


    wa_it_fldcat-col_pos = flds_count.
    wa_it_fldcat-currency = 'BRL'.
    wa_it_fldcat-datatype = 'CURR'.
    wa_it_fldcat-outputlen = 20.
    wa_it_fldcat-intlen = 15.
    APPEND wa_it_fldcat TO it_fldcat.

    PERFORM append_fieldcatalog USING wa_it_fldcat-fieldname
                                      '<dyn_table>' text-h14 flds_count
                                      '' '' '' '' '' '' ''
                                      '' '' ''.
    ADD 1 TO flds_count.
    ADD 1 TO cnt.
  ENDDO.

  CALL METHOD cl_alv_table_create=>create_dynamic_table
       EXPORTING
         it_fieldcatalog = it_fldcat
       IMPORTING
         ep_table        = new_table.

  ASSIGN new_table->* TO <dyn_table>.
ENDFORM.                    " constroi_fieldcatalog
*&---------------------------------------------------------------------*
*&      Form  append_fieldcatalog
*&---------------------------------------------------------------------*
FORM append_fieldcatalog USING i_fieldname       TYPE any
                                 i_tabname         TYPE any
                                 i_seltext_m       TYPE any
                                 i_col_pos         TYPE any
                                 i_ref_fieldname   TYPE any
                                 i_ref_tabname     TYPE any
                                 i_key             TYPE any
                                 i_text            TYPE any
                                 i_checkbox        TYPE any
                                 i_edit            TYPE any
                                 i_no_out          TYPE any
                                 i_hotspot         TYPE any
                                 i_sum             TYPE any
                                 i_inttype         TYPE any.

  CLEAR fieldcatalog.

  fieldcatalog-fieldname     = i_fieldname.
  fieldcatalog-tabname       = i_tabname.
  fieldcatalog-col_pos       = i_col_pos.
  fieldcatalog-seltext_m     = i_seltext_m.
  fieldcatalog-ref_fieldname = i_ref_fieldname.
  fieldcatalog-ref_tabname   = i_ref_tabname.
  fieldcatalog-key           = i_key.
  fieldcatalog-reptext_ddic  = i_text.
  fieldcatalog-checkbox      = i_checkbox.
  fieldcatalog-edit          = i_edit.
  fieldcatalog-no_out        = i_no_out.
  fieldcatalog-hotspot       = i_hotspot.
  fieldcatalog-do_sum        = i_sum.
  fieldcatalog-inttype       = i_inttype.

  APPEND fieldcatalog.
  CLEAR fieldcatalog.
ENDFORM.                    " append_fieldcatalog

What can be wrong?

Best Regards,

Pedro Gaspar

8 REPLIES 8
Read only

Former Member
0 Likes
1,095

Hi,

I am not sure whether you have pasted the entire code bcz it doesnt seem to be complete code.

I dont see any Start-of-Selection/End-of-selection event, nor any call to any of the forms using PERFORM statement.

Simply defining a class & its method wont serve the purpose.

Best regards,

Prashant

Read only

0 Likes
1,095

Hello Prashant,

Here it goes the complete code:


*&---------------------------------------------------------------------*
*& Programa Z3DDR002                                                   *
*& Mapa de Linearização de Contratos                                   *
*&---------------------------------------------------------------------*
*& Sonae Sierra                                                        *
*& Pedro Gaspar - 24.05.2007                                           *
*&---------------------------------------------------------------------*
INCLUDE z3ddr002top.
INCLUDE z3ddr001c01.        " Definições e Implementações de Classes
INCLUDE z3ddr002f01.

AT SELECTION-SCREEN.
* toDo Implementar impossibilidade de pedir datas futuras?
  IF p_date GT sy-datum.
    MESSAGE e995(z3) WITH text-m00.
  ENDIF.

* Bloco de Selecção de Dados
*----------------------------------------------------------------------*
START-OF-SELECTION.

* Adiciona Condições de Aluguer ao Range de Condições de Aluguer
  CALL METHOD crange=>add:
    EXPORTING low = '0010' CHANGING range = r_skoart,
    EXPORTING low = '0020' CHANGING range = r_skoart,
    EXPORTING low = '0040' CHANGING range = r_skoart,
    EXPORTING low = '0170' CHANGING range = r_skoart,
    EXPORTING low = '0300' CHANGING range = r_skoart,
    EXPORTING low = '0320' CHANGING range = r_skoart,
    EXPORTING low = '0915' CHANGING range = r_skoart.

  PERFORM selecciona_dados.

* Bloco Após Selecção de Dados
*----------------------------------------------------------------------*
END-OF-SELECTION.
* Calcula facturacao do processamento antigo
  PERFORM calcula_facturacao USING t_zcondsnapshots_old.

  LOOP AT t_cond_monthly_value INTO w_cond_monthly_value.
    MOVE-CORRESPONDING w_cond_monthly_value TO w_total_old.

    COLLECT w_total_old INTO t_total_old.
  ENDLOOP.

* Calcula facturacao do processamento novo
  PERFORM calcula_facturacao USING t_zcondsnapshots.

* Preenche tabelas com dados para apresentação
  PERFORM prepara_dados.

* Cria fieldcatalog Dinâmico
  PERFORM constroi_fieldcatalog.

* Alimenta a Tabela Dinâmica com Dados
  PERFORM alimenta_tabela_dyn.

* Apresenta ALV
  PERFORM apresenta_alv.
*----------------------------------------------------------------------*
* Fim de Programa

*&---------------------------------------------------------------------*
*& Include Z3DDR002TOP                                                 *
*&                                                                     *
*&---------------------------------------------------------------------*
PROGRAM z3ddr002.

TYPE-POOLS: slis.

DATA: w_zcondsnapshots TYPE zcondsnapshots,
      w_vimimv         TYPE vimimv,
      w_vzzkopo        TYPE vzzkopo,
      w_vikoko         TYPE vikoko.

DATA: BEGIN OF w_conds,
        intreno  LIKE vimimv-intreno,
        skoart   LIKE vzzkopo-skoart,
        dguel_kp LIKE vzzkopo-dguel_kp,
        bkond    LIKE vzzkopo-bkond,
      END OF w_conds.

DATA: BEGIN OF w_cond_monthly_value,
        intreno     LIKE vimimv-intreno,
        monat(2)    TYPE n,
        gjahr(4)    TYPE n,
        skoart      LIKE vzzkopo-skoart,
        max_days(2) TYPE n,
        bkond       LIKE vzzkopo-bkond,
        szbmeth     LIKE vikoko-szbmeth,
      END OF w_cond_monthly_value.

DATA: BEGIN OF w_total_old,
        intreno LIKE vimimv-intreno,
        bkond   LIKE vzzkopo-bkond,
      END OF w_total_old.

DATA: BEGIN OF w_total,
        intreno  LIKE vimimv-intreno,
        bukrs    LIKE vimimv-bukrs,
        swenr    LIKE vimimv-swenr,
        smive    LIKE vimimv-smive,
        smenr    LIKE vimimv-smenr,
        zznmfan  LIKE vimimv-zznmfan,
        alt      TYPE c,
        dmibeg   LIKE vimimv-dmibeg,
        dmiend   LIKE vimimv-dmiend,
        last_act LIKE sy-datum,
        p_date   LIKE sy-datum,
        bkond    LIKE vzzkopo-bkond,
        monat    LIKE komp-anz_monate,
        linear   LIKE vzzkopo-bkond,
        delta    LIKE vzzkopo-bkond,
        control  LIKE vzzkopo-bkond,
        color(4) TYPE c,
      END OF w_total.

DATA: t_zcondsnapshots     LIKE TABLE OF w_zcondsnapshots,
      t_zcondsnapshots_old LIKE TABLE OF w_zcondsnapshots,
      t_vimimv             LIKE TABLE OF w_vimimv,
      t_conds              LIKE TABLE OF w_conds,
      t_conds_aux          LIKE TABLE OF w_conds,
      t_conds_to_charge    LIKE TABLE OF w_conds,
      t_cond_monthly_value LIKE TABLE OF w_cond_monthly_value,
      t_total_old          LIKE TABLE OF w_total_old,
      t_total              LIKE TABLE OF w_total.

* Ranges
DATA: r_skoart TYPE RANGE OF skoart.

* ALV
DATA: new_table TYPE REF TO data,
      new_line  TYPE REF TO data.

DATA: it_fldcat    TYPE lvc_t_fcat,
      wa_it_fldcat TYPE lvc_s_fcat.

DATA: fieldcatalog TYPE slis_t_fieldcat_alv WITH HEADER LINE,
      gd_tab_group TYPE slis_t_sp_group_alv,
      gd_layout    TYPE slis_layout_alv,
      gd_event     TYPE slis_t_event,
      gd_repid     LIKE sy-repid.

DATA: x_date        TYPE sy-datum,
      x_days(2)     TYPE n,
      x_months      LIKE komp-anz_monate,
      x_monat(2)    TYPE n,
      x_gjahr(4)    TYPE n,
      x_mes_ano(7)  TYPE c,
      my_subrc      LIKE sy-subrc,
      last_intreno  LIKE vimimv-intreno,
      last_skoart   LIKE vzzkopo-skoart,
      last_dguel_kp LIKE vzzkopo-dguel_kp,
      max_months    LIKE komp-anz_monate.

FIELD-SYMBOLS: <dyn_table> TYPE STANDARD TABLE,
               <dyn_wa>.

FIELD-SYMBOLS: <fs1>.

* Écran de Selecção
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-s01.
PARAMETERS: p_date LIKE sy-datum.
SELECTION-SCREEN END OF BLOCK b1.

*----------------------------------------------------------------------*
*   INCLUDE Z3DDR001C01                                                *
*----------------------------------------------------------------------*
*INCLUDE: <icon>.
*
**---------------------------------------------------------------------*
**       CLASS cdata DEFINITION
**---------------------------------------------------------------------*
**       ........                                                      *
**---------------------------------------------------------------------*
*CLASS cdata DEFINITION.
*  PUBLIC SECTION.
*    DATA: info               TYPE REF TO data.
*
*    METHODS constructor
*      IMPORTING
*        data                 TYPE any   OPTIONAL
*        table                TYPE table OPTIONAL.
*
*    METHODS add_data
*      CHANGING
*        data                 TYPE any   OPTIONAL
*        table                TYPE table OPTIONAL.
*
*    METHODS field
*      IMPORTING
*        fieldname            TYPE any
*      RETURNING
*        value(field_value)   TYPE REF TO data.
*
*    METHODS get_field
*      IMPORTING
*        fieldname            TYPE any
*      EXPORTING
*        field_value          TYPE any.
*
*    METHODS row
*      IMPORTING
*        index                TYPE i
*      RETURNING
*        value(row)           TYPE REF TO data.
*ENDCLASS.                    "cdata DEFINITION
*
**---------------------------------------------------------------------*
**       CLASS cdata IMPLEMENTATION
**---------------------------------------------------------------------*
**       ........                                                      *
**---------------------------------------------------------------------*
*CLASS cdata IMPLEMENTATION.
*  METHOD constructor.
*    IF NOT data IS INITIAL.
*      GET REFERENCE OF data INTO info.
*    ENDIF.
*
*    IF NOT table IS INITIAL.
*      GET REFERENCE OF table INTO info.
*    ENDIF.
*  ENDMETHOD.                    "constructor
*
*  METHOD add_data.
*    IF NOT data IS INITIAL.
*      GET REFERENCE OF data INTO info.
*    ENDIF.
*
*    IF NOT table IS INITIAL.
*      GET REFERENCE OF table INTO info.
*    ENDIF.
*  ENDMETHOD.                    "add_data
*
*  METHOD get_field.
*    FIELD-SYMBOLS: <info>         TYPE ANY,
*                   <field_value>  TYPE ANY.
*
*    ASSIGN info->* TO <info>.
*    ASSIGN COMPONENT fieldname OF STRUCTURE <info> TO <field_value>.
*
*    IF sy-subrc = 0.
*      field_value = <field_value>.
*    ELSE.
*      CLEAR field_value.
*    ENDIF.
*  ENDMETHOD.                    "get_field
*
*  METHOD field.
*    FIELD-SYMBOLS: <info>         TYPE ANY,
*                   <field_value>  TYPE ANY.
*
*    ASSIGN info->* TO <info>.
*    ASSIGN COMPONENT fieldname OF STRUCTURE <info> TO <field_value>.
*
*    IF sy-subrc = 0.
*      GET REFERENCE OF <field_value> INTO field_value.
*    ELSE.
*      CLEAR field_value.
*    ENDIF.
*  ENDMETHOD.                    "field
*
*  METHOD row.
*    FIELD-SYMBOLS: <table>        TYPE table,
*                   <row>          TYPE ANY.
*
*    ASSIGN info->* TO <table>.
*
*    READ TABLE  <table>
*     ASSIGNING  <row>
*         INDEX  index.
*
*    IF sy-subrc = 0.
*      GET REFERENCE OF <row> INTO row.
*    ELSE.
*      CLEAR row.
*    ENDIF.
*  ENDMETHOD.                    "row
*ENDCLASS.                    "cdata IMPLEMENTATION
*
**---------------------------------------------------------------------*
**       CLASS cdate DEFINITION
**---------------------------------------------------------------------*
**
**---------------------------------------------------------------------*
*CLASS cdate DEFINITION.
*  PUBLIC SECTION.
*    CLASS-METHODS get_age
*      IMPORTING begda               TYPE datum
*                endda               TYPE datum DEFAULT sy-datum
*      RETURNING value(age)          TYPE i.
*
*    CLASS-METHODS add_months
*      IMPORTING months              TYPE i
*                date                TYPE datum
*      RETURNING value(date_after)   TYPE datum.
*
*    CLASS-METHODS subtract_months
*      IMPORTING months              TYPE any
*                date                TYPE datum
*      RETURNING value(date_after)   TYPE datum.
*
*    CLASS-METHODS add_days30
*      IMPORTING days                TYPE i
*                date                TYPE datum
*      RETURNING value(date_after)   TYPE datum.
*
*    CLASS-METHODS add_days_30_split
*      IMPORTING total_days          TYPE i
*      CHANGING  years               TYPE i
*                months              TYPE i
*                days                TYPE i.
*
*    CLASS-METHODS month_last_day
*      IMPORTING
*        year                        TYPE numc04
*        month                       TYPE numc2
*      RETURNING
*        value(date)                 TYPE datum.
*
*    CLASS-METHODS add_period
*      IMPORTING
*        VALUE                       type i  default 1
*      CHANGING
*        year                        TYPE numc04
*        month                       TYPE numc2.
*
*    CLASS-METHODS set_period_text
*      IMPORTING
*        date                        TYPE datum   OPTIONAL
*        year                        TYPE any     OPTIONAL
*        month                       TYPE any     OPTIONAL
*        separator                   TYPE char1   DEFAULT '-'
*      RETURNING
*        value(period_text)          TYPE text20.
*ENDCLASS.                    "cdate DEFINITION
*
**---------------------------------------------------------------------*
**       CLASS CDATE IMPLEMENTATION
**---------------------------------------------------------------------*
**
**---------------------------------------------------------------------*
*CLASS cdate IMPLEMENTATION.
*  METHOD get_age.
*    age = endda(4) - begda(4).
*
*    IF endda+4(2) < begda+4(2).
*      age = age - 1.
*    ELSEIF endda+4(2) = begda+4(2).
*      IF endda+6(2) < begda+6(2).
*        age = age - 1.
*      ENDIF.
*    ENDIF.
*  ENDMETHOD.                    "get_age
*
*  METHOD add_months.
*    date_after = date.
*
*    DO months TIMES.
*      ADD 1 TO date_after(6).
*
*      IF date_after+4(2) > 12.
*        ADD 1 TO date_after(4).
*        date_after+4(2) = '01'.
*      ENDIF.
*    ENDDO.
*  ENDMETHOD.                    "add_months
*
*  METHOD subtract_months.
*    date_after = date.
*
*    DO months TIMES.
*      SUBTRACT 1 FROM date_after(6).
*
*      IF date_after+4(2) = 0.
*        SUBTRACT 1 FROM date_after(4).
*        date_after+4(2) = '12'.
*      ENDIF.
*    ENDDO.
*  ENDMETHOD.                    "subtract_months
*
*  METHOD add_days30.
*    DATA: lv_months        TYPE i,
*          lv_days          TYPE i,
*          lv_days_to_month TYPE i,
*          lv_period        TYPE iperi.
*
*    date_after = date.
*
*    lv_months = days DIV 30.
*    lv_days   = days MOD 30.
*
*    date_after = add_months( months = lv_months date = date_after ).
*
*    lv_days_to_month = 30 - date_after+6(2).
*
*    IF lv_days > lv_days_to_month.
*      date_after = add_months( months = 1 date = date_after ).
*      date_after+6(2) = lv_days - lv_days_to_month.
*    ELSE.
*      lv_period = date_after(6).
*      ADD lv_days TO date_after.
*
*      IF date_after(6) > lv_period.
*        date_after+6(2) = '01'.
*        SUBTRACT 1 FROM date_after.
*      ENDIF.
*    ENDIF.
*  ENDMETHOD.                                                "add_days30
*
*  METHOD add_days_30_split.
*    DATA: lv_years    TYPE i,
*          lv_months   TYPE i,
*          lv_days     TYPE i.
*
*    CLEAR: lv_years,
*           lv_months,
*           lv_days.
*
*    lv_years = total_days DIV 365.
*    lv_days  = total_days MOD 365.
*
*    IF lv_days > 30.
*      lv_months = lv_days DIV 30.
*      lv_days   = lv_days MOD 30.
*    ENDIF.
*
*    ADD lv_years  TO years.
*    ADD lv_months TO months.
*    ADD lv_days   TO days.
*  ENDMETHOD.                    "add_days_30_split
*
*  METHOD month_last_day.
*    date = year.
*
*    IF month = '12'.
*      date+4(4) = '1231'.
*    ELSE.
*      date+4(2) = month + 1.
*      date+6(2) = '01'.
*
*      SUBTRACT 1 FROM date.
*    ENDIF.
*  ENDMETHOD.                    "month_last_day
*
*  METHOD add_period.
*    DATA: lv_date    TYPE datum,
*          lv_value   TYPE i.
*
*    lv_value = abs( value ).
*
*    lv_date(4)   = year.
*    lv_date+4(2) = month.
*    lv_date+6(2) = '01'.
*
*    IF value > 0.
*      lv_date = add_months( date = lv_date months = lv_value ).
*    ELSE.
*      lv_date = subtract_months( date = lv_date months = lv_value ).
*    ENDIF.
*
*    year  = lv_date(4).
*    month = lv_date+4(2).
*  ENDMETHOD.                    "add_period
*
*  METHOD set_period_text.
*    DATA: lt_months    TYPE TABLE OF t247,
*          ls_months    TYPE t247,
*          lv_year      TYPE gjahr,
*          lv_month     TYPE monat.
*
*    IF NOT date IS INITIAL.
*      lv_year  = date(4).
*      lv_month = date+4(2).
*    ELSE.
*      lv_year  = year.
*      lv_month = month.
*    ENDIF.
*
*    CALL FUNCTION 'MONTH_NAMES_GET'
*         TABLES
*              month_names           = lt_months[]
*         EXCEPTIONS
*              month_names_not_found = 1
*              OTHERS                = 2.
*
*    READ TABLE  lt_months
*          INTO  ls_months
*      WITH KEY  mnr = lv_month.
*
*    IF sy-subrc IS INITIAL.
*      CONCATENATE ls_months-ltx(3) separator lv_year+2(2)
*             INTO period_text.
*
*      CONDENSE period_text.
*    ENDIF.
*  ENDMETHOD.                    "set_period_text
*ENDCLASS.                    "CDATE IMPLEMENTATION
*
*---------------------------------------------------------------------*
*       CLASS cstring DEFINITION
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
CLASS cstring DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS conc
      IMPORTING
        text1        TYPE any
        text2        TYPE any
        text3        TYPE any OPTIONAL
        text4        TYPE any OPTIONAL
      RETURNING
        value(text)  TYPE text132.
ENDCLASS.                    "cstring DEFINITION

*---------------------------------------------------------------------*
*       CLASS cstring IMPLEMENTATION
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
CLASS cstring IMPLEMENTATION.
  METHOD conc.
    DATA: lv_text1   TYPE text132,
          lv_text2   TYPE text132,
          lv_text3   TYPE text132,
          lv_text4   TYPE text132.

    WRITE: text1   TO lv_text1,
           text2   TO lv_text2.

    CONDENSE: lv_text1,
              lv_text2.

    IF NOT text3 IS INITIAL.
      WRITE text3   TO lv_text3.
      CONDENSE lv_text3.
    ENDIF.

    IF NOT text4 IS INITIAL.
      WRITE text4   TO lv_text4.
      CONDENSE lv_text4.
    ENDIF.

    CONCATENATE lv_text1 lv_text2 lv_text3 lv_text4
           INTO text SEPARATED BY space.
  ENDMETHOD.                    "conc
ENDCLASS.                    "cstring IMPLEMENTATION
**---------------------------------------------------------------------*
**       CLASS cdic DEFINITION
**---------------------------------------------------------------------*
**
**---------------------------------------------------------------------*
*CLASS cdic DEFINITION.
*  PUBLIC SECTION.
*    CLASS-METHODS domain_text
*      IMPORTING domain           TYPE any
*                VALUE            type any
*      RETURNING value(text)      TYPE val_text.
*
*    CLASS-METHODS data_element_text
*      IMPORTING rollname         TYPE any
*      RETURNING value(text)      TYPE scrtext_l.
*
*    CLASS-METHODS field_attributes
*      IMPORTING
*        table            TYPE any
*        field            TYPE any
*      CHANGING
*        info             TYPE dd03l      OPTIONAL
*        text             TYPE scrtext_l  OPTIONAL.
*
*    CLASS-METHODS split_name
*      IMPORTING
*        name             TYPE any
*      CHANGING
*        fieldname        TYPE fieldname  OPTIONAL
*        tabname          TYPE tabname    OPTIONAL
*        subrc            TYPE subrc      OPTIONAL.
*
*    CLASS-METHODS field_part
*      IMPORTING
*        name             TYPE any
*      RETURNING
*        value(field)     TYPE fieldname.
*
*    CLASS-METHODS tab_part
*      IMPORTING
*        name             TYPE any
*      RETURNING
*        value(tab)       TYPE tabname.
*ENDCLASS.                    "cdic DEFINITION
*
**---------------------------------------------------------------------*
**       CLASS cdic IMPLEMENTATION
**---------------------------------------------------------------------*
**
**---------------------------------------------------------------------*
*CLASS cdic IMPLEMENTATION.
*  METHOD domain_text.
*    DATA: lv_value       TYPE domvalue_l,
*          lv_domain_info TYPE dd07v.
*
*    CLEAR text.
*
*    lv_value = value.
*
*    CALL FUNCTION 'DDUT_DOMVALUE_TEXT_GET'
*         EXPORTING
*              name          = domain
*              value         = lv_value
*         IMPORTING
*              dd07v_wa      = lv_domain_info
*         EXCEPTIONS
*              not_found     = 1
*              illegal_input = 2
*              OTHERS        = 3.
*
*    IF sy-subrc = 0.
*      text = lv_domain_info-ddtext.
*    ENDIF.
*  ENDMETHOD.                    "domain_text
*
*  METHOD data_element_text.
*    CLEAR text.
*    SELECT  SINGLE scrtext_l
*      INTO  text
*      FROM  dd04t
*     WHERE  rollname   = rollname
*       AND  ddlanguage = sy-langu
*       AND  as4local   = 'A'
*       AND  as4vers    = '0000'.
*  ENDMETHOD.                    "data_element_text
*
*  METHOD field_attributes.
*    CLEAR: info,
*           text.
*
*    SELECT  *
*      INTO  info
*      FROM  dd03l UP TO 1 ROWS
*     WHERE  tabname   = table
*       AND  fieldname = field
*       AND  as4local  = 'A'
*       AND  as4vers   = '0000'.
*      text = data_element_text( info-rollname ).
*    ENDSELECT.
*  ENDMETHOD.                    "field_attributes
*
*  METHOD split_name.
*    CLEAR: tabname,
*           fieldname.
*
*    SPLIT name AT '-' INTO tabname fieldname.
*
*    subrc = sy-subrc.
*  ENDMETHOD.                    "split_name
*
*  METHOD field_part.
*    CALL METHOD split_name
*      EXPORTING
*        name      = name
*      CHANGING
*        fieldname = field.
*  ENDMETHOD.                    "field_part
*
*  METHOD tab_part.
*    CALL METHOD split_name
*      EXPORTING
*        name    = name
*      CHANGING
*        tabname = tab.
*  ENDMETHOD.                    "tab_part
*ENDCLASS.                    "cdic IMPLEMENTATION
**---------------------------------------------------------------------*
**       CLASS cpopup DEFINITION
**---------------------------------------------------------------------*
**
**---------------------------------------------------------------------*
*CLASS cpopup DEFINITION.
*  PUBLIC SECTION.
*    DATA: fields      TYPE TABLE OF sval.
*
*    METHODS constructor.
*
*    METHODS add_field
*      IMPORTING
*        field         TYPE any
*        comp_field    TYPE any  OPTIONAL
*        text          TYPE any  OPTIONAL
*        VALUE         type any  optional
*        mode          TYPE any  DEFAULT space
*        obligatory    TYPE any  DEFAULT space
*        no_value_help TYPE any  DEFAULT space.
*
*    METHODS get_value
*      IMPORTING
*        field               TYPE any
*      RETURNING
*        value(field_value)  TYPE spo_value.
*
*    METHODS display
*      IMPORTING
*        title         TYPE any
*        column        TYPE i     DEFAULT 30
*        row           TYPE i     DEFAULT 5
*      CHANGING
*        answer        TYPE char1 OPTIONAL.
*
*    CLASS-METHODS table_select
*      IMPORTING
*        title         TYPE any DEFAULT 'Escolher Opção'
*        list          TYPE table
*        field         TYPE fieldname
*        current       TYPE i DEFAULT 1
*        column        TYPE i DEFAULT 20
*        row           TYPE i DEFAULT 5
*        display_only  TYPE c DEFAULT space
*      CHANGING
*        option        TYPE i
*        answer        TYPE c     OPTIONAL
*        subrc         TYPE subrc OPTIONAL.
*
*    CLASS-METHODS ask
*      IMPORTING
*        title           TYPE any
*        question        TYPE any
*        yes             TYPE any      DEFAULT 'Sim'
*        no              TYPE any      DEFAULT 'Não'
*        cancel_display  TYPE c        DEFAULT 'X'
*        popup_type      TYPE iconname OPTIONAL
*      CHANGING
*        answer          TYPE c     OPTIONAL
*        subrc           TYPE subrc OPTIONAL.
*
*    CLASS-METHODS confirm
*      IMPORTING
*        title           TYPE c
*        text1           TYPE c
*        text2           TYPE c     OPTIONAL
*        text3           TYPE c     OPTIONAL
*        line1           TYPE c
*        line2           TYPE c     OPTIONAL
*        default         TYPE c     DEFAULT 'Y'
*        start_column    TYPE i     DEFAULT 25
*        start_row       TYPE i     DEFAULT 6
*        cancel_display  TYPE c     DEFAULT 'X'
*      CHANGING
*        answer        TYPE c     OPTIONAL
*        subrc         TYPE subrc OPTIONAL.
*ENDCLASS.                    "cpopup DEFINITION
*
**---------------------------------------------------------------------*
**       CLASS cpopup IMPLEMENTATION
**---------------------------------------------------------------------*
**
**---------------------------------------------------------------------*
*CLASS cpopup IMPLEMENTATION.
*  METHOD constructor.
*    CLEAR: me->fields.
*  ENDMETHOD.                    "constructor
*
*  METHOD add_field.
*    DATA: ls_field       TYPE sval,
*          lv_field       TYPE fieldname,
*          lv_table       TYPE tabname,
*          lv_comp_field  TYPE fieldname,
*          lv_comp_table  TYPE fieldname.
*
*    CLEAR: lv_table,
*           lv_field,
*           lv_comp_table,
*           lv_comp_field.
*
*    CALL METHOD cdic=>split_name
*      EXPORTING
*        name      = field
*      CHANGING
*        tabname   = lv_table
*        fieldname = lv_field.
*
*
*    IF NOT comp_field IS INITIAL.
*      CALL METHOD cdic=>split_name
*        EXPORTING
*          name      = comp_field
*        CHANGING
*          tabname   = lv_comp_table
*          fieldname = lv_comp_field.
*    ENDIF.
*
*    CLEAR ls_field.
*    ls_field-tabname     = lv_table.
*    ls_field-fieldname   = lv_field.
*    ls_field-value       = value.
*    ls_field-field_attr  = mode.
*    ls_field-field_obl   = obligatory.
*    ls_field-fieldtext   = text.
*    ls_field-novaluehlp  = no_value_help.
*    ls_field-comp_tab    = lv_comp_table.
*    ls_field-comp_field  = lv_comp_field.
*    APPEND ls_field TO fields.
*  ENDMETHOD.                    "add_field
*
*  METHOD get_value.
*    DATA: ls_field   TYPE sval,
*          lv_field   TYPE fieldname,
*          lv_table   TYPE tabname.
*
*    CALL METHOD cdic=>split_name
*      EXPORTING
*        name      = field
*      CHANGING
*        tabname   = lv_table
*        fieldname = lv_field.
*
*    CLEAR field_value.
*
*    LOOP AT  fields
*       INTO  ls_field
*      WHERE  tabname   = lv_table
*        AND  fieldname = lv_field.
*      field_value = ls_field-value.
*    ENDLOOP.
*  ENDMETHOD.                    "get_value
*
*  METHOD display.
*    CALL FUNCTION 'POPUP_GET_VALUES'
*         EXPORTING
*              popup_title     = title
*              start_column    = column
*              start_row       = row
*         IMPORTING
*              returncode      = answer
*         TABLES
*              fields          = fields
*         EXCEPTIONS
*              error_in_fields = 1
*              OTHERS          = 2.
*  ENDMETHOD.                    "display
*
*  METHOD table_select.
******** Obsoleto substituido pela classe CPOPUP_SELECT
******************
*
*    FIELD-SYMBOLS: <list>   TYPE ANY,
*                   <value>  TYPE ANY.
*
*    DATA: lt_spopli TYPE STANDARD TABLE OF spopli,
*          ls_spopli TYPE spopli.
*
*    FREE lt_spopli.
*
*    CLEAR: option,
*           answer,
*           subrc.
*
*    LOOP AT list ASSIGNING <list>.
*      ASSIGN COMPONENT field OF STRUCTURE <list> TO <value>.
*
*      IF sy-subrc = 0.
*        CLEAR ls_spopli.
*        ls_spopli-varoption = <value>.
*        APPEND ls_spopli TO lt_spopli.
*      ENDIF.
*    ENDLOOP.
*
*    CALL FUNCTION 'POPUP_TO_DECIDE_LIST'
*         EXPORTING
*              cursorline         = current
*              start_col          = column
*              start_row          = row
*              textline1          = space
*              titel              = title
*              display_only       = display_only
*         IMPORTING
*              answer             = answer
*         TABLES
*              t_spopli           = lt_spopli
*         EXCEPTIONS
*              not_enough_answers = 1
*              too_much_answers   = 2
*              too_much_marks     = 3
*              OTHERS             = 4.
*
*    subrc = sy-subrc.
*
*    IF subrc IS INITIAL.
*      READ TABLE lt_spopli
*            INTO ls_spopli
*        WITH KEY selflag = 'X'.
*
*      IF sy-subrc = 0.
*        option = sy-tabix.
*      ENDIF.
*    ENDIF.
*  ENDMETHOD.                    "table_select
*
*  METHOD ask.
*    CLEAR: answer,
*           subrc.
*
*    CALL FUNCTION 'POPUP_TO_CONFIRM'
*         EXPORTING
*              titlebar              = title
*              text_question         = question
*              text_button_1         = yes
*              text_button_2         = no
*              display_cancel_button = cancel_display
*              popup_type            = popup_type
*         IMPORTING
*              answer                = answer
*         EXCEPTIONS
*              text_not_found        = 1
*              OTHERS                = 2.
*
*    subrc = sy-subrc.
*  ENDMETHOD.                    "ask
*
*  METHOD confirm.
*    CLEAR: answer,
*           subrc.
*
*    CALL FUNCTION 'POPUP_TO_CONFIRM_WITH_MESSAGE'
*         EXPORTING
*              defaultoption  = default
*              diagnosetext1  = text1
*              diagnosetext2  = text2
*              diagnosetext3  = text3
*              textline1      = line1
*              textline2      = line2
*              titel          = title
*              start_column   = start_column
*              start_row      = start_row
*              cancel_display = cancel_display
*         IMPORTING
*              answer         = answer.
*
*    subrc = sy-subrc.
*  ENDMETHOD.                    "confirm
*ENDCLASS.                    "cpopup IMPLEMENTATION

*---------------------------------------------------------------------*
*       CLASS crange DEFINITION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS crange DEFINITION.
  PUBLIC SECTION.
    TYPES: BEGIN OF tps_range,
             table       TYPE tabname,
             field       TYPE fieldname,
             range       TYPE RANGE OF char30,
           END OF tps_range.

    TYPES: tpt_range     TYPE TABLE OF tps_range.

    DATA: info           TYPE tpt_range.

    METHODS constructor.

    METHODS add_field
      IMPORTING
        table           TYPE tabname
        field           TYPE fieldname
        VALUE           type char30.

    CLASS-METHODS add
      IMPORTING
        SIGN          type sign_range   default 'I'
        option        TYPE opt_range    DEFAULT 'EQ'
        low           TYPE any
        high          TYPE any          OPTIONAL
        clear         TYPE char1        DEFAULT space
      CHANGING
        range         TYPE table.

    CLASS-METHODS select_options
      IMPORTING
        title             TYPE sytitle    DEFAULT  'Possible Values'
        text              TYPE rsseltext  OPTIONAL
        no_interval_check TYPE char1      DEFAULT space
        just_display      TYPE char1      DEFAULT space
        excluded_options  TYPE rsoptions  OPTIONAL
        help_field        TYPE rsscr_dbfi OPTIONAL
        search_help       TYPE shlpname   OPTIONAL
        tabname           TYPE tabname    OPTIONAL
        fieldname         TYPE fieldname  OPTIONAL
        clear             TYPE char1      DEFAULT space
      CHANGING
        range             TYPE table
        subrc             TYPE subrc     OPTIONAL.
ENDCLASS.                    "crange DEFINITION

*---------------------------------------------------------------------*
*       CLASS crange IMPLEMENTATION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS crange IMPLEMENTATION.
  METHOD constructor.
    CLEAR info.
  ENDMETHOD.                    "constructor

  METHOD add_field.
    DATA: ls_info    TYPE tps_range.

    IF NOT value IS INITIAL.
      LOOP AT  info
         INTO  ls_info
        WHERE  table = table
          AND  field = field.
        CALL METHOD crange=>add
          EXPORTING
            low   = value
          CHANGING
            range = ls_info-range.

        MODIFY info FROM ls_info.
      ENDLOOP.

      IF sy-subrc <> 0.
        CLEAR ls_info.
        ls_info-table = table.
        ls_info-field = field.

        CALL METHOD crange=>add
          EXPORTING
            low   = value
          CHANGING
            range = ls_info-range.

        APPEND ls_info TO info.
      ENDIF.
    ENDIF.
  ENDMETHOD.                    "add_field

  METHOD add.
    FIELD-SYMBOLS: <ls_range>  TYPE ANY,
                   <sign>      TYPE ANY,
                   <option>    TYPE ANY,
                   <low>       TYPE ANY,
                   <high>      TYPE ANY.

    DATA: ref_range            TYPE REF TO data.

    IF NOT clear IS INITIAL.
      CLEAR range.
    ENDIF.

    CREATE DATA ref_range   LIKE LINE OF range.
    ASSIGN ref_range->*     TO <ls_range>.

    CLEAR <ls_range>.

    ASSIGN COMPONENT 'SIGN'   OF STRUCTURE <ls_range> TO <sign>.

    IF sy-subrc = 0.
      <sign> = sign.
    ENDIF.

    ASSIGN COMPONENT 'OPTION' OF STRUCTURE <ls_range> TO <option>.

    IF sy-subrc = 0.
      IF option = 'BT' AND high IS INITIAL.
        <option> = 'EQ'.
      ELSE.
        <option> = option.
      ENDIF.
    ENDIF.

    ASSIGN COMPONENT 'LOW'    OF STRUCTURE <ls_range> TO <low>.

    IF sy-subrc = 0.
      <low> = low.
    ENDIF.

    ASSIGN COMPONENT 'HIGH'   OF STRUCTURE <ls_range> TO <high>.

    IF sy-subrc = 0.
      <high> = high.
    ENDIF.

    APPEND <ls_range> TO range.
  ENDMETHOD.                    "add

  METHOD select_options.
    DATA: ls_tab_and_field    TYPE rstabfield.

    ls_tab_and_field-tablename = tabname.
    ls_tab_and_field-fieldname = fieldname.

    IF NOT clear IS INITIAL.
      CLEAR range.
    ENDIF.

    CALL FUNCTION 'COMPLEX_SELECTIONS_DIALOG'
         EXPORTING
              title             = title
              text              = text
              no_interval_check = no_interval_check
              just_display      = just_display
              excluded_options  = excluded_options
              help_field        = help_field
              search_help       = search_help
              tab_and_field     = ls_tab_and_field
         TABLES
              range             = range
         EXCEPTIONS
              no_range_tab      = 1
              cancelled         = 2
              internal_error    = 3
              invalid_fieldname = 4
              OTHERS            = 5.

    subrc = sy-subrc.
  ENDMETHOD.                    "select_options
ENDCLASS.                    "crange IMPLEMENTATION
**---------------------------------------------------------------------*
**       Class (Definition) creport_alv
**---------------------------------------------------------------------*
**
**---------------------------------------------------------------------*
*CLASS creport_alv DEFINITION.
*  PUBLIC SECTION.
*    TYPE-POOLS: slis,
*                kkblo.
*
*    DATA: pubt_events     TYPE slis_t_event,
*          table           TYPE REF TO cdata,
*          changed         TYPE char1.
*
*    CLASS-DATA: pubt_header    TYPE slis_t_listheader,
*                pubv_pf_status TYPE gui_status.
*
*    METHODS constructor
*      IMPORTING
*        value(repid)      TYPE repid.
*
*    METHODS set_changed.
*
*    METHODS clear_changed.
*
*    METHODS check_changes
*      IMPORTING
*        title             TYPE any    DEFAULT 'Exit'
*        text              TYPE any    DEFAULT 'Modifications not saved'
*        question          TYPE any    DEFAULT 'Save?'
*      RETURNING
*        value(answer)     TYPE char1.
*
*    METHODS add_field
*      IMPORTING
*        field             TYPE fieldname
*        length            TYPE outputlen     OPTIONAL
*        text              TYPE any           OPTIONAL
*        rollname          TYPE rollname      OPTIONAL
*        datatype          TYPE datatype_d    OPTIONAL
*        inttype           TYPE inttype       OPTIONAL
*        icon              TYPE char1         DEFAULT space
*        checkbox          TYPE char1         DEFAULT space
*        just              TYPE char1         DEFAULT 'L'
*        no_out            TYPE char1         DEFAULT space
*        edit              TYPE char1         DEFAULT space
*        input             TYPE char1         DEFAULT space.
*
*    METHODS add_event
*      IMPORTING
*        event             TYPE any
*        form              TYPE any.
*
*    METHODS display_list
*      IMPORTING
*        title             TYPE lvc_title          OPTIONAL
*        zebra             TYPE char1              DEFAULT 'X'
*        get_selinfos      TYPE char1              DEFAULT 'X'
*        detail_popup      TYPE char1              DEFAULT 'X'
*        colwidth_optimize TYPE char1              DEFAULT 'X'
*        coll_top_p        TYPE char1              DEFAULT ' '
*        pf_status         TYPE slis_formname      DEFAULT space
*        user_command      TYPE slis_formname      DEFAULT space
*        confirm_prompt    TYPE char1              DEFAULT space
*        top_of_page       TYPE slis_formname      DEFAULT space
*        save              TYPE char1              DEFAULT space
*        edit              TYPE char1              DEFAULT space
*        edit_mode         TYPE char1              DEFAULT space
*        edit_callback     TYPE char1              DEFAULT space
*        variant           TYPE disvariant         OPTIONAL
*        variant_name      TYPE disvariant-variant OPTIONAL
*        box_fieldname     TYPE fieldname          DEFAULT space
*        start_column      TYPE i                  DEFAULT 0
*        end_column        TYPE i                  DEFAULT 0
*        start_line        TYPE i                  DEFAULT 0
*        end_line          TYPE i                  DEFAULT 0
*      CHANGING
*        data_table        TYPE table.
*
*    METHODS select_list
*      IMPORTING
*        title             TYPE any
*        selection         TYPE char1              DEFAULT 'X'
*        zebra             TYPE char1              DEFAULT 'X'
*        user_command      TYPE slis_formname      DEFAULT space
*        box_fieldname     TYPE fieldname          DEFAULT space
*        tabname           TYPE c                  DEFAULT space
*        start_column      TYPE i                  DEFAULT 0
*        end_column        TYPE i                  DEFAULT 0
*        start_line        TYPE i                  DEFAULT 0
*        end_line          TYPE i                  DEFAULT 0
*      CHANGING
*        data_table        TYPE table
*        cancel            TYPE char1              OPTIONAL.
*
*    CLASS-METHODS select_variant
*      IMPORTING
*        repid             TYPE syrepid DEFAULT sy-repid
*        uname             TYPE syuname DEFAULT sy-uname
*        save              TYPE char1   DEFAULT 'A'
*      CHANGING
*        variant           TYPE disvariant
*        param             TYPE slis_vari OPTIONAL.
*
*    CLASS-METHODS add_header_line
*      IMPORTING
*        type              TYPE char1         DEFAULT 'S'
*        margin            TYPE i             OPTIONAL
*        just              TYPE char1         DEFAULT 'L'
*        label             TYPE any           OPTIONAL
*        key               TYPE any           OPTIONAL
*        text1             TYPE any           OPTIONAL
*        text2             TYPE any           OPTIONAL
*        text3             TYPE any           OPTIONAL
*        text4             TYPE any           OPTIONAL
*        text5             TYPE any           OPTIONAL
*        text6             TYPE any           OPTIONAL.
*
*    CLASS-METHODS add_so_parameter
*      IMPORTING
*        margin            TYPE i             DEFAULT '31'
*        label             TYPE any
*        param_low         TYPE any
*        param_high        TYPE any           OPTIONAL.
*
*  PRIVATE SECTION.
*    DATA: prvt_fieldcat  TYPE slis_t_fieldcat_alv,
*          prvs_fieldcat  TYPE slis_fieldcat_alv,
*          prvs_layout    TYPE slis_layout_alv,
*          prvs_grid      TYPE lvc_s_glay,
*          prvs_variant   TYPE disvariant,
*          prvv_repid     TYPE repid.
*ENDCLASS.                    "creport_alv DEFINITION
*
**&---------------------------------------------------------------------
**
**&       Class (Implementation)  creport_alv
**&---------------------------------------------------------------------
**
**        Text
**----------------------------------------------------------------------
**
*CLASS creport_alv IMPLEMENTATION.
*  METHOD constructor.
*    FREE: prvt_fieldcat,
*          pubt_header,
*          pubt_events.
*
*    CLEAR: changed.
*
*    prvv_repid = repid.
*
*    CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
*         IMPORTING
*              et_events       = pubt_events
*         EXCEPTIONS
*              list_type_wrong = 1
*              OTHERS          = 2.
*  ENDMETHOD.                    "constructor
*
*  METHOD set_changed.
*    changed = 'X'.
*  ENDMETHOD.                    "set_changed
*
*  METHOD clear_changed.
*    CLEAR changed.
*  ENDMETHOD.                    "clear_changed
*
*  METHOD check_changes.
** ANSWER: 'A' - Cancel
**         'J' - Yes
**         'N' - No
*    IF NOT changed IS INITIAL.
*      CALL METHOD cpopup=>confirm
*        EXPORTING
*          title  = title
*          text1  = text
*          line1  = question
*        CHANGING
*          answer = answer.
*
*      IF answer <> 'A'.
*        CLEAR changed.
*      ENDIF.
*    ENDIF.
*  ENDMETHOD.                    "check_changes
*
*  METHOD select_variant.
*    DATA: lv_exit,
*          ls_variant   TYPE disvariant.
*
*    CLEAR variant.
*
*    ls_variant-report   = repid.
*    ls_variant-username = uname.
*
*    CALL FUNCTION 'REUSE_ALV_VARIANT_F4'
*         EXPORTING
*              is_variant    = ls_variant
*              i_save        = save
*         IMPORTING
*              e_exit        = lv_exit
*              es_variant    = variant
*         EXCEPTIONS
*              not_found     = 1
*              program_error = 2
*              OTHERS        = 3.
*
*    IF sy-subrc IS INITIAL AND lv_exit IS INITIAL.
*      param = variant-variant.
*    ELSE.
*      MESSAGE ID sy-msgid TYPE 'S'
*                   NUMBER sy-msgno
*                   WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
*    ENDIF.
*  ENDMETHOD.                    "select_variant
*
*  METHOD add_header_line.
*    DATA: is_header    TYPE slis_listheader,
*          is_line(60),
*          lv_text1(60),
*          lv_text2(60),
*          lv_text3(60),
*          lv_text4(60),
*          lv_text5(60),
*          lv_text6(60).
*
*    CLEAR: is_header,
*           is_line.
*
*    WRITE: text1 TO lv_text1,
*           text2 TO lv_text2,
*           text3 TO lv_text3,
*           text4 TO lv_text4,
*           text5 TO lv_text5,
*           text6 TO lv_text6.
*
*    CONCATENATE lv_text1 lv_text2 lv_text3 lv_text4 lv_text5 lv_text6
*           INTO is_line SEPARATED BY space.
*
*    CONDENSE is_line.
*
*    is_header-typ  = type.
*    is_header-key  = key.
*    is_header-info = label.
*
*    CASE just.
*      WHEN 'R'.
*        WRITE is_line TO is_header-info RIGHT-JUSTIFIED.
*      WHEN 'C'.
*        WRITE is_line TO is_header-info CENTERED.
*      WHEN OTHERS.
*        is_header-info+margin = is_line.
*    ENDCASE.
*
*    APPEND is_header TO pubt_header.
*  ENDMETHOD.                    "add_header_line
*
*  METHOD add_so_parameter.
*    DATA: lv_param_low(60),
*          lv_param_high(60).
*
*    WRITE param_low  TO lv_param_low.
*    WRITE param_high TO lv_param_high.
*
*    IF NOT param_low IS INITIAL.
*      IF param_high  IS INITIAL.
*        CALL METHOD creport_alv=>add_header_line
*          EXPORTING
*            type   = 'S'
*            margin = margin
*            label  = label
*            text1  = lv_param_low.
*      ELSE.
*        CALL METHOD creport_alv=>add_header_line
*          EXPORTING
*            type   = 'S'
*            margin = margin
*            label  = label
*            text1  = 'de'
*            text2  = lv_param_low
*            text3  = 'até'
*            text4  = lv_param_high.
*      ENDIF.
*    ENDIF.
*  ENDMETHOD.                    "add_so_parameter
*
*  METHOD add_field.
*    CLEAR prvs_fieldcat.
*    prvs_fieldcat-fieldname = field.
*    prvs_fieldcat-outputlen = length.
*    prvs_fieldcat-seltext_l = text.
*    prvs_fieldcat-seltext_m = text.
*    prvs_fieldcat-seltext_s = text.
*    prvs_fieldcat-rollname  = rollname.
*    prvs_fieldcat-datatype  = datatype.
*    prvs_fieldcat-inttype   = inttype.
*    prvs_fieldcat-icon      = icon.
*    prvs_fieldcat-checkbox  = checkbox.
*    prvs_fieldcat-just      = just.
*    prvs_fieldcat-no_out    = no_out.
*    prvs_fieldcat-edit      = edit.
*    prvs_fieldcat-input     = input.
*    APPEND prvs_fieldcat TO prvt_fieldcat.
*  ENDMETHOD.                    "add_field
*
*  METHOD add_event.
*    DATA: ls_event    TYPE slis_alv_event.
*
*    READ TABLE pubt_events
*      WITH KEY name = event
*          INTO ls_event.
*
*    IF sy-subrc IS INITIAL.
*      MOVE form TO ls_event-form.
*      MODIFY pubt_events FROM ls_event INDEX sy-tabix.
*    ENDIF.
*  ENDMETHOD.                    "add_event
*
*  METHOD display_list.
*    IF NOT pf_status IS INITIAL.
*      pubv_pf_status = pf_status.
*
*      CALL METHOD me->add_event
*        EXPORTING
*          event = slis_ev_pf_status_set
*          form  = 'SET_PF_STATUS'.
*    ENDIF.
*
*    CLEAR prvs_layout.
*    prvs_layout-zebra               = zebra.
*    prvs_layout-get_selinfos        = get_selinfos.
*    prvs_layout-detail_popup        = detail_popup.
*    prvs_layout-colwidth_optimize   = colwidth_optimize.
*    prvs_layout-edit                = edit.
*    prvs_layout-edit_mode           = edit_mode.
*    prvs_layout-box_fieldname       = box_fieldname.
*    prvs_layout-confirmation_prompt = confirm_prompt.
*
*    CLEAR prvs_grid.
*    prvs_grid-coll_top_p          = coll_top_p.
*    prvs_grid-edt_cll_cb          = edit_callback.
*
*    CLEAR prvs_variant.
*
*    IF NOT variant_name IS INITIAL.
*      prvs_variant-variant = variant_name.
*    ELSE.
*      prvs_variant = variant.
*    ENDIF.
*
*    CREATE OBJECT table.
*
*    CALL METHOD table->add_data
*      CHANGING
*        table = data_table[].
*
*    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
*         EXPORTING
*              i_grid_title            = title
*              is_layout               = prvs_layout
*              it_fieldcat             = prvt_fieldcat[]
*              it_events               = pubt_events[]
*              i_callback_program      = prvv_repid
**              i_callback_pf_status    = 'SET_PF_STATUS'
*              i_callback_user_command = user_command
*              i_callback_top_of_page  = top_of_page
*              i_grid_settings         = prvs_grid
*              i_save                  = save
*              is_variant              = prvs_variant
*              i_screen_start_column   = start_column
*              i_screen_end_column     = end_column
*              i_screen_start_line     = start_line
*              i_screen_end_line       = end_line
*         TABLES
*              t_outtab                = data_table[]
*         EXCEPTIONS
*              program_error           = 1
*              OTHERS                  = 2.
*  ENDMETHOD.                    "display_list
*
*  METHOD select_list.
*    CALL FUNCTION 'REUSE_ALV_POPUP_TO_SELECT'
*         EXPORTING
*              i_title                 = title
*              i_selection             = selection
*              i_zebra                 = zebra
*              i_screen_start_column   = start_column
*              i_screen_end_column     = end_column
*              i_screen_start_line     = start_line
*              i_screen_end_line       = end_line
*              i_checkbox_fieldname    = box_fieldname
*              i_tabname               = tabname
*              it_fieldcat             = prvt_fieldcat[]
*              i_callback_program      = prvv_repid
*              i_callback_user_command = user_command
*         IMPORTING
*              e_exit                  = cancel
*         TABLES
*              t_outtab                = data_table[]
*         EXCEPTIONS
*              program_error           = 1
*              OTHERS                  = 2.
*  ENDMETHOD.                    "select_list
*ENDCLASS.               "creport_alv
*
**---------------------------------------------------------------------*
**       FORM TOP_OF_PAGE                                              *
**---------------------------------------------------------------------*
*FORM top_of_page.
*  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
*       EXPORTING
*            it_list_commentary = creport_alv=>pubt_header.
*ENDFORM.                    "top_of_page
**&---------------------------------------------------------------------
**
**&      Form  set_pf_status
**&---------------------------------------------------------------------
**
*FORM set_pf_status USING pt_exctab TYPE slis_t_extab.
*  SET PF-STATUS creport_alv=>pubv_pf_status.
*ENDFORM.                    " set_pf_status
*
*
**---------------------------------------------------------------------*
**       CLASS cpopup_select DEFINITION
**---------------------------------------------------------------------*
**       ........                                                      *
**---------------------------------------------------------------------*
*CLASS cpopup_select DEFINITION.
*  PUBLIC SECTION.
*    TYPES: tps_option   TYPE spopli,
*           tpt_options  TYPE TABLE OF tps_option.
*
*    DATA: options       TYPE tpt_options,
*          options_count TYPE i.
*
*    METHODS constructor.
*
*    METHODS add_option
*      IMPORTING
*        VALUE         type any
*        option        TYPE i    OPTIONAL
*        inact         TYPE flag DEFAULT space.
*
*    METHODS add_options
*      IMPORTING
*        values        TYPE table
*        field         TYPE any.
*
*    METHODS display
*      IMPORTING
*        title         TYPE any DEFAULT 'Escolher Opção'
*        text1         TYPE any DEFAULT space
*        text2         TYPE any DEFAULT space
*        text3         TYPE any DEFAULT space
*        current       TYPE i   DEFAULT 1
*        column        TYPE i   DEFAULT 20
*        row           TYPE i   DEFAULT 5
*        display_only  TYPE c   DEFAULT space
*      CHANGING
*        option        TYPE i     OPTIONAL
*        answer        TYPE c     OPTIONAL
*        subrc         TYPE subrc OPTIONAL.
*ENDCLASS.                    "cpopup_select DEFINITION
*
**---------------------------------------------------------------------*
**       CLASS cpopup_select IMPLEMENTATION
**---------------------------------------------------------------------*
**       ........                                                      *
**---------------------------------------------------------------------*
*CLASS cpopup_select IMPLEMENTATION.
*  METHOD constructor.
*    CLEAR: options,
*           options_count.
*  ENDMETHOD.                    "constructor
*
*  METHOD add_option.
*    DATA: ls_option   TYPE tps_option,
*          lv_position TYPE i.
*
*    CLEAR ls_option.
*    ls_option-varoption = value.
*    ls_option-inactive  = inact.
*
*    IF option IS INITIAL.
*      APPEND ls_option TO options.
*    ELSE.
*      IF option > options_count.
*        lv_position = options_count + 1.
*      ELSE.
*        lv_position = option.
*      ENDIF.
*
*      INSERT ls_option INTO options INDEX lv_position.
*    ENDIF.
*
*    ADD 1 TO options_count.
*  ENDMETHOD.                    "add_option
*
*  METHOD add_options.
*    FIELD-SYMBOLS: <option>   TYPE ANY,
*                   <value>    TYPE ANY.
*
*    LOOP AT values ASSIGNING <option>.
*      ASSIGN COMPONENT field OF STRUCTURE <option> TO <value>.
*
*      IF sy-subrc = 0.
*        CALL METHOD add_option
*          EXPORTING
*            value  = <value>
*            option = sy-tabix.
*      ENDIF.
*    ENDLOOP.
*  ENDMETHOD.                    "add_options
*
*  METHOD display.
*    DATA: ls_option       TYPE tps_option,
*          lv_function(30) TYPE c,
*          lv_text1(70)    TYPE c,
*          lv_text2(70)    TYPE c,
*          lv_text3(70)    TYPE c.
*
*    WRITE: text1  TO lv_text1,
*           text2  TO lv_text2,
*           text3  TO lv_text3.
*
*    IF options_count < 25.
*      lv_function = 'POPUP_TO_DECIDE_LIST'.
*    ELSE.
*      lv_function = 'SELECT_FROM_LIST'.
*    ENDIF.
*
*    CALL FUNCTION lv_function
*         EXPORTING
*              cursorline         = current
*              start_col          = column
*              start_row          = row
*              textline1          = lv_text1
*              textline2          = lv_text2
*              textline3          = lv_text3
*              titel              = title
*              display_only       = display_only
*         IMPORTING
*              answer             = answer
*         TABLES
*              t_spopli           = options
*         EXCEPTIONS
*              not_enough_answers = 1
*              too_much_answers   = 2
*              too_much_marks     = 3
*              OTHERS             = 4.
*
*    subrc = sy-subrc.
*
*    IF subrc IS INITIAL.
*      READ TABLE  options
*            INTO  ls_option
*        WITH KEY  selflag = 'X'.
*
*      IF sy-subrc = 0.
*        option = sy-tabix.
*      ENDIF.
*    ENDIF.
*  ENDMETHOD.                    "display
*ENDCLASS.                    "cpopup_select IMPLEMENTATION
*
**---------------------------------------------------------------------*
**       CLASS cexcel DEFINITION
**---------------------------------------------------------------------*
**       ........                                                      *
**---------------------------------------------------------------------*
*CLASS cexcel DEFINITION.
*  PUBLIC SECTION.
*    TYPE-POOLS kkblo.
*
*    DATA: tabname           TYPE fieldname,
*          layout            TYPE kkblo_layout,
*          catalog           TYPE kkblo_t_fieldcat.
*
*    METHODS constructor
*      IMPORTING
*        tabname             TYPE any DEFAULT 'ITAB'.
*
*    METHODS add_field
*      IMPORTING
*        fieldname           TYPE any
*        just                TYPE char1 DEFAULT 'L'
*        header              TYPE any   OPTIONAL
*        length              TYPE any   OPTIONAL
*        no_sum              TYPE any   DEFAULT space
*        datatype            TYPE any   DEFAULT 'CHAR'
*        currency            TYPE any   OPTIONAL
*        unit                TYPE any   OPTIONAL.
*
*    METHODS call
*      CHANGING
*        table               TYPE table.
*ENDCLASS.                    "cexcel DEFINITION
*
**---------------------------------------------------------------------*
**       CLASS cexcel IMPLEMENTATION
**---------------------------------------------------------------------*
**       ........                                                      *
**---------------------------------------------------------------------*
*CLASS cexcel IMPLEMENTATION.
*  METHOD constructor.
*    CLEAR: layout,
*           catalog.
*
*    me->tabname = tabname.
*  ENDMETHOD.                    "constructor
*
*  METHOD add_field.
*    DATA: ls_catalog    TYPE kkblo_fieldcat.
*
*    CLEAR ls_catalog.
*    ls_catalog-fieldname      = fieldname.
*    ls_catalog-reptext        = header.
*    ls_catalog-row_pos        = 1.
*    ls_catalog-tabname        = tabname.
*    ls_catalog-outputlen      = length.
*    ls_catalog-ddic_outputlen = length.
*    ls_catalog-no_sum         = space.
*    ls_catalog-datatype       = datatype.
*    ls_catalog-currency       = currency.
*    ls_catalog-quantity       = unit.
*    APPEND ls_catalog TO catalog.
*  ENDMETHOD.                    "add_field
*
*  METHOD call.
*    CLEAR layout.
*    layout-window_titlebar = sy-title.
*
*    CALL FUNCTION 'ALV_XXL_CALL'
*         EXPORTING
*              i_tabname           = tabname
*              is_layout           = layout
*              it_fieldcat         = catalog
*              i_title             = sy-title
*         TABLES
*              it_outtab           = table[]
*         EXCEPTIONS
*              fatal_error         = 1
*              no_display_possible = 2
*              OTHERS              = 3.
*  ENDMETHOD.                    "call
*ENDCLASS.                    "cexcel IMPLEMENTATION
*
**---------------------------------------------------------------------*
**       CLASS cuser DEFINITION
**---------------------------------------------------------------------*
**       ........                                                      *
**---------------------------------------------------------------------*
*CLASS cuser DEFINITION.
*  PUBLIC SECTION.
*    DATA: usr01      TYPE usr01,
*          usr03      TYPE usr03,
*          adrc       TYPE adrc,
*          adrp       TYPE adrp,
*          adcp       TYPE adcp,
*          adr6       TYPE adr6.
*
*    METHODS constructor
*      IMPORTING
*        user                  TYPE any
*        date                  TYPE datum  DEFAULT sy-datum.
*
*    CLASS-METHODS name
*      IMPORTING user          TYPE any
*                date          TYPE datum  DEFAULT sy-datum
*      RETURNING value(name)   TYPE ad_namtext.
*
*    CLASS-METHODS validate
*      IMPORTING user          TYPE any
*      RETURNING value(subrc)  TYPE subrc.
*
*    CLASS-METHODS address_data
*      IMPORTING
*        user                  TYPE uname
*      CHANGING
*        data                  TYPE usr03.
*ENDCLASS.                    "cuser DEFINITION
*
**---------------------------------------------------------------------*
**       CLASS cuser IMPLEMENTATION
**---------------------------------------------------------------------*
**       ........                                                      *
**---------------------------------------------------------------------*
*CLASS cuser IMPLEMENTATION.
*  METHOD constructor.
*    DATA: ls_usr21   TYPE usr21.
*
*    CLEAR: usr01,
*           usr03,
*           adrc,
*           adrp,
*           adcp,
*           adr6.
*
*    SELECT  SINGLE *
*      INTO  usr01
*      FROM  usr01
*     WHERE  bname = user.
*
*    CALL METHOD address_data
*      EXPORTING
*        user = user
*      CHANGING
*        data = usr03.
*
*    SELECT  *
*      INTO  CORRESPONDING FIELDS OF adrp
*      FROM  usr21
*      JOIN  adrp
*        ON  adrp~persnumber = usr21~persnumber
*     WHERE  bname      = user
*       AND  date_from <= date
*       AND  date_to   >= date.
*    ENDSELECT.
*
*    SELECT  *
*      INTO  CORRESPONDING FIELDS OF adrc
*      FROM  usr21
*      JOIN  adrc
*        ON  adrc~addrnumber = usr21~addrnumber
*     WHERE  bname      = user
*       AND  date_from <= date
*       AND  date_to   >= date.
*    ENDSELECT.
*
*    SELECT  *
*      INTO  CORRESPONDING FIELDS OF adcp
*      FROM  usr21
*      JOIN  adcp
*        ON  adcp~addrnumber = usr21~addrnumber
*       AND  adcp~persnumber = usr21~persnumber
*     WHERE  bname      = user
*       AND  date_from <= date
*       AND  date_to   >= date.
*    ENDSELECT.
*
*    SELECT  *
*      INTO  CORRESPONDING FIELDS OF adr6
*      FROM  usr21
*      JOIN  adr6
*        ON  adr6~addrnumber = usr21~addrnumber
*       AND  adr6~persnumber = usr21~persnumber
*     WHERE  bname      =  user
*       AND  date_from  <= date
*       AND  flgdefault =  'X'.
*    ENDSELECT.
*  ENDMETHOD.                    "constructor
*
*  METHOD name.
*    CLEAR name.
*    SELECT  name_text
*      INTO  name
*      FROM  usr21
*      JOIN  adrp
*        ON  adrp~persnumber = usr21~persnumber
*     WHERE  bname      = user
*       AND  date_from <= date
*       AND  date_to   >= date.
*
*    ENDSELECT.
*  ENDMETHOD.                    "name
*
*  METHOD validate.
*    DATA: lv_bname     TYPE xubname.
*
*    CLEAR subrc.
*    SELECT  SINGLE bname
*      INTO  lv_bname
*      FROM  usr01
*     WHERE  bname = user.
*
*    subrc = sy-subrc.
*  ENDMETHOD.                    "validate
*
*  METHOD address_data.
*    CLEAR data.
*    SELECT  SINGLE *
*      INTO  data
*      FROM  usr03
*     WHERE  bname = user.
*  ENDMETHOD.                    "address_data
*ENDCLASS.                    "cuser IMPLEMENTATION
*
**&---------------------------------------------------------------------
**
**&  Include           ZREPORT_OBJECTS_DRILL
**
**&---------------------------------------------------------------------
**
**---------------------------------------------------------------------*
**       CLASS cdrill_down DEFINITION
**---------------------------------------------------------------------*
**       ........                                                      *
**---------------------------------------------------------------------*
*CLASS cdrill_down DEFINITION.
*  PUBLIC SECTION.
*    TYPES: BEGIN OF tps_value_type,
*             curr          TYPE rfwrt,
*             quan          TYPE menge_pos,
*           END OF tps_value_type.
*
*    TYPES: BEGIN OF tps_values,
*             n01       TYPE tps_value_type,
*             n02       TYPE tps_value_type,
*             n03       TYPE tps_value_type,
*             n04       TYPE tps_value_type,
*             n05       TYPE tps_value_type,
*             n06       TYPE tps_value_type,
*             n07       TYPE tps_value_type,
*             n08       TYPE tps_value_type,
*             n09       TYPE tps_value_type,
*             n10       TYPE tps_value_type,
*             n11       TYPE tps_value_type,
*             n12       TYPE tps_value_type,
*             n13       TYPE tps_value_type,
*             n14       TYPE tps_value_type,
*             n15       TYPE tps_value_type,
*             n16       TYPE tps_value_type,
*             n17       TYPE tps_value_type,
*             n18       TYPE tps_value_type,
*             n19       TYPE tps_value_type,
*             n20       TYPE tps_value_type,
*             n21       TYPE tps_value_type,
*             n22       TYPE tps_value_type,
*             n23       TYPE tps_value_type,
*             n24       TYPE tps_value_type,
*             n25       TYPE tps_value_type,
*             n26       TYPE tps_value_type,
*             n27       TYPE tps_value_type,
*             n28       TYPE tps_value_type,
*             n29       TYPE tps_value_type,
*             n30       TYPE tps_value_type,
*           END OF tps_values.
*
*    TYPES: BEGIN OF tps_colors,
*             main                TYPE i,
*             last_level          TYPE i,
*             values              TYPE i,
*           END OF tps_colors.
*
*    TYPES: BEGIN OF tps_dynamic_values,
*             table               TYPE fieldname,
*             level               TYPE i,
*             level_index         TYPE i,
*             index               TYPE i,
*             field               TYPE fieldname,
*             page                TYPE sy-cpage,
*             line                TYPE sy-lilli,
*             column              TYPE sy-colno,
*             start_line          TYPE sy-staro,
*             start_column        TYPE sy-staco,
*           END OF tps_dynamic_values.
*
*    TYPES: BEGIN OF tps_fields,
*             group(30)           TYPE c,
*             fieldname           TYPE fieldname,
*             unit_field          TYPE fieldname,
*             header(100)         TYPE c,
*             icon                TYPE char1,
*             symbol              TYPE char1,
*             type(4)             TYPE c,
*             waers               TYPE waers,
*             unit                TYPE unit,
*             length              TYPE i,
*             centered(1)         TYPE c,
*             hotspot(1)          TYPE c,
*             input               TYPE char1,
*             input_variable      TYPE fieldname,
*             form_input_check    TYPE formname,
*             intensified         TYPE char1,
*             inten_variable      TYPE fieldname,
*             color               TYPE i,
*             color_variable      TYPE fieldname,
*             output_type(1)      TYPE c,
*             excel_include       TYPE char1,
*           END OF tps_fields.
*
*    TYPES: tpv_key(50)      TYPE c.
*
*    TYPES: BEGIN OF tps_level_info,
*             level               TYPE char2,
*             level_index         TYPE i,
*             table               TYPE fieldname,
*             field               TYPE fieldname,
*             name(50)            TYPE c,
*             include_header      TYPE char1,
*             color               TYPE i,
*             program             TYPE cprog,
*             form_selection      TYPE formname,
*             form_display        TYPE formname,
*             form_execution      TYPE formname,
*             field_checkbox      TYPE fieldname,
*             field_icon          TYPE fieldname,
*             icon_length         TYPE i,
*             no_symbol(1)        TYPE c, "Sem indicação de folder
*             no_scroll(1)        TYPE c, "Sem SCROLL horizontal
*             header(255)         TYPE c, "Cabeçalho de nível
*             length              TYPE i, "Comprimento do nível
*             fields              TYPE TABLE OF tps_fields
*                                    WITH NON-UNIQUE DEFAULT KEY,
*           END OF tps_level_info.
*
*    TYPES: BEGIN OF tps_table_field,
*             table              TYPE fieldname,
*             value(500)         TYPE c,
*           END OF tps_table_field.
*
*    TYPES: BEGIN OF tps_list_info,
*             key                 TYPE tps_table_field,
*             parent              TYPE tps_table_field,
*             node_number         TYPE i,
*             child_selected      TYPE char1,
*             child_number        TYPE i,
*             child_last_table    TYPE fieldname,
*             explode             TYPE char1,
*             level               TYPE i,
*             level_index         TYPE i,
*             linno               TYPE i,
*             info                TYPE REF TO cdata,
*             values              TYPE tps_values,
*           END OF tps_list_info.
*
*    TYPES: BEGIN OF tps_cascade_table,
*             key                 TYPE tpv_key,
*             parent              TYPE tpv_key,
*             connection          TYPE tpv_key,
*             imported            TYPE char1,
*             info                TYPE REF TO cdata,
*           END OF tps_cascade_table.
*
*    TYPES: tpt_fields            TYPE TABLE OF tps_fields,
*           tpt_cascade_table     TYPE TABLE OF tps_cascade_table
*                                    WITH NON-UNIQUE DEFAULT KEY.
*
*    TYPES: BEGIN OF tps_table,
*             type                TYPE char1,
*             name                TYPE fieldname,
*             text                TYPE text70,
*             field_key           TYPE fieldname,
*             field_parent        TYPE fieldname,
*             field_connection    TYPE fieldname,
*             connection_field    TYPE fieldname,
*             connection_table    TYPE fieldname,
*             level_index         TYPE i,
*             export              TYPE char1,
*             data                TYPE REF TO cdata,
*             info                TYPE tpt_cascade_table,
*           END OF tps_table.
*
*    DATA: list_tables            TYPE TABLE OF tps_table,
*          data                   TYPE TABLE OF tps_list_info,
*          levels                 TYPE TABLE OF tps_level_info,
*          value_fields           TYPE TABLE OF tps_fields,
*          table_number           TYPE i,
*          form_values            TYPE formname,
*          values_position        TYPE i,
*          top_node               TYPE tpv_key,
*          type                   TYPE char1,  " Cascade; Normal
*          header(100)            TYPE c,
*          user_info              TYPE char1,
*          color                  TYPE tps_colors,
*          step_margin            TYPE i,
*          with_lines             TYPE char1," ' ' Normal 'X' com linhas
*          selected               TYPE tps_dynamic_values.
*
*    METHODS constructor
*      IMPORTING
*        type             TYPE char1  DEFAULT 'N'
*        top_node         TYPE any    DEFAULT space
*        with_lines       TYPE char1  DEFAULT 'X'
*        color_main       TYPE i      DEFAULT 4
*        color_last_level TYPE i      DEFAULT 3
*        color_values     TYPE i      DEFAULT 2
*        step_margin      TYPE i      DEFAULT 6
*        header           TYPE c      OPTIONAL
*        user_info        TYPE char1  OPTIONAL
*        form_values      TYPE any    OPTIONAL
*        values_position  TYPE i      DEFAULT 80.
*
*    METHODS set_internal_table.
*
*    METHODS child_selection
*      IMPORTING
*        table            TYPE any
*        parent_table     TYPE any
*        parent_value     TYPE any.
*
*    METHODS write_list_header.
*
*    METHODS write_list
*      IMPORTING
*        update           TYPE char1     OPTIONAL.
*
*    METHODS add_table
*      IMPORTING
*        type             TYPE char1     DEFAULT 'C'
*        table_name       TYPE any
*        text             TYPE any       OPTIONAL
*        level_index      TYPE i         OPTIONAL
*        field_key        TYPE any       OPTIONAL
*        field_connection TYPE any       OPTIONAL
*        field_parent     TYPE any       OPTIONAL
*        connection_field TYPE any       OPTIONAL
*        connection_table TYPE any       OPTIONAL
*        export           TYPE char1     DEFAULT 'X'
*      CHANGING
*        table            TYPE table.
*
*    METHODS add_level
*      IMPORTING
*        level            TYPE i
*        table            TYPE fieldname OPTIONAL
*        field            TYPE fieldname OPTIONAL
*        name             TYPE c         OPTIONAL
*        include_header   TYPE char1     OPTIONAL
*        color            TYPE i         OPTIONAL
*        program          TYPE cprog     OPTIONAL
*        form_selection   TYPE formname  OPTIONAL
*        form_display     TYPE formname  OPTIONAL
*        form_execution   TYPE formname  OPTIONAL
*        field_checkbox   TYPE fieldname OPTIONAL
*        field_icon       TYPE fieldname OPTIONAL
*        icon_length      TYPE i         DEFAULT 3
*        no_symbol        TYPE char1     OPTIONAL
*        no_scroll        TYPE char1     OPTIONAL.
*
*    METHODS add_field_to_level
*      IMPORTING
*        level            TYPE i
*        field            TYPE fieldname OPTIONAL
*        header           TYPE c         OPTIONAL
*        length           TYPE i         DEFAULT 10
*        centered         TYPE c         OPTIONAL
*        hotspot          TYPE c         OPTIONAL
*        input            TYPE char1     DEFAULT space
*        input_variable   TYPE fieldname OPTIONAL
*        form_input_check TYPE formname  OPTIONAL
*        intensified      TYPE c         OPTIONAL
*        inten_variable   TYPE fieldname OPTIONAL
*        color            TYPE i         OPTIONAL
*        color_variable   TYPE fieldname OPTIONAL
*        icon             TYPE c         OPTIONAL
*        symbol           TYPE c         OPTIONAL
*        unit_field       TYPE fieldname OPTIONAL
*        excel_include    TYPE char1     DEFAULT 'X'.
*
*    METHODS add_value_field
*      IMPORTING
*        field            TYPE fieldname
*        header           TYPE c DEFAULT 'Montante'
*        type             TYPE char4 DEFAULT 'CURR'
*        waers            TYPE waers DEFAULT 'EUR'
*        unit             TYPE unit OPTIONAL
*        length           TYPE i DEFAULT 21
*        centered         TYPE c OPTIONAL
*        hotspot          TYPE c OPTIONAL
*        color_variable   TYPE char30 OPTIONAL.
*
*    METHODS set_control_data
*      IMPORTING
*        selection_comm   TYPE syucomm   DEFAULT 'PICK'.
*
*    METHODS set_level
*      IMPORTING
*        level            TYPE i.
*
*    METHODS mark
*      IMPORTING
*        table                TYPE any
*        level                TYPE i
*        VALUE                type char1 default 'X'.
*
*    METHODS delete
*      IMPORTING
*        table                TYPE any
*        level                TYPE i.
*
*    METHODS excel_export
*      IMPORTING
*        title                TYPE any.
*
*  PROTECTED SECTION.
*    TYPES: BEGIN OF tps_sort_table,
*             sort1       TYPE tpv_key,
*             sort2       TYPE tpv_key,
*             sort3       TYPE tpv_key,
*             sort4       TYPE tpv_key,
*             sort5       TYPE tpv_key,
*             sort6       TYPE tpv_key,
*             sort7       TYPE tpv_key,
*             sort8       TYPE tpv_key,
*             sort9       TYPE tpv_key,
*             values      TYPE tps_values,
*             info        TYPE REF TO cdata,
*           END OF tps_sort_table.
*
*    TYPES: tpt_sort_table        TYPE TABLE OF tps_sort_table.
*
*    DATA: current_list_line  TYPE i,
*          indent_lines       TYPE char10,
*          indent_margin      TYPE i,
*          data_backup        TYPE TABLE OF tps_list_info.
*
*    METHODS convert_table_list_to_sort
*      CHANGING
*        list_table           TYPE REF TO data
*        sort_table           TYPE tpt_sort_table.
*
*    METHODS import_sort_table
*      IMPORTING
*        table_name           TYPE any
*        sort_table           TYPE tpt_sort_table.
*
*    METHODS import_cascade_table
*      IMPORTING
*        field_key            TYPE any
*        field_parent         TYPE any
*        field_connection     TYPE any
*      CHANGING
*        table                TYPE table
*        info                 TYPE tpt_cascade_table.
*
*    METHODS add_table_line
*      IMPORTING
*        level_index          TYPE i
*        table_key            TYPE fieldname
*        field_key            TYPE fieldname  OPTIONAL
*        key                  TYPE any        OPTIONAL
*        table_parent         TYPE fieldname  OPTIONAL
*        field_parent         TYPE fieldname  OPTIONAL
*        parent               TYPE any        OPTIONAL
*        field_connection     TYPE fieldname  OPTIONAL
*        connection_field     TYPE fieldname  OPTIONAL
*        connection_table     TYPE fieldname  OPTIONAL
*        values               TYPE tps_values OPTIONAL
*      CHANGING
*        line_info            TYPE any.
*
*    METHODS add_connection_table_line
*      IMPORTING
*        connection_table     TYPE any
*        connection_field     TYPE any
*        connection_value     TYPE any
*        parent_value         TYPE any.
*
*    METHODS get_level_info
*      IMPORTING
*        level                TYPE i
*      RETURNING
*        value(level_info)    TYPE tps_level_info.
*
*    METHODS write_next_level
*      IMPORTING
*        value(level)               TYPE i
*        value(child_number)        TYPE i
*        value(child_last_table)    TYPE fieldname
*        value(parent_last_node)    TYPE char1  DEFAULT 'X'
*        value(table)               TYPE fieldname
*        value(parent_table)        TYPE fieldname
*        value(parent_key)          TYPE any.
*
*    METHODS write_level_header
*      IMPORTING
*        level                 TYPE i
*        level_info            TYPE tps_level_info
*        child_number          TYPE i.
*
*    METHODS write_level
*      IMPORTING
*        value(level)          TYPE i
*        value(index)          TYPE i
*        list_info             TYPE tps_list_info
*        level_info            TYPE tps_level_info.
*
*    METHODS write_checkbox
*      IMPORTING
*        type                  TYPE char1      OPTIONAL
*        list_info             TYPE tps_list_info
*        field_checkbox        TYPE fieldname.
*
*    METHODS write_symbol
*      IMPORTING
*        type                  TYPE char1      OPTIONAL
*        list_info             TYPE tps_list_info.
*
*    METHODS new_line
*      IMPORTING
*        line_type             TYPE char1
*        level                 TYPE i
*        checkbox              TYPE fieldname  OPTIONAL
*        no_scroll             TYPE char1      OPTIONAL.
*
*    METHODS get_symbol
*      IMPORTING
*        child_number          TYPE i
*        explode               TYPE char1
*      RETURNING
*        value(symbol)         TYPE char2.
*
*    METHODS write_default_level
*      IMPORTING
*        level_info            TYPE tps_level_info
*        list_line             TYPE REF TO cdata
*        color                 TYPE i.
*
*    METHODS write_default_values
*      IMPORTING
*        list_info             TYPE tps_list_info
*        color                 TYPE i.
*
*    METHODS get_selected_values
*      IMPORTING
*        index                 TYPE i
*      CHANGING
*        selected              TYPE tps_dynamic_values.
*
*    METHODS set_selected_field.
*
*    METHODS drill_down.
*
*    METHODS execute_level_function.
*
*    METHODS get_input
*      IMPORTING
*        key           TYPE any
*        explode       TYPE char1.
*
*    METHODS get_field_input
*      IMPORTING
*        list_info     TYPE tps_list_info
*      CHANGING
*        fields        TYPE tpt_fields.
*
*    METHODS set_child_checkbox
*      IMPORTING
*        field_checkbox TYPE fieldname
*        select         TYPE any
*        key            TYPE any.
*
*    METHODS read_list_line
*      IMPORTING
*        line          TYPE i
*        level         TYPE i
*      RETURNING
*        value(select) TYPE char1.
*
*    METHODS read_line_field
*      IMPORTING
*        line          TYPE i
*        level         TYPE i
*        position      TYPE i
*        length        TYPE i
*      CHANGING
*        VALUE         type any.
*
*    METHODS set_next_level
*      IMPORTING
*        level        TYPE i
*        stop_level   TYPE i
*        key          TYPE any.
*
*    METHODS set_level_indent
*      IMPORTING
*        level             TYPE i
*        last_node         TYPE char1.
*
*    METHODS get_level_indent
*      IMPORTING
*        level             TYPE i
*      RETURNING
*        value(info)       TYPE char1.
*ENDCLASS.                    "cdrill_down DEFINITION
*
**---------------------------------------------------------------------*
**       CLASS cdrill_down IMPLEMENTATION
**---------------------------------------------------------------------*
**       ........                                                      *
**---------------------------------------------------------------------*
*CLASS cdrill_down IMPLEMENTATION.
*  METHOD constructor.
*    CLEAR: me->data,
*           me->levels,
*           me->table_number.
*
*    me->type             = type.
*    me->top_node         = top_node.
*    me->with_lines       = with_lines.
*    me->color-main       = color_main.
*    me->color-last_level = color_last_level.
*    me->color-values     = color_values.
*    me->step_margin      = step_margin.
*    me->header           = header.
*    me->user_info        = user_info.
*    me->form_values      = form_values.
*    me->values_position  = values_position.
*  ENDMETHOD.                    "constructor
**---------------------------------------------------------------------*
*  METHOD child_selection.
*    FIELD-SYMBOLS: <list_table>    TYPE table,
*                   <new_data>      TYPE table,
*                   <row>           TYPE ANY.
*
*    DATA: ls_table         TYPE tps_table,
*          ls_table1        TYPE tps_table,
*          ls_data          TYPE tps_list_info,
*          ls_temp          TYPE tps_list_info,
*          ls_level         TYPE tps_level_info,
*          lref_new_data    TYPE REF TO data,
*          lv_lines         TYPE i,
*          lv_counter       TYPE i.
*
*    CLEAR lv_counter.
*
*    LOOP AT  list_tables
*       INTO  ls_table1.
*      LOOP AT  data
*         INTO  ls_data
*        WHERE  key-table    = ls_table1-name
*          AND  parent-table = parent_table
*          AND  parent-value = parent_value.
*
*        IF ls_data-child_selected IS INITIAL.
*          ls_data-child_selected = 'X'.
*
*          ADD 1 TO lv_counter.
*          ls_data-node_number = lv_counter.
*
*          ls_level = get_level_info( ls_data-level_index ).
*
*          IF NOT ls_level-form_selection IS INITIAL AND type = 'C'.
*            ASSIGN ls_table1-data->info->* TO <list_table>.
*
*            DESCRIBE TABLE <list_table> LINES lv_lines.
*            ADD 1 TO lv_lines.
*
*            CREATE DATA lref_new_data LIKE <list_table>.
*            ASSIGN lref_new_data->*     TO <new_data>.
*
*            PERFORM (ls_level-form_selection)
*                                   IN PROGRAM (ls_level-program)
*                                        USING ls_data-key-value
*                                     CHANGING <new_data>.
*
*            LOOP AT  <new_data> ASSIGNING <row>.
*              APPEND <row> TO <list_table>.
*            ENDLOOP.
*
*            LOOP AT  <list_table> ASSIGNING <row> FROM lv_lines.
*              CALL METHOD add_table_line
*                EXPORTING
*                  level_index  = ls_data-level_index
*                  table_key    = ls_data-key-table
*                  field_key    = ls_table1-field_key
*                  field_parent = ls_table1-field_parent
*                CHANGING
*                  line_info    = <row>.
*            ENDLOOP.
*
**            DESCRIBE TABLE <new_data> LINES ls_data-child_number.
*          ENDIF.
*
*          CLEAR ls_data-child_number.
*
*          LOOP AT  list_tables
*             INTO  ls_table.
*
*            LOOP AT  data
*               INTO  ls_temp
*              WHERE  key-table    = ls_table-name
*                AND  parent-table = ls_data-key-table
*                AND  parent-value = ls_data-key-value.
*              ADD 1 TO ls_data-child_number.
*              ls_data-child_last_table = ls_table-name.
*            ENDLOOP.
*          ENDLOOP.
*
*          MODIFY data FROM ls_data.
*        ENDIF.
*      ENDLOOP.
*    ENDLOOP.
*  ENDMETHOD.                    "child_selection
**---------------------------------------------------------------------*
*  METHOD write_list_header.
*    DATA: ls_level           TYPE tps_level_info,
*          ls_field           TYPE tps_fields,
*          lv_title_margin    TYPE i,
*          lv_title_line(70)  TYPE c,
*          lv_date(10)        TYPE c.
*
*    ls_level = get_level_info( 1 ).
*
*    lv_title_margin = ls_level-length.
*
*    IF lv_title_margin > sy-linsz.
*      lv_title_margin = sy-linsz.
*    ENDIF.
*
*    IF NOT user_info IS INITIAL.
*      WRITE sy-datum TO lv_date.
*      CONCATENATE  'Usuário:' sy-uname 'Data:' lv_date
*             INTO  lv_title_line
*        SEPARATED  BY space.
*
*      CALL METHOD new_line
*        EXPORTING
*          line_type = 'H'
*          level     = 1
*          checkbox  = ls_level-field_checkbox
*          no_scroll = ls_level-no_scroll.
*
*      WRITE AT (lv_title_margin) lv_title_line  NO-GAP.
*    ENDIF.
*
*    IF NOT header IS INITIAL.
*      CALL METHOD new_line
*        EXPORTING
*          line_type = 'H'
*          level     = 1
*          checkbox  = ls_level-field_checkbox
*          no_scroll = ls_level-no_scroll.
*
*      WRITE AT: (lv_title_margin) header  NO-GAP CENTERED.
*
**   IF NOT igroup[] IS INITIAL.
**      NEW-LINE.
**
**      WRITE: AT (ititle_margin) header  NO-GAP CENTERED.
**
**      WRITE AT level_length space NO-GAP COLOR = color_main
**                            INTENSIFIED ON.
**
**      SORT ivalues_fields BY group.
**
**      LOOP AT ivalues_fields INTO wa.
**        ADD 1 TO group_fields.
**
**        AT END OF group.
**          SUM.
**          LOOP AT igroup INTO wa2 WHERE group = wa-group.
**            SUBTRACT 1 FROM group_fields.
**            ADD group_fields TO wa-length.
**            WRITE:  AT (wa-length) wa2-text NO-GAP
**                                             INTENSIFIED OFF CENTERED,
**                       space NO-GAP COLOR = color_main
**                             INTENSIFIED ON.
**          ENDLOOP.
**
**          CLEAR group_fields.
**        ENDAT.
**      ENDLOOP.
**
**      ADD 1 TO me->current_list_line.
**      NEW-LINE.
**      WRITE: AT (level_length) space  NO-GAP CENTERED.
**    ELSE.
**      WRITE: AT (ititle_margin) header  NO-GAP CENTERED.
**    ENDIF.
*
*      IF NOT value_fields IS INITIAL.
*        WRITE AT values_position space NO-GAP COLOR = color-main
*                                       INTENSIFIED ON.
*      ENDIF.
*
*      LOOP AT  value_fields
*         INTO  ls_field.
*        WRITE: AT (ls_field-length) ls_field-header NO-GAP INTENSIFIED
*OFF
*
*CENTERED,
*                                     space           NO-GAP INTENSIFIED
*ON
*                                                        COLOR =
*color-main.
*      ENDLOOP.
*    ENDIF.
*
*    IF type = 'C'.
*      CALL METHOD write_level_header
*        EXPORTING
*          level        = 1
*          level_info   = ls_level
*          child_number = 1.
*    ENDIF.
*  ENDMETHOD.                    "write_list_header
**---------------------------------------------------------------------*
*  METHOD write_list.
*    DATA: lv_index        TYPE i,
*          ls_table        TYPE tps_table,
*          lv_table_number TYPE i.
*
*    IF me->data IS INITIAL OR NOT update IS INITIAL.
*      CALL METHOD set_internal_table.
*    ENDIF.
*
*    CLEAR current_list_line.
*
*    LOOP AT  list_tables
*       INTO  ls_table
*      WHERE  connection_table = space.
*      CALL METHOD write_next_level
*        EXPORTING
*          level            = 0
*          table            = ls_table-name
*          child_last_table = ls_table-name
*          parent_table     = ls_table-name
*          parent_key       = top_node
*          child_number     = 0.
*    ENDLOOP.
*
*    lv_index = sy-lsind + 1.
*
*    SCROLL LIST INDEX lv_index TO PAGE   selected-page
*                                  LINE   selected-start_line.
*
*    SCROLL LIST INDEX lv_index TO COLUMN selected-start_column.
*  ENDMETHOD.                    "write_list
**---------------------------------------------------------------------*
*  METHOD add_table.
*    DATA: ls_table     TYPE tps_table.
*
*    IF NOT table IS INITIAL.
*      CLEAR ls_table.
*      ls_table-type             = type.
*      ls_table-name             = table_name.
*      ls_table-text             = text.
*      ls_table-field_key        = field_key.
*      ls_table-field_parent     = field_parent.
*      ls_table-field_connection = field_connection.
*      ls_table-connection_field = connection_field.
*      ls_table-connection_table = connection_table.
*      ls_table-level_index      = level_index.
*      ls_table-export           = export.
*
*      CREATE OBJECT ls_table-data.
*
*      CALL METHOD ls_table-data->add_data
*        CHANGING
*          table = table.
*
*      APPEND ls_table TO list_tables.
*
*      ADD 1 TO table_number.
*
*      SORT list_tables BY level_index.
*    ENDIF.
*  ENDMETHOD.                    "add_table
**---------------------------------------------------------------------*
*  METHOD add_level.
*    DATA: ls_level        TYPE tps_level_info,
*          lv_first_level  TYPE i.
*
*    IF levels         IS INITIAL AND NOT
*       field_checkbox IS INITIAL.
*      indent_margin = 2.
*    ENDIF.
*
*    ls_level-level          = level.
*    ls_level-level_index    = level.
*    ls_level-table          = table.
*    ls_level-field          = field.
*    ls_level-name           = name.
*    ls_level-include_header = include_header.
*    ls_level-color          = color.
*    ls_level-program        = program.
*    ls_level-form_selection = form_selection.
*    ls_level-form_display   = form_display.
*    ls_level-form_execution = form_execution.
*    ls_level-field_checkbox = field_checkbox.
*    ls_level-field_icon     = field_icon.
*    ls_level-icon_length    = icon_length.
*    ls_level-no_symbol      = no_symbol.
*    ls_level-no_scroll      = no_scroll.
*    ls_level-length         = 3.
*
*    IF ls_level-program IS INITIAL.
*      ls_level-program = sy-cprog.
*    ENDIF.
*
*    APPEND ls_level TO levels.
*
**    SORT levels BY level_index.
**
**    LOOP AT  levels
**       INTO  ls_level.
**      IF NOT ls_level-field IS INITIAL.
**        IF sy-tabix = 1.
**          IF ls_level-level > 1 OR ls_level-level < 0.
**            lv_first_level = 1.
**          ELSE.
**            lv_first_level = ls_level-level.
**          ENDIF.
**        ELSE.
**          ADD 1 TO lv_first_level.
**        ENDIF.
**
**        ls_level-level_index = lv_first_level.
**        MODIFY levels FROM ls_level.
**      ENDIF.
**    ENDLOOP.
*
*    IF type            = 'N'      AND NOT
*       ls_level-field  IS INITIAL.
*      IF me->header IS INITIAL.
*        me->header = ls_level-name.
*      ELSE.
*        CONCATENATE me->header '/' ls_level-name
*               INTO me->header SEPARATED BY space.
*      ENDIF.
*    ENDIF.
*  ENDMETHOD.                    "add_level
**---------------------------------------------------------------------*
*  METHOD add_field_to_level.
*    DATA: ls_level       TYPE tps_level_info,
*          ls_field       TYPE tps_fields.
*
*    LOOP AT  levels
*       INTO  ls_level
*      WHERE  level = level.
*      CLEAR ls_field.
*      ls_field-fieldname        = field.
*      ls_field-unit_field       = unit_field.
*      ls_field-header           = header.
*      ls_field-length           = length.
*      ls_field-centered         = centered.
*      ls_field-hotspot          = hotspot.
*      ls_field-input            = input.
*      ls_field-input_variable   = input_variable.
*      ls_field-form_input_check = form_input_check.
*      ls_field-intensified      = intensified.
*      ls_field-inten_variable   = inten_variable.
*      ls_field-color            = color.
*      ls_field-color_variable   = color_variable.
*      ls_field-icon             = icon.
*      ls_field-symbol           = symbol.
*      ls_field-excel_include    = excel_include.
*      COLLECT ls_field INTO ls_level-fields.
*
*      ADD length TO ls_level-length.
*
*      MODIFY levels FROM ls_level.
*    ENDLOOP.
*  ENDMETHOD.                    "add_field_to_level
**---------------------------------------------------------------------*
*  METHOD add_value_field.
*    DATA: ls_field       TYPE tps_fields.
*
*    CLEAR ls_field.
*    ls_field-fieldname      = field.
*    ls_field-header         = header.
*    ls_field-type           = type.
*    ls_field-unit           = unit.
*    ls_field-waers          = waers.
*    ls_field-color_variable = color_variable.
*    ls_field-length         = length.
*    ls_field-centered       = centered.
*    ls_field-hotspot        = hotspot.
*    APPEND ls_field TO value_fields.
*  ENDMETHOD.                    "add_value_field
**---------------------------------------------------------------------*
*  METHOD set_control_data .
*    DATA: ls_level     TYPE tps_level_info.
*
*    SUBTRACT 1 FROM sy-lsind.
*
*    IF NOT sy-tabix IS INITIAL.
*      CALL METHOD get_selected_values
*        EXPORTING
*          index    = sy-tabix
*        CHANGING
*          selected = selected.
*
*      CALL METHOD get_input( key = top_node explode = 'X' ).
*
*      IF sy-ucomm = selection_comm.
*        CALL METHOD set_selected_field.
*
*        IF selected-field = 'DRILL'.
*          CALL METHOD drill_down.
*        ELSE.
*          CALL METHOD execute_level_function.
*        ENDIF.
*      ENDIF.
*    ENDIF.
*
*    CLEAR sy-tabix.
*  ENDMETHOD.                    "set_control_data
**---------------------------------------------------------------------*
*  METHOD set_level.
*    CALL METHOD set_next_level
*      EXPORTING
*        level      = 1
*        stop_level = level
*        key        = top_node.
*  ENDMETHOD.                    "set_level
**---------------------------------------------------------------------*
*  METHOD mark.
*    FIELD-SYMBOLS: <table>     TYPE table,
*                   <row>       TYPE ANY,
*                   <select>    TYPE ANY.
*
*    DATA: ls_level      TYPE tps_level_info,
*          ls_data       TYPE tps_list_info,
*          lref_select   TYPE REF TO data.
*
*    LOOP AT  levels
*       INTO  ls_level
*      WHERE  level = level.
*      IF NOT ls_level-field_checkbox IS INITIAL.
*        LOOP AT  data
*           INTO  ls_data
*          WHERE  key-table   =  table
*            AND  level_index =  ls_level-level_index.
*          lref_select = ls_data-info->field( ls_level-field_checkbox ).
*          ASSIGN lref_select->* TO <select>.
*
*          <select> = value.
*        ENDLOOP.
*      ENDIF.
*    ENDLOOP.
*  ENDMETHOD.                    "mark
**---------------------------------------------------------------------*
*  METHOD delete.
*    FIELD-SYMBOLS: <table>     TYPE table,
*                   <row>       TYPE ANY,
*                   <select>    TYPE ANY.
*
*    DATA: ls_level      TYPE tps_level_info,
*          ls_table      TYPE tps_table.
*
*    LOOP AT  levels
*       INTO  ls_level
*      WHERE  level = level.
*      IF NOT ls_level-field_checkbox IS INITIAL.
*        LOOP AT  list_tables
*           INTO  ls_table
*          WHERE  name = table.
*          ASSIGN ls_table-data->info->* TO <table>.
*
*          LOOP AT <table> ASSIGNING <row>.
*            ASSIGN COMPONENT  ls_level-field_checkbox
*                OF STRUCTURE  <row>
*                          TO  <select>.
*
*            IF NOT <select> IS INITIAL.
*              DELETE <table>.
*            ENDIF.
*          ENDLOOP.
*        ENDLOOP.
*      ENDIF.
*    ENDLOOP.
*
*    CALL METHOD set_internal_table.
*  ENDMETHOD.                    "delete
**---------------------------------------------------------------------*
*  METHOD excel_export.
*    FIELD-SYMBOLS: <table>        TYPE table.
*
*    DATA: lo_actions      TYPE REF TO cpopup_select,
*          lo_excel        TYPE REF TO cexcel,
*          ls_table        TYPE tps_table,
*          ls_fields       TYPE tps_fields,
*          ls_level        TYPE tps_level_info,
*          lv_text         TYPE char70,
*          lv_option       TYPE i VALUE 1,
*          lv_tables_count TYPE i.
*
*    CREATE OBJECT lo_actions.
*
*    DESCRIBE TABLE list_tables LINES lv_tables_count.
*
*    IF lv_tables_count > 1.
*      LOOP AT  list_tables
*         INTO  ls_table.
*        IF NOT ls_table-export IS INITIAL.
*          IF NOT ls_table-text IS INITIAL.
*            lv_text = ls_table-text.
*          ELSE.
*            lv_text = ls_table-name.
*          ENDIF.
*
*          CALL METHOD lo_actions->add_option
*            EXPORTING
*              value  = lv_text
*              option = sy-tabix.
*        ENDIF.
*      ENDLOOP.
*
*      CALL METHOD lo_actions->display
*        EXPORTING
*          title  = title
*        CHANGING
*          option = lv_option.
*    ENDIF.
*
*    IF lv_option <> 0.
*      READ TABLE list_tables INTO ls_table INDEX lv_option.
*
*      IF sy-subrc = 0.
*        CREATE OBJECT lo_excel.
*
*        LOOP AT levels
*           INTO ls_level
*          WHERE table = ls_table-name.
*
*          LOOP AT ls_level-fields
*             INTO ls_fields
*            WHERE excel_include = 'X'.
*            CALL METHOD lo_excel->add_field
*              EXPORTING
*                fieldname = ls_fields-fieldname
*                header    = ls_fields-header
*                length    = ls_fields-length.
*          ENDLOOP.
*        ENDLOOP.
*
*        ASSIGN ls_table-data->info->* TO <table>.
*
*        CALL METHOD lo_excel->call
*          CHANGING
*            table = <table>.
*      ENDIF.
*    ENDIF.
*  ENDMETHOD.                    "excel_export
**---------------------------------------------------------------------*
*  METHOD set_internal_table.
*    FIELD-SYMBOLS: <table>       TYPE table,
*                   <line_info>   TYPE ANY.
*
*    DATA: lt_sort_table       TYPE TABLE OF tps_sort_table,
*          ls_table            TYPE tps_table,
*          ls_data             TYPE tps_list_info,
*          ls_cascade_data     TYPE tps_cascade_table.
*
*    data_backup = me->data.
*    CLEAR me->data.
*
*    LOOP AT  list_tables
*       INTO  ls_table
*      WHERE  type = 'C'.
*      ASSIGN ls_table-data->info->*   TO <table>.
*
*      CALL METHOD import_cascade_table
*        EXPORTING
*          field_key        = ls_table-field_key
*          field_parent     = ls_table-field_parent
*          field_connection = ls_table-field_connection
*        CHANGING
*          table            = <table>
*          info             = ls_table-info.
*
*      MODIFY list_tables FROM ls_table.
*    ENDLOOP.
*
*    READ TABLE  list_tables
*          INTO  ls_table
*      WITH KEY  type = 'N'.
*
*    IF sy-subrc = 0.
*      CALL METHOD convert_table_list_to_sort
*        CHANGING
*          list_table = ls_table-data->info
*          sort_table = lt_sort_table.
*
*      CALL METHOD import_sort_table
*        EXPORTING
*          table_name = ls_table-name
*          sort_table = lt_sort_table.
*    ENDIF.
*
*    LOOP AT  list_tables
*       INTO  ls_table.
*      IF ls_table-type = 'C'.
*        LOOP AT  ls_table-info
*           INTO  ls_cascade_data
*          WHERE  imported = space.
*          ASSIGN ls_cascade_data-info->info->* TO <line_info>.
*
*          CALL METHOD add_table_line
*            EXPORTING
*              level_index      = ls_table-level_index
*              table_key        = ls_table-name
*              field_key        = ls_table-field_key
*              field_parent     = ls_table-field_parent
*              field_connection = ls_table-field_connection
*              connection_table = ls_table-connection_table
*              connection_field = ls_table-connection_field
*            CHANGING
*              line_info        = <line_info>.
*        ENDLOOP.
*      ENDIF.
*    ENDLOOP.
*
*    CLEAR data_backup.
*  ENDMETHOD.                    "set_internal_table
**---------------------------------------------------------------------*
*  METHOD convert_table_list_to_sort.
*    FIELD-SYMBOLS: <table>      TYPE table,
*                   <list_info>  TYPE ANY,
*                   <value>      TYPE ANY.
*
*    DATA: ls_sort_table   TYPE tps_sort_table,
*          ls_level        TYPE tps_level_info,
*          ls_field        TYPE tps_fields,
*          ls_value        TYPE tps_value_type,
*          lv_sort         TYPE tpv_key,
*          lref_value      TYPE REF TO data.
*
*    CLEAR sort_table.
*
*    ASSIGN list_table->*   TO <table>.
*
*    LOOP AT <table> ASSIGNING <list_info>.
*      CLEAR ls_sort_table.
*
*      CREATE OBJECT ls_sort_table-info.
*
*      CALL METHOD ls_sort_table-info->add_data
*        CHANGING
*          data = <list_info>.
*
*      DO 9 TIMES VARYING lv_sort FROM ls_sort_table-sort1
*                                 NEXT ls_sort_table-sort2.
*        ls_level = get_level_info( sy-index ).
*
*        IF ls_level IS INITIAL.
*          EXIT.
*        ELSE.
*          CALL METHOD ls_sort_table-info->get_field
*            EXPORTING
*              fieldname   = ls_level-field
*            IMPORTING
*              field_value = lv_sort.
*        ENDIF.
*      ENDDO.
*
*      DO 30 TIMES VARYING ls_value FROM ls_sort_table-values-n01
*                                   NEXT ls_sort_table-values-n02.
*        READ TABLE  value_fields
*              INTO  ls_field
*             INDEX  sy-index.
*
*        IF sy-subrc <> 0.
*          EXIT.
*        ELSE.
*          lref_value = ls_sort_table-info->field( ls_field-fieldname ).
*          ASSIGN lref_value->* TO <value>.
*
*          CASE ls_field-type.
*            WHEN 'CURR'. ls_value-curr = <value>.
*            WHEN 'QUAN'. ls_value-quan = <value>.
*          ENDCASE.
*        ENDIF.
*      ENDDO.
*
*      APPEND ls_sort_table TO sort_table.
*    ENDLOOP.
*
*    SORT sort_table BY sort1 sort2 sort3 sort4 sort5 sort6 sort7
*                       sort8 sort9.
*  ENDMETHOD.                    "convert_table_list_to_sort
**---------------------------------------------------------------------*
*  METHOD import_sort_table.
*    FIELD-SYMBOLS: <line_info>   TYPE ANY.
*
*    TYPES: BEGIN OF tps_sort_fields,
*             name01           TYPE fieldname,
*             name02           TYPE fieldname,
*             name03           TYPE fieldname,
*             name04           TYPE fieldname,
*             name05           TYPE fieldname,
*             name06           TYPE fieldname,
*             name07           TYPE fieldname,
*             name08           TYPE fieldname,
*             name09           TYPE fieldname,
*           END OF tps_sort_fields.
*
*    DATA: ls_sort_table       TYPE tps_sort_table,
*          ls_level            TYPE tps_level_info,
*          ls_sort_field       TYPE tps_sort_fields,
*          lv_sort_field       TYPE fieldname,
*          lv_sort             TYPE tpv_key,
*          lv_sort_key(500)    TYPE c,
*          lv_sort_parent(500) TYPE c.
*
*    DO 9 TIMES VARYING lv_sort_field FROM ls_sort_field-name01
*                                     NEXT ls_sort_field-name02.
*      ls_level = get_level_info( sy-index ).
*
*      IF NOT ls_level IS INITIAL.
*        lv_sort_field = ls_level-field.
*      ENDIF.
*    ENDDO.
*
*    LOOP AT  sort_table
*       INTO  ls_sort_table.
*      ASSIGN ls_sort_table-info->info->* TO <line_info>.
*
*      AT NEW sort1.
*        SUM.
*        lv_sort_parent = space.
*        lv_sort_key    = ls_sort_table-sort1.
*
*        CALL METHOD add_table_line
*          EXPORTING
*            level_index = 1
*            table_key   = table_name
*            key         = lv_sort_key
*            parent      = lv_sort_parent
*            values      = ls_sort_table-values
*          CHANGING
*            line_info   = <line_info>.
*
*        CALL METHOD add_connection_table_line
*          EXPORTING
*            connection_table = table_name
*            connection_field = ls_sort_field-name01
*            connection_value = ls_sort_table-sort1
*            parent_value     = lv_sort_key.
*      ENDAT.
*
*      AT NEW sort2.
*        SUM.
*        lv_sort_parent = ls_sort_table-sort1.
*
*        CONCATENATE  lv_sort_parent ls_sort_table-sort2
*               INTO  lv_sort_key.
*
*        CALL METHOD add_table_line
*          EXPORTING
*            level_index = 2
*            table_key   = table_name
*            key         = lv_sort_key
*            parent      = lv_sort_parent
*            values      = ls_sort_table-values
*          CHANGING
*            line_info   = <line_info>.
*
*        CALL METHOD add_connection_table_line
*          EXPORTING
*            connection_table = table_name
*            connection_field = ls_sort_field-name02
*            connection_value = ls_sort_table-sort2
*            parent_value     = lv_sort_key.
*      ENDAT.
*
*      AT NEW sort3.
*        SUM.
*        CLEAR lv_sort_parent.
*
*        DO 2 TIMES VARYING lv_sort FROM ls_sort_table-sort1
*                                   NEXT ls_sort_table-sort2.
*          CONCATENATE lv_sort_parent lv_sort
*                 INTO lv_sort_parent.
*        ENDDO.
*
*        CONCATENATE  lv_sort_parent ls_sort_table-sort3
*               INTO  lv_sort_key.
*
*        CALL METHOD add_table_line
*          EXPORTING
*            level_index = 3
*            table_key   = table_name
*            key         = lv_sort_key
*            parent      = lv_sort_parent
*            values      = ls_sort_table-values
*          CHANGING
*            line_info   = <line_info>.
*
*        CALL METHOD add_connection_table_line
*          EXPORTING
*            connection_table = table_name
*            connection_field = ls_sort_field-name03
*            connection_value = ls_sort_table-sort3
*            parent_value     = lv_sort_key.
*      ENDAT.
*
*      AT NEW sort4.
*        SUM.
*        CLEAR lv_sort_parent.
*
*        DO 3 TIMES VARYING lv_sort FROM ls_sort_table-sort1
*                                   NEXT ls_sort_table-sort2.
*          CONCATENATE lv_sort_parent lv_sort
*                 INTO lv_sort_parent.
*        ENDDO.
*
*        CONCATENATE  lv_sort_parent ls_sort_table-sort4
*               INTO  lv_sort_key.
*
*        CALL METHOD add_table_line
*          EXPORTING
*            level_index = 4
*            table_key   = table_name
*            key         = lv_sort_key
*            parent      = lv_sort_parent
*            values      = ls_sort_table-values
*          CHANGING
*            line_info   = <line_info>.
*
*        CALL METHOD add_connection_table_line
*          EXPORTING
*            connection_table = table_name
*            connection_field = ls_sort_field-name04
*            connection_value = ls_sort_table-sort4
*            parent_value     = lv_sort_key.
*      ENDAT.
*
*      AT NEW sort5.
*        SUM.
*        CLEAR lv_sort_parent.
*
*        DO 4 TIMES VARYING lv_sort FROM ls_sort_table-sort1
*                                   NEXT ls_sort_table-sort2.
*          CONCATENATE lv_sort_parent lv_sort
*                 INTO lv_sort_parent.
*        ENDDO.
*
*        CONCATENATE  lv_sort_parent ls_sort_table-sort5
*               INTO  lv_sort_key.
*
*        CALL METHOD add_table_line
*          EXPORTING
*            level_index = 5
*            table_key   = table_name
*            key         = lv_sort_key
*            parent      = lv_sort_parent
*            values      = ls_sort_table-values
*          CHANGING
*            line_info   = <line_info>.
*
*        CALL METHOD add_connection_table_line
*          EXPORTING
*            connection_table = table_name
*            connection_field = ls_sort_field-name05
*            connection_value = ls_sort_table-sort5
*            parent_value     = lv_sort_key.
*      ENDAT.
*
*      AT NEW sort6.
*        SUM.
*        CLEAR lv_sort_parent.
*
*        DO 5 TIMES VARYING lv_sort FROM ls_sort_table-sort1
*                                   NEXT ls_sort_table-sort2.
*          CONCATENATE lv_sort_parent lv_sort
*                 INTO lv_sort_parent.
*        ENDDO.
*
*        CONCATENATE  lv_sort_parent ls_sort_table-sort6
*               INTO  lv_sort_key.
*
*        CALL METHOD add_table_line
*          EXPORTING
*            level_index = 6
*            table_key   = table_name
*            key         = lv_sort_key
*            parent      = lv_sort_parent
*            values      = ls_sort_table-values
*          CHANGING
*            line_info   = <line_info>.
*
*        CALL METHOD add_connection_table_line
*          EXPORTING
*            connection_table = table_name
*            connection_field = ls_sort_field-name06
*            connection_value = ls_sort_table-sort6
*            parent_value     = lv_sort_key.
*      ENDAT.
*
*      AT NEW sort7.
*        SUM.
*        CLEAR lv_sort_parent.
*
*        DO 6 TIMES VARYING lv_sort FROM ls_sort_table-sort1
*                                   NEXT ls_sort_table-sort2.
*          CONCATENATE lv_sort_parent lv_sort
*                 INTO lv_sort_parent.
*        ENDDO.
*
*        CONCATENATE  lv_sort_parent ls_sort_table-sort7
*               INTO  lv_sort_key.
*
*        CALL METHOD add_table_line
*          EXPORTING
*            level_index = 7
*            table_key   = table_name
*            key         = lv_sort_key
*            parent      = lv_sort_parent
*            values      = ls_sort_table-values
*          CHANGING
*            line_info   = <line_info>.
*
*        CALL METHOD add_connection_table_line
*          EXPORTING
*            connection_table = table_name
*            connection_field = ls_sort_field-name07
*            connection_value = ls_sort_table-sort7
*            parent_value     = lv_sort_key.
*      ENDAT.
*
*      AT NEW sort8.
*        SUM.
*        CLEAR lv_sort_parent.
*
*        DO 7 TIMES VARYING lv_sort FROM ls_sort_table-sort1
*                                   NEXT ls_sort_table-sort2.
*          CONCATENATE lv_sort_parent lv_sort
*                 INTO lv_sort_parent.
*        ENDDO.
*
*        CONCATENATE  lv_sort_parent ls_sort_table-sort8
*               INTO  lv_sort_key.
*
*        CALL METHOD add_table_line
*          EXPORTING
*            level_index = 8
*            table_key   = table_name
*            key         = lv_sort_key
*            parent      = lv_sort_parent
*            values      = ls_sort_table-values
*          CHANGING
*            line_info   = <line_info>.
*
*        CALL METHOD add_connection_table_line
*          EXPORTING
*            connection_table = table_name
*            connection_field = ls_sort_field-name08
*            connection_value = ls_sort_table-sort8
*            parent_value     = lv_sort_key.
*      ENDAT.
*
*      AT NEW sort9.
*        SUM.
*        CLEAR lv_sort_parent.
*
*        DO 8 TIMES VARYING lv_sort FROM ls_sort_table-sort1
*                                   NEXT ls_sort_table-sort2.
*          CONCATENATE lv_sort_parent lv_sort
*                 INTO lv_sort_parent.
*        ENDDO.
*
*        CONCATENATE  lv_sort_parent ls_sort_table-sort9
*               INTO  lv_sort_key.
*
*        CALL METHOD add_table_line
*          EXPORTING
*            level_index = 9
*            table_key   = table_name
*            key         = lv_sort_key
*            parent      = lv_sort_parent
*            values      = ls_sort_table-values
*          CHANGING
*            line_info   = <line_info>.
*
*        CALL METHOD add_connection_table_line
*          EXPORTING
*            connection_table = table_name
*            connection_field = ls_sort_field-name09
*            connection_value = ls_sort_table-sort9
*            parent_value     = lv_sort_key.
*      ENDAT.
*    ENDLOOP.
*  ENDMETHOD.                    "import_sort_table
**---------------------------------------------------------------------*
*  METHOD import_cascade_table.
*    FIELD-SYMBOLS: <line_info>     TYPE ANY.
*
*    DATA: ls_cascade_data      TYPE tps_cascade_table.
*
*    CLEAR info.
*
*    LOOP AT  table ASSIGNING <line_info>.
*      CLEAR ls_cascade_data.
*
*      CREATE OBJECT ls_cascade_data-info.
*
*      CALL METHOD ls_cascade_data-info->add_data
*        CHANGING
*          data = <line_info>.
*
*      IF NOT field_key IS INITIAL.
*        CALL METHOD ls_cascade_data-info->get_field
*          EXPORTING
*            fieldname   = field_key
*          IMPORTING
*            field_value = ls_cascade_data-key.
*      ENDIF.
*
*      IF NOT field_parent IS INITIAL.
*        CALL METHOD ls_cascade_data-info->get_field
*          EXPORTING
*            fieldname   = field_parent
*          IMPORTING
*            field_value = ls_cascade_data-parent.
*      ENDIF.
*
*      IF NOT field_connection IS INITIAL.
*        CALL METHOD ls_cascade_data-info->get_field
*          EXPORTING
*            fieldname   = field_connection
*          IMPORTING
*            field_value = ls_cascade_data-connection.
*      ENDIF.
*
*      APPEND ls_cascade_data TO info.
*    ENDLOOP.
*  ENDMETHOD.                    "import_cascade_table
**---------------------------------------------------------------------*
*  METHOD add_table_line.
*    DATA: ls_data       TYPE tps_list_info,
*          ls_level      TYPE tps_level_info.
*
*    IF NOT key IS INITIAL OR NOT field_key IS INITIAL.
*      ls_level = get_level_info( level_index ).
*
*      CLEAR ls_data.
*
*      LOOP AT  data_backup
*         INTO  ls_data
*        WHERE  key-table    = table_key
*          AND  key-value    = key
*          AND  parent-value = parent.
*        CLEAR: ls_data-child_selected,
*               ls_data-child_number,
*               ls_data-node_number.
*      ENDLOOP.
*
*      ls_data-level_index  = level_index.
*      ls_data-values       = values.
*
*      CREATE OBJECT ls_data-info.
*
*      CALL METHOD ls_data-info->add_data
*        CHANGING
*          data = line_info.
*
*      ls_data-key-table = table_key.
*
*      IF NOT field_key IS INITIAL.
*        CALL METHOD ls_data-info->get_field
*          EXPORTING
*            fieldname   = field_key
*          IMPORTING
*            field_value = ls_data-key-value.
*      ELSE.
*        ls_data-key-value = key.
*      ENDIF.
*
*      IF table_parent IS INITIAL.
*        ls_data-parent-table = table_key.
*      ELSE.
*        ls_data-parent-table = table_parent.
*      ENDIF.
*
*      IF NOT field_parent IS INITIAL.
*        CALL METHOD ls_data-info->get_field
*          EXPORTING
*            fieldname   = field_parent
*          IMPORTING
*            field_value = ls_data-parent-value.
*      ELSE.
*        ls_data-parent-value = parent.
*      ENDIF.
*
*      IF ls_data-parent-value IS INITIAL AND NOT
*         connection_table     IS INITIAL.
*        ls_data-parent-table = connection_table.
*
*        CALL METHOD ls_data-info->get_field
*          EXPORTING
*            fieldname   = connection_field
*          IMPORTING
*            field_value = ls_data-parent-value.
*      ENDIF.
*
*      IF ls_data-key-value <> ls_data-parent-value.
*        APPEND ls_data TO me->data.
*      ENDIF.
*    ENDIF.
*  ENDMETHOD.                    "add_table_line
**---------------------------------------------------------------------*
*  METHOD add_connection_table_line.
*    FIELD-SYMBOLS: <row>         TYPE ANY.
*
*    DATA: ls_table            TYPE tps_table,
*          ls_data             TYPE tps_cascade_table.
*
*    LOOP AT  list_tables
*       INTO  ls_table
*      WHERE  connection_table = connection_table
*        AND  connection_field = connection_field.
*
*      LOOP AT  ls_table-info
*         INTO  ls_data
*        WHERE  connection = connection_value.
*        ASSIGN ls_data-info->info->* TO <row>.
*
*        CALL METHOD add_table_line
*          EXPORTING
*            level_index  = ls_table-level_index
*            table_key    = ls_table-name
*            key          = ls_data-key
*            table_parent = connection_table
*            parent       = parent_value
*          CHANGING
*            line_info    = <row>.
*
*        ls_data-imported = 'X'.
*        MODIFY ls_table-info FROM ls_data.
*      ENDLOOP.
*    ENDLOOP.
*  ENDMETHOD.                    "add_connection_table_line
**---------------------------------------------------------------------*
*  METHOD get_level_info.
*    CLEAR level_info.
*
*    READ TABLE  levels
*          INTO  level_info
*      WITH KEY  level_index = level.
*  ENDMETHOD.                    "get_level_info
**---------------------------------------------------------------------*
*  METHOD write_next_level.
*    DATA: ls_level        TYPE tps_level_info,
*          ls_data         TYPE tps_list_info,
*          ls_table        TYPE tps_table,
*          lv_last_node    TYPE char1,
*          lv_index        TYPE i,
*          lv_first_line   TYPE char1.
*
*    ADD 1 TO level.
*
*    CALL METHOD set_level_indent
*      EXPORTING
*        level     = level
*        last_node = parent_last_node.
*
*    CALL METHOD child_selection
*      EXPORTING
*        table        = table
*        parent_table = parent_table
*        parent_value = parent_key.
*
*    lv_first_line = 'X'.
*
*    LOOP AT  data
*       INTO  ls_data
*      WHERE  key-table    = table
*        AND  parent-table = parent_table
*        AND  parent-value = parent_key.
*      lv_index = sy-tabix.
*
*      ls_level = get_level_info( ls_data-level_index ).
*
*      IF NOT lv_first_line IS INITIAL.
*        CLEAR lv_first_line.
*
*        IF level <> 1.
*          CALL METHOD new_line
*            EXPORTING
*              line_type = 'B'
*              level     = level
*              checkbox  = ls_level-field_checkbox
*              no_scroll = ls_level-no_scroll.
*        ENDIF.
*
*        IF type = 'N'.
*          CALL METHOD write_level_header
*            EXPORTING
*              level        = level
*              level_info   = ls_level
*              child_number = ls_data-child_number.
*        ENDIF.
*      ENDIF.
*
*      CALL METHOD new_line
*        EXPORTING
*          line_type = 'N'
*          level     = level
*          checkbox  = ls_level-field_checkbox
*          no_scroll = ls_level-no_scroll.
*
*      CALL METHOD write_level
*        EXPORTING
*          level      = level
*          index      = lv_index
*          list_info  = ls_data
*          level_info = ls_level.
*
*      ls_data-level  = level.
*      ls_data-linno  = current_list_line.
*      MODIFY data FROM ls_data.
*
*      IF NOT ls_data-explode IS INITIAL.
*        LOOP AT  list_tables
*           INTO  ls_table.
*          IF ls_data-node_number = child_number.
*            lv_last_node = 'X'.
*          ELSE.
*            CLEAR lv_last_node.
*          ENDIF.
*
*          CALL METHOD write_next_level
*            EXPORTING
*              level            = level
*              child_number     = ls_data-child_number
*              child_last_table = ls_data-child_last_table
*              parent_last_node = lv_last_node
*              table            = ls_table-name
*              parent_table     = ls_data-key-table
*              parent_key       = ls_data-key-value.
*        ENDLOOP.
*      ENDIF.
*    ENDLOOP.
*
*    IF parent_last_node IS INITIAL AND
*       sy-subrc         IS INITIAL AND
*       child_last_table = table.
*      CALL METHOD new_line
*        EXPORTING
*          line_type = 'A'
*          level     = level.
*    ENDIF.
*  ENDMETHOD.                    "write_next_level
**---------------------------------------------------------------------*
*  METHOD write_level_header.
*    DATA: ls_field       TYPE tps_fields,
*          lv_color       TYPE i.
*
*    IF NOT level_info-include_header IS INITIAL.
*      CALL METHOD new_line
*        EXPORTING
*          line_type = 'L'
*          level     = level
*          checkbox  = level_info-field_checkbox
*          no_scroll = level_info-no_scroll.
*
*      IF NOT level_info-color IS INITIAL.
*        lv_color = level_info-color.
*      ELSEIF child_number IS INITIAL.
*        lv_color = color-last_level.
*      ELSE.
*        lv_color = color-main.
*      ENDIF.
*
*      FORMAT INTENSIFIED ON.
*
*      WRITE AT: (3) space   COLOR = lv_color  NO-GAP.
*
*      LOOP AT level_info-fields INTO ls_field.
*        WRITE AT: (ls_field-length) ls_field-header COLOR = lv_color
*                                                    CENTERED NO-GAP.
*      ENDLOOP.
*    ENDIF.
*  ENDMETHOD.                    "write_level_header
**---------------------------------------------------------------------*
*  METHOD write_level.
*    FIELD-SYMBOLS: <info>     TYPE ANY.
*
*    DATA: lv_color    TYPE i.
*
*    IF NOT level_info-color IS INITIAL.
*      lv_color = level_info-color.
*    ELSEIF list_info-child_number IS INITIAL.
*      lv_color = me->color-last_level.
*    ELSE.
*      lv_color = me->color-main.
*    ENDIF.
*
*    FORMAT COLOR = lv_color INTENSIFIED ON.
*
*    IF NOT level_info-field_checkbox IS INITIAL.
*      CALL METHOD write_checkbox
*        EXPORTING
*          list_info      = list_info
*          field_checkbox = level_info-field_checkbox.
*    ENDIF.
*
*    IF level_info-no_symbol IS INITIAL.
*      CALL METHOD write_symbol
*        EXPORTING
*          list_info = list_info.
*    ENDIF.
*
*    IF level_info-form_display IS INITIAL.
*      CALL METHOD write_default_level
*        EXPORTING
*          level_info = level_info
*          list_line  = list_info-info
*          color      = lv_color.
*    ELSE.
*      ASSIGN list_info-info->info->* TO <info>.
*      PERFORM (level_info-form_display) IN PROGRAM (sy-cprog)
*                                             USING <info>.
*    ENDIF.
*
*    IF NOT value_fields IS INITIAL.
*      IF form_values IS INITIAL.
*        CALL METHOD write_default_values
*          EXPORTING
*            list_info = list_info
*            color     = color-values.
*      ELSE.
*        ASSIGN list_info-info->info->* TO <info>.
*        PERFORM (form_values) IN PROGRAM (sy-cprog)
*                                   USING <info>.
*      ENDIF.
*    ENDIF.
*
*    sy-tabix = index.
*    HIDE sy-tabix.
*  ENDMETHOD.                    "write_level
**---------------------------------------------------------------------*
*  METHOD write_checkbox.
*    FIELD-SYMBOLS: <select>   TYPE ANY.
*
*    DATA: lref_select    TYPE REF TO data.
*
*    lref_select = list_info-info->field( field_checkbox ).
*    ASSIGN lref_select->*  TO <select>.
*
*    IF type IS INITIAL.
*      CASE field_checkbox.
*        WHEN 'O'.
*          WRITE: <select>        AS CHECKBOX NO-GAP INPUT OFF,
*                 space           COLOR = 0 INTENSIFIED OFF NO-GAP.
*        WHEN OTHERS.
*          CASE <select>.
*            WHEN 'O'.
*              WRITE: <select>      AS CHECKBOX NO-GAP INPUT OFF,
*                     space         COLOR = 0 INTENSIFIED OFF NO-GAP.
*            WHEN OTHERS.
*              WRITE: <select>      AS CHECKBOX NO-GAP,
*                     space         COLOR = 0 INTENSIFIED OFF NO-GAP.
*          ENDCASE.
*      ENDCASE.
*    ELSE.
*      WRITE AT (2) space COLOR = 0 INTENSIFIED OFF NO-GAP.
*    ENDIF.
*  ENDMETHOD.                    "write_checkbox
**---------------------------------------------------------------------*
*  METHOD write_symbol.
*    DATA: lv_symbol      TYPE char2.
*
*    IF type IS INITIAL.
*      lv_symbol = get_symbol( child_number = list_info-child_number
*                              explode      = list_info-explode ).
*
*      WRITE AT (3) lv_symbol AS SYMBOL NO-GAP HOTSPOT.
*    ELSE.
*      WRITE AT (3) space NO-GAP.
*    ENDIF.
*  ENDMETHOD.                    "write_symbol
**---------------------------------------------------------------------*
*  METHOD new_line.
** line_type = 'H' - Header
** line_type = 'L' - Level Header
** line_type = 'B' - Before;
** line_type = 'N' - Normal line;
** line_type = 'A' - After
*
*    DATA: lv_indent        TYPE i,
*          lv_indent1       TYPE i,
*          lv_indent2       TYPE i,
*          lv_indentations  TYPE i,
*          lv_line          TYPE char1.
*
*    lv_indentations  = level - 1.
*
*    FORMAT COLOR = 0 INTENSIFIED OFF HOTSPOT OFF.
*
*    lv_indent  = ( level - 1 ) * step_margin.
*    lv_indent1 = 1.
*    lv_indent2 = step_margin - lv_indent1 - 1.
*
*    IF no_scroll IS INITIAL OR NOT with_lines IS INITIAL.
*      NEW-LINE SCROLLING.
*    ELSE.
*      NEW-LINE NO-SCROLLING.
*    ENDIF.
*
*    CASE line_type.
*      WHEN 'H'.
*        ADD 1 TO current_list_line.
*
*        WRITE AT (indent_margin) space  NO-GAP COLOR = 0.
*
*        CLEAR sy-tabix.
*        HIDE sy-tabix.
*
*        FORMAT COLOR = color-main INTENSIFIED ON.
*      WHEN 'B' OR 'L'.
*        IF NOT with_lines IS INITIAL OR line_type = 'L'.
*          ADD 1 TO current_list_line.
*
*          IF NOT indent_margin IS INITIAL.
*            WRITE AT: (indent_margin) space     NO-GAP.
*          ENDIF.
*
*          CLEAR sy-tabix.
*          HIDE sy-tabix.
*
*          IF with_lines IS INITIAL.
*            WRITE AT: (lv_indent) space     NO-GAP.
*          ELSE.
*            DO lv_indentations TIMES.
*              IF sy-index = lv_indentations.
*                WRITE AT: (lv_indent1) space     NO-GAP,
*                          (1)          sy-vline  NO-GAP,
*                          (lv_indent2) space     NO-GAP.
*              ELSE.
*                lv_line = get_level_indent( sy-index ).
*
*                WRITE AT: (lv_indent1) space     NO-GAP,
*                          (1)          lv_line   NO-GAP,
*                          (lv_indent2) space     NO-GAP.
*              ENDIF.
*            ENDDO.
*          ENDIF.
*        ENDIF.
*      WHEN 'N'.
*        ADD 1 TO current_list_line.
*
*        IF NOT indent_margin IS INITIAL AND level <> 1.
*          WRITE AT: (indent_margin) space     NO-GAP.
*        ENDIF.
*
*        IF with_lines IS INITIAL.
*          IF NOT checkbox IS INITIAL.
*            SUBTRACT 2 FROM lv_indent.
*          ENDIF.
*
*          WRITE AT: (lv_indent) space     NO-GAP.
*        ELSE.
*          DO lv_indentations TIMES.
*            IF sy-index = lv_indentations.
*              IF NOT checkbox IS INITIAL.
*                SUBTRACT 2 FROM lv_indent2.
*              ENDIF.
*
*              WRITE AT: (lv_indent1) space     NO-GAP,
*                        (1)          sy-vline  NO-GAP,
*                        (lv_indent2) sy-uline  NO-GAP.
*            ELSE.
*              lv_line = get_level_indent( sy-index ).
*
*              WRITE AT: (lv_indent1) space     NO-GAP,
*                        (1)          lv_line   NO-GAP,
*                        (lv_indent2) space     NO-GAP.
*            ENDIF.
*          ENDDO.
*        ENDIF.
*      WHEN 'A'.
*        IF NOT with_lines IS INITIAL.
*          ADD 1 TO current_list_line.
*
*          IF level = 2.
*            SKIP.
*          ENDIF.
*
*          CLEAR sy-tabix.
*          HIDE sy-tabix.
*
*          lv_indentations = level - 2.
*
*          IF lv_indentations > 0.
*            IF NOT indent_margin IS INITIAL.
*              WRITE AT: (indent_margin) space     NO-GAP.
*            ENDIF.
*          ENDIF.
*
*          DO lv_indentations TIMES.
*            lv_line = get_level_indent( sy-index ).
*
*            WRITE AT: (lv_indent1) space     NO-GAP,
*                      (1)          lv_line   NO-GAP,
*                      (lv_indent2) space     NO-GAP.
*          ENDDO.
*        ENDIF.
*    ENDCASE.
*  ENDMETHOD.                    "new_line
**---------------------------------------------------------------------*
*  METHOD get_symbol.
*    CONSTANTS:   con_documents(2)    VALUE '2 ',
*                 con_plus_folder(2)  VALUE '4 ',
*                 con_minus_folder(2) VALUE '5 '.
*
*    IF child_number IS INITIAL.
*      symbol = con_documents.
*    ELSE.
*      IF NOT explode IS INITIAL.
*        symbol  = con_minus_folder.
*      ELSE.
*        symbol  = con_plus_folder.
*      ENDIF.
*    ENDIF.
*  ENDMETHOD.                    "get_symbol
**---------------------------------------------------------------------*
*  METHOD write_default_level.
*    DATA: ls_field       TYPE tps_fields,
*          lv_dummy(100)  TYPE c,
*          lv_color       TYPE i,
*          lv_unit        TYPE meins.
*
*    DATA: ref_field      TYPE REF TO data.
*
*    FIELD-SYMBOLS: <field>          TYPE ANY.
*
*    LOOP AT level_info-fields INTO ls_field.
*      IF ls_field-fieldname IS INITIAL.
*        GET REFERENCE OF lv_dummy INTO ref_field.
*        ASSIGN ref_field->* TO <field>.
*      ELSE.
*        ref_field = list_line->field( ls_field-fieldname ).
*        ASSIGN ref_field->* TO <field>.
*      ENDIF.
*
*      IF NOT ls_field-color_variable IS INITIAL.
*        CALL METHOD list_line->get_field
*          EXPORTING
*            fieldname   = ls_field-color_variable
*          IMPORTING
*            field_value = ls_field-color.
*      ENDIF.
*
*      IF ls_field-color IS INITIAL.
*        lv_color = color.
*      ELSE.
*        lv_color = ls_field-color.
*      ENDIF.
*
*      IF NOT ls_field-inten_variable IS INITIAL.
*        CALL METHOD list_line->get_field
*          EXPORTING
*            fieldname   = ls_field-inten_variable
*          IMPORTING
*            field_value = ls_field-intensified.
*      ENDIF.
*
*      IF ls_field-intensified IS INITIAL.
*        FORMAT INTENSIFIED OFF.
*      ELSE.
*        FORMAT INTENSIFIED ON.
*      ENDIF.
*
*      IF ls_field-hotspot IS INITIAL.
*        FORMAT HOTSPOT OFF.
*      ELSE.
*        FORMAT HOTSPOT ON.
*      ENDIF.
*
*      IF NOT ls_field-input_variable IS INITIAL.
*        CALL METHOD list_line->get_field
*          EXPORTING
*            fieldname   = ls_field-input_variable
*          IMPORTING
*            field_value = ls_field-input.
*      ENDIF.
*
*      IF ls_field-input IS INITIAL.
*        FORMAT INPUT OFF.
*      ELSE.
*        FORMAT INPUT ON.
*      ENDIF.
*
*      IF NOT ls_field-icon IS INITIAL AND NOT <field> IS INITIAL.
*        WRITE AT (ls_field-length) <field> AS ICON
*                                           COLOR = lv_color NO-GAP.
*      ELSEIF NOT ls_field-symbol IS INITIAL AND NOT <field> IS INITIAL.
*        WRITE AT (ls_field-length) <field> AS SYMBOL
*                                           COLOR = lv_color NO-GAP.
*      ELSE.
*        CALL METHOD list_line->get_field
*          EXPORTING
*            fieldname   = ls_field-unit_field
*          IMPORTING
*            field_value = lv_unit.
*
*        IF NOT lv_unit IS INITIAL.
*          WRITE: AT (ls_field-length) <field>  COLOR = lv_color NO-GAP
*                                                   UNIT lv_unit.
*        ELSEIF ls_field-centered IS INITIAL.
*          WRITE AT (ls_field-length) <field> COLOR = lv_color NO-GAP.
*        ELSE.
*          WRITE AT (ls_field-length) <field> COLOR = lv_color NO-GAP
*                                             CENTERED
*  .
*        ENDIF.
*      ENDIF.
*    ENDLOOP.
*  ENDMETHOD.                    "write_default_level
**---------------------------------------------------------------------*
*  METHOD write_default_values.
*    FIELD-SYMBOLS: <field>    TYPE tps_value_type,
*                   <color>    TYPE i.
*
*    DATA: ls_field            TYPE tps_fields,
*          lv_color            TYPE i.
*
*    WRITE AT values_position space NO-GAP COLOR = me->color-main
*                                   INTENSIFIED.
*
*    LOOP AT  value_fields
*       INTO  ls_field.
*      ASSIGN COMPONENT sy-tabix OF STRUCTURE list_info-values
*                                          TO <field>.
*
*      IF NOT ls_field-color_variable IS INITIAL.
*        CALL METHOD list_info-info->get_field
*          EXPORTING
*            fieldname   = ls_field-color_variable
*          IMPORTING
*            field_value = ls_field-color.
*      ENDIF.
*
*      IF ls_field-color IS INITIAL.
*        lv_color = color.
*      ELSE.
*        lv_color = ls_field-color.
*      ENDIF.
*
*      IF ls_field-hotspot IS INITIAL.
*        FORMAT HOTSPOT OFF.
*      ELSE.
*        FORMAT HOTSPOT ON.
*      ENDIF.
*
*      CASE ls_field-type.
*        WHEN 'CURR'.
*          IF ls_field-centered IS INITIAL.
*            WRITE AT (ls_field-length) <field>-curr
*               NO-GAP CURRENCY ls_field-waers COLOR = lv_color.
*          ELSE.
*            WRITE: AT (ls_field-length) <field>-curr
*             NO-GAP CURRENCY ls_field-waers COLOR = lv_color CENTERED.
*          ENDIF.
*        WHEN 'QUAN'.
*          IF ls_field-centered IS INITIAL.
*            WRITE: AT (ls_field-length) <field>-quan
*                    NO-GAP UNIT ls_field-unit COLOR = lv_color.
*          ELSE.
*            WRITE: AT (ls_field-length) <field>-quan
*                  NO-GAP UNIT ls_field-unit COLOR = lv_color CENTERED.
*          ENDIF.
*      ENDCASE.
*
*      WRITE space  NO-GAP COLOR = me->color-main INTENSIFIED OFF.
*    ENDLOOP.
*  ENDMETHOD.                    "write_default_values
**---------------------------------------------------------------------*
*  METHOD get_selected_values.
*    DATA: ls_data     TYPE tps_list_info.
*
*    CLEAR selected.
*    selected-page         = sy-cpage.
*    selected-line         = sy-lilli.
*    selected-column       = sy-cucol.
*    selected-start_line   = sy-staro.
*    selected-start_column = sy-staco.
*    selected-index        = index.
*
*    READ TABLE  data
*          INTO  ls_data
*         INDEX  index.
*
*    IF sy-subrc = 0.
*      selected-table       = ls_data-key-table.
*      selected-level       = ls_data-level.
*      selected-level_index = ls_data-level_index.
*    ENDIF.
*  ENDMETHOD.                    "get_selected_values
**---------------------------------------------------------------------*
*  METHOD set_selected_field.
*    DATA: ls_level                TYPE tps_level_info,
*          ls_field                TYPE tps_fields,
*          lv_cursor_drill_begin   TYPE i,
*          lv_cursor_drill_end     TYPE i,
*          lv_field_position       TYPE i.
*
*    ls_level = get_level_info( selected-level_index ).
*
*    IF with_lines = space AND NOT ls_level-no_scroll IS INITIAL.
*      lv_cursor_drill_begin = ( selected-level - 1 ) * step_margin
*                            - 1 + indent_margin + 3.
*    ELSE.
*      lv_cursor_drill_begin = ( selected-level - 1 ) * step_margin
*                          - selected-start_column + indent_margin + 3.
*    ENDIF.
*
*    lv_cursor_drill_end = lv_cursor_drill_begin + 2.
*
*    CLEAR selected-field.
*
*    IF    selected-column >= lv_cursor_drill_begin
*      AND selected-column <= lv_cursor_drill_end.
*      selected-field = 'DRILL'.
*    ENDIF.
*
*    IF selected-column > lv_cursor_drill_end.
*      lv_field_position = lv_cursor_drill_end + 1.
*
*      LOOP AT ls_level-fields INTO ls_field.
*        ADD ls_field-length TO lv_field_position.
*
*        IF selected-column < lv_field_position.
*          selected-field = ls_field-fieldname.
*          EXIT.
*        ENDIF.
*      ENDLOOP.
*    ENDIF.
*  ENDMETHOD.                    "set_selected_field
**---------------------------------------------------------------------*
*  METHOD drill_down.
*    DATA: ls_data       TYPE tps_list_info.
*
*    READ TABLE  data
*          INTO  ls_data
*         INDEX  selected-index.
*
*    IF sy-subrc = 0 AND ls_data-child_number <> 0.
*      IF ls_data-explode IS INITIAL.
*        ls_data-explode = 'X'.
*      ELSE.
*        CLEAR ls_data-explode.
*      ENDIF.
*
*      MODIFY  data
*        FROM  ls_data
*       INDEX  selected-index.
*    ENDIF.
*  ENDMETHOD.                    "drill_down
**---------------------------------------------------------------------*
*  METHOD execute_level_function.
*    FIELD-SYMBOLS: <info>     TYPE ANY.
*
*    DATA: ls_level     TYPE tps_level_info,
*          ls_data      TYPE tps_list_info.
*
*    READ TABLE  data
*          INTO  ls_data
*         INDEX  selected-index.
*
*    IF sy-subrc = 0.
*      ls_level = get_level_info( ls_data-level_index ).
*
*      IF NOT ls_level-form_execution IS INITIAL.
*        ASSIGN ls_data-info->info->* TO <info>.
*
*        PERFORM (ls_level-form_execution) IN PROGRAM (ls_level-program)
*                                               USING <info>.
*      ENDIF.
*    ENDIF.
*  ENDMETHOD.                    "execute_level_function
**---------------------------------------------------------------------*
*  METHOD get_input.
*    FIELD-SYMBOLS: <select>    TYPE ANY.
*
*    DATA: ls_data      TYPE tps_list_info,
*          ls_level     TYPE tps_level_info,
*          lv_select    TYPE char1,
*          lref_select  TYPE REF TO data.
*
*    IF NOT explode IS INITIAL.
*      LOOP AT  data
*         INTO  ls_data
*        WHERE  parent-value = key.
*        ls_level = get_level_info( ls_data-level_index ).
*
*        IF NOT ls_level-field_checkbox IS INITIAL.
*          lref_select = ls_data-info->field( ls_level-field_checkbox ).
*          ASSIGN lref_select->* TO <select>.
*
*          <select> =  read_list_line( line  = ls_data-linno
*                                      level = ls_data-level ).
*
*          IF type = 'N'.
*            CALL METHOD set_child_checkbox
*              EXPORTING
*                field_checkbox = ls_level-field_checkbox
*                select         = <select>
*                key            = ls_data-key-value.
*          ENDIF.
*        ENDIF.
*
*        CALL METHOD get_field_input
*          EXPORTING
*            list_info = ls_data
*          CHANGING
*            fields    = ls_level-fields.
*
*        CALL METHOD get_input( key = ls_data-key-value
*          explode = ls_data-explode ).
*      ENDLOOP.
*    ENDIF.
*  ENDMETHOD.                    "get_input
**---------------------------------------------------------------------*
*  METHOD get_field_input.
*    FIELD-SYMBOLS: <info>      TYPE ANY,
*                   <field>     TYPE ANY.
*
*    DATA: ls_field     TYPE tps_fields,
*          lv_position  TYPE i,
*          lref_field   TYPE REF TO data.
*
*    CLEAR lv_position.
*    LOOP AT  fields
*       INTO  ls_field.
*      IF NOT ls_field-input_variable IS INITIAL.
*        CALL METHOD list_info-info->get_field
*          EXPORTING
*            fieldname   = ls_field-input_variable
*          IMPORTING
*            field_value = ls_field-input.
*      ENDIF.
*
*      IF ls_field-input = 'X'.
*        lref_field = list_info-info->field( ls_field-fieldname ).
*        ASSIGN lref_field->* TO <field>.
*
*        CALL METHOD read_line_field
*          EXPORTING
*            line     = list_info-linno
*            level    = list_info-level
*            position = lv_position
*            length   = ls_field-length
*          CHANGING
*            value    = <field>.
*
*        IF NOT ls_field-form_input_check IS INITIAL.
*          ASSIGN list_info-info->info->* TO <info>.
*          PERFORM (ls_field-form_input_check) IN PROGRAM (sy-cprog)
*                                                   USING <info>
*                                                CHANGING <field>.
*        ENDIF.
*      ENDIF.
*
*      ADD ls_field-length TO lv_position.
*    ENDLOOP.
*  ENDMETHOD.                    "get_field_input
**---------------------------------------------------------------------*
*  METHOD set_child_checkbox.
*    FIELD-SYMBOLS: <select>   TYPE ANY.
*
*    DATA: ls_data      TYPE tps_list_info,
*          lref_select  TYPE REF TO data.
*
*    LOOP AT  data
*       INTO  ls_data
*      WHERE  parent = key.
*      lref_select = ls_data-info->field( field_checkbox ).
*      ASSIGN lref_select->* TO <select>.
*
*      CALL METHOD set_child_checkbox
*        EXPORTING
*          field_checkbox = field_checkbox
*          select         = select
*          key            = ls_data-key-value.
*    ENDLOOP.
*  ENDMETHOD.                    "set_child_checkbox
**---------------------------------------------------------------------*
*  METHOD read_list_line.
*    DATA: lv_position    TYPE i.
*
*    READ LINE line.
*
*    IF sy-subrc = 0.
*      CLEAR lv_position.
*
*      IF level > 1.
*        lv_position = step_margin * ( level - 1 ) - 2 + indent_margin.
*      ENDIF.
*
*      select = sy-lisel+lv_position(1).
*    ENDIF.
*  ENDMETHOD.                    "read_list_line
**---------------------------------------------------------------------*
*  METHOD read_line_field.
*    DATA: lv_position    TYPE i.
*
*    READ LINE line.
*
*    IF sy-subrc = 0.
*      CLEAR lv_position.
*
*      IF level > 1.
*        lv_position = step_margin * ( level - 1 ) + 3 + indent_margin.
*      ENDIF.
*
*      ADD position TO lv_position.
*
*      value = sy-lisel+lv_position(length).
*    ENDIF.
*  ENDMETHOD.                    "read_line_field
**---------------------------------------------------------------------*
*  METHOD set_next_level.
*    DATA: ls_data       TYPE tps_list_info,
*          lv_level      TYPE i.
*
*    LOOP AT  data
*       INTO  ls_data
*      WHERE  parent-value = key.
*      IF level < stop_level              AND NOT
*         ls_data-child_number IS INITIAL.
*        ls_data-explode = 'X'.
*      ELSE.
*        CLEAR ls_data-explode.
*      ENDIF.
*
*      MODIFY data FROM ls_data.
*
*      lv_level = level + 1.
*
*      CALL METHOD set_next_level
*        EXPORTING
*          level      = lv_level
*          stop_level = stop_level
*          key        = ls_data-key-value.
*    ENDLOOP.
*  ENDMETHOD.                    "set_next_level
**---------------------------------------------------------------------*
*  METHOD set_level_indent.
*    DATA: lv_position   TYPE i.
*
*    lv_position         = level - 1.
*    indent_lines+lv_position(1) = last_node.
*  ENDMETHOD.                    "set_level_indent
**---------------------------------------------------------------------*
*  METHOD get_level_indent.
*    DATA: lv_position   TYPE i.
*
*    lv_position = level + 1.
*    info        = indent_lines+lv_position(1).
*
*    IF info IS INITIAL.
*      info = sy-vline.
*    ELSE.
*      info = space.
*    ENDIF.
*  ENDMETHOD.                    "get_level_indent
*ENDCLASS.                    "cdrill_down IMPLEMENTATION
*
**----------------------------------------------------------------------
**
**       CLASS cicp DEFINITION
**----------------------------------------------------------------------
**
**
**----------------------------------------------------------------------
**
*CLASS cicp DEFINITION.
*  PUBLIC SECTION.
*    TYPES: tps_index    TYPE t094p,
*           tpt_index    TYPE TABLE OF tps_index.
*
*    DATA: wbind    TYPE wbind,
*          basjhr   TYPE basjhr,
*          indjhr   TYPE indjhr,
*          indexes  TYPE tpt_index,
*          lines    TYPE i.
*
*    METHODS constructor
*      IMPORTING
*         wbind    TYPE wbind
*         basjhr   TYPE basjhr
*         indjhr   TYPE indjhr
*         table    TYPE table.
*
*    METHODS month
*      IMPORTING
*        month         TYPE indmon
*      RETURNING
*        value(index)  TYPE indprz.
*ENDCLASS.                    "cicp DEFINITION
*
**----------------------------------------------------------------------
**
**       CLASS cicp IMPLEMENTATION
**----------------------------------------------------------------------
**
**
**----------------------------------------------------------------------
**
*CLASS cicp IMPLEMENTATION.
*  METHOD constructor.
*    FIELD-SYMBOLS:  <data>     TYPE ANY.
*
*    DATA: lref_data    TYPE REF TO data,
*          ls_index     TYPE tps_index.
*
*    CREATE DATA lref_data LIKE LINE OF table.
*    ASSIGN lref_data->*    TO <data>.
*
*    me->wbind  = wbind.
*    me->basjhr = basjhr.
*    me->indjhr = indjhr.
*
*    CLEAR indexes.
*
*    LOOP AT table ASSIGNING <data>.
*      MOVE-CORRESPONDING <data> TO ls_index.
*
*      IF ls_index-wbind  = wbind   AND
*         ls_index-basjhr = basjhr  AND
*         ls_index-indjhr = indjhr.
*        APPEND ls_index TO indexes.
*      ENDIF.
*    ENDLOOP.
*
*    DESCRIBE TABLE indexes LINES lines.
*  ENDMETHOD.                    "constructor
*
*  METHOD month.
*    DATA: ls_index    TYPE tps_index.
*
*    CLEAR index.
*
*    LOOP AT  indexes
*       INTO  ls_index
*      WHERE  indmon = month.
*      index = ls_index-indproz.
*    ENDLOOP.
*  ENDMETHOD.                    "month
*ENDCLASS.                    "cicp IMPLEMENTATION
*
**----------------------------------------------------------------------
**
**       CLASS ccons_clauses DEFINITION
**----------------------------------------------------------------------
**
**
**----------------------------------------------------------------------
**
*CLASS ccons_clauses  DEFINITION.
*  PUBLIC SECTION.
*    TYPES: tps_user          TYPE vzsort.
*
*    DATA: contract           TYPE vimimv,
*          clause             TYPE z3acons,
*          discount           TYPE z3dsc,
*          ipc                TYPE vimi16,
*          old_value          TYPE balt,
*          year               TYPE gjahr,
*          month              TYPE monat,
*          date               TYPE datum,
*          last_day           TYPE datum,
*          first_day          TYPE datum,
*          sales              TYPE z3sales_t,
*          first_sales_period TYPE text6,
*          last_sales_period  TYPE text6,
*          total_sales        TYPE bneu.
*
*    CLASS-METHODS get_contract_user_values
*      IMPORTING
*        intreno        TYPE vvintreno
*      CHANGING
*        user           TYPE vzsort.
*
*    METHODS constructor
*      IMPORTING
*        intreno        TYPE vvintreno
*        year           TYPE numc04
*        month          TYPE numc2.
*
*    METHODS get_cons_value
*      RETURNING
*        value(value)   TYPE bneu.
*
*    METHODS get_sales_values
*      IMPORTING
*        periods       TYPE i       DEFAULT 12
*        type          TYPE i       DEFAULT 0
*        displacement  TYPE i       DEFAULT 0
*      CHANGING
*        VALUE         type bneu.
*
*    CLASS-METHODS select_sales_values
*      IMPORTING
*        intreno       TYPE vvintreno
*        year          TYPE gjahr
*        month         TYPE monat
*      CHANGING
*        valor_fact    TYPE bneu   OPTIONAL
*        renda_var     TYPE bneu   OPTIONAL
*        renumer       TYPE bneu   OPTIONAL.
*
*  PROTECTED SECTION.
*    METHODS get_multi_sales_values
*      IMPORTING
*        first         TYPE i
*        last          TYPE i
*      CHANGING
*        VALUE         type bneu  optional
*        period_value  TYPE bneu  OPTIONAL.
*
*    METHODS get_cond
*      IMPORTING
*        skoart        TYPE skoart
*        date_from     TYPE datum
*        date_to       TYPE datum
*        SIGN          type char1
*      CHANGING
*        VALUE         type bneu.
*
*    METHODS set_discount
*      IMPORTING
*        VALUE            type bneu
*        TYPE             type char1 default '+'
*      RETURNING
*        value(discount)  TYPE bneu.
*
*    METHODS process01
*      RETURNING value(value_cons) TYPE bneu.
*
*    METHODS process02
*      RETURNING value(value_cons) TYPE bneu.
*
*    METHODS process03
*      RETURNING value(value_cons) TYPE bneu.
*
*    METHODS process04
*      RETURNING value(value_cons) TYPE bneu.
*
*    METHODS process05
*      RETURNING value(value_cons) TYPE bneu.
*
*    METHODS process06
*      RETURNING value(value_cons) TYPE bneu.
*
*    METHODS process07
*      RETURNING value(value_cons) TYPE bneu.
*
*    METHODS process08
*      RETURNING value(value_cons) TYPE bneu.
*
*    METHODS process09
*      RETURNING value(value_cons) TYPE bneu.
*ENDCLASS.                    "ccons_clauses DEFINITION
*
**----------------------------------------------------------------------
**
**       CLASS ccons_clauses IMPLEMENTATION
**----------------------------------------------------------------------
**
**
**----------------------------------------------------------------------
**
*CLASS ccons_clauses  IMPLEMENTATION.
*  METHOD get_contract_user_values.
*    CLEAR user.
*    SELECT  SINGLE *
*      INTO  user
*      FROM  vzsort
*     WHERE  snumobj = 'VI'
*       AND  sobjekt = intreno.
*  ENDMETHOD.                    "get_contract_user_values
*
*  METHOD constructor.
*    DATA: ls_user  TYPE tps_user.
*
*    CLEAR: me->contract,
*           me->clause,
*           me->discount,
*           me->ipc,
*           me->old_value,
*           me->year,
*           me->month,
*           me->date,
*           me->last_day,
*           me->first_day.
*
*    SELECT  SINGLE *
*      INTO  contract
*      FROM  vimimv
*     WHERE  intreno = intreno.
*
*    IF sy-subrc IS INITIAL.
*      me->year       = year.
*      me->month      = month.
*      last_day       = cdate=>month_last_day( year = year month = month
*).
*      first_day      = last_day.
*      first_day+6(2) = '01'.
*
*      SELECT  *
*        INTO  clause
*        FROM  z3acons UP TO 1 ROWS
*       WHERE  intreno =  intreno
*         AND  data BETWEEN first_day AND last_day
*       ORDER  BY data DESCENDING.
*
*        SELECT  SINGLE *
*          INTO  discount
*          FROM  z3dsc
*         WHERE  bukrs   = contract-bukrs
*           AND  intreno = contract-intreno
*           AND  dguel   = clause-data.
*
*        CALL METHOD get_contract_user_values
*          EXPORTING
*            intreno = contract-intreno
*          CHANGING
*            user    = ls_user.
*
*        date = ls_user-usr08.
*
*        IF NOT date IS INITIAL AND date+6(2) > 14.
*          date = cdate=>add_months( date = date months = 1 ).
*        ENDIF.
*      ENDSELECT.
*
*      SELECT  *
*        INTO  ipc
*        FROM  vimi16 UP TO 1 ROWS
*       WHERE  bukrs   =  contract-bukrs
*         AND  smive   =  contract-smive
*         AND  swenr   =  contract-swenr
*         AND  smenr   =  contract-smenr
*         AND  dguelab =  first_day
*         AND  skoart  =  '0010'
*         AND  sanpnr  =  '008'
*         AND  dstorno =  '00000000'
*         AND  sfutanp <> '2'
*       ORDER  BY danpass.
*        old_value = set_discount( value = ipc-bkondalt type = '-' ).
*      ENDSELECT.
*    ENDIF.
*  ENDMETHOD.                    "constructor
*
*  METHOD get_cons_value.
*    CLEAR value.
*
*    CASE clause-zzccaso.
*      WHEN '01'. value = process01( ).
*      WHEN '02'. value = process02( ).
*      WHEN '03'. value = process03( ).
*      WHEN '04'. value = process04( ).
*      WHEN '05'. value = process05( ). "Inactivo: Deve ser revisto
*      WHEN '06'. value = process06( ).
*      WHEN '07'. value = process07( ). "Inactivo: Não utilizado
*      WHEN '08'. value = process08( ). "Inactivo: Não utilizado
*      WHEN '09'. value = process09( ).
*      WHEN '99'.
*    ENDCASE.
*  ENDMETHOD.                    "get_cons_value
*
*  METHOD get_sales_values.
*    DATA: ls_sales       TYPE z3sales_s,
*          lv_month       TYPE monat,
*          lv_year        TYPE gjahr,
*          lv_displ       TYPE i,
*          lv_date_to     TYPE datum,
*          lv_date_from   TYPE datum,
*          lv_months      TYPE p,
*          lv_renda_var   TYPE bneu.
*
*    CLEAR value.
*
*    lv_year   = year.
*    lv_month  = month.
*
*    lv_displ  = displacement * -1.
*
*    CALL METHOD cdate=>add_period
*      EXPORTING
*        value = lv_displ
*      CHANGING
*        year  = lv_year
*        month = lv_month.
*
*    CLEAR: sales,
*           first_sales_period,
*           last_sales_period,
*           total_sales.
*
*    DO periods TIMES.
*      CALL METHOD cdate=>add_period
*        EXPORTING
*          value = -1
*        CHANGING
*          year  = lv_year
*          month = lv_month.
*
*      CALL METHOD select_sales_values
*        EXPORTING
*          intreno   = contract-intreno
*          year      = lv_year
*          month     = lv_month
*        CHANGING
*          renda_var = lv_renda_var.
*
*      ADD lv_renda_var TO value.
*
*      CLEAR ls_sales.
*      ls_sales-period = cdate=>set_period_text( year = lv_year month =
*lv_month ).
*      ls_sales-value  = lv_renda_var.
*      INSERT ls_sales INTO sales INDEX 1.
*
*      IF last_sales_period IS INITIAL.
*        last_sales_period = ls_sales-period.
*      ENDIF.
*
*      first_sales_period = ls_sales-period.
*      total_sales = value.
*    ENDDO.
*
*    IF type = 1.
*      lv_year  = year.
*      lv_month = month.
*
*      CALL METHOD cdate=>add_period
*        EXPORTING
*          value = lv_displ
*        CHANGING
*          year  = lv_year
*          month = lv_month.
*
*      CONCATENATE year    month    '01' INTO lv_date_to.
*      CONCATENATE lv_year lv_month '01' INTO lv_date_from.
*
*      CALL METHOD get_cond
*        EXPORTING
*          skoart    = '0010'
*          date_from = lv_date_from
*          date_to   = lv_date_to
*          sign      = '+'
*        CHANGING
*          value     = value.
*    ENDIF.
*  ENDMETHOD.                    "get_sales_values
*
*  METHOD select_sales_values.
*    DATA: lv_valor_fact     TYPE z3valor_fact,
*          lv_renda_var      TYPE z3renda_var,
*          lv_renumer        TYPE z3remuner.
*
*    CLEAR: valor_fact,
*           renda_var,
*           renumer.
*
*    SELECT  valor_fact
*            renda_var
*            renumer
*      INTO (lv_valor_fact,
*            lv_renda_var,
*            lv_renumer)
*      FROM  z3vvm
*     WHERE  anovv   = year
*       AND  mesvv   = month
*       AND  intreno = intreno
*       AND  ( status = space OR status = '33' ).
*      ADD lv_valor_fact  TO valor_fact.
*      ADD lv_renda_var   TO renda_var.
*      ADD lv_renumer     TO renumer.
*    ENDSELECT.
*  ENDMETHOD.                    "select_sales_values
*
*  METHOD get_multi_sales_values.
*    DATA: lv_yocul        TYPE char1,
*          lv_mult         TYPE char1,
*          lv_date_from    TYPE datum,
*          lv_date_to      TYPE datum,
*          lv_value        TYPE zvolvem_re.
*
*    CLEAR: lv_yocul,
*           lv_mult.
*
*    SELECT  SINGLE yocul
*      INTO  lv_yocul
*      FROM  z3cmconfig
*     WHERE  zzccaso EQ '06'.
*
*    IF sy-subrc IS INITIAL.
*      IF lv_yocul IS INITIAL.
*        lv_mult = 'X'.
*      ELSE.
*        CLEAR lv_mult.
*      ENDIF.
*    ENDIF.
*
*    lv_date_from =
*       cdate=>subtract_months( date = first_day months = first ).
*    lv_date_to  =
*       cdate=>subtract_months( date = first_day months = last ).
*
*    CLEAR: value.
*
*    SELECT  volvem_re
*      INTO  lv_value
*      FROM  z3vvm_mv
*     WHERE ( ( anovv = lv_date_from(4) AND
*               mesvv >= lv_date_from+4(2) ) OR
*             ( anovv > lv_date_from(4) AND
*               anovv <  lv_date_from(4)   ) OR
*             ( anovv = lv_date_to(4)   AND
*               mesvv <= lv_date_to+4(2) ) )
*       AND  intreno = contract-intreno.
*      ADD lv_value TO value.
*
*      IF lv_mult = 'X'.
*        IF NOT clause-zzccy IS INITIAL.
*          lv_value = lv_value * clause-zzccy / 100.
*        ENDIF.
*
*        ADD lv_value TO period_value.
*      ENDIF.
*    ENDSELECT.
*
*    period_value = ( period_value / 12 ) * ( clause-zzccx / 100 ).
*  ENDMETHOD.                    "get_multi_sales_values
*
*  METHOD get_cond.
*    DATA: lv_bcwhr      TYPE bcwhr,
*          lv_bmwst      TYPE bmwst.
*
*    SELECT  bcwhr     bmwst
*      INTO (lv_bcwhr, lv_bmwst)
*      FROM  vibepp
*     WHERE  bukrs   =  contract-bukrs
*       AND  smive   =  contract-smive
*       AND  swenr   =  contract-swenr
*       AND  smenr   =  contract-smenr
*       AND  skoart  =  skoart
*       AND  dbervon >= date_from
*       AND  dberbis <= date_to.
*
*      DIVIDE lv_bcwhr BY 12.
*      DIVIDE lv_bmwst BY 12.
*
*      IF sign = '-'.
*        SUBTRACT lv_bcwhr FROM value.
*        ADD      lv_bmwst TO   value.
*      ELSE.
*        ADD      lv_bcwhr TO   value.
*        SUBTRACT lv_bmwst FROM value.
*      ENDIF.
*    ENDSELECT.
*  ENDMETHOD.                    "get_cond
*
*  METHOD set_discount.
*    IF type = '+'.
*      discount = value *
*          ( 1 - ( me->discount-zzdesc / 100 ) ) *
*          ( 1 - ( me->discount-zzdescex / 100 ) ).
*    ELSE.
*      discount = value /
*          ( 1 - ( me->discount-zzdesc / 100 ) ) *
*          ( 1 - ( me->discount-zzdescex / 100 ) ).
*    ENDIF.
*  ENDMETHOD.                    "set_discount
*
*  METHOD process01.
*    CLEAR value_cons.
*
*    CALL METHOD get_sales_values
*      CHANGING
*        value = value_cons.
*
*    value_cons = old_value + ( value_cons * clause-zzccx / 1200 ).
*    value_cons = set_discount( value_cons ).
*  ENDMETHOD.                                                "process01
*
*  METHOD process02.
*    CLEAR value_cons.
*
*    IF date(6) = last_day(6).
*      CALL METHOD get_sales_values
*        EXPORTING
*          periods      = 9
*          displacement = 3
*        CHANGING
*          value        = value_cons.
*
*      value_cons = old_value + ( value_cons * clause-zzccx / 900 ).
*    ELSE.
*      CALL METHOD get_sales_values
*        EXPORTING
*          periods      = 12
*          displacement = 3
*        CHANGING
*          value        = value_cons.
*
*      value_cons = old_value + ( value_cons * clause-zzccx / 1200 ).
*    ENDIF.
*
*    value_cons = set_discount( value_cons ).
*  ENDMETHOD.                                                "process02
*
*  METHOD process03.
*    DATA: lv_bneu     TYPE bneu.
*
*    CLEAR value_cons.
*
*    CALL METHOD get_sales_values
*      CHANGING
*        value = value_cons.
*
*    value_cons = ( value_cons * clause-zzccx / 1200 ).
*    value_cons = set_discount( value_cons ).
*
*    lv_bneu = ipc-banpass *  ( 1 + ( clause-zzccz / 100 ) ).
*
*    IF lv_bneu > value_cons.
*      value_cons = lv_bneu.
*    ENDIF.
*  ENDMETHOD.                                                "process03
*
*  METHOD process04.
*    CLEAR value_cons.
*
*    CALL METHOD get_sales_values
*      EXPORTING
*        type  = 1
*      CHANGING
*        value = value_cons.
*
*    value_cons = ( value_cons * clause-zzccx / 100 ).
*    value_cons = set_discount( value_cons ).
*  ENDMETHOD.                                                "process04
*
*  METHOD process05.
**    DATA: lv_value1      TYPE bneu,
**          lv_value2      TYPE bneu,
**          lv_coef        TYPE bneu,
**          lv_sales_value TYPE bneu,
**          lv_data        TYPE datum.
**
**    CLEAR value_cons.
**
**    CALL METHOD get_multi_sales_values
**      EXPORTING
**        first = 12
**        last  = 1
**      CHANGING
**        value = lv_value1.
**
**    CALL METHOD get_multi_sales_values
**      EXPORTING
**        first = 24
**        last  = 13
**      CHANGING
**        value = lv_value2.
**
**    IF lv_value1 > lv_value2.
**      value_cons = process02( ).
**    ELSE.
**      SELECT  SINGLE data
**        INTO  lv_data
**        FROM  z3acons
**       WHERE  data  < clause-data
**         AND  tpact = 'C'
**         AND  evt1  = 'X'.
**
**      IF sy-subrc IS INITIAL.
**      ELSE.
**      ENDIF.
**    ENDIF.
*  ENDMETHOD.                                                "process05
*
*  METHOD process06.
*    CLEAR value_cons.
*
*    CALL METHOD get_multi_sales_values
*      EXPORTING
*        first        = 12
*        last         = 1
*      CHANGING
*        period_value = value_cons.
*  ENDMETHOD.                                                "process06
*
*  METHOD process07.
**    DATA: lv_bkondalt    TYPE bkondalt.
**
**    CLEAR value_cons.
**
**    CALL METHOD get_multi_sales_values
**      EXPORTING
**        first        = 12
**        last         = 1
**      CHANGING
**        period_value = value_cons.
**
**    IF ipc-sfutanp <> '2'.
**      lv_bkondalt = ipc-bkondalt /
**                         ( ( 1 - ( discount-zzdesc / 100   ) ) *
**                           ( 1 - ( discount-zzdescex / 100 ) ) ).
**
**      ADD lv_bkondalt TO value_cons.
**    ELSE.
**      CLEAR value_cons.
**    ENDIF.
*  ENDMETHOD.                                                "process07
*
*  METHOD process08.
*  ENDMETHOD.                                                "process08
*
*  METHOD process09.
*    DATA lv_bneu    TYPE bneu.
*
*    CLEAR value_cons.
*
*    IF date(6) = last_day(6).
*      CALL METHOD get_sales_values
*        EXPORTING
*          periods      = 9
*          displacement = 3
*        CHANGING
*          value        = value_cons.
*
*      value_cons = old_value + ( value_cons * clause-zzccx / 900 ).
*    ELSE.
*      CALL METHOD get_sales_values
*        EXPORTING
*          periods      = 12
*          displacement = 3
*        CHANGING
*          value        = value_cons.
*
*      value_cons = old_value + ( value_cons * clause-zzccx / 1200 ).
*    ENDIF.
*
*    value_cons = set_discount( value_cons ).
*
*    lv_bneu = ipc-banpass *  ( 1 + ( clause-zzccz / 100 ) ).
*
*    IF lv_bneu > value_cons.
*      value_cons = lv_bneu.
*    ENDIF.
*  ENDMETHOD.                                                "process09
*ENDCLASS.                    "ccons_clauses IMPLEMENTATION
*
**----------------------------------------------------------------------
**
**       CLASS cre_contract DEFINITION
**----------------------------------------------------------------------
**
**
**----------------------------------------------------------------------
**
*CLASS cre_contract DEFINITION.
*  PUBLIC SECTION.
*    DATA: vimimv    TYPE vimimv,
*          vimi55    TYPE TABLE OF vimi55,
*          vzzkopo   TYPE TABLE OF vzzkopo.
*
*    METHODS constructor
*      IMPORTING
*        intreno     TYPE vvintreno.
*
*    METHODS definitive_index
*      IMPORTING
*        skoart      TYPE skoart
*        index_date  TYPE datum  OPTIONAL
*        dguelab     TYPE datum  OPTIONAL
*      CHANGING
*        ipc         TYPE indprz.
*
*    METHODS print
*      IMPORTING
*        no_open     TYPE char1     DEFAULT space
*        no_close    TYPE char1     DEFAULT space
*        r_date      TYPE table
*        r_skoart    TYPE table
*        r_sanpnr    TYPE table
*        new_spool   TYPE char1     DEFAULT 'X'
*        no_dialog   TYPE char1     DEFAULT ' '
*        printer     TYPE rspopname OPTIONAL
*        z3act_s     TYPE z3act_s
*        option      TYPE numc2
*        user        TYPE uname.
*
*    METHODS print_label
*      IMPORTING
*        type           TYPE char10
*        position       TYPE numc2   OPTIONAL
*      CHANGING
*        etiq_count     TYPE i       OPTIONAL
*        proc_label_pos TYPE char1   OPTIONAL.
*
*    METHODS get_other_data
*      CHANGING
*        bp000       TYPE bp000      OPTIONAL
*        bp030       TYPE bp030      OPTIONAL
*        adrc        TYPE adrc       OPTIONAL
*        sans1       TYPE sans1      OPTIONAL
*        vimi01      TYPE vimi01     OPTIONAL
*        tiv0a       TYPE tiv0a      OPTIONAL
*        viob01      TYPE viob01     OPTIONAL.
*
*    METHODS get_index_data
*      IMPORTING
*        vimi16      TYPE vimi16
*      CHANGING
*        index       TYPE z3indice_prov
*        vimi55      TYPE vimi55.
*
*    CLASS-METHODS check_first_vimi16
*      IMPORTING
*        bukrs       TYPE bukrs
*        smive       TYPE smive
*        swenr       TYPE swenr
*        smenr       TYPE smenr
*        skoart      TYPE skoart
*        dguelab     TYPE dguelab
*        danpass     TYPE danpass
*        sanpnr      TYPE sanpnr
*        xident      TYPE xident1
*        sfutanp     TYPE vvsfutanp
*      CHANGING
*        value(valid) TYPE char1.
*
*    CLASS-METHODS get_vimi16_data
*      IMPORTING
*        bukrs       TYPE bukrs
*        smive       TYPE smive
*        swenr       TYPE swenr
*        smenr       TYPE smenr
*        dguelab     TYPE dguelab   OPTIONAL
*        skoart      TYPE skoart    OPTIONAL
*        sanpnr      TYPE sanpnr    OPTIONAL
*        r_date      TYPE table     OPTIONAL
*        r_skoart    TYPE table     OPTIONAL
*        r_sanpnr    TYPE table     OPTIONAL
*      CHANGING
*        vimi16      TYPE vimi16.
*
*    CLASS-METHODS get_skopo_text
*      IMPORTING
*        skopo       TYPE vvskopo
*        rantyp      TYPE rantyp   DEFAULT '3'
*        skoart      TYPE skoart   DEFAULT '0010'
*      RETURNING
*        value(text) TYPE xkbez.
*
*    CLASS-METHODS get_definitive_index
*      IMPORTING
*        wbind       TYPE wbind
*        basjhr      TYPE basjhr
*        indjhr      TYPE indjhr
*        indmon      TYPE indmon
*      CHANGING
*        ipc         TYPE indprz.
*
*    CLASS-METHODS get_index
*      IMPORTING
*        wbind       TYPE wbind
*        basjhr      TYPE basjhr
*        indjhr      TYPE indjhr
*        indmon      TYPE indmon
*      CHANGING
*        ipc         TYPE indprz.
*ENDCLASS.                    "cre_contract DEFINITION
*
**----------------------------------------------------------------------
**
**       CLASS cre_contract IMPLEMENTATION
**----------------------------------------------------------------------
**
**
**----------------------------------------------------------------------
**
*CLASS cre_contract IMPLEMENTATION.
*  METHOD constructor.
*    SELECT  SINGLE *
*      INTO  me->vimimv
*      FROM  vimimv
*     WHERE  intreno = intreno.
*
*    IF sy-subrc IS INITIAL.
*      SELECT  *
*        INTO  TABLE me->vimi55
*        FROM  vimi55
*       WHERE  intreno  =  intreno
*       ORDER  BY dgabanrt DESCENDING.
*
*      SELECT  *
*        INTO  TABLE me->vzzkopo
*        FROM  vzzkopo
*       WHERE  bukrs    =  me->vimimv-bukrs
*         AND  sanlf    = '410'
*         AND  rkey1    =  me->vimimv-smive
*         AND  rkey2    =  me->vimimv-swenr
*         AND  rkey3    =  me->vimimv-smenr
*         AND  dguel_kk <= sy-datum
*       ORDER  BY dguel_kk DESCENDING.
*    ENDIF.
*  ENDMETHOD.                    "constructor
*
*  METHOD definitive_index.
*    DATA: ls_vimi55        TYPE vimi55,
*          lv_index_date    TYPE datum,
*          lv_daktiv        TYPE datum.
*
*    CLEAR ipc.
*
*    IF index_date IS INITIAL.
*      SELECT  dguelbi daktiv
*        INTO  (lv_index_date, lv_daktiv)
*        FROM  vimi16 UP TO 1 ROWS
*       WHERE  bukrs   =  vimimv-bukrs
*         AND  smive   =  vimimv-smive
*         AND  swenr   =  vimimv-swenr
*         AND  smenr   =  vimimv-smenr
*         AND  skoart  =  skoart
*         AND  sanpnr  =  '008'
*         AND  dguelab =  dguelab
*         AND  dstorno =  '00000000'
*       ORDER  BY daktiv  DESCENDING.
*      ENDSELECT.
*    ELSE.
*      lv_index_date = index_date.
*    ENDIF.
*
*    IF NOT lv_index_date IS INITIAL.
*      LOOP AT  vimi55
*         INTO  ls_vimi55
*        WHERE  dgabanrt <= lv_index_date
*          AND  skoart   =  skoart.
*        CALL METHOD get_definitive_index
*          EXPORTING
*            wbind  = ls_vimi55-sindart
*            basjhr = ls_vimi55-ybasisj
*            indjhr = lv_index_date(4)
*            indmon = lv_index_date+4(2)
*          CHANGING
*            ipc    = ipc.
*
*        EXIT.
*      ENDLOOP.
*    ENDIF.
*  ENDMETHOD.                    "definitive_index
*
*  METHOD print.
*    DATA: ls_out_options     TYPE ssfcompop,
*          lv_function_name   TYPE rs38l_fnam,
*          lv_ctrl_parm       TYPE ssfctrlop,
*          lv_count           TYPE i,
*          lv_ipc_def         TYPE indprz,
*          lv_email           TYPE ad_smtpadr,
*          lv_current_value   TYPE bneu,
*          lv_no_open1        TYPE char1,
*          lv_no_open2        TYPE char1,
*          lv_no_close1       TYPE char1,
*          lv_no_close2       TYPE char1,
*          lv_last_dguelab    TYPE dguelab,
*          lv_last_value      TYPE z3remb,
*          lv_percent         TYPE z3perc,
** AR01 <<<
**          lv_last_year       TYPE char1,
**          lv_this_year       TYPE char1,
*          lv_last_year       TYPE char2,
*          lv_this_year       TYPE char2,
** AR01 >>>
*          lv_data            TYPE datum,
*          lv_ipc_value       TYPE bneu,
*          lv_ipc_index       TYPE indprz.
*
*    DATA: ls_viob01          TYPE viob01,
*          ls_vimi01          TYPE vimi01,
*          ls_vimi16          TYPE vimi16,
*          ls_vimi16_last     TYPE vimi16,
*          ls_vimi55          TYPE vimi55,
*          ls_adrc            TYPE adrc,
*          ls_sans1           TYPE sans1,
*          ls_tiv0a           TYPE tiv0a,
*          ls_bp000           TYPE bp000,
*          ls_bp030           TYPE bp030,
*          ls_z3indice_prov   TYPE z3indice_prov,
*          lo_user            TYPE REF TO cuser,
*          lo_cc              TYPE REF TO ccons_clauses.
*
*    CALL METHOD get_other_data
*      CHANGING
*        bp000  = ls_bp000
*        bp030  = ls_bp030
*        adrc   = ls_adrc
*        sans1  = ls_sans1
*        vimi01 = ls_vimi01
*        tiv0a  = ls_tiv0a
*        viob01 = ls_viob01.
*
*    CALL METHOD get_vimi16_data
*      EXPORTING
*        bukrs    = vimimv-bukrs
*        smive    = vimimv-smive
*        swenr    = vimimv-swenr
*        smenr    = vimimv-smenr
*        r_skoart = r_skoart
*        r_date   = r_date
*        r_sanpnr = r_sanpnr
*      CHANGING
*        vimi16   = ls_vimi16.
*
*    CALL METHOD get_index_data
*      EXPORTING
*        vimi16 = ls_vimi16
*      CHANGING
*        index  = ls_z3indice_prov
*        vimi55 = ls_vimi55.
*
*    CREATE OBJECT lo_user
*      EXPORTING
*        user = user.
*
*    lv_email = lo_user->adr6-smtp_addr.
*
*    CALL METHOD definitive_index
*      EXPORTING
*        skoart     = ls_vimi16-skoart
*        index_date = ls_vimi16-dguelbi
*        dguelab    = ls_vimi16-dguelab
*      CHANGING
*        ipc        = lv_ipc_def.
*
*    IF ( ls_vimi16-skopo = '30' AND ls_vimi16-skoart = '0010' ) OR
*ls_vimi16-sanpnr = '010'.
*      IF no_open IS INITIAL.
*        lv_no_open1 = space.
*        lv_no_open2 = 'X'.
*      ELSE.
*        lv_no_open1 = lv_no_open2 = 'X'.
*      ENDIF.
*
*      IF no_close IS INITIAL.
*        lv_no_close1 = 'X'.
*        lv_no_close2 = space.
*      ELSE.
*        lv_no_close1 = lv_no_close2 = 'X'.
*      ENDIF.
*    ELSE.
*      lv_no_open1 = no_open.
*      lv_no_close1 = no_close.
*    ENDIF.
*
*    ls_out_options-tdnewid  = new_spool.
*    ls_out_options-tddelete = 'X'.
*    ls_out_options-tdtitle  = 'Cartas de actualização'.
*    ls_out_options-tddest   = printer.
*
*    lv_ctrl_parm-no_dialog = no_dialog.
*    lv_ctrl_parm-no_open   = lv_no_open1.
*    lv_ctrl_parm-no_close  = lv_no_close1.
*
*    CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
*         EXPORTING
*              formname           = 'Z3_ACT_MOD'
*         IMPORTING
*              fm_name            = lv_function_name
*         EXCEPTIONS
*              no_form            = 1
*              no_function_module = 2
*              OTHERS             = 3.
*
*    CALL FUNCTION lv_function_name
*         EXPORTING
*              control_parameters = lv_ctrl_parm
*              output_options     = ls_out_options
*              user_settings      = space
*              vimimv             = vimimv
*              viob01             = ls_viob01
*              vimi01             = ls_vimi01
*              vimi16             = ls_vimi16
*              vimi55             = ls_vimi55
*              contact_email      = lv_email
*              contact_adcp       = lo_user->adcp
*              contact_adrp       = lo_user->adrp
*              adrc               = ls_adrc
*              sans1              = ls_sans1
*              z3act_s            = z3act_s
*              tiv0a              = ls_tiv0a
*              bp000              = ls_bp000
*              bp030              = ls_bp030
*              z3indice_prov      = ls_z3indice_prov
*              option             = option
*              indice_final       = lv_ipc_def
*         EXCEPTIONS
*              formatting_error   = 1
*              internal_error     = 2
*              send_error         = 3
*              user_canceled      = 4
*              OTHERS             = 5.
*
*    IF ( ls_vimi16-skopo = '30' AND ls_vimi16-skoart = '0010' ) OR
*ls_vimi16-sanpnr = '010'.
*      SELECT  dguel zzvalue
*        INTO (lv_last_dguelab, lv_last_value)
*        FROM  z3dsc UP TO 1 ROWS
*       WHERE  bukrs   = vimimv-bukrs
*         AND  intreno = vimimv-intreno
*         AND  dguel   < ls_vimi16-dguelab
*       ORDER  BY dguel DESCENDING.
*      ENDSELECT.
*
*      CALL METHOD get_vimi16_data
*        EXPORTING
*          bukrs   = vimimv-bukrs
*          smive   = vimimv-smive
*          swenr   = vimimv-swenr
*          smenr   = vimimv-smenr
*          skoart  = ls_vimi16-skoart
*          sanpnr  = '008'
*          dguelab = ls_vimi16-dguelab
*        CHANGING
*          vimi16  = ls_vimi16_last.
*
*      LOOP AT  vimi55
*         INTO  ls_vimi55
*        WHERE  dgabanrt <= ls_vimi16_last-dguelbi
*          AND  skoart   =  ls_vimi16_last-skoart.
*        CALL METHOD get_definitive_index
*          EXPORTING
*            wbind  = ls_vimi55-sindart
*            basjhr = ls_vimi55-ybasisj
*            indjhr = ls_vimi16_last-dguelbi(4)
*            indmon = ls_vimi16_last-dguelbi+4(2)
*          CHANGING
*            ipc    = lv_ipc_index.
*
*        lv_ipc_value = ls_vimi16_last-bkondalt * ( ( lv_ipc_index / 100
*) + 1 ).
*        EXIT.
*      ENDLOOP.
*
*      SELECT  perc data
*        INTO  (lv_percent, lv_data)
*        FROM  z3peq UP TO 1 ROWS
*       WHERE  intreno =  vimimv-intreno
*         AND  data    <= ls_vimi16-dguelab
*         AND  tpven   =  '01'
*       ORDER  BY data DESCENDING.
*      ENDSELECT.
*
*      IF ls_vimi16-dguelab(4) <> vimimv-dmibeg(4).
*        lv_this_year = ls_vimi16-dguelab(4) - vimimv-dmibeg(4) + 1.
*        lv_last_year = lv_this_year - 1.
*      ENDIF.
*
*      CREATE OBJECT lo_cc
*        EXPORTING
*          intreno = vimimv-intreno
*          year    = ls_vimi16-dguelab(4)
*          month   = ls_vimi16-dguelab+4(2).
*
*      lv_current_value = lo_cc->get_cons_value( ).
*
*      CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
*           EXPORTING
*                formname           = 'Z3_ACT_MOD_DETAILS'
*           IMPORTING
*                fm_name            = lv_function_name
*           EXCEPTIONS
*                no_form            = 1
*                no_function_module = 2
*                OTHERS             = 3.
*
*      lv_ctrl_parm-no_open   = lv_no_open2.
*      lv_ctrl_parm-no_close  = lv_no_close2.
*
*      CALL FUNCTION lv_function_name
*           EXPORTING
*                control_parameters = lv_ctrl_parm
*                output_options     = ls_out_options
*                user_settings      = space
*                values             = lo_cc->sales
*                dguelab            = ls_vimi16-dguelab
*                dmibeg             = vimimv-dmibeg
*                percent            = lv_percent
*                last_dguelab       = lv_last_dguelab
*                last_value         = lv_last_value
*                this_year          = lv_this_year
*                last_year          = lv_last_year
*                first_period       = lo_cc->first_sales_period
*                last_period        = lo_cc->last_sales_period
*                total_values       = lo_cc->total_sales
*                current_value      = ls_vimi16-banpass
*                name1              = ls_bp000-name1
*                name2              = ls_bp000-name2
*                ipc_value          = lv_ipc_value
*                ipc_index          = lv_ipc_index
*           EXCEPTIONS
*                formatting_error   = 1
*                internal_error     = 2
*                send_error         = 3
*                user_canceled      = 4
*                OTHERS             = 5.
*    ENDIF.
*  ENDMETHOD.                    "print
*
*  METHOD print_label.
*    DATA: ls_itcpo          TYPE itcpo.
*
*    CASE type.
*      WHEN 'START'.
*        CLEAR ls_itcpo.
*        ls_itcpo-tdnewid = 'X'.
*
*        CALL FUNCTION 'OPEN_FORM'
*             EXPORTING
*                  device       = 'PRINTER'
*                  form         = 'Z3_ACT_MODLABEL'
*                  language     = 'P'
*                  options      = ls_itcpo
*             EXCEPTIONS
*                  canceled     = 1
*                  device       = 2
*                  form         = 3
*                  options      = 4
*                  unclosed     = 5
*                  mail_options = 6
*                  OTHERS       = 7.
*
*        IF sy-subrc EQ 4.
*          MESSAGE i018(z3) WITH 'Z3_ACT_MODLABEL'.
*        ENDIF.
*
*        CALL FUNCTION 'START_FORM'
*             EXPORTING
*                  form      = 'Z3_ACT_MODLABEL'
*                  startpage = 'FIRST'
*             EXCEPTIONS
*                  form      = 1
*                  format    = 2
*                  unended   = 3
*                  unopened  = 4
*                  unused    = 5.
*      WHEN 'BODY'.
*
*        IF etiq_count EQ 51.
*          etiq_count = 0.
*          CALL FUNCTION 'END_FORM'.
*          CALL FUNCTION 'START_FORM'
*               EXPORTING
*                    form      = 'Z3_ACT_MODLABEL'
*                    startpage = 'FIRST'
*               EXCEPTIONS
*                    form      = 1
*                    format    = 2
*                    unended   = 3
*                    unopened  = 4
*                    unused    = 5.
*        ENDIF.
*
*        IF proc_label_pos IS INITIAL.
*          proc_label_pos = 'X'.
*          IF position GT 0.
*            DO position TIMES.
*              ADD 1 TO etiq_count.
*              CALL FUNCTION 'WRITE_FORM'
*                   EXPORTING
*                        window  = 'MAIN'
*                        element = 'NEWWINDOW'
*                   EXCEPTIONS
*                        window  = 1.
*            ENDDO.
*          ENDIF.
*        ENDIF.
*        CALL FUNCTION 'WRITE_FORM'
*             EXPORTING
*                  window  = 'MAIN'
*                  element = 'LABEL'
*             EXCEPTIONS
*                  window  = 1.
*        CALL FUNCTION 'WRITE_FORM'
*             EXPORTING
*                  window  = 'MAIN'
*                  element = 'NEWWINDOW'
*             EXCEPTIONS
*                  window  = 1.
*
*        ADD 1 TO etiq_count.
*
*        IF etiq_count EQ 51.
*          etiq_count = 0.
*          CALL FUNCTION 'END_FORM'.
*          CALL FUNCTION 'START_FORM'
*               EXPORTING
*                    form      = 'Z3_ACT_MODLABEL'
*                    startpage = 'FIRST'
*               EXCEPTIONS
*                    form      = 1
*                    format    = 2
*                    unended   = 3
*                    unopened  = 4
*                    unused    = 5.
*        ENDIF.
*
*        CALL FUNCTION 'WRITE_FORM'
*             EXPORTING
*                  window  = 'MAIN'
*                  element = 'LABEL'
*             EXCEPTIONS
*                  window  = 1.
*        CALL FUNCTION 'WRITE_FORM'
*             EXPORTING
*                  window  = 'MAIN'
*                  element = 'NEWWINDOW'
*             EXCEPTIONS
*                  window  = 1.
*
*        ADD 1 TO etiq_count.
*      WHEN 'END'.
*        CALL FUNCTION 'END_FORM'.
*        CALL FUNCTION 'CLOSE_FORM'
*             EXCEPTIONS
*                  unopened = 1.
*    ENDCASE.
*  ENDMETHOD.                    "print_label
*
*  METHOD get_other_data.
*    DATA: t001   TYPE t001.
*
*    CLEAR t001.
*    SELECT  SINGLE *
*      INTO  t001
*      FROM  t001
*     WHERE  bukrs = vimimv-bukrs.
*
** Nome e Morada do Parceiro
*    CLEAR bp000.
*    SELECT  SINGLE *
*      INTO  bp000
*      FROM  bp000
*     WHERE  customer = vimimv-kunnr.
*
*    CLEAR bp030.
*    SELECT  SINGLE *
*      INTO  bp030
*      FROM  bp030
*     WHERE  partnr    = bp000-partnr
*       AND  adr_ref_k = bp000-adr_ref.
*
*    CLEAR sans1.
*    SELECT  SINGLE *
*      INTO  sans1
*      FROM  sans1
*     WHERE  adrnr = bp030-adrnr.
*
** Nome e Morada da Empresa
*    CLEAR adrc.
*    SELECT  SINGLE *
*      INTO  adrc
*      FROM  adrc
*     WHERE  addrnumber = t001-adrnr
*       AND  date_from <= sy-datum
*       AND  date_to > sy-datum.
*
** Nome da Unidade Economica
*    CLEAR viob01.
*    SELECT  SINGLE *
*      INTO  viob01
*      FROM  viob01
*     WHERE  bukrs = vimimv-bukrs
*       AND  swenr = vimimv-swenr.
*
** Tipo de Loja
*    CLEAR vimi01.
*    SELECT  SINGLE *
*      INTO  vimi01
*      FROM  vimi01
*     WHERE  bukrs = vimimv-bukrs
*       AND  swenr = vimimv-swenr
*       AND  smenr = vimimv-smenr.
*
*    CLEAR tiv0a.
*    SELECT  SINGLE *
*      INTO  tiv0a
*      FROM  tiv0a
*     WHERE  spras = sy-langu
*       AND  snunr = vimi01-snunr.
*  ENDMETHOD.                    "get_other_data
*
*  METHOD get_index_data.
*    DATA: lv_date  TYPE datum.
*
*    SELECT  *
*      INTO  vimi55
*      FROM  vimi55 UP TO 1 ROWS
*     WHERE  intreno  =  vimimv-intreno
*       AND  skoart   =  vimi16-skoart
*       AND  dgabanrt <= vimi16-dguelab
*     ORDER  BY dgabanrt DESCENDING.
*
*      lv_date = cdate=>subtract_months( date = vimi16-dguelab months =
*vimi55-manpverz ).
*
*      SELECT  SINGLE *
*        INTO  index
*        FROM  z3indice_prov
*       WHERE  wbind  = vimi55-sindart
*         AND  basjhr = vimi55-ybasisj
*         AND  indjhr = lv_date(4)
*         AND  indmon = lv_date+4(2).
*    ENDSELECT.
*  ENDMETHOD.                    "get_index_data
*
*  METHOD check_first_vimi16.
*    DATA: ls_vimi16   TYPE vimi16.
*
*    CLEAR valid.
*
*    IF sfutanp = '2'.
*      CLEAR ls_vimi16.
*      SELECT SINGLE * FROM  vimi16
*       INTO  ls_vimi16
*       WHERE  bukrs   = bukrs
*         AND  smive   = smive
*         AND  swenr   = swenr
*         AND  smenr   = smenr
*         AND  danpass = danpass
*         AND  sanpnr  = sanpnr
*         AND  xident  = xident
*         AND  dstorno = '00000000'
*         AND  sfutanp = '1'.
*
*      IF ls_vimi16-skoart NE skoart.
*        valid = 'X'.
*      ENDIF.
*    ELSE.
*      valid = 'X'.
*    ENDIF.
*  ENDMETHOD.                    "check_first_vimi16
*
*  METHOD get_vimi16_data.
*    DATA: lr_skoart     TYPE RANGE OF skoart,
*          lr_sanpnr     TYPE RANGE OF sanpnr,
*          lr_dguelab    TYPE RANGE OF dguelab.
*
*    IF NOT skoart IS INITIAL.
*      CALL METHOD crange=>add
*        EXPORTING
*          low   = skoart
*          clear = 'X'
*        CHANGING
*          range = lr_skoart.
*    ELSE.
*      lr_skoart = r_skoart.
*    ENDIF.
*
*    IF NOT sanpnr IS INITIAL.
*      CALL METHOD crange=>add
*        EXPORTING
*          low   = sanpnr
*          clear = 'X'
*        CHANGING
*          range = lr_sanpnr.
*    ELSE.
*      lr_sanpnr = r_sanpnr.
*    ENDIF.
*
*    IF NOT dguelab IS INITIAL.
*      CALL METHOD crange=>add
*        EXPORTING
*          low   = dguelab
*          clear = 'X'
*        CHANGING
*          range = lr_dguelab.
*    ELSE.
*      lr_dguelab = r_date.
*    ENDIF.
*
*    CLEAR vimi16.
*    SELECT  *
*      INTO  vimi16
*      FROM  vimi16 UP TO 1 ROWS
*     WHERE  bukrs   =  bukrs
*       AND  smive   =  smive
*       AND  swenr   =  swenr
*       AND  smenr   =  smenr
*       AND  skoart  IN lr_skoart
*       AND  sanpnr  IN lr_sanpnr
*       AND  dguelab IN lr_dguelab
*       AND  dstorno =  '00000000'
*     ORDER  BY daktiv DESCENDING sanpnr DESCENDING.
*    ENDSELECT.
*  ENDMETHOD.                    "get_vimi16_data
*
*  METHOD get_skopo_text.
*    CLEAR text.
*    SELECT  SINGLE xkbez
*      INTO  text
*      FROM  tzk0g
*     WHERE  spras  = sy-langu
*       AND  rantyp = rantyp
*       AND  skoart = skoart
*       AND  skopo  = skopo.
*  ENDMETHOD.                    "get_skopo_text
*
*  METHOD get_definitive_index.
*    DATA: lv_ipc        TYPE indprz.
*
*    CLEAR ipc.
*
*    SELECT  SINGLE indlast
*      INTO  lv_ipc
*      FROM  z3indice_prov
*     WHERE  wbind  = wbind
*       AND  basjhr = basjhr
*       AND  indjhr = indjhr
*       AND  indmon = indmon.
*
*    IF NOT lv_ipc IS INITIAL OR NOT sy-subrc IS INITIAL.
*      CALL METHOD get_index
*        EXPORTING
*          wbind  = wbind
*          basjhr = basjhr
*          indjhr = indjhr
*          indmon = indmon
*        CHANGING
*          ipc    = ipc.
*    ENDIF.
*  ENDMETHOD.                    "get_definitive_index
*
*  METHOD get_index.
*    DATA: lv_last_year   TYPE indjhr,
*          lv_ipc1        TYPE indprz,
*          lv_ipc2        TYPE indprz.
*
*    CLEAR ipc.
*
*    lv_last_year = indjhr - 1.
*
*    CLEAR lv_ipc2.
*    SELECT  indproz
*      INTO  lv_ipc2
*      FROM  t094p UP TO 1 ROWS
*     WHERE  wbind  = wbind
*       AND  basjhr = basjhr
*       AND  indjhr = indjhr
*       AND  indmon = indmon.
*    ENDSELECT.
*
*    CLEAR lv_ipc1.
*    SELECT  indproz
*      INTO  lv_ipc1
*      FROM  t094p UP TO 1 ROWS
*     WHERE  wbind  = wbind
*       AND  basjhr = basjhr
*       AND  indjhr = lv_last_year
*       AND  indmon = indmon.
*      ipc =  ( ( lv_ipc2 / lv_ipc1 ) - 1 ) * 100.
*    ENDSELECT.
*  ENDMETHOD.                    "get_index
*ENDCLASS.                    "cre_contract IMPLEMENTATION

*----------------------------------------------------------------------*
*   INCLUDE Z3DDR002F01                                                *
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Form  selecciona_dados
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM selecciona_dados.
* Selecciona última data de processamento
  SELECT MAX( pdate ) FROM zcondsnapshots
                      INTO x_date.

* toDo Caso a data de referência seja menor que ultima data de
* processamento é necessário recalcular o snapshot do contrato?
* Caso contrário processa a última data de processamento e a data de
* referência que tem que ser maior ou igual à ultima data de
* processamento

* 01 ***
* Se data de referência = última data de processamento => é directo
  IF p_date EQ x_date.
* Selecciona snapshots da data de Referência
    SELECT * FROM zcondsnapshots INTO TABLE t_zcondsnapshots
                                WHERE pdate EQ x_date.

* Selecciona última data anterior à data de referência
    SELECT MAX( pdate ) FROM zcondsnapshots
                        INTO x_date
                       WHERE pdate LE x_date.

* Selecciona snapshots da última data anterior à data de
* referência
    SELECT * FROM zcondsnapshots INTO TABLE t_zcondsnapshots_old
                                      WHERE pdate EQ x_date.

* Se data de referência > última data de processamento =>
* guarda dados de último snapshot e guarda contratos activos à data de
* referência

* 02 ***
  ELSEIF p_date GT x_date.
    CLEAR w_zcondsnapshots.

* Selecciona snapshots da última data anterior à data de
* referência
    SELECT * FROM zcondsnapshots INTO TABLE t_zcondsnapshots_old
                                      WHERE pdate EQ x_date.

* Contractos Activos à Data
    SELECT * FROM vimimv INTO TABLE t_vimimv
                              WHERE ( dkuezu EQ '00000000' OR
                                      dkuezu GT p_date )
                                AND dmiend GT p_date
** toDo Verificar se as condições têm que ser superiores à data DERF
*                                AND derf GE x_date
                                AND derf LT p_date.

    LOOP AT t_vimimv INTO w_vimimv.
* Condições de Aluguer de Contrato
      SELECT * FROM vzzkopo INTO w_vzzkopo
                           WHERE bukrs    EQ w_vimimv-bukrs
                             AND sanlf    EQ '410'
                             AND rkey1    EQ w_vimimv-smive
                             AND skoart   IN r_skoart
                        ORDER BY BUKRS rkey1 SKOART ascending
                                 dguel_kp DESCENDING.

        MOVE p_date                  TO w_zcondsnapshots-pdate.
        MOVE w_vimimv-intreno        TO w_zcondsnapshots-intreno.
        MOVE-CORRESPONDING w_vzzkopo TO w_zcondsnapshots.

        APPEND w_zcondsnapshots TO t_zcondsnapshots.

      ENDSELECT.

* t_zcondsnapshots_old contém contratos do último processamento e
* t_zcondsanpshots contém contratos activos na data de referência
    ENDLOOP.

* 03 ***
  ELSEIF p_date LT x_date.
* Selecciona última data de processamento anterior à data de
* referência
    SELECT MAX( pdate ) FROM zcondsnapshots
                        INTO x_date
                       WHERE pdate LE p_date.

    IF p_date EQ x_date.
* Selecciona snapshots dessa data
      SELECT * FROM zcondsnapshots INTO TABLE t_zcondsnapshots
                                  WHERE pdate EQ x_date.

* Selecciona última data anterior à data de referência
      SELECT MAX( pdate ) FROM zcondsnapshots
                          INTO x_date
                         WHERE pdate LE x_date.

* Selecciona snapshots dessa data
      SELECT * FROM zcondsnapshots INTO TABLE t_zcondsnapshots_old
                                        WHERE pdate EQ x_date.
    ELSE.
* Selecciona snapshots da última data anterior à data de
* referência
      SELECT * FROM zcondsnapshots INTO TABLE t_zcondsnapshots_old
                                        WHERE pdate EQ x_date.

* Contractos Activos à Data
      SELECT * FROM vimimv INTO TABLE t_vimimv
                                WHERE ( dkuezu EQ '00000000' OR
                                        dkuezu GT p_date )
                                  AND dmiend GT p_date
* toDo Verificar se as condições têm que ser superiores à data DERF
                                  AND derf GE x_date
                                  AND derf LT p_date.

      LOOP AT t_vimimv INTO w_vimimv.
* Condições de Aluguer de Contrato
        SELECT * FROM vzzkopo INTO w_vzzkopo
                             WHERE bukrs    EQ w_vimimv-bukrs
                               AND sanlf    EQ '410'
                               AND rkey1    EQ w_vimimv-smive
                               AND skoart   IN r_skoart
                          ORDER BY BUKRS rkey1 SKOART ascending
                                   dguel_kp DESCENDING.

          MOVE p_date                  TO w_zcondsnapshots-pdate.
          MOVE w_vimimv-intreno        TO w_zcondsnapshots-intreno.
          MOVE-CORRESPONDING w_vzzkopo TO w_zcondsnapshots.

          APPEND w_zcondsnapshots TO t_zcondsnapshots.

        ENDSELECT.

* toDo Rollback das condições do contrato?

* t_zcondsnapshots_old contém contratos do último processamento e
* t_zcondsnapshots contém contratos activos na data de referência
      ENDLOOP.

    ENDIF.
  ENDIF.
ENDFORM.                    " selecciona_dados
*&---------------------------------------------------------------------*
*&      Form  calcula_facturacao
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_T_ZCONDSNAPSHOTS_OLD  text
*----------------------------------------------------------------------*
FORM calcula_facturacao USING p_t_zcondsnapshots LIKE t_zcondsnapshots.

  REFRESH: t_conds[],
           t_conds_to_charge[],
           t_cond_monthly_value[].

  LOOP AT p_t_zcondsnapshots INTO w_zcondsnapshots.

    AT NEW intreno.
* Para cada contrato cria tabela de condições e valores mensais
      READ TABLE t_vimimv INTO w_vimimv
                      WITH KEY intreno = w_zcondsnapshots-intreno.

      IF sy-subrc EQ 0.
        CLEAR: x_monat,
               x_gjahr.

        MOVE w_vimimv-dmibeg+4(2) TO x_monat.
        MOVE w_vimimv-dmibeg(4)   TO x_gjahr.


        SELECT SINGLE * FROM vikoko
                        INTO w_vikoko
                       WHERE bukrs EQ w_vimimv-bukrs
                         AND sanlf EQ '410'
                         AND rkey1 EQ w_vimimv-smive.

        IF sy-subrc NE 0.
          CLEAR w_vikoko.
        ENDIF.

* Registos Mensais por Condição (Tantos quantos os meses em que estão
* activos os contratos).
        DO.
          IF x_monat EQ '13'.
            MOVE '01' TO x_monat.
            ADD 1 TO x_gjahr.
          ENDIF.

          CONCATENATE x_gjahr x_monat '01' INTO x_date.

          CALL FUNCTION 'LAST_DAY_OF_MONTHS'
               EXPORTING
                    day_in            = x_date
               IMPORTING
                    last_day_of_month = x_date
               EXCEPTIONS
                    day_in_no_date    = 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.


          MOVE w_vimimv-intreno        TO w_cond_monthly_value-intreno.
          MOVE w_zcondsnapshots-skoart TO w_cond_monthly_value-skoart.
          MOVE x_monat                 TO w_cond_monthly_value-monat.
          MOVE x_gjahr                 TO w_cond_monthly_value-gjahr.

* Método de Cálculo
          MOVE w_vikoko-szbmeth TO w_cond_monthly_value-szbmeth.

          APPEND w_cond_monthly_value TO t_cond_monthly_value.

          IF x_monat GT w_vimimv-dmiend+4(2) AND
             x_gjahr GT w_vimimv-dmiend(4).

            EXIT.
          ELSE.
            ADD 1 TO x_monat.
          ENDIF.
        ENDDO.
      ELSE.
        CLEAR w_vimimv.
        CONTINUE.
      ENDIF.
    ENDAT.

    IF w_zcondsnapshots-dguel_kp LT p_date.
* Passado
      APPEND w_conds TO t_conds.
    ELSE.
* Futuro
      APPEND w_conds TO t_conds_to_charge.
    ENDIF.
  ENDLOOP.

* Cálculo de condições (Futuro)
  LOOP AT t_conds_to_charge INTO w_conds.

    IF sy-index EQ '1'.
      MOVE w_conds-intreno  TO last_intreno.
      MOVE w_conds-skoart   TO last_skoart.
      MOVE w_conds-dguel_kp TO last_dguel_kp.
      CONTINUE.
    ENDIF.

* Calcula os valores das condições para cada mês (Futuro)
    LOOP AT t_cond_monthly_value
       INTO w_cond_monthly_value
      WHERE skoart EQ w_conds-skoart
        AND ( gjahr GE last_dguel_kp(4) AND
              gjahr LE w_conds-dguel_kp(4) )
        AND ( monat GE last_dguel_kp+4(2) AND
              monat LE w_conds-dguel_kp+4(2) ).

* Condição de Inicio
      AT FIRST.
        IF w_conds-dguel_kp+6(2) NE '01'.

          IF w_cond_monthly_value-szbmeth EQ '1'.
            MOVE '30' TO w_cond_monthly_value-max_days.
          ENDIF.
* Período Parcial
         x_days = w_cond_monthly_value-max_days - w_conds-dguel_kp+6(2).
          w_cond_monthly_value-bkond = w_cond_monthly_value-bkond +
                                     ( w_conds-bkond * x_days ) /
                                       w_cond_monthly_value-max_days.
        ELSE.
* Período Completo
          w_cond_monthly_value-bkond = w_conds-bkond.
        ENDIF.
      ENDAT.

      w_cond_monthly_value-bkond = w_conds-bkond.

* Condição de Fim
      AT LAST.
        IF w_conds-dguel_kp+6(2) NE w_cond_monthly_value-max_days.

          IF w_cond_monthly_value-szbmeth EQ '1'.
            MOVE '30' TO w_cond_monthly_value-max_days.
          ENDIF.

* Período Parcial
          w_cond_monthly_value-bkond = ( w_conds-bkond *
                                         w_conds-dguel_kp+6(2) ) /
                                       w_cond_monthly_value-max_days.
        ELSE.
* Período Completo
          w_cond_monthly_value-bkond = w_conds-bkond.
        ENDIF.
      ENDAT.

      MODIFY t_cond_monthly_value FROM w_cond_monthly_value
                                 INDEX sy-tabix.

*toDo Sobreposição de cálculo de condições no mesmo período
    ENDLOOP.

    MOVE w_conds-intreno  TO last_intreno.
    MOVE w_conds-skoart   TO last_skoart.
    MOVE w_conds-dguel_kp TO last_dguel_kp.
  ENDLOOP.
ENDFORM.                    " calcula_facturacao
*&---------------------------------------------------------------------*
*&      Form  prepara_dados
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM prepara_dados.
  LOOP AT t_cond_monthly_value INTO w_cond_monthly_value.
    AT NEW intreno.
      READ TABLE t_vimimv INTO w_vimimv
                      WITH KEY intreno = w_cond_monthly_value-intreno.

      IF sy-subrc EQ 0.
        MOVE-CORRESPONDING w_vimimv TO w_total.
      ELSE.
        CLEAR w_vimimv.
      ENDIF.
    ENDAT.

    ADD w_cond_monthly_value-bkond TO w_total-bkond.

    AT END OF intreno.
*      SUM.
      MOVE x_date TO w_total-last_act.
      MOVE p_date TO w_total-p_date.

*  Cálculo do nº de meses até ao fim do contrato
      CALL FUNCTION 'MONTHS_BETWEEN_TWO_DATES_NEW'
           EXPORTING
                i_datum_bis       = w_vimimv-dmiend
                i_datum_von       = p_date
                i_kz_incl_bis     = ' '
                i_kz_volle_monate = 'X'
           IMPORTING
                e_monate          = x_months.

      SUBTRACT 1 FROM x_months.

      IF x_months GT max_months.
        MOVE x_months TO max_months.
      ENDIF.

      MOVE x_months TO w_total-monat.

      w_total-linear = w_total-bkond / w_total-monat.


      READ TABLE t_total_old INTO w_total_old
                        WITH KEY intreno = w_cond_monthly_value-intreno.

      IF sy-subrc EQ 0.
        MOVE w_total_old-bkond TO w_total-delta.
      ELSE.
        CLEAR w_total_old.
      ENDIF.

      w_total-control = w_total-bkond - w_total-delta.

      IF w_total-control EQ '0.00'.
        MOVE 'X' TO w_total-alt.
* Populate color variable with colour properties
* Char 1 = C (This is a color property)
* Char 2 = 3 (Color codes: 1 - 7)
* Char 3 = Intensified on/off ( 1 or 0 )
* Char 4 = Inverse display on/off ( 1 or 0 )
*           i.e. wa_ekko-line_color = 'C410'
        CONCATENATE 'C' '7' '10' INTO w_total-color.
      ELSE.
        CLEAR w_total-alt.
        CLEAR w_total-color.
      ENDIF.

      COLLECT w_total INTO t_total.
    ENDAT.
  ENDLOOP.
ENDFORM.                    " prepara_dados
*&---------------------------------------------------------------------*
*&      Form  constroi_fieldcatalog
*&---------------------------------------------------------------------*
FORM constroi_fieldcatalog.

  DATA: flds_count   TYPE i,
        cnt          TYPE i,
        x_datec(8)   TYPE c,
        x_date       LIKE sy-datum.

  ADD 1 TO flds_count.
  wa_it_fldcat-fieldname = 'BUKRS'.
  wa_it_fldcat-col_pos = flds_count.
  wa_it_fldcat-datatype = 'CHAR'.
  wa_it_fldcat-intlen = 4.
  wa_it_fldcat-outputlen = 4.
  APPEND wa_it_fldcat TO it_fldcat.

  PERFORM append_fieldcatalog USING 'BUKRS' '<dyn_table>' text-h00
                                      flds_count '' '' '' '' '' '' '' ''
                                      '' ''.

  ADD 1 TO flds_count.
  wa_it_fldcat-fieldname = 'SWENR'.
  wa_it_fldcat-col_pos = flds_count.
  wa_it_fldcat-datatype = 'CHAR'.
  wa_it_fldcat-intlen = 8.
  wa_it_fldcat-outputlen = 8.
  APPEND wa_it_fldcat TO it_fldcat.

  PERFORM append_fieldcatalog USING 'SWENR' '<dyn_table>' text-h01
                                      flds_count '' '' '' '' '' '' '' ''
                                      '' ''.

  ADD 1 TO flds_count.
  wa_it_fldcat-fieldname = 'SMIVE'.
  wa_it_fldcat-col_pos = flds_count.
  wa_it_fldcat-datatype = 'CHAR'.
  wa_it_fldcat-intlen = 13.
  wa_it_fldcat-outputlen = 13.
  APPEND wa_it_fldcat TO it_fldcat.

  PERFORM append_fieldcatalog USING 'SMIVE' '<dyn_table>' text-h02
                                      flds_count '' '' '' '' '' '' '' ''
                                      '' ''.

  ADD 1 TO flds_count.
  wa_it_fldcat-fieldname = 'SMENR'.
  wa_it_fldcat-col_pos = flds_count.
  wa_it_fldcat-datatype = 'CHAR'.
  wa_it_fldcat-intlen = 8.
  wa_it_fldcat-outputlen = 8.
  APPEND wa_it_fldcat TO it_fldcat.

  PERFORM append_fieldcatalog USING 'SMENR' '<dyn_table>' text-h03
                                      flds_count '' '' '' '' '' '' '' ''
                                      '' ''.

  ADD 1 TO flds_count.
  wa_it_fldcat-fieldname = 'ZZNMFAN'.
  wa_it_fldcat-col_pos = flds_count.
  wa_it_fldcat-datatype = 'CHAR'.
  wa_it_fldcat-intlen = 40.
  wa_it_fldcat-outputlen = 40.
  APPEND wa_it_fldcat TO it_fldcat.

  PERFORM append_fieldcatalog USING 'ZZNMFAN' '<dyn_table>' text-h04
                                     flds_count '' '' '' '' '' '' '' ''
                                      '' ''.

  ADD 1 TO flds_count.
  wa_it_fldcat-fieldname = 'ALT'.
  wa_it_fldcat-col_pos = flds_count.
  wa_it_fldcat-datatype = 'CHAR'.
  wa_it_fldcat-intlen = 3.
  wa_it_fldcat-outputlen = 3.
  APPEND wa_it_fldcat TO it_fldcat.

  PERFORM append_fieldcatalog USING 'ALT' '<dyn_table>' text-h05
                                      flds_count '' '' '' '' '' '' '' ''
                                      '' ''.
  ADD 1 TO flds_count.
  wa_it_fldcat-fieldname = 'DMIBEG'.
  wa_it_fldcat-col_pos = flds_count.
  wa_it_fldcat-datatype = 'DATS'.
  wa_it_fldcat-intlen = 8.
  wa_it_fldcat-outputlen = 8.
  APPEND wa_it_fldcat TO it_fldcat.

  PERFORM append_fieldcatalog USING 'DMIBEG' '<dyn_table>' text-h06
                                      flds_count '' '' '' '' '' '' '' ''
                                      '' ''.

  ADD 1 TO flds_count.
  wa_it_fldcat-fieldname = 'DMIEND'.
  wa_it_fldcat-col_pos = flds_count.
  wa_it_fldcat-datatype = 'DATS'.
  wa_it_fldcat-intlen = 8.
  wa_it_fldcat-outputlen = 8.
  APPEND wa_it_fldcat TO it_fldcat.

  PERFORM append_fieldcatalog USING 'DMIEND' '<dyn_table>' text-h07
                                      flds_count '' '' '' '' '' '' '' ''
                                      '' ''.

  ADD 1 TO flds_count.
  wa_it_fldcat-fieldname = 'DMIEND'.
  wa_it_fldcat-col_pos = flds_count.
  wa_it_fldcat-datatype = 'DATS'.
  wa_it_fldcat-intlen = 8.
  wa_it_fldcat-outputlen = 8.
  APPEND wa_it_fldcat TO it_fldcat.

  PERFORM append_fieldcatalog USING 'LAST_ACT' '<dyn_table>' text-h08
                                      flds_count '' '' '' '' '' '' '' ''
                                      '' ''.

  ADD 1 TO flds_count.
  wa_it_fldcat-fieldname = 'DMIEND'.
  wa_it_fldcat-col_pos = flds_count.
  wa_it_fldcat-datatype = 'DATS'.
  wa_it_fldcat-intlen = 8.
  wa_it_fldcat-outputlen = 8.
  APPEND wa_it_fldcat TO it_fldcat.

  PERFORM append_fieldcatalog USING 'P_DATE' '<dyn_table>' text-h09
                                      flds_count '' '' '' '' '' '' '' ''
                                      '' ''.

  ADD 1 TO flds_count.
  wa_it_fldcat-fieldname = 'BKOND'.
  wa_it_fldcat-col_pos = flds_count.
  wa_it_fldcat-currency = 'BRL'.
  wa_it_fldcat-datatype = 'CURR'.
  wa_it_fldcat-outputlen = 20.
  wa_it_fldcat-intlen = 15.
  APPEND wa_it_fldcat TO it_fldcat .

  PERFORM append_fieldcatalog USING 'BKOND' '<dyn_table>' text-h10
                                      flds_count '' '' '' '' '' '' '' ''
                                      '' ''.

  ADD 1 TO flds_count.
  wa_it_fldcat-fieldname = 'MONAT'.
  wa_it_fldcat-col_pos = flds_count.
  wa_it_fldcat-datatype = 'CHAR'.
  wa_it_fldcat-intlen = 16.
  wa_it_fldcat-outputlen = 16.
  APPEND wa_it_fldcat TO it_fldcat.

  PERFORM append_fieldcatalog USING 'MONAT' '<dyn_table>' text-h11
                                      flds_count '' '' '' '' '' '' '' ''
                                      '' ''.

  ADD 1 TO flds_count.
  wa_it_fldcat-fieldname = 'LINEAR'.
  wa_it_fldcat-col_pos = flds_count.
  wa_it_fldcat-currency = 'BRL'.
  wa_it_fldcat-datatype = 'CURR'.
  wa_it_fldcat-outputlen = 20.
  wa_it_fldcat-intlen = 15.
  APPEND wa_it_fldcat TO it_fldcat .

  PERFORM append_fieldcatalog USING 'LINEAR' '<dyn_table>' text-h12
                                     flds_count '' '' '' '' '' '' '' ''
                                      '' ''.

  ADD 1 TO flds_count.
  wa_it_fldcat-fieldname = 'DELTA'.
  wa_it_fldcat-col_pos = flds_count.
  wa_it_fldcat-currency = 'BRL'.
  wa_it_fldcat-datatype = 'CURR'.
  wa_it_fldcat-outputlen = 20.
  wa_it_fldcat-intlen = 15.
  APPEND wa_it_fldcat TO it_fldcat .

  PERFORM append_fieldcatalog USING 'DELTA' '<dyn_table>' text-h13
                                      flds_count '' '' '' '' '' '' '' ''
                                      '' ''.

  ADD 1 TO flds_count.
  wa_it_fldcat-fieldname = 'CONTROL'.
  wa_it_fldcat-col_pos = flds_count.
  wa_it_fldcat-currency = 'BRL'.
  wa_it_fldcat-datatype = 'CURR'.
  wa_it_fldcat-outputlen = 20.
  wa_it_fldcat-intlen = 15.
  APPEND wa_it_fldcat TO it_fldcat .

  PERFORM append_fieldcatalog USING 'CONTROL' '<dyn_table>' text-h14
                                      flds_count '' '' '' '' '' '' '' ''
                                      '' ''.

  ADD 1 TO flds_count.
  MOVE '01' TO p_date+6(2).
*** Dado de teste
  MOVE 2 TO max_months.
*** Dado de teste
  DO max_months TIMES.
    CLEAR wa_it_fldcat.


    CALL FUNCTION 'RE_ADD_MONTH_TO_DATE'
         EXPORTING
              months  = cnt
              olddate = p_date
         IMPORTING
              newdate = x_date.


    CONCATENATE x_date+4(2) '-' x_date(4) INTO x_mes_ano.
    WRITE x_mes_ano TO wa_it_fldcat-fieldname.


    wa_it_fldcat-col_pos = flds_count.
    wa_it_fldcat-currency = 'BRL'.
    wa_it_fldcat-datatype = 'CURR'.
    wa_it_fldcat-outputlen = 20.
    wa_it_fldcat-intlen = 15.
    APPEND wa_it_fldcat TO it_fldcat.

    PERFORM append_fieldcatalog USING wa_it_fldcat-fieldname
                                      '<dyn_table>' text-h14 flds_count
                                      '' '' '' '' '' '' ''
                                      '' '' ''.
    ADD 1 TO flds_count.
    ADD 1 TO cnt.
  ENDDO.

  CALL METHOD cl_alv_table_create=>create_dynamic_table
       EXPORTING
         it_fieldcatalog = it_fldcat
       IMPORTING
         ep_table        = new_table.

  ASSIGN new_table->* TO <dyn_table>.
ENDFORM.                    " append_fieldcatalog
*&---------------------------------------------------------------------*
*&      Form  append_fieldcatalog
*&---------------------------------------------------------------------*
FORM append_fieldcatalog USING i_fieldname       TYPE any
                                 i_tabname         TYPE any
                                 i_seltext_m       TYPE any
                                 i_col_pos         TYPE any
                                 i_ref_fieldname   TYPE any
                                 i_ref_tabname     TYPE any
                                 i_key             TYPE any
                                 i_text            TYPE any
                                 i_checkbox        TYPE any
                                 i_edit            TYPE any
                                 i_no_out          TYPE any
                                 i_hotspot         TYPE any
                                 i_sum             TYPE any
                                 i_inttype         TYPE any.

  CLEAR fieldcatalog.

  fieldcatalog-fieldname     = i_fieldname.
  fieldcatalog-tabname       = i_tabname.
  fieldcatalog-col_pos       = i_col_pos.
  fieldcatalog-seltext_m     = i_seltext_m.
  fieldcatalog-ref_fieldname = i_ref_fieldname.
  fieldcatalog-ref_tabname   = i_ref_tabname.
  fieldcatalog-key           = i_key.
  fieldcatalog-reptext_ddic  = i_text.
  fieldcatalog-checkbox      = i_checkbox.
  fieldcatalog-edit          = i_edit.
  fieldcatalog-no_out        = i_no_out.
  fieldcatalog-hotspot       = i_hotspot.
  fieldcatalog-do_sum        = i_sum.
  fieldcatalog-inttype       = i_inttype.

  APPEND fieldcatalog.
  CLEAR fieldcatalog.
ENDFORM.                    " append_fieldcatalog
*&---------------------------------------------------------------------*
*&      Form  alimenta_tabela_dyn
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM alimenta_tabela_dyn.

  DATA: x_bkond LIKE vzzkopo-bkond.

  LOOP AT t_total INTO w_total.

    CREATE DATA new_line LIKE LINE OF <dyn_table>.
    ASSIGN new_line->* TO <dyn_wa>.

    ASSIGN COMPONENT 'BUKRS' OF STRUCTURE <dyn_wa> TO <fs1>.
    <fs1> = w_total-bukrs.

    ASSIGN COMPONENT 'SWENR' OF STRUCTURE <dyn_wa> TO <fs1>.
    <fs1> = w_total-swenr.

    ASSIGN COMPONENT 'SMIVE' OF STRUCTURE <dyn_wa> TO <fs1>.
    <fs1> = w_total-smive.

    ASSIGN COMPONENT 'SMENR' OF STRUCTURE <dyn_wa> TO <fs1>.
    <fs1> = w_total-smenr.

    ASSIGN COMPONENT 'ZZNMFAN' OF STRUCTURE <dyn_wa> TO <fs1>.
    <fs1> = w_total-zznmfan.

    ASSIGN COMPONENT 'ALT' OF STRUCTURE <dyn_wa> TO <fs1>.
    <fs1> = w_total-alt.

    ASSIGN COMPONENT 'DMIBEG' OF STRUCTURE <dyn_wa> TO <fs1>.
    <fs1> = w_total-dmibeg.

    ASSIGN COMPONENT 'DMIEND' OF STRUCTURE <dyn_wa> TO <fs1>.
    <fs1> = w_total-dmiend.

    ASSIGN COMPONENT 'LAST_ACT' OF STRUCTURE <dyn_wa> TO <fs1>.
    <fs1> = w_total-last_act.

    ASSIGN COMPONENT 'P_DATE' OF STRUCTURE <dyn_wa> TO <fs1>.
    <fs1> = w_total-p_date.

    ASSIGN COMPONENT 'BKOND' OF STRUCTURE <dyn_wa> TO <fs1>.
    <fs1> = w_total-bkond.

    ASSIGN COMPONENT 'MONAT' OF STRUCTURE <dyn_wa> TO <fs1>.
    <fs1> = w_total-monat.

    ASSIGN COMPONENT 'LINEAR' OF STRUCTURE <dyn_wa> TO <fs1>.
    <fs1> = w_total-linear.

    ASSIGN COMPONENT 'DELTA' OF STRUCTURE <dyn_wa> TO <fs1>.
    <fs1> = w_total-delta.

    ASSIGN COMPONENT 'CONTROL' OF STRUCTURE <dyn_wa> TO <fs1>.
    <fs1> = w_total-control.

    ASSIGN COMPONENT 'COLOR' OF STRUCTURE <dyn_wa> TO <fs1>.
    <fs1> = w_total-color.

    SORT t_cond_monthly_value BY intreno monat gjahr.

    LOOP AT t_cond_monthly_value INTO w_cond_monthly_value
                                WHERE intreno EQ w_total-intreno
                                  AND monat   GE p_date+4(2)
                                  AND gjahr   GE p_date(4).

      x_bkond = x_bkond + w_cond_monthly_value-bkond.

      AT END OF intreno.
        CLEAR x_bkond.

        CONCATENATE w_cond_monthly_value-monat '/'
                    w_cond_monthly_value-gjahr INTO x_mes_ano.

        ASSIGN COMPONENT x_mes_ano OF STRUCTURE <dyn_wa> TO <fs1>.

        IF sy-subrc EQ 0.
          ADD x_bkond TO <fs1>.
        ENDIF.
      ENDAT.
    ENDLOOP.

    APPEND <dyn_wa> TO <dyn_table>.
  ENDLOOP.
ENDFORM.                    " alimenta_tabela_dyn
*&---------------------------------------------------------------------*
*&      Form  apresenta_alv
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM apresenta_alv.

  gd_layout-zebra             = 'X'.
  gd_layout-colwidth_optimize = 'X'.
* Set layout field for row attributes(i.e. color)
  gd_layout-info_fieldname    = 'COLOR'.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
       EXPORTING
            i_callback_program       = sy-repid
*            i_callback_pf_status_set = 'SET_STATUS'
*            i_callback_user_command  = 'F_USER_COMMAND'
            it_fieldcat              = fieldcatalog[]
            is_layout                = gd_layout
*            it_events               = t_alv_event[]
*            i_grid_title             = w_titulo
*            i_default                = 'X'
            i_save                   = 'X'
*            is_variant               = variante
*            is_print                 = print
       TABLES
            t_outtab                 = <dyn_table>
       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.                    " apresenta_alv

Regards,

Pedro Gaspar

Read only

Former Member
0 Likes
1,095

Hi,

The reason of the error is bcz you havent written the REPORT statement.

Please add the Report statement in the main program.

Best regards,

Prashant

Read only

0 Likes
1,095

Hello Prashant,

I've written the REPORT statement in the Include ***TOP.

I need to write it in the main program?

Regards,

Pedro Gaspar

Read only

0 Likes
1,095

Hi,

I've already added the REPORT statement but the problem still persists.

Best Regards,

Pedro Gaspar

Read only

Former Member
0 Likes
1,095

Solved My Own

Read only

0 Likes
1,095

Hi,

How did you do this? Now I am facing the same problem..

Thanks,

Raj

Read only

0 Likes
1,095

Hi,

How did you do this? Now I am facing the same problem..

Thanks,

Raj