<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: cl_alv_table_create=&amp;gt;create_dynamic_table Dump in Application Development and Automation Discussions</title>
    <link>https://community.sap.com/t5/application-development-and-automation-discussions/cl-alv-table-create-gt-create-dynamic-table-dump/m-p/2298042#M501966</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The reason of the error is bcz you havent written the REPORT statement.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Please add the Report statement in the main program.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Best regards,&lt;/P&gt;&lt;P&gt;Prashant&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Tue, 29 May 2007 15:59:21 GMT</pubDate>
    <dc:creator>Former Member</dc:creator>
    <dc:date>2007-05-29T15:59:21Z</dc:date>
    <item>
      <title>cl_alv_table_create=&gt;create_dynamic_table Dump</title>
      <link>https://community.sap.com/t5/application-development-and-automation-discussions/cl-alv-table-create-gt-create-dynamic-table-dump/m-p/2298039#M501963</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I'm trying to use &lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;cl_alv_table_create=&amp;gt;create_dynamic_table&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt; but i receive a dump saying &amp;lt;i&amp;gt;Program " " not found &amp;lt;/i&amp;gt;.&lt;/P&gt;&lt;P&gt;Here follows the code:&lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;
*&amp;amp;---------------------------------------------------------------------*
*&amp;amp; Include Z3DDR002TOP                                                 *
*&amp;amp;                                                                     *
*&amp;amp;---------------------------------------------------------------------*
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.


*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;      Form  constroi_fieldcatalog
*&amp;amp;---------------------------------------------------------------------*
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' '&amp;lt;dyn_table&amp;gt;' 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' '&amp;lt;dyn_table&amp;gt;' 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' '&amp;lt;dyn_table&amp;gt;' 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' '&amp;lt;dyn_table&amp;gt;' 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' '&amp;lt;dyn_table&amp;gt;' 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' '&amp;lt;dyn_table&amp;gt;' 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' '&amp;lt;dyn_table&amp;gt;' 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' '&amp;lt;dyn_table&amp;gt;' 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' '&amp;lt;dyn_table&amp;gt;' 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' '&amp;lt;dyn_table&amp;gt;' 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' '&amp;lt;dyn_table&amp;gt;' 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' '&amp;lt;dyn_table&amp;gt;' 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' '&amp;lt;dyn_table&amp;gt;' 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' '&amp;lt;dyn_table&amp;gt;' 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' '&amp;lt;dyn_table&amp;gt;' 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
                                      '&amp;lt;dyn_table&amp;gt;' text-h14 flds_count
                                      '' '' '' '' '' '' ''
                                      '' '' ''.
    ADD 1 TO flds_count.
    ADD 1 TO cnt.
  ENDDO.

  CALL METHOD cl_alv_table_create=&amp;gt;create_dynamic_table
       EXPORTING
         it_fieldcatalog = it_fldcat
       IMPORTING
         ep_table        = new_table.

  ASSIGN new_table-&amp;gt;* TO &amp;lt;dyn_table&amp;gt;.
ENDFORM.                    " constroi_fieldcatalog
*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;      Form  append_fieldcatalog
*&amp;amp;---------------------------------------------------------------------*
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
&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;What can be wrong?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Best Regards,&lt;/P&gt;&lt;P&gt;Pedro Gaspar&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 29 May 2007 14:49:52 GMT</pubDate>
      <guid>https://community.sap.com/t5/application-development-and-automation-discussions/cl-alv-table-create-gt-create-dynamic-table-dump/m-p/2298039#M501963</guid>
      <dc:creator>Former Member</dc:creator>
      <dc:date>2007-05-29T14:49:52Z</dc:date>
    </item>
    <item>
      <title>Re: cl_alv_table_create=&gt;create_dynamic_table Dump</title>
      <link>https://community.sap.com/t5/application-development-and-automation-discussions/cl-alv-table-create-gt-create-dynamic-table-dump/m-p/2298040#M501964</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I am not sure whether you have pasted the entire code bcz it doesnt seem to be complete code.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I dont see any Start-of-Selection/End-of-selection event, nor any call to any of the forms using PERFORM statement.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Simply defining a class &amp;amp; its method wont serve the purpose.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Best regards,&lt;/P&gt;&lt;P&gt;Prashant&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 29 May 2007 15:37:18 GMT</pubDate>
      <guid>https://community.sap.com/t5/application-development-and-automation-discussions/cl-alv-table-create-gt-create-dynamic-table-dump/m-p/2298040#M501964</guid>
      <dc:creator>Former Member</dc:creator>
      <dc:date>2007-05-29T15:37:18Z</dc:date>
    </item>
    <item>
      <title>Re: cl_alv_table_create=&gt;create_dynamic_table Dump</title>
      <link>https://community.sap.com/t5/application-development-and-automation-discussions/cl-alv-table-create-gt-create-dynamic-table-dump/m-p/2298041#M501965</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello Prashant,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Here it goes the complete code:&lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;
*&amp;amp;---------------------------------------------------------------------*
*&amp;amp; Programa Z3DDR002                                                   *
*&amp;amp; Mapa de Linearização de Contratos                                   *
*&amp;amp;---------------------------------------------------------------------*
*&amp;amp; Sonae Sierra                                                        *
*&amp;amp; Pedro Gaspar - 24.05.2007                                           *
*&amp;amp;---------------------------------------------------------------------*
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=&amp;gt;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

*&amp;amp;---------------------------------------------------------------------*
*&amp;amp; Include Z3DDR002TOP                                                 *
*&amp;amp;                                                                     *
*&amp;amp;---------------------------------------------------------------------*
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: &amp;lt;dyn_table&amp;gt; TYPE STANDARD TABLE,
               &amp;lt;dyn_wa&amp;gt;.

FIELD-SYMBOLS: &amp;lt;fs1&amp;gt;.

* É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: &amp;lt;icon&amp;gt;.
*
**---------------------------------------------------------------------*
**       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: &amp;lt;info&amp;gt;         TYPE ANY,
*                   &amp;lt;field_value&amp;gt;  TYPE ANY.
*
*    ASSIGN info-&amp;gt;* TO &amp;lt;info&amp;gt;.
*    ASSIGN COMPONENT fieldname OF STRUCTURE &amp;lt;info&amp;gt; TO &amp;lt;field_value&amp;gt;.
*
*    IF sy-subrc = 0.
*      field_value = &amp;lt;field_value&amp;gt;.
*    ELSE.
*      CLEAR field_value.
*    ENDIF.
*  ENDMETHOD.                    "get_field
*
*  METHOD field.
*    FIELD-SYMBOLS: &amp;lt;info&amp;gt;         TYPE ANY,
*                   &amp;lt;field_value&amp;gt;  TYPE ANY.
*
*    ASSIGN info-&amp;gt;* TO &amp;lt;info&amp;gt;.
*    ASSIGN COMPONENT fieldname OF STRUCTURE &amp;lt;info&amp;gt; TO &amp;lt;field_value&amp;gt;.
*
*    IF sy-subrc = 0.
*      GET REFERENCE OF &amp;lt;field_value&amp;gt; INTO field_value.
*    ELSE.
*      CLEAR field_value.
*    ENDIF.
*  ENDMETHOD.                    "field
*
*  METHOD row.
*    FIELD-SYMBOLS: &amp;lt;table&amp;gt;        TYPE table,
*                   &amp;lt;row&amp;gt;          TYPE ANY.
*
*    ASSIGN info-&amp;gt;* TO &amp;lt;table&amp;gt;.
*
*    READ TABLE  &amp;lt;table&amp;gt;
*     ASSIGNING  &amp;lt;row&amp;gt;
*         INDEX  index.
*
*    IF sy-subrc = 0.
*      GET REFERENCE OF &amp;lt;row&amp;gt; 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) &amp;lt; begda+4(2).
*      age = age - 1.
*    ELSEIF endda+4(2) = begda+4(2).
*      IF endda+6(2) &amp;lt; 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) &amp;gt; 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 &amp;gt; 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) &amp;gt; 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 &amp;gt; 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 &amp;gt; 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-&amp;gt;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=&amp;gt;split_name
*      EXPORTING
*        name      = field
*      CHANGING
*        tabname   = lv_table
*        fieldname = lv_field.
*
*
*    IF NOT comp_field IS INITIAL.
*      CALL METHOD cdic=&amp;gt;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=&amp;gt;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: &amp;lt;list&amp;gt;   TYPE ANY,
*                   &amp;lt;value&amp;gt;  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 &amp;lt;list&amp;gt;.
*      ASSIGN COMPONENT field OF STRUCTURE &amp;lt;list&amp;gt; TO &amp;lt;value&amp;gt;.
*
*      IF sy-subrc = 0.
*        CLEAR ls_spopli.
*        ls_spopli-varoption = &amp;lt;value&amp;gt;.
*        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=&amp;gt;add
          EXPORTING
            low   = value
          CHANGING
            range = ls_info-range.

        MODIFY info FROM ls_info.
      ENDLOOP.

      IF sy-subrc &amp;lt;&amp;gt; 0.
        CLEAR ls_info.
        ls_info-table = table.
        ls_info-field = field.

        CALL METHOD crange=&amp;gt;add
          EXPORTING
            low   = value
          CHANGING
            range = ls_info-range.

        APPEND ls_info TO info.
      ENDIF.
    ENDIF.
  ENDMETHOD.                    "add_field

  METHOD add.
    FIELD-SYMBOLS: &amp;lt;ls_range&amp;gt;  TYPE ANY,
                   &amp;lt;sign&amp;gt;      TYPE ANY,
                   &amp;lt;option&amp;gt;    TYPE ANY,
                   &amp;lt;low&amp;gt;       TYPE ANY,
                   &amp;lt;high&amp;gt;      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-&amp;gt;*     TO &amp;lt;ls_range&amp;gt;.

    CLEAR &amp;lt;ls_range&amp;gt;.

    ASSIGN COMPONENT 'SIGN'   OF STRUCTURE &amp;lt;ls_range&amp;gt; TO &amp;lt;sign&amp;gt;.

    IF sy-subrc = 0.
      &amp;lt;sign&amp;gt; = sign.
    ENDIF.

    ASSIGN COMPONENT 'OPTION' OF STRUCTURE &amp;lt;ls_range&amp;gt; TO &amp;lt;option&amp;gt;.

    IF sy-subrc = 0.
      IF option = 'BT' AND high IS INITIAL.
        &amp;lt;option&amp;gt; = 'EQ'.
      ELSE.
        &amp;lt;option&amp;gt; = option.
      ENDIF.
    ENDIF.

    ASSIGN COMPONENT 'LOW'    OF STRUCTURE &amp;lt;ls_range&amp;gt; TO &amp;lt;low&amp;gt;.

    IF sy-subrc = 0.
      &amp;lt;low&amp;gt; = low.
    ENDIF.

    ASSIGN COMPONENT 'HIGH'   OF STRUCTURE &amp;lt;ls_range&amp;gt; TO &amp;lt;high&amp;gt;.

    IF sy-subrc = 0.
      &amp;lt;high&amp;gt; = high.
    ENDIF.

    APPEND &amp;lt;ls_range&amp;gt; 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
*
**&amp;amp;---------------------------------------------------------------------
**
**&amp;amp;       Class (Implementation)  creport_alv
**&amp;amp;---------------------------------------------------------------------
**
**        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=&amp;gt;confirm
*        EXPORTING
*          title  = title
*          text1  = text
*          line1  = question
*        CHANGING
*          answer = answer.
*
*      IF answer &amp;lt;&amp;gt; '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=&amp;gt;add_header_line
*          EXPORTING
*            type   = 'S'
*            margin = margin
*            label  = label
*            text1  = lv_param_low.
*      ELSE.
*        CALL METHOD creport_alv=&amp;gt;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-&amp;gt;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-&amp;gt;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=&amp;gt;pubt_header.
*ENDFORM.                    "top_of_page
**&amp;amp;---------------------------------------------------------------------
**
**&amp;amp;      Form  set_pf_status
**&amp;amp;---------------------------------------------------------------------
**
*FORM set_pf_status USING pt_exctab TYPE slis_t_extab.
*  SET PF-STATUS creport_alv=&amp;gt;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 &amp;gt; 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: &amp;lt;option&amp;gt;   TYPE ANY,
*                   &amp;lt;value&amp;gt;    TYPE ANY.
*
*    LOOP AT values ASSIGNING &amp;lt;option&amp;gt;.
*      ASSIGN COMPONENT field OF STRUCTURE &amp;lt;option&amp;gt; TO &amp;lt;value&amp;gt;.
*
*      IF sy-subrc = 0.
*        CALL METHOD add_option
*          EXPORTING
*            value  = &amp;lt;value&amp;gt;
*            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 &amp;lt; 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-&amp;gt;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 &amp;lt;= date
*       AND  date_to   &amp;gt;= date.
*    ENDSELECT.
*
*    SELECT  *
*      INTO  CORRESPONDING FIELDS OF adrc
*      FROM  usr21
*      JOIN  adrc
*        ON  adrc~addrnumber = usr21~addrnumber
*     WHERE  bname      = user
*       AND  date_from &amp;lt;= date
*       AND  date_to   &amp;gt;= 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 &amp;lt;= date
*       AND  date_to   &amp;gt;= 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  &amp;lt;= 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 &amp;lt;= date
*       AND  date_to   &amp;gt;= 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
*
**&amp;amp;---------------------------------------------------------------------
**
**&amp;amp;  Include           ZREPORT_OBJECTS_DRILL
**
**&amp;amp;---------------------------------------------------------------------
**
**---------------------------------------------------------------------*
**       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-&amp;gt;data,
*           me-&amp;gt;levels,
*           me-&amp;gt;table_number.
*
*    me-&amp;gt;type             = type.
*    me-&amp;gt;top_node         = top_node.
*    me-&amp;gt;with_lines       = with_lines.
*    me-&amp;gt;color-main       = color_main.
*    me-&amp;gt;color-last_level = color_last_level.
*    me-&amp;gt;color-values     = color_values.
*    me-&amp;gt;step_margin      = step_margin.
*    me-&amp;gt;header           = header.
*    me-&amp;gt;user_info        = user_info.
*    me-&amp;gt;form_values      = form_values.
*    me-&amp;gt;values_position  = values_position.
*  ENDMETHOD.                    "constructor
**---------------------------------------------------------------------*
*  METHOD child_selection.
*    FIELD-SYMBOLS: &amp;lt;list_table&amp;gt;    TYPE table,
*                   &amp;lt;new_data&amp;gt;      TYPE table,
*                   &amp;lt;row&amp;gt;           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-&amp;gt;info-&amp;gt;* TO &amp;lt;list_table&amp;gt;.
*
*            DESCRIBE TABLE &amp;lt;list_table&amp;gt; LINES lv_lines.
*            ADD 1 TO lv_lines.
*
*            CREATE DATA lref_new_data LIKE &amp;lt;list_table&amp;gt;.
*            ASSIGN lref_new_data-&amp;gt;*     TO &amp;lt;new_data&amp;gt;.
*
*            PERFORM (ls_level-form_selection)
*                                   IN PROGRAM (ls_level-program)
*                                        USING ls_data-key-value
*                                     CHANGING &amp;lt;new_data&amp;gt;.
*
*            LOOP AT  &amp;lt;new_data&amp;gt; ASSIGNING &amp;lt;row&amp;gt;.
*              APPEND &amp;lt;row&amp;gt; TO &amp;lt;list_table&amp;gt;.
*            ENDLOOP.
*
*            LOOP AT  &amp;lt;list_table&amp;gt; ASSIGNING &amp;lt;row&amp;gt; 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    = &amp;lt;row&amp;gt;.
*            ENDLOOP.
*
**            DESCRIBE TABLE &amp;lt;new_data&amp;gt; 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 &amp;gt; 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-&amp;gt;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-&amp;gt;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-&amp;gt;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 &amp;gt; 1 OR ls_level-level &amp;lt; 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-&amp;gt;header IS INITIAL.
*        me-&amp;gt;header = ls_level-name.
*      ELSE.
*        CONCATENATE me-&amp;gt;header '/' ls_level-name
*               INTO me-&amp;gt;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: &amp;lt;table&amp;gt;     TYPE table,
*                   &amp;lt;row&amp;gt;       TYPE ANY,
*                   &amp;lt;select&amp;gt;    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-&amp;gt;field( ls_level-field_checkbox ).
*          ASSIGN lref_select-&amp;gt;* TO &amp;lt;select&amp;gt;.
*
*          &amp;lt;select&amp;gt; = value.
*        ENDLOOP.
*      ENDIF.
*    ENDLOOP.
*  ENDMETHOD.                    "mark
**---------------------------------------------------------------------*
*  METHOD delete.
*    FIELD-SYMBOLS: &amp;lt;table&amp;gt;     TYPE table,
*                   &amp;lt;row&amp;gt;       TYPE ANY,
*                   &amp;lt;select&amp;gt;    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-&amp;gt;info-&amp;gt;* TO &amp;lt;table&amp;gt;.
*
*          LOOP AT &amp;lt;table&amp;gt; ASSIGNING &amp;lt;row&amp;gt;.
*            ASSIGN COMPONENT  ls_level-field_checkbox
*                OF STRUCTURE  &amp;lt;row&amp;gt;
*                          TO  &amp;lt;select&amp;gt;.
*
*            IF NOT &amp;lt;select&amp;gt; IS INITIAL.
*              DELETE &amp;lt;table&amp;gt;.
*            ENDIF.
*          ENDLOOP.
*        ENDLOOP.
*      ENDIF.
*    ENDLOOP.
*
*    CALL METHOD set_internal_table.
*  ENDMETHOD.                    "delete
**---------------------------------------------------------------------*
*  METHOD excel_export.
*    FIELD-SYMBOLS: &amp;lt;table&amp;gt;        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 &amp;gt; 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-&amp;gt;add_option
*            EXPORTING
*              value  = lv_text
*              option = sy-tabix.
*        ENDIF.
*      ENDLOOP.
*
*      CALL METHOD lo_actions-&amp;gt;display
*        EXPORTING
*          title  = title
*        CHANGING
*          option = lv_option.
*    ENDIF.
*
*    IF lv_option &amp;lt;&amp;gt; 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-&amp;gt;add_field
*              EXPORTING
*                fieldname = ls_fields-fieldname
*                header    = ls_fields-header
*                length    = ls_fields-length.
*          ENDLOOP.
*        ENDLOOP.
*
*        ASSIGN ls_table-data-&amp;gt;info-&amp;gt;* TO &amp;lt;table&amp;gt;.
*
*        CALL METHOD lo_excel-&amp;gt;call
*          CHANGING
*            table = &amp;lt;table&amp;gt;.
*      ENDIF.
*    ENDIF.
*  ENDMETHOD.                    "excel_export
**---------------------------------------------------------------------*
*  METHOD set_internal_table.
*    FIELD-SYMBOLS: &amp;lt;table&amp;gt;       TYPE table,
*                   &amp;lt;line_info&amp;gt;   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-&amp;gt;data.
*    CLEAR me-&amp;gt;data.
*
*    LOOP AT  list_tables
*       INTO  ls_table
*      WHERE  type = 'C'.
*      ASSIGN ls_table-data-&amp;gt;info-&amp;gt;*   TO &amp;lt;table&amp;gt;.
*
*      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            = &amp;lt;table&amp;gt;
*          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-&amp;gt;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-&amp;gt;info-&amp;gt;* TO &amp;lt;line_info&amp;gt;.
*
*          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        = &amp;lt;line_info&amp;gt;.
*        ENDLOOP.
*      ENDIF.
*    ENDLOOP.
*
*    CLEAR data_backup.
*  ENDMETHOD.                    "set_internal_table
**---------------------------------------------------------------------*
*  METHOD convert_table_list_to_sort.
*    FIELD-SYMBOLS: &amp;lt;table&amp;gt;      TYPE table,
*                   &amp;lt;list_info&amp;gt;  TYPE ANY,
*                   &amp;lt;value&amp;gt;      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-&amp;gt;*   TO &amp;lt;table&amp;gt;.
*
*    LOOP AT &amp;lt;table&amp;gt; ASSIGNING &amp;lt;list_info&amp;gt;.
*      CLEAR ls_sort_table.
*
*      CREATE OBJECT ls_sort_table-info.
*
*      CALL METHOD ls_sort_table-info-&amp;gt;add_data
*        CHANGING
*          data = &amp;lt;list_info&amp;gt;.
*
*      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-&amp;gt;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 &amp;lt;&amp;gt; 0.
*          EXIT.
*        ELSE.
*          lref_value = ls_sort_table-info-&amp;gt;field( ls_field-fieldname ).
*          ASSIGN lref_value-&amp;gt;* TO &amp;lt;value&amp;gt;.
*
*          CASE ls_field-type.
*            WHEN 'CURR'. ls_value-curr = &amp;lt;value&amp;gt;.
*            WHEN 'QUAN'. ls_value-quan = &amp;lt;value&amp;gt;.
*          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: &amp;lt;line_info&amp;gt;   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-&amp;gt;info-&amp;gt;* TO &amp;lt;line_info&amp;gt;.
*
*      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   = &amp;lt;line_info&amp;gt;.
*
*        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   = &amp;lt;line_info&amp;gt;.
*
*        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   = &amp;lt;line_info&amp;gt;.
*
*        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   = &amp;lt;line_info&amp;gt;.
*
*        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   = &amp;lt;line_info&amp;gt;.
*
*        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   = &amp;lt;line_info&amp;gt;.
*
*        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   = &amp;lt;line_info&amp;gt;.
*
*        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   = &amp;lt;line_info&amp;gt;.
*
*        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   = &amp;lt;line_info&amp;gt;.
*
*        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: &amp;lt;line_info&amp;gt;     TYPE ANY.
*
*    DATA: ls_cascade_data      TYPE tps_cascade_table.
*
*    CLEAR info.
*
*    LOOP AT  table ASSIGNING &amp;lt;line_info&amp;gt;.
*      CLEAR ls_cascade_data.
*
*      CREATE OBJECT ls_cascade_data-info.
*
*      CALL METHOD ls_cascade_data-info-&amp;gt;add_data
*        CHANGING
*          data = &amp;lt;line_info&amp;gt;.
*
*      IF NOT field_key IS INITIAL.
*        CALL METHOD ls_cascade_data-info-&amp;gt;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-&amp;gt;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-&amp;gt;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-&amp;gt;add_data
*        CHANGING
*          data = line_info.
*
*      ls_data-key-table = table_key.
*
*      IF NOT field_key IS INITIAL.
*        CALL METHOD ls_data-info-&amp;gt;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-&amp;gt;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-&amp;gt;get_field
*          EXPORTING
*            fieldname   = connection_field
*          IMPORTING
*            field_value = ls_data-parent-value.
*      ENDIF.
*
*      IF ls_data-key-value &amp;lt;&amp;gt; ls_data-parent-value.
*        APPEND ls_data TO me-&amp;gt;data.
*      ENDIF.
*    ENDIF.
*  ENDMETHOD.                    "add_table_line
**---------------------------------------------------------------------*
*  METHOD add_connection_table_line.
*    FIELD-SYMBOLS: &amp;lt;row&amp;gt;         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-&amp;gt;info-&amp;gt;* TO &amp;lt;row&amp;gt;.
*
*        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    = &amp;lt;row&amp;gt;.
*
*        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 &amp;lt;&amp;gt; 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: &amp;lt;info&amp;gt;     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-&amp;gt;color-last_level.
*    ELSE.
*      lv_color = me-&amp;gt;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-&amp;gt;info-&amp;gt;* TO &amp;lt;info&amp;gt;.
*      PERFORM (level_info-form_display) IN PROGRAM (sy-cprog)
*                                             USING &amp;lt;info&amp;gt;.
*    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-&amp;gt;info-&amp;gt;* TO &amp;lt;info&amp;gt;.
*        PERFORM (form_values) IN PROGRAM (sy-cprog)
*                                   USING &amp;lt;info&amp;gt;.
*      ENDIF.
*    ENDIF.
*
*    sy-tabix = index.
*    HIDE sy-tabix.
*  ENDMETHOD.                    "write_level
**---------------------------------------------------------------------*
*  METHOD write_checkbox.
*    FIELD-SYMBOLS: &amp;lt;select&amp;gt;   TYPE ANY.
*
*    DATA: lref_select    TYPE REF TO data.
*
*    lref_select = list_info-info-&amp;gt;field( field_checkbox ).
*    ASSIGN lref_select-&amp;gt;*  TO &amp;lt;select&amp;gt;.
*
*    IF type IS INITIAL.
*      CASE field_checkbox.
*        WHEN 'O'.
*          WRITE: &amp;lt;select&amp;gt;        AS CHECKBOX NO-GAP INPUT OFF,
*                 space           COLOR = 0 INTENSIFIED OFF NO-GAP.
*        WHEN OTHERS.
*          CASE &amp;lt;select&amp;gt;.
*            WHEN 'O'.
*              WRITE: &amp;lt;select&amp;gt;      AS CHECKBOX NO-GAP INPUT OFF,
*                     space         COLOR = 0 INTENSIFIED OFF NO-GAP.
*            WHEN OTHERS.
*              WRITE: &amp;lt;select&amp;gt;      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 &amp;lt;&amp;gt; 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 &amp;gt; 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: &amp;lt;field&amp;gt;          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-&amp;gt;* TO &amp;lt;field&amp;gt;.
*      ELSE.
*        ref_field = list_line-&amp;gt;field( ls_field-fieldname ).
*        ASSIGN ref_field-&amp;gt;* TO &amp;lt;field&amp;gt;.
*      ENDIF.
*
*      IF NOT ls_field-color_variable IS INITIAL.
*        CALL METHOD list_line-&amp;gt;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-&amp;gt;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-&amp;gt;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 &amp;lt;field&amp;gt; IS INITIAL.
*        WRITE AT (ls_field-length) &amp;lt;field&amp;gt; AS ICON
*                                           COLOR = lv_color NO-GAP.
*      ELSEIF NOT ls_field-symbol IS INITIAL AND NOT &amp;lt;field&amp;gt; IS INITIAL.
*        WRITE AT (ls_field-length) &amp;lt;field&amp;gt; AS SYMBOL
*                                           COLOR = lv_color NO-GAP.
*      ELSE.
*        CALL METHOD list_line-&amp;gt;get_field
*          EXPORTING
*            fieldname   = ls_field-unit_field
*          IMPORTING
*            field_value = lv_unit.
*
*        IF NOT lv_unit IS INITIAL.
*          WRITE: AT (ls_field-length) &amp;lt;field&amp;gt;  COLOR = lv_color NO-GAP
*                                                   UNIT lv_unit.
*        ELSEIF ls_field-centered IS INITIAL.
*          WRITE AT (ls_field-length) &amp;lt;field&amp;gt; COLOR = lv_color NO-GAP.
*        ELSE.
*          WRITE AT (ls_field-length) &amp;lt;field&amp;gt; COLOR = lv_color NO-GAP
*                                             CENTERED
*  .
*        ENDIF.
*      ENDIF.
*    ENDLOOP.
*  ENDMETHOD.                    "write_default_level
**---------------------------------------------------------------------*
*  METHOD write_default_values.
*    FIELD-SYMBOLS: &amp;lt;field&amp;gt;    TYPE tps_value_type,
*                   &amp;lt;color&amp;gt;    TYPE i.
*
*    DATA: ls_field            TYPE tps_fields,
*          lv_color            TYPE i.
*
*    WRITE AT values_position space NO-GAP COLOR = me-&amp;gt;color-main
*                                   INTENSIFIED.
*
*    LOOP AT  value_fields
*       INTO  ls_field.
*      ASSIGN COMPONENT sy-tabix OF STRUCTURE list_info-values
*                                          TO &amp;lt;field&amp;gt;.
*
*      IF NOT ls_field-color_variable IS INITIAL.
*        CALL METHOD list_info-info-&amp;gt;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) &amp;lt;field&amp;gt;-curr
*               NO-GAP CURRENCY ls_field-waers COLOR = lv_color.
*          ELSE.
*            WRITE: AT (ls_field-length) &amp;lt;field&amp;gt;-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) &amp;lt;field&amp;gt;-quan
*                    NO-GAP UNIT ls_field-unit COLOR = lv_color.
*          ELSE.
*            WRITE: AT (ls_field-length) &amp;lt;field&amp;gt;-quan
*                  NO-GAP UNIT ls_field-unit COLOR = lv_color CENTERED.
*          ENDIF.
*      ENDCASE.
*
*      WRITE space  NO-GAP COLOR = me-&amp;gt;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 &amp;gt;= lv_cursor_drill_begin
*      AND selected-column &amp;lt;= lv_cursor_drill_end.
*      selected-field = 'DRILL'.
*    ENDIF.
*
*    IF selected-column &amp;gt; 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 &amp;lt; 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 &amp;lt;&amp;gt; 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: &amp;lt;info&amp;gt;     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-&amp;gt;info-&amp;gt;* TO &amp;lt;info&amp;gt;.
*
*        PERFORM (ls_level-form_execution) IN PROGRAM (ls_level-program)
*                                               USING &amp;lt;info&amp;gt;.
*      ENDIF.
*    ENDIF.
*  ENDMETHOD.                    "execute_level_function
**---------------------------------------------------------------------*
*  METHOD get_input.
*    FIELD-SYMBOLS: &amp;lt;select&amp;gt;    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-&amp;gt;field( ls_level-field_checkbox ).
*          ASSIGN lref_select-&amp;gt;* TO &amp;lt;select&amp;gt;.
*
*          &amp;lt;select&amp;gt; =  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         = &amp;lt;select&amp;gt;
*                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: &amp;lt;info&amp;gt;      TYPE ANY,
*                   &amp;lt;field&amp;gt;     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-&amp;gt;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-&amp;gt;field( ls_field-fieldname ).
*        ASSIGN lref_field-&amp;gt;* TO &amp;lt;field&amp;gt;.
*
*        CALL METHOD read_line_field
*          EXPORTING
*            line     = list_info-linno
*            level    = list_info-level
*            position = lv_position
*            length   = ls_field-length
*          CHANGING
*            value    = &amp;lt;field&amp;gt;.
*
*        IF NOT ls_field-form_input_check IS INITIAL.
*          ASSIGN list_info-info-&amp;gt;info-&amp;gt;* TO &amp;lt;info&amp;gt;.
*          PERFORM (ls_field-form_input_check) IN PROGRAM (sy-cprog)
*                                                   USING &amp;lt;info&amp;gt;
*                                                CHANGING &amp;lt;field&amp;gt;.
*        ENDIF.
*      ENDIF.
*
*      ADD ls_field-length TO lv_position.
*    ENDLOOP.
*  ENDMETHOD.                    "get_field_input
**---------------------------------------------------------------------*
*  METHOD set_child_checkbox.
*    FIELD-SYMBOLS: &amp;lt;select&amp;gt;   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-&amp;gt;field( field_checkbox ).
*      ASSIGN lref_select-&amp;gt;* TO &amp;lt;select&amp;gt;.
*
*      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 &amp;gt; 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 &amp;gt; 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 &amp;lt; 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:  &amp;lt;data&amp;gt;     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-&amp;gt;*    TO &amp;lt;data&amp;gt;.
*
*    me-&amp;gt;wbind  = wbind.
*    me-&amp;gt;basjhr = basjhr.
*    me-&amp;gt;indjhr = indjhr.
*
*    CLEAR indexes.
*
*    LOOP AT table ASSIGNING &amp;lt;data&amp;gt;.
*      MOVE-CORRESPONDING &amp;lt;data&amp;gt; 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-&amp;gt;contract,
*           me-&amp;gt;clause,
*           me-&amp;gt;discount,
*           me-&amp;gt;ipc,
*           me-&amp;gt;old_value,
*           me-&amp;gt;year,
*           me-&amp;gt;month,
*           me-&amp;gt;date,
*           me-&amp;gt;last_day,
*           me-&amp;gt;first_day.
*
*    SELECT  SINGLE *
*      INTO  contract
*      FROM  vimimv
*     WHERE  intreno = intreno.
*
*    IF sy-subrc IS INITIAL.
*      me-&amp;gt;year       = year.
*      me-&amp;gt;month      = month.
*      last_day       = cdate=&amp;gt;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) &amp;gt; 14.
*          date = cdate=&amp;gt;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 &amp;lt;&amp;gt; '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=&amp;gt;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=&amp;gt;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=&amp;gt;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=&amp;gt;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=&amp;gt;subtract_months( date = first_day months = first ).
*    lv_date_to  =
*       cdate=&amp;gt;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 &amp;gt;= lv_date_from+4(2) ) OR
*             ( anovv &amp;gt; lv_date_from(4) AND
*               anovv &amp;lt;  lv_date_from(4)   ) OR
*             ( anovv = lv_date_to(4)   AND
*               mesvv &amp;lt;= 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 &amp;gt;= date_from
*       AND  dberbis &amp;lt;= 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-&amp;gt;discount-zzdesc / 100 ) ) *
*          ( 1 - ( me-&amp;gt;discount-zzdescex / 100 ) ).
*    ELSE.
*      discount = value /
*          ( 1 - ( me-&amp;gt;discount-zzdesc / 100 ) ) *
*          ( 1 - ( me-&amp;gt;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 &amp;gt; 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 &amp;gt; lv_value2.
**      value_cons = process02( ).
**    ELSE.
**      SELECT  SINGLE data
**        INTO  lv_data
**        FROM  z3acons
**       WHERE  data  &amp;lt; 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 &amp;lt;&amp;gt; '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 &amp;gt; 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-&amp;gt;vimimv
*      FROM  vimimv
*     WHERE  intreno = intreno.
*
*    IF sy-subrc IS INITIAL.
*      SELECT  *
*        INTO  TABLE me-&amp;gt;vimi55
*        FROM  vimi55
*       WHERE  intreno  =  intreno
*       ORDER  BY dgabanrt DESCENDING.
*
*      SELECT  *
*        INTO  TABLE me-&amp;gt;vzzkopo
*        FROM  vzzkopo
*       WHERE  bukrs    =  me-&amp;gt;vimimv-bukrs
*         AND  sanlf    = '410'
*         AND  rkey1    =  me-&amp;gt;vimimv-smive
*         AND  rkey2    =  me-&amp;gt;vimimv-swenr
*         AND  rkey3    =  me-&amp;gt;vimimv-smenr
*         AND  dguel_kk &amp;lt;= 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 &amp;lt;= 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 &amp;lt;&amp;lt;&amp;lt;
**          lv_last_year       TYPE char1,
**          lv_this_year       TYPE char1,
*          lv_last_year       TYPE char2,
*          lv_this_year       TYPE char2,
** AR01 &amp;gt;&amp;gt;&amp;gt;
*          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-&amp;gt;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-&amp;gt;adcp
*              contact_adrp       = lo_user-&amp;gt;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   &amp;lt; 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 &amp;lt;= 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    &amp;lt;= ls_vimi16-dguelab
*         AND  tpven   =  '01'
*       ORDER  BY data DESCENDING.
*      ENDSELECT.
*
*      IF ls_vimi16-dguelab(4) &amp;lt;&amp;gt; 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-&amp;gt;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-&amp;gt;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-&amp;gt;first_sales_period
*                last_period        = lo_cc-&amp;gt;last_sales_period
*                total_values       = lo_cc-&amp;gt;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 &amp;lt;= sy-datum
*       AND  date_to &amp;gt; 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 &amp;lt;= vimi16-dguelab
*     ORDER  BY dgabanrt DESCENDING.
*
*      lv_date = cdate=&amp;gt;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=&amp;gt;add
*        EXPORTING
*          low   = skoart
*          clear = 'X'
*        CHANGING
*          range = lr_skoart.
*    ELSE.
*      lr_skoart = r_skoart.
*    ENDIF.
*
*    IF NOT sanpnr IS INITIAL.
*      CALL METHOD crange=&amp;gt;add
*        EXPORTING
*          low   = sanpnr
*          clear = 'X'
*        CHANGING
*          range = lr_sanpnr.
*    ELSE.
*      lr_sanpnr = r_sanpnr.
*    ENDIF.
*
*    IF NOT dguelab IS INITIAL.
*      CALL METHOD crange=&amp;gt;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                                                *
*----------------------------------------------------------------------*
*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;      Form  selecciona_dados
*&amp;amp;---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  --&amp;gt;  p1        text
*  &amp;lt;--  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 =&amp;gt; é 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 &amp;gt; última data de processamento =&amp;gt;
* 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
*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;      Form  calcula_facturacao
*&amp;amp;---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      --&amp;gt;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 &amp;lt;&amp;gt; 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
*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;      Form  prepara_dados
*&amp;amp;---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  --&amp;gt;  p1        text
*  &amp;lt;--  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
*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;      Form  constroi_fieldcatalog
*&amp;amp;---------------------------------------------------------------------*
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' '&amp;lt;dyn_table&amp;gt;' 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' '&amp;lt;dyn_table&amp;gt;' 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' '&amp;lt;dyn_table&amp;gt;' 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' '&amp;lt;dyn_table&amp;gt;' 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' '&amp;lt;dyn_table&amp;gt;' 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' '&amp;lt;dyn_table&amp;gt;' 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' '&amp;lt;dyn_table&amp;gt;' 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' '&amp;lt;dyn_table&amp;gt;' 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' '&amp;lt;dyn_table&amp;gt;' 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' '&amp;lt;dyn_table&amp;gt;' 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' '&amp;lt;dyn_table&amp;gt;' 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' '&amp;lt;dyn_table&amp;gt;' 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' '&amp;lt;dyn_table&amp;gt;' 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' '&amp;lt;dyn_table&amp;gt;' 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' '&amp;lt;dyn_table&amp;gt;' 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
                                      '&amp;lt;dyn_table&amp;gt;' text-h14 flds_count
                                      '' '' '' '' '' '' ''
                                      '' '' ''.
    ADD 1 TO flds_count.
    ADD 1 TO cnt.
  ENDDO.

  CALL METHOD cl_alv_table_create=&amp;gt;create_dynamic_table
       EXPORTING
         it_fieldcatalog = it_fldcat
       IMPORTING
         ep_table        = new_table.

  ASSIGN new_table-&amp;gt;* TO &amp;lt;dyn_table&amp;gt;.
ENDFORM.                    " append_fieldcatalog
*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;      Form  append_fieldcatalog
*&amp;amp;---------------------------------------------------------------------*
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
*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;      Form  alimenta_tabela_dyn
*&amp;amp;---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  --&amp;gt;  p1        text
*  &amp;lt;--  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 &amp;lt;dyn_table&amp;gt;.
    ASSIGN new_line-&amp;gt;* TO &amp;lt;dyn_wa&amp;gt;.

    ASSIGN COMPONENT 'BUKRS' OF STRUCTURE &amp;lt;dyn_wa&amp;gt; TO &amp;lt;fs1&amp;gt;.
    &amp;lt;fs1&amp;gt; = w_total-bukrs.

    ASSIGN COMPONENT 'SWENR' OF STRUCTURE &amp;lt;dyn_wa&amp;gt; TO &amp;lt;fs1&amp;gt;.
    &amp;lt;fs1&amp;gt; = w_total-swenr.

    ASSIGN COMPONENT 'SMIVE' OF STRUCTURE &amp;lt;dyn_wa&amp;gt; TO &amp;lt;fs1&amp;gt;.
    &amp;lt;fs1&amp;gt; = w_total-smive.

    ASSIGN COMPONENT 'SMENR' OF STRUCTURE &amp;lt;dyn_wa&amp;gt; TO &amp;lt;fs1&amp;gt;.
    &amp;lt;fs1&amp;gt; = w_total-smenr.

    ASSIGN COMPONENT 'ZZNMFAN' OF STRUCTURE &amp;lt;dyn_wa&amp;gt; TO &amp;lt;fs1&amp;gt;.
    &amp;lt;fs1&amp;gt; = w_total-zznmfan.

    ASSIGN COMPONENT 'ALT' OF STRUCTURE &amp;lt;dyn_wa&amp;gt; TO &amp;lt;fs1&amp;gt;.
    &amp;lt;fs1&amp;gt; = w_total-alt.

    ASSIGN COMPONENT 'DMIBEG' OF STRUCTURE &amp;lt;dyn_wa&amp;gt; TO &amp;lt;fs1&amp;gt;.
    &amp;lt;fs1&amp;gt; = w_total-dmibeg.

    ASSIGN COMPONENT 'DMIEND' OF STRUCTURE &amp;lt;dyn_wa&amp;gt; TO &amp;lt;fs1&amp;gt;.
    &amp;lt;fs1&amp;gt; = w_total-dmiend.

    ASSIGN COMPONENT 'LAST_ACT' OF STRUCTURE &amp;lt;dyn_wa&amp;gt; TO &amp;lt;fs1&amp;gt;.
    &amp;lt;fs1&amp;gt; = w_total-last_act.

    ASSIGN COMPONENT 'P_DATE' OF STRUCTURE &amp;lt;dyn_wa&amp;gt; TO &amp;lt;fs1&amp;gt;.
    &amp;lt;fs1&amp;gt; = w_total-p_date.

    ASSIGN COMPONENT 'BKOND' OF STRUCTURE &amp;lt;dyn_wa&amp;gt; TO &amp;lt;fs1&amp;gt;.
    &amp;lt;fs1&amp;gt; = w_total-bkond.

    ASSIGN COMPONENT 'MONAT' OF STRUCTURE &amp;lt;dyn_wa&amp;gt; TO &amp;lt;fs1&amp;gt;.
    &amp;lt;fs1&amp;gt; = w_total-monat.

    ASSIGN COMPONENT 'LINEAR' OF STRUCTURE &amp;lt;dyn_wa&amp;gt; TO &amp;lt;fs1&amp;gt;.
    &amp;lt;fs1&amp;gt; = w_total-linear.

    ASSIGN COMPONENT 'DELTA' OF STRUCTURE &amp;lt;dyn_wa&amp;gt; TO &amp;lt;fs1&amp;gt;.
    &amp;lt;fs1&amp;gt; = w_total-delta.

    ASSIGN COMPONENT 'CONTROL' OF STRUCTURE &amp;lt;dyn_wa&amp;gt; TO &amp;lt;fs1&amp;gt;.
    &amp;lt;fs1&amp;gt; = w_total-control.

    ASSIGN COMPONENT 'COLOR' OF STRUCTURE &amp;lt;dyn_wa&amp;gt; TO &amp;lt;fs1&amp;gt;.
    &amp;lt;fs1&amp;gt; = 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 &amp;lt;dyn_wa&amp;gt; TO &amp;lt;fs1&amp;gt;.

        IF sy-subrc EQ 0.
          ADD x_bkond TO &amp;lt;fs1&amp;gt;.
        ENDIF.
      ENDAT.
    ENDLOOP.

    APPEND &amp;lt;dyn_wa&amp;gt; TO &amp;lt;dyn_table&amp;gt;.
  ENDLOOP.
ENDFORM.                    " alimenta_tabela_dyn
*&amp;amp;---------------------------------------------------------------------*
*&amp;amp;      Form  apresenta_alv
*&amp;amp;---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  --&amp;gt;  p1        text
*  &amp;lt;--  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                 = &amp;lt;dyn_table&amp;gt;
       EXCEPTIONS
            program_error            = 1
            OTHERS                   = 2.

  IF sy-subrc &amp;lt;&amp;gt; 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
ENDFORM.                    " apresenta_alv
&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards,&lt;/P&gt;&lt;P&gt;Pedro Gaspar&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 29 May 2007 15:52:21 GMT</pubDate>
      <guid>https://community.sap.com/t5/application-development-and-automation-discussions/cl-alv-table-create-gt-create-dynamic-table-dump/m-p/2298041#M501965</guid>
      <dc:creator>Former Member</dc:creator>
      <dc:date>2007-05-29T15:52:21Z</dc:date>
    </item>
    <item>
      <title>Re: cl_alv_table_create=&gt;create_dynamic_table Dump</title>
      <link>https://community.sap.com/t5/application-development-and-automation-discussions/cl-alv-table-create-gt-create-dynamic-table-dump/m-p/2298042#M501966</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The reason of the error is bcz you havent written the REPORT statement.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Please add the Report statement in the main program.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Best regards,&lt;/P&gt;&lt;P&gt;Prashant&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 29 May 2007 15:59:21 GMT</pubDate>
      <guid>https://community.sap.com/t5/application-development-and-automation-discussions/cl-alv-table-create-gt-create-dynamic-table-dump/m-p/2298042#M501966</guid>
      <dc:creator>Former Member</dc:creator>
      <dc:date>2007-05-29T15:59:21Z</dc:date>
    </item>
    <item>
      <title>Re: cl_alv_table_create=&gt;create_dynamic_table Dump</title>
      <link>https://community.sap.com/t5/application-development-and-automation-discussions/cl-alv-table-create-gt-create-dynamic-table-dump/m-p/2298043#M501967</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello Prashant,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I've written the REPORT statement in the Include ***TOP.&lt;/P&gt;&lt;P&gt;I need to write it in the main program?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards,&lt;/P&gt;&lt;P&gt;Pedro Gaspar&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 29 May 2007 16:12:49 GMT</pubDate>
      <guid>https://community.sap.com/t5/application-development-and-automation-discussions/cl-alv-table-create-gt-create-dynamic-table-dump/m-p/2298043#M501967</guid>
      <dc:creator>Former Member</dc:creator>
      <dc:date>2007-05-29T16:12:49Z</dc:date>
    </item>
    <item>
      <title>Re: cl_alv_table_create=&gt;create_dynamic_table Dump</title>
      <link>https://community.sap.com/t5/application-development-and-automation-discussions/cl-alv-table-create-gt-create-dynamic-table-dump/m-p/2298044#M501968</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I've already added the REPORT statement but the problem still persists.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Best Regards,&lt;/P&gt;&lt;P&gt;Pedro Gaspar&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 29 May 2007 16:57:15 GMT</pubDate>
      <guid>https://community.sap.com/t5/application-development-and-automation-discussions/cl-alv-table-create-gt-create-dynamic-table-dump/m-p/2298044#M501968</guid>
      <dc:creator>Former Member</dc:creator>
      <dc:date>2007-05-29T16:57:15Z</dc:date>
    </item>
    <item>
      <title>Re: cl_alv_table_create=&gt;create_dynamic_table Dump</title>
      <link>https://community.sap.com/t5/application-development-and-automation-discussions/cl-alv-table-create-gt-create-dynamic-table-dump/m-p/2298045#M501969</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Solved My Own&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 06 Jun 2007 11:51:34 GMT</pubDate>
      <guid>https://community.sap.com/t5/application-development-and-automation-discussions/cl-alv-table-create-gt-create-dynamic-table-dump/m-p/2298045#M501969</guid>
      <dc:creator>Former Member</dc:creator>
      <dc:date>2007-06-06T11:51:34Z</dc:date>
    </item>
    <item>
      <title>Re: cl_alv_table_create=&gt;create_dynamic_table Dump</title>
      <link>https://community.sap.com/t5/application-development-and-automation-discussions/cl-alv-table-create-gt-create-dynamic-table-dump/m-p/2298046#M501970</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;How did you do this? Now I am facing the same problem..&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks,&lt;/P&gt;&lt;P&gt;Raj&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 05 Jul 2007 09:42:56 GMT</pubDate>
      <guid>https://community.sap.com/t5/application-development-and-automation-discussions/cl-alv-table-create-gt-create-dynamic-table-dump/m-p/2298046#M501970</guid>
      <dc:creator>Former Member</dc:creator>
      <dc:date>2007-07-05T09:42:56Z</dc:date>
    </item>
    <item>
      <title>Re: cl_alv_table_create=&gt;create_dynamic_table Dump</title>
      <link>https://community.sap.com/t5/application-development-and-automation-discussions/cl-alv-table-create-gt-create-dynamic-table-dump/m-p/2298047#M501971</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;How did you do this? Now I am facing the same problem..&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks,&lt;/P&gt;&lt;P&gt;Raj&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 05 Jul 2007 09:45:52 GMT</pubDate>
      <guid>https://community.sap.com/t5/application-development-and-automation-discussions/cl-alv-table-create-gt-create-dynamic-table-dump/m-p/2298047#M501971</guid>
      <dc:creator>Former Member</dc:creator>
      <dc:date>2007-07-05T09:45:52Z</dc:date>
    </item>
  </channel>
</rss>

