antelio
10/10/2018 - 12:54 PM

Release Strategy Report

*&---------------------------------------------------------------------*
*& Report  ZRMM008
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  zrmm008.


CONSTANTS:
  c_memory_id(19) TYPE c VALUE 'ZMMR50230_LOG_TABLE',
  c_icon_led_green(4) TYPE c VALUE '@5B@',
  c_icon_led_red(4) TYPE c VALUE '@5C@'.

CONSTANTS:
  c_lenght_output TYPE i VALUE 512,
  c_param_support_log TYPE memoryid VALUE 'Z_SUPPORT_LOG'.

TYPES:
  BEGIN OF s_numvalue,
    frggr TYPE frggr,
    frgsx TYPE frggr.
        INCLUDE STRUCTURE bapi1003_alloc_values_num.
TYPES:
  table_field TYPE atfel,
  entry TYPE i,
END OF s_numvalue.

TYPES:
BEGIN OF s_charvalue,
  frggr TYPE frggr,
  frgsx TYPE frgsx.
        INCLUDE STRUCTURE bapi1003_alloc_values_char.
TYPES:
table_field TYPE atfel,
entry TYPE i,
END OF s_charvalue.

TYPES:
BEGIN OF s_currvalue,
  frggr TYPE frggr,
  frgsx TYPE frggr.
        INCLUDE STRUCTURE bapi1003_alloc_values_curr.
TYPES:
  table_field TYPE atfel,
  entry TYPE i,
END OF s_currvalue.

TYPES:
BEGIN OF s_table_fields,
  data_element TYPE rollname,
  columns TYPE i,
  column_name TYPE name_feld,
END OF s_table_fields.

TYPES:
BEGIN OF s_customizing,
  version TYPE c,
  status(3) TYPE c,
  frggr TYPE frggr,
  frgsx TYPE frgsx,
  frgc1 TYPE frgco,
  frgc2 TYPE frgco,
  frgc3 TYPE frgco,
  frgc4 TYPE frgco,
  frgc5 TYPE frgco,
  frgc6 TYPE frgco,
  frgc7 TYPE frgco,
  frgc8 TYPE frgco,
  frgxt TYPE frgxt,
  frgot TYPE frgot,
END OF s_customizing.

TYPES:
BEGIN OF s_not_ekgrp,
  frggr TYPE frggr,
  frgsx TYPE frgsx,
  ekgrp TYPE ekgrp,
END OF s_not_ekgrp.

TYPES:
BEGIN OF s_log,
  frggr TYPE frggr,
  frgsx  TYPE frgsx,
  type  TYPE char1,
  datum  TYPE datum,
  uzeit  TYPE uzeit,
  ballog  TYPE balloghndl,
  scprlog  TYPE scpr_handl,
  has_error TYPE flag,
  type_descr(5) TYPE c,
END OF s_log.


TYPES:
BEGIN OF s_code,
  frggr TYPE frggr,
  frgco TYPE frgco,
  frgct TYPE frgct,
  mark TYPE flag,
  color(4) TYPE c,
END OF s_code.

TYPE-POOLS : abap, slis, icon.
DATA: v_type TYPE frgot.

DATA: " Customizing Information
      t_t16fg TYPE TABLE OF v_t16fg,  " Strategy Group
      t_t16fc TYPE TABLE OF v_t16fc,  " Release Code
      t_t16fs TYPE TABLE OF v_t16fs,  " Release Strategy
      t_t16fk TYPE TABLE OF t16fk,    " Release States
      t_t024 TYPE TABLE OF t024.

DATA: "Classification Information
      t_currvalues TYPE TABLE OF s_currvalue,
      t_numvalues TYPE TABLE OF s_numvalue,
      t_charvalues TYPE TABLE OF s_charvalue,
      t_characteristics TYPE TABLE OF bapi_char,
      t_not_ekgrp TYPE TABLE OF s_not_ekgrp,
      v_classnum TYPE bapi1003_key-classnum,
      v_curr_column_output_len TYPE i.

DATA: "Dynamic Table for Classification Information
dy_table TYPE REF TO data,
      t_classification_current TYPE TABLE OF s_table_fields,
      t_classification_new TYPE TABLE OF s_table_fields.

DATA: "Dynpro Control
      lvc_t_fcat TYPE lvc_t_fcat,
      lvc_w_layout TYPE lvc_s_layo,
      lvc_t_filt TYPE lvc_t_filt,
      v_file_uploaded TYPE flag,
      v_filtered TYPE c,
      v_request TYPE trkorr,
      v_display_sel1 TYPE smp_dyntxt VALUE 'SEL1',
      v_display_sel2 TYPE smp_dyntxt VALUE 'SEL2',
      v_display_sel3 TYPE smp_dyntxt VALUE 'SEL3',
      v_display_sel4 TYPE smp_dyntxt VALUE 'SEL4',
      v_display_sel5 TYPE smp_dyntxt VALUE 'SEL5',
      v_display_request TYPE smp_dyntxt,
      c_tab TYPE c VALUE cl_abap_char_utilities=>horizontal_tab,
      c_newline TYPE c VALUE cl_abap_char_utilities=>cr_lf,
      t_tvarvc TYPE TABLE OF tvarvc,
      v_okcode TYPE syst-ucomm,
      t_log TYPE TABLE OF s_log,
      t_code TYPE TABLE OF s_code.

DATA:
      v_trkorr TYPE trkorr,
      t_file TYPE TABLE OF string,
      v_header TYPE string.


SELECTION-SCREEN BEGIN OF BLOCK bl0 WITH FRAME TITLE text-bl0.
PARAMETERS: p_rc TYPE flag RADIOBUTTON GROUP gr1,
  p_po TYPE flag RADIOBUTTON GROUP gr1,
  p_fs TYPE flag RADIOBUTTON GROUP gr1.

SELECTION-SCREEN END OF BLOCK bl0.

FIELD-SYMBOLS:
<dyn_table> TYPE STANDARD TABLE.

INITIALIZATION.
  CLEAR v_file_uploaded.

START-OF-SELECTION.
  PERFORM set_type.
  PERFORM select_data.
  PERFORM process_data.

END-OF-SELECTION.
  PERFORM call_alv.



*----------------------------------------------------------------------*
*       CLASS support_log DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS support_log DEFINITION.
  PUBLIC SECTION.
    CLASS-DATA:
          self_instance TYPE REF TO support_log.
    DATA: id TYPE bal_s_log-extnumber READ-ONLY,
          object TYPE bal_s_log-object READ-ONLY,
          subobject TYPE bal_s_log-subobject READ-ONLY,
          delimiter TYPE c VALUE '|'.
    CLASS-METHODS:
    class_constructor.
    METHODS:

* TODO ---------------------------------------------------
    log_string IMPORTING
      value(msgty) TYPE syst-msgty OPTIONAL
      value(string_value) TYPE string PREFERRED PARAMETER string_value,
    log_string_table IMPORTING
      value(msgty) TYPE syst-msgty OPTIONAL
      value(string_table) TYPE table_of_strings PREFERRED PARAMETER
      string_table,
    log_value IMPORTING value(variable) TYPE char30 value(value) TYPE
      char50,
    log_table IMPORTING value(table_data) TYPE data
          PREFERRED PARAMETER table_data,

* DONE ---------------------------------------------------
    log_text IMPORTING
      value(msgty) TYPE syst-msgty OPTIONAL
      value(text) TYPE c PREFERRED PARAMETER text,
      log_message_symsg,
    log_message IMPORTING
      value(msgid) TYPE syst-msgid
      value(msgty) TYPE syst-msgty
      value(msgno) TYPE syst-msgno
      value(msgv1) TYPE syst-msgv1
      value(msgv2) TYPE syst-msgv2
      value(msgv3) TYPE syst-msgv3
      value(msgv4) TYPE syst-msgv4,
    set_object IMPORTING value(object) TYPE balobj_d,
    set_subobject IMPORTING value(subobject) TYPE balsubobj,
    set_id IMPORTING value(id) TYPE balnrext,
      spool_split,
      spool_close,
      get_log_handler RETURNING value(handler) TYPE balloghndl,
      log_system_stack,
    constructor IMPORTING
      value(object) TYPE balobj_d OPTIONAL
      value(subobject) TYPE balsubobj OPTIONAL
      value(id) TYPE balnrext OPTIONAL.

  PROTECTED SECTION.
  PRIVATE SECTION.
    CLASS-DATA:
          system_type TYPE t000-cccategory,
          support_parameter TYPE memoryid.
    DATA: log_handler TYPE balloghndl,
          spool_handler TYPE  sy-tabix,
          spool_id TYPE tsp01-rqident.
    CLASS-METHODS:
    call_message_x IMPORTING value(prog_reference) TYPE progname
      PREFERRED PARAMETER prog_reference.
    METHODS:

* TODO ---------------------------------------------------
    log_components IMPORTING value(components) TYPE  abap_compdescr_tab,
    spool_write IMPORTING value(string_val) TYPE string
      PREFERRED PARAMETER string_val,
    spool_write_string_table IMPORTING value(string_table) TYPE
      table_of_strings,
    dump_table IMPORTING reference(table_ref) TYPE STANDARD TABLE
      RETURNING value(string_table) TYPE table_of_strings,

* DONE ---------------------------------------------------
      save_db_log,
      spool_start,

      update_handler,
      get_system_stack RETURNING value(stack) TYPE abap_callstack.

ENDCLASS. "support_log DEFINITION

*----------------------------------------------------------------------*
*       CLASS log IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS support_log IMPLEMENTATION.
  METHOD class_constructor.
    CREATE OBJECT support_log=>self_instance.
    SELECT SINGLE cccategory FROM t000 INTO support_log=>system_type
    WHERE mandt = sy-mandt.
    GET PARAMETER ID c_param_support_log FIELD
    support_log=>support_parameter.

  ENDMETHOD.                    "class_constructor
  METHOD constructor.
    IF object IS SUPPLIED.
      me->object = object.
    ENDIF.
    IF subobject IS SUPPLIED.
      me->subobject = subobject.
    ENDIF.
    IF id IS SUPPLIED.
      me->id = id.
    ENDIF.
    me->update_handler( ).
  ENDMETHOD.                    "constructor
  METHOD get_system_stack.
    CALL FUNCTION 'SYSTEM_CALLSTACK'
*     EXPORTING
*       MAX_LEVEL          = 0
    IMPORTING
      callstack          = stack
*       ET_CALLSTACK       =
      .

  ENDMETHOD.                    "get_system_stack
  METHOD set_object.
    me->object = object.
    me->update_handler( ).
  ENDMETHOD.                    "set_object
  METHOD set_subobject.
    me->subobject = subobject.
    me->update_handler( ).
  ENDMETHOD.                    "set_subobject
  METHOD set_id.
    me->id = id.
    me->update_handler( ).
  ENDMETHOD.                    "set_id
  METHOD update_handler.
    DATA: bal_s_log TYPE bal_s_log,
          timestampl TYPE timestampl.
    IF me->id IS NOT INITIAL.
      bal_s_log-extnumber = me->id.
    ELSE.
      GET TIME STAMP FIELD timestampl .
      bal_s_log-extnumber = timestampl.
      CONDENSE bal_s_log-extnumber NO-GAPS.
    ENDIF.
    IF me->object IS NOT INITIAL.
      bal_s_log-object = me->object.
    ELSE.
      bal_s_log-object = 'BTC'.
    ENDIF.
    IF me->subobject IS INITIAL AND bal_s_log-object = 'BTC'.
      bal_s_log-subobject = 'DEFAULT'.
    ELSE.
      bal_s_log-subobject = me->subobject.
    ENDIF.
    bal_s_log-aldate = sy-datum.
    bal_s_log-altime = sy-uzeit.
    bal_s_log-aluser = sy-uname.
    bal_s_log-altcode = sy-tcode.
    bal_s_log-alprog = sy-cprog.
*   BAL_S_LOG-ALMODE
*   BAL_S_LOG-ALCHDATE
*   BAL_S_LOG-ALCHTIME
*   BAL_S_LOG-ALCHUSER
*   BAL_S_LOG-ALDATE_DEL
*   BAL_S_LOG-DEL_BEFORE
*   BAL_S_LOG-ALSTATE
*   BAL_S_LOG-CONTEXT
*   BAL_S_LOG-PARAMS

    CALL FUNCTION 'BAL_LOG_CREATE'
      EXPORTING
        i_s_log                 = bal_s_log
      IMPORTING
        e_log_handle            = me->log_handler
      EXCEPTIONS
        log_header_inconsistent = 1
        OTHERS                  = 2.
    IF sy-subrc <> 0 OR me->log_handler IS INITIAL..
      support_log=>call_message_x('BAL_LOG_CREATE' ).
    ENDIF.
*    me->spool_start( ).
*
*    me->log_string( ).
  ENDMETHOD.                    "update_handler
  METHOD log_message.
    DATA: i_s_msg TYPE bal_s_msg.
    CHECK me->log_handler IS NOT INITIAL.
    i_s_msg-msgty = msgty.
    i_s_msg-msgid = msgid.
    i_s_msg-msgno = msgno.
    i_s_msg-msgv1 = msgv1.
    i_s_msg-msgv2 = msgv2.
    i_s_msg-msgv3 = msgv3.
    i_s_msg-msgv4 = msgv4.
    CALL FUNCTION 'BAL_LOG_MSG_ADD'
      EXPORTING
        i_log_handle     = me->log_handler
        i_s_msg          = i_s_msg
      EXCEPTIONS
        log_not_found    = 1
        msg_inconsistent = 2
        log_is_full      = 3
        OTHERS           = 4.
    IF sy-subrc <> 0.
      support_log=>call_message_x('BAL_LOG_MSG_ADD' ).
    ENDIF.
    me->save_db_log( ).
*
*    DATA: message_output TYPE string.
*    MESSAGE
*      ID msgid TYPE msgty NUMBER msgno
*      WITH msgv1 msgv2 msgv3 msgv4
*      INTO message_output.
*    me->spool_write( message_output ).
  ENDMETHOD.                    "log_message
  METHOD log_message_symsg.
    me->log_message(
    msgid = syst-msgid
    msgty = syst-msgty
    msgno = syst-msgno
    msgv1 = syst-msgv1
    msgv2 = syst-msgv2
    msgv3 = syst-msgv3
    msgv4 = syst-msgv4
    ).

  ENDMETHOD.                    "log_message_sy
  METHOD log_system_stack.
    DATA: stack TYPE abap_callstack.
    stack = get_system_stack( ).
    me->log_table( stack ).
  ENDMETHOD.                    "log_system_stack
  METHOD log_text.
    DATA: v_msgty TYPE syst-msgty.
    CHECK me->log_handler IS NOT INITIAL.
    IF msgty IS NOT SUPPLIED.
      v_msgty = 'I'.
    ELSE.
      v_msgty = msgty.
    ENDIF.

    DATA: c_200(200) TYPE c.
    c_200  = text.

    CALL FUNCTION 'BAL_LOG_MSG_ADD_FREE_TEXT'
    EXPORTING
      i_log_handle              = me->log_handler
      i_msgty                   = v_msgty
*       I_PROBCLASS               = '4'
      i_text                    = c_200
*       I_S_CONTEXT               =
*       I_S_PARAMS                =
*     IMPORTING
*       E_S_MSG_HANDLE            =
*       E_MSG_WAS_LOGGED          =
*       E_MSG_WAS_DISPLAYED       =
*     EXCEPTIONS
*       LOG_NOT_FOUND             = 1
*       MSG_INCONSISTENT          = 2
*       LOG_IS_FULL               = 3
*       OTHERS                    = 4
      .
    IF sy-subrc <> 0.
      support_log=>call_message_x( 'BAL_LOG_MSG_ADD_FREE_TEXT' ).
    ELSE.
      me->save_db_log( ).
    ENDIF.
    DATA: s TYPE string.
    s = text.
    me->spool_write( s ).
  ENDMETHOD.                   "log_text
  METHOD log_table.
    DATA: cl_tabledescr TYPE REF TO cl_abap_tabledescr,
          cl_structdescr TYPE REF TO cl_abap_structdescr,
          components TYPE abap_compdescr_tab,
          column_name LIKE LINE OF components.
    cl_tabledescr ?= cl_abap_typedescr=>describe_by_data( table_data ).
    cl_structdescr ?= cl_tabledescr->get_table_line_type( ).
    components = cl_structdescr->components.
    me->log_components( components ).
    FIELD-SYMBOLS: <table> TYPE ANY TABLE,
    <wa> TYPE ANY,
    <field> TYPE ANY.
    ASSIGN table_data TO <table>.

  ENDMETHOD.                    "log_table
  METHOD log_value.
  ENDMETHOD.                    "log_value
  METHOD save_db_log.
    CHECK me->log_handler IS NOT INITIAL.
*    DATA: bal_t_logh TYPE bal_t_logh,
*          balloghndl TYPE balloghndl.
*    balloghndl = me->log_handler.
*    APPEND balloghndl TO bal_t_logh.

    CALL FUNCTION 'BAL_DB_SAVE'
    EXPORTING
*    I_CLIENT                   = SY-MANDT
*    I_IN_UPDATE_TASK           = ' '
      i_save_all                 = 'X'
*    i_t_log_handle             = bal_t_logh
*    I_2TH_CONNECTION           = ' '
*    I_2TH_CONNECT_COMMIT       = ' '
*  IMPORTING
*    E_NEW_LOGNUMBERS           =
*    E_SECOND_CONNECTION        =
    EXCEPTIONS
      log_not_found              = 1
      save_not_allowed           = 2
      numbering_error            = 3
      OTHERS                     = 4
      .
    IF sy-subrc <> 0.
      support_log=>call_message_x( 'BAL_DB_SAVE').
    ENDIF.
  ENDMETHOD.                    "save_db_log
  METHOD spool_start.
    DATA: l_layout TYPE tsp01-rqpaper,
          l_title TYPE tsp01-rqtitle,
          l_doctype TYPE tsp01-rqdoctype.

    l_doctype = 'LIST'.
    l_layout = 'X_POSTSCRIPT'.

* Create Spool
    CALL FUNCTION 'RSPO_SR_OPEN'
    EXPORTING
      dest             = 'LP01'
*       LDEST            =
      layout           = l_layout
      name             = 'LOGMAN'
*       SUFFIX1          =
*       SUFFIX2          =
      copies           = '1'
*       PRIO             =
*       immediate_print  = ' '
*       AUTO_DELETE      =
      titleline        = l_title
      receiver         = syst-uname           "
*       division         = l_pri_params-prabt " abteilung
*       authority        = l_pri_params-prber           "
*       POSNAME          =
*       ACTTIME          =
*       LIFETIME         = '8'
*       APPEND           =
*       COVERPAGE        =
*       CODEPAGE         =
      doctype          = l_doctype
*       ARCHMODE         =
*       ARCHPARAMS       =
*       TELELAND         =
*       TELENUM          =
*       TELENUME         =
    IMPORTING
      handle           = me->spool_handler
      spoolid          = me->spool_id
    EXCEPTIONS
      device_missing   = 1
      name_twice       = 2
      no_such_device   = 3
      operation_failed = 4
      OTHERS           = 5
      .                                                  "#EC DOM_EQUAL
    IF sy-subrc <> 0.
      support_log=>call_message_x('RSPO_SR_OPEN').
    ENDIF.
  ENDMETHOD.                    "spool_start
  METHOD spool_write.

    DATA: l_pos TYPE i,
          l_len TYPE i,
          l_line_length TYPE i,
          l_loops TYPE i,
          l_char(c_lenght_output) TYPE c.

    l_len = STRLEN( string_val ).
    l_loops = l_len DIV c_lenght_output.

    DO l_loops TIMES.
      l_pos = ( sy-index - 1 ) * c_lenght_output + 1.

      CALL FUNCTION 'RSPO_SR_WRITE'
        EXPORTING
          handle = me->spool_handler
          text   = l_char
          length = l_line_length.
    ENDDO.
  ENDMETHOD.                    "spool_write
  METHOD spool_write_string_table.

  ENDMETHOD.                    "spool_write_string_table
  METHOD spool_close.
    CALL FUNCTION 'RSPO_SR_CLOSE'
      EXPORTING
        handle           = me->spool_handler
        pages            = 1
        final            = 'X'
      EXCEPTIONS
        handle_not_valid = 1
        operation_failed = 2
        OTHERS           = 3.
    IF sy-subrc IS NOT INITIAL.
      support_log=>call_message_x('RSPO_SR_CLOSE').
    ENDIF.
  ENDMETHOD.                    "spool_close
  METHOD spool_split.
    me->spool_close( ).
    me->spool_start( ).
    "@TODO
  ENDMETHOD.                    "spool_split
  METHOD log_components.
    DATA: component LIKE LINE OF components,
          len TYPE i,
          spaces TYPE i.
    DATA: out_string TYPE string,
          fill_space(500) TYPE c.
    CLEAR out_string.
    LOOP AT components INTO component.
      AT FIRST.
        out_string = '|'.
      ENDAT.
      IF component-decimals > 0.
        len = component-decimals + component-length + 1.
      ELSE.
        len = component-length.
      ENDIF.
      IF STRLEN( component-name ) >= len.
        CONCATENATE out_string component-name(len) INTO out_string.
      ELSE.
        spaces = len - STRLEN( component-name ).
        CONCATENATE out_string component-name fill_space(spaces) INTO
        out_string RESPECTING BLANKS.
      ENDIF.
      CONCATENATE out_string '|' INTO out_string.
    ENDLOOP.
    me->log_string( out_string ).
  ENDMETHOD.                    "log_components
  METHOD dump_table.
    "@TODO
  ENDMETHOD.                    "dump_table
  METHOD log_string.
    DATA: string_len TYPE i,
          write_pos TYPE i,
          write_len TYPE i,
          loops TYPE i.
    me->log_text( 'Logging String Value' ).
*    string_len = strlen( string_value ).
*    loops = string_len DIV c_lenght_output.
*    DO loops TIMES.
*      write_pos =  ( ( sy-index - 1 ) * c_lenght_output ) + 1.
*      IF write_pos + c_lenght_output < string_len.
*
*      ELSE.
*
*      ENDIF.
*
*    ENDDO.
    DATA: t(200) TYPE c.
    t = string_value.
    me->log_text( t ).
    me->spool_write( string_value ).
  ENDMETHOD.                    "log_string
  METHOD log_string_table.
  ENDMETHOD.                    "log_string_table
  METHOD call_message_x.
    CHECK support_log=>system_type <> 'P'.
    CHECK support_log=>support_parameter IS NOT INITIAL.
    MESSAGE x001(bl) WITH 'Un-Expected Execution'(x01) prog_reference.
  ENDMETHOD.                    "call_message_x
  METHOD get_log_handler.
    IF me->log_handler IS NOT INITIAL.
      handler = me->log_handler.
    ENDIF.
  ENDMETHOD.                    "get_log_handler
ENDCLASS. "log IMPLEMENTATION


*&---------------------------------------------------------------------*
*&      Form  fill_current_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM fill_current_data.
  FIELD-SYMBOLS:
  <dyn_wa>,
  <dyn_field>.
  DATA:
  dy_line  TYPE REF TO data.

  DATA: w_charvalue LIKE LINE OF t_charvalues,
        w_numvalue LIKE LINE OF t_numvalues,
        w_currvalue LIKE LINE OF t_currvalues,
        atwrt TYPE atwrt,
        column_number(3) TYPE n,
        component_name(30) TYPE c.
  ASSIGN dy_table->* TO <dyn_table>.
  DATA: w_t16fs LIKE LINE OF t_t16fs.
  LOOP AT t_t16fs INTO w_t16fs.
    READ TABLE <dyn_table> WITH KEY ('FRGGR') = w_t16fs-frggr ('FRGSX')
 = w_t16fs-frgsx
    ASSIGNING <dyn_wa>.
    IF sy-subrc IS INITIAL.
      ASSIGN COMPONENT 'FRGC1' OF STRUCTURE <dyn_wa> TO <dyn_field>.
      <dyn_field> = w_t16fs-frgc1.
      ASSIGN COMPONENT 'FRGC2' OF STRUCTURE <dyn_wa> TO <dyn_field>.
      <dyn_field> = w_t16fs-frgc2.
      ASSIGN COMPONENT 'FRGC3' OF STRUCTURE <dyn_wa> TO <dyn_field>.
      <dyn_field> = w_t16fs-frgc3.
      ASSIGN COMPONENT 'FRGC4' OF STRUCTURE <dyn_wa> TO <dyn_field>.
      <dyn_field> = w_t16fs-frgc4.
      ASSIGN COMPONENT 'FRGC5' OF STRUCTURE <dyn_wa> TO <dyn_field>.
      <dyn_field> = w_t16fs-frgc5.
      ASSIGN COMPONENT 'FRGC6' OF STRUCTURE <dyn_wa> TO <dyn_field>.
      <dyn_field> = w_t16fs-frgc5.
      ASSIGN COMPONENT 'FRGC7' OF STRUCTURE <dyn_wa> TO <dyn_field>.
      <dyn_field> = w_t16fs-frgc5.
      ASSIGN COMPONENT 'FRGC8' OF STRUCTURE <dyn_wa> TO <dyn_field>.
      <dyn_field> = w_t16fs-frgc5.
    ELSE.
      CREATE DATA dy_line LIKE LINE OF <dyn_table>.
      ASSIGN dy_line->* TO <dyn_wa>.
      ASSIGN COMPONENT 'FRGGR' OF STRUCTURE <dyn_wa>
      TO <dyn_field>.
      <dyn_field> = w_t16fs-frggr.
      ASSIGN COMPONENT 'FRGSX' OF STRUCTURE <dyn_wa>
      TO <dyn_field>.
      <dyn_field> =  w_t16fs-frgsx.
      ASSIGN COMPONENT 'TYPE' OF STRUCTURE <dyn_wa>
      TO <dyn_field>.
      <dyn_field> = 'C'.
      ASSIGN COMPONENT 'FRGC1' OF STRUCTURE <dyn_wa> TO <dyn_field>.
      <dyn_field> = w_t16fs-frgc1.
      ASSIGN COMPONENT 'FRGC2' OF STRUCTURE <dyn_wa> TO <dyn_field>.
      <dyn_field> = w_t16fs-frgc2.
      ASSIGN COMPONENT 'FRGC3' OF STRUCTURE <dyn_wa> TO <dyn_field>.
      <dyn_field> = w_t16fs-frgc3.
      ASSIGN COMPONENT 'FRGC4' OF STRUCTURE <dyn_wa> TO <dyn_field>.
      <dyn_field> = w_t16fs-frgc4.
      ASSIGN COMPONENT 'FRGC5' OF STRUCTURE <dyn_wa> TO <dyn_field>.
      <dyn_field> = w_t16fs-frgc5.
      ASSIGN COMPONENT 'FRGC6' OF STRUCTURE <dyn_wa> TO <dyn_field>.
      <dyn_field> = w_t16fs-frgc6.
      ASSIGN COMPONENT 'FRGC7' OF STRUCTURE <dyn_wa> TO <dyn_field>.
      <dyn_field> = w_t16fs-frgc7.
      ASSIGN COMPONENT 'FRGC8' OF STRUCTURE <dyn_wa> TO <dyn_field>.
      <dyn_field> = w_t16fs-frgc8.
      ASSIGN COMPONENT 'SEQ' OF STRUCTURE <dyn_wa> TO <dyn_field>.
      <dyn_field> = 0.
      ASSIGN COMPONENT 'COLOR' OF STRUCTURE <dyn_wa> TO <dyn_field>.
      <dyn_field> = 'C611'.
      APPEND <dyn_wa> TO <dyn_table>.
    ENDIF.
  ENDLOOP.
  LOOP AT t_charvalues INTO w_charvalue.

    READ TABLE <dyn_table>
     WITH KEY ('FRGGR') = w_charvalue-frggr
              ('FRGSX') = w_charvalue-frgsx
               ('SEQ') = w_charvalue-entry

    ASSIGNING <dyn_wa>.
    IF sy-subrc IS NOT INITIAL.
      CREATE DATA dy_line LIKE LINE OF <dyn_table>.
      ASSIGN dy_line->* TO <dyn_wa>.
      ASSIGN COMPONENT 'FRGGR' OF STRUCTURE <dyn_wa>
        TO <dyn_field>.
      <dyn_field> = w_charvalue-frggr.
      ASSIGN COMPONENT 'FRGSX' OF STRUCTURE <dyn_wa>
        TO <dyn_field>.
      <dyn_field> = w_charvalue-frgsx.
      ASSIGN COMPONENT 'SEQ' OF STRUCTURE <dyn_wa>
        TO <dyn_field>.
      <dyn_field> = w_charvalue-entry.
      APPEND <dyn_wa> TO <dyn_table> ASSIGNING <dyn_wa>.
    ENDIF.
    ASSIGN COMPONENT w_charvalue-table_field OF STRUCTURE <dyn_wa>
    TO <dyn_field>.
    IF sy-subrc IS INITIAL.
      <dyn_field> = w_charvalue-value_neutral.
    ENDIF.
  ENDLOOP.

  LOOP AT t_currvalues INTO w_currvalue.
    LOOP AT t_t16fs INTO w_t16fs.
      READ TABLE <dyn_table>
        WITH KEY ('FRGGR') = w_currvalue-frggr
                  ('FRGSX') = w_currvalue-frgsx
                  ('SEQ') = w_currvalue-entry
      ASSIGNING <dyn_wa>.
      IF sy-subrc IS NOT INITIAL.
        CREATE DATA dy_line LIKE LINE OF <dyn_table>.
        ASSIGN dy_line->* TO <dyn_wa>.
        ASSIGN COMPONENT 'FRGGR' OF STRUCTURE <dyn_wa>
        TO <dyn_field>.
        <dyn_field> = w_currvalue-frggr.
        ASSIGN COMPONENT 'FRGSX' OF STRUCTURE <dyn_wa>
        TO <dyn_field>.
        <dyn_field> = w_currvalue-frgsx.
        ASSIGN COMPONENT 'SEQ' OF STRUCTURE <dyn_wa>
        TO <dyn_field>.
        <dyn_field> = w_currvalue-entry.
        APPEND <dyn_wa> TO <dyn_table> ASSIGNING <dyn_wa>.
      ENDIF.
      ASSIGN COMPONENT w_currvalue-table_field OF STRUCTURE <dyn_wa>
      TO <dyn_field>.
      CALL FUNCTION 'CTBP_CONVERT_VALUE_INT_TO_EXT'
      EXPORTING
        charactname             = w_currvalue-charact
        value_from              = w_currvalue-value_from
        value_to                = w_currvalue-value_to
        value_relation          = w_currvalue-value_relation
*       CHARACTDETAIL           =
      IMPORTING
        value_external          = atwrt
*     EXCEPTIONS
*       CHARACT_NOT_FOUND       = 1
*       NO_AUTHORITY            = 2
*       WRONG_DATA_TYPE         = 3
*       INTERNAL_ERROR          = 4
*       WRONG_INPUT             = 5
*       WRONG_FORMAT            = 6
*       OTHERS                  = 7
        .
      <dyn_field> = atwrt.
      DATA: len_atwrt TYPE i.
      len_atwrt = STRLEN( atwrt ).
      IF len_atwrt > v_curr_column_output_len.
        v_curr_column_output_len = len_atwrt.
      ENDIF.
    ENDLOOP.
  ENDLOOP.
*  DATA: w_t16fv TYPE t16fv.
*  LOOP AT t_t16fs INTO w_t16fs.
*    READ TABLE <dyn_table> WITH KEY ('FRGGR') = w_t16fs-frggr ('FRGSX')
* = w_t16fs-frgsx
*    ASSIGNING <dyn_wa>.
*    IF sy-subrc IS INITIAL.
*      ASSIGN COMPONENT 'SEQ' OF STRUCTURE <dyn_wa> TO <dyn_field>.
*      CHECK <dyn_field> IS ASSIGNED.
*      IF w_t16fs-frgc2 IS INITIAL AND w_t16fs-frgc3 IS INITIAL
*      AND w_t16fs-frgc4 IS INITIAL AND w_t16fs-frgc5 IS INITIAL.
*        <dyn_field> = 'S'.
*      ELSE.
*        SELECT * UP TO 1 ROWS FROM t16fv
*        INTO w_t16fv
*        WHERE frggr = w_t16fs-frggr AND frgsx = w_t16fs-frgsx
*        AND ( frga1 = '+' OR frga2 = '+' OR frga3 = '+'
*        OR frga4 = '+' OR frga5 = '+' OR frga6 = '+' OR frga7 = '+'
*        OR frga8 = '+' ).
*        ENDSELECT.
*        IF sy-subrc IS INITIAL.
*          SELECT * UP TO 1 ROWS FROM t16fv
*          INTO w_t16fv
*          WHERE frggr = w_t16fs-frggr AND frgsx = w_t16fs-frgsx
*          AND ( frga2 = 'X' AND frga1 = ' ' ).
*          ENDSELECT.
*          IF sy-subrc IS INITIAL.
*            <dyn_field> = 'M2'.
*          ELSE.
*            <dyn_field> = 'S'.
*          ENDIF.
*        ELSE.
*          <dyn_field> = 'R'.
*        ENDIF.
*      ENDIF.
*    ENDIF.
*  ENDLOOP.
*  DATA: w_log TYPE s_log.
*  IF t_log[] IS NOT INITIAL.
*    LOOP AT t_log INTO w_log.
*      READ TABLE <dyn_table> WITH KEY ('FRGGR') = w_log-frggr ('FRGSX')
* = w_log-frgsx
*      TRANSPORTING NO FIELDS.
*      IF sy-subrc IS NOT INITIAL.
*        CREATE DATA dy_line LIKE LINE OF <dyn_table>.
*        ASSIGN dy_line->* TO <dyn_wa>.
*        ASSIGN COMPONENT 'FRGGR' OF STRUCTURE <dyn_wa> TO <dyn_field>.
*        <dyn_field> = w_log-frggr.
*        ASSIGN COMPONENT 'FRGSX' OF STRUCTURE <dyn_wa> TO <dyn_field>.
*        <dyn_field> = w_log-frgsx.
*        ASSIGN COMPONENT 'LOG_STATUS' OF STRUCTURE <dyn_wa> TO
*<dyn_field>.
*        IF w_log-has_error IS NOT INITIAL.
*          <dyn_field> = c_icon_led_red.
*        ENDIF.
*        APPEND <dyn_wa> TO <dyn_table>.
*      ENDIF.
*    ENDLOOP.
*  ENDIF.
ENDFORM. " FILL_CURRENT
*&---------------------------------------------------------------------*
*&      Form  CALL_ALV
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM call_alv .
  "log_system_stack.

  ASSIGN dy_table->* TO <dyn_table>.

  PERFORM adjust_field_cat.
  PERFORM adjust_layout.
  PERFORM adjust_filter.
  DATA: ref_grid TYPE REF TO cl_gui_alv_grid.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
*        EXPORTING
*          ir_salv_fullscreen_adapter = ref_grid.
  IMPORTING
*         ET_EXCLUDING                     =
*         E_REPID                          =
*         E_CALLBACK_PROGRAM               =
*         E_CALLBACK_ROUTINE               =
    e_grid                           = ref_grid.
*         ET_FIELDCAT_LVC                  =
*         ER_TRACE                         =
*         E_FLG_NO_HTML                    =
*         ES_LAYOUT_KKBLO                  =
*         ES_SEL_HIDE                      =
*         ET_EVENT_EXIT                    =
*         ER_FORM_TOL                      =
*         ER_FORM_EOL                      =
  .

  IF ref_grid IS NOT INITIAL.
    CALL METHOD ref_grid->set_table_for_first_display
    EXPORTING
*      i_buffer_active               =
*      i_bypassing_buffer            =
*      i_consistency_check           =
*      i_structure_name              =
*      is_variant                    =
*      i_save                        =
*      i_default                     = 'X'
      is_layout                     = lvc_w_layout
*      is_print                      =
*      it_special_groups             =
*      it_toolbar_excluding          =
*      it_hyperlink                  =
*      it_alv_graphics               =
*      it_except_qinfo               =
*      ir_salv_adapter               =
    CHANGING
      it_outtab                     = <dyn_table>
      it_fieldcatalog               = lvc_t_fcat
*     it_sort                       =
      it_filter                     = lvc_t_filt
*     EXCEPTIONS
*     invalid_parameter_combination = 1
*     program_error                 = 2
*     too_many_lines                = 3
*     others                        = 4
      .
    IF sy-subrc <> 0.
*       MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*                  WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    ENDIF.
  ELSE.
    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
*     I_INTERFACE_CHECK                 = ' '
*     I_BYPASSING_BUFFER                =
*     I_BUFFER_ACTIVE                   =
      i_callback_program                = sy-cprog
      i_callback_pf_status_set          = 'SET_PF_STATUS'
      i_callback_user_command           = 'USER_COMMAND'
*     I_CALLBACK_TOP_OF_PAGE            = ' '
*     I_CALLBACK_HTML_TOP_OF_PAGE       = ' '
*     I_CALLBACK_HTML_END_OF_LIST       = ' '
*     I_STRUCTURE_NAME                  =
*     I_BACKGROUND_ID                   = ' '
*     I_GRID_TITLE                      =
*     I_GRID_SETTINGS                   =
      is_layout_lvc                     = lvc_w_layout
      it_fieldcat_lvc                   = lvc_t_fcat
*     IT_EXCLUDING                      =
*     IT_SPECIAL_GROUPS_LVC             =
*     IT_SORT_LVC                       =
      it_filter_lvc                     = lvc_t_filt
*     IT_HYPERLINK                      =
*     IS_SEL_HIDE                       =
*     I_DEFAULT                         = 'X'
*     I_SAVE                            = ' '
*     IS_VARIANT                        =
*     IT_EVENTS                         =
*     IT_EVENT_EXIT                     =
*     IS_PRINT_LVC                      =
*     IS_REPREP_ID_LVC                  =
*     I_SCREEN_START_COLUMN             = 0
*     I_SCREEN_START_LINE               = 0
*     I_SCREEN_END_COLUMN               = 0
*     I_SCREEN_END_LINE                 = 0
*     I_HTML_HEIGHT_TOP                 =
*     I_HTML_HEIGHT_END                 =
*     IT_ALV_GRAPHICS                   =
*     IT_EXCEPT_QINFO_LVC               =
*     IR_SALV_FULLSCREEN_ADAPTER        =
*   IMPORTING
*     E_EXIT_CAUSED_BY_CALLER           =
*     ES_EXIT_CAUSED_BY_USER            =
    TABLES
      t_outtab                          = <dyn_table>
*   EXCEPTIONS
*     PROGRAM_ERROR                     = 1
*     OTHERS                            = 2
      .
    IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    ENDIF.
  ENDIF.
ENDFORM. " CALL_ALV
*&---------------------------------------------------------------------*
*&      Form  ADJUST_FIELD_CAT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM adjust_field_cat .
  PERFORM set_field_cat_value USING :
        "field check_value column value.
        'FIELDNAME' 'FRGGR' 'ROLLNAME' 'FRGGR',
        'FIELDNAME' 'FRGSX' 'ROLLNAME' 'FRGSX',
        'FIELDNAME' 'FRGGR' 'KEY' 'X',
        'FIELDNAME' 'FRGSX' 'KEY' 'X',
        'FIELDNAME' 'FRGC1' 'ROLLNAME' 'FRGCO',
        'FIELDNAME' 'FRGC2' 'ROLLNAME' 'FRGCO',
        'FIELDNAME' 'FRGC3' 'ROLLNAME' 'FRGCO',
        'FIELDNAME' 'FRGC4' 'ROLLNAME' 'FRGCO',
        'FIELDNAME' 'FRGC5' 'ROLLNAME' 'FRGCO',
        'FIELDNAME' 'FRGC6' 'ROLLNAME' 'FRGCO',
        'FIELDNAME' 'FRGC7' 'ROLLNAME' 'FRGCO',
        'FIELDNAME' 'FRGC8' 'ROLLNAME' 'FRGCO',
        'FIELDNAME' 'FRGC1' 'EMPHASIZE' 'X',
        'FIELDNAME' 'FRGC2' 'EMPHASIZE' 'X',
        'FIELDNAME' 'FRGC3' 'EMPHASIZE' 'X',
        'FIELDNAME' 'FRGC4' 'EMPHASIZE' 'X',
        'FIELDNAME' 'FRGC5' 'EMPHASIZE' 'X',
        'FIELDNAME' 'FRGC6' 'EMPHASIZE' 'X',
        'FIELDNAME' 'FRGC7' 'EMPHASIZE' 'X',
        'FIELDNAME' 'FRGC8' 'EMPHASIZE' 'X',
        "   'FIELDNAME' 'MARK' 'NO_OUT' 'X',
        'FIELDNAME' 'COLOR' 'NO_OUT' 'X',
        'FIELDNAME' 'TYPE' 'NO_OUT' 'X',
        'FIELDNAME' 'SCPR_HANDL' 'NO_OUT' 'X',
        'FIELDNAME' 'DISPLAY' 'NO_OUT' 'X',
*        'FIELDNAME' 'SEQ' 'NO_OUT' 'X',
        'FIELDNAME' 'LOG_STATUS' 'ICON' 'X',
        'FIELDNAME' 'LOG_STATUS' 'OUTPUTLEN' '3',
        'FIELDNAME' 'LOG_STATUS' 'SCRTEXT_S' 'Log',
        'FIELDNAME' 'SEQ' 'SCRTEXT_S' 'Seq.',
        'FIELDNAME' 'LOG_STATUS' 'NO_OUT' 'X',
         'FIELDNAME' 'STATUS' 'NO_OUT' 'X'.

  PERFORM set_field_cat_ekgrp.
  PERFORM set_field_cat_curr.
  PERFORM set_field_cat_class_descr.

ENDFORM. " ADJUST_FIELD_CAT
*&---------------------------------------------------------------------*
*&      Form  SET_FIELD_CAT_VALUE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_FIELD  text
*      -->P_CHECK_VALUE  text
*      -->P_COLUMN  text
*      -->P_VALUE  text
*----------------------------------------------------------------------*
FORM set_field_cat_value USING p_field p_check_value p_column p_value.
  FIELD-SYMBOLS:
  <dyn_wa>,
  <dyn_field>.
  DATA:
  dy_line  TYPE REF TO data.

  FIELD-SYMBOLS: <lvc_s_fcat> TYPE lvc_s_fcat.
  READ TABLE lvc_t_fcat ASSIGNING <lvc_s_fcat>
  WITH KEY (p_field) = p_check_value.
  CHECK sy-subrc IS INITIAL.
  ASSIGN COMPONENT p_column OF STRUCTURE <lvc_s_fcat> TO <dyn_field>.
  CHECK sy-subrc IS INITIAL.
  <dyn_field> = p_value.
ENDFORM. " SET_FIELD_CAT_VALUE
*&---------------------------------------------------------------------*
*&      Form  SET_FIELD_CAT_EKGRP
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM set_field_cat_ekgrp .
  DATA: w_t024 TYPE t024,
        fieldname TYPE lvc_fname.
  LOOP AT t_t024 INTO w_t024.
    CONCATENATE 'EKGRP_' w_t024-ekgrp INTO fieldname.
    PERFORM set_field_cat_value USING:
          'FIELDNAME' fieldname 'SCRTEXT_L' w_t024-ekgrp,
          'FIELDNAME' fieldname 'SCRTEXT_M' w_t024-ekgrp,
          'FIELDNAME' fieldname 'SCRTEXT_S' w_t024-ekgrp,
          'FIELDNAME' fieldname 'OUTPUTLEN' 3.
  ENDLOOP.
ENDFORM. " SET_FIELD_CAT_EKGRP
*&---------------------------------------------------------------------*
*&      Form  SET_FIELD_CAT_CURR
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM set_field_cat_curr .
  FIELD-SYMBOLS: <lvc_s_fcat> TYPE lvc_s_fcat.
  DATA: len_curr TYPE i.
  len_curr = v_curr_column_output_len + 1.
  LOOP AT lvc_t_fcat ASSIGNING <lvc_s_fcat> WHERE fieldname(5) =
'GNETW'.
    PERFORM set_field_cat_value USING:
          'FIELDNAME' <lvc_s_fcat>-fieldname 'OUTPUTLEN' len_curr,
          'FIELDNAME' <lvc_s_fcat>-fieldname 'SCRTEXT_S' 'Valor'.
  ENDLOOP.
  CLEAR v_curr_column_output_len.

ENDFORM. " SET_FIELD_CAT_CURR
*&---------------------------------------------------------------------*
*&      Form  SET_FIELD_CAT_CLASS_DESCR
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM set_field_cat_class_descr .
  FIELD-SYMBOLS: <lvc_s_fcat> TYPE lvc_s_fcat.
  LOOP AT lvc_t_fcat ASSIGNING <lvc_s_fcat>
    WHERE fieldname(5) = 'BSART'.
    PERFORM set_field_cat_value USING:
          'FIELDNAME' <lvc_s_fcat>-fieldname 'SCRTEXT_S' 'Tipo'.
  ENDLOOP.
  LOOP AT lvc_t_fcat ASSIGNING <lvc_s_fcat>
    WHERE fieldname(5) = 'BSART'.
    PERFORM set_field_cat_value USING:
          'FIELDNAME' <lvc_s_fcat>-fieldname 'SCRTEXT_S' 'Tip'.
  ENDLOOP.
  LOOP AT lvc_t_fcat ASSIGNING <lvc_s_fcat>
    WHERE fieldname(5) = 'BSTYP'.
    PERFORM set_field_cat_value USING:
          'FIELDNAME' <lvc_s_fcat>-fieldname 'SCRTEXT_S' 'Cat'.
  ENDLOOP.
  LOOP AT lvc_t_fcat ASSIGNING <lvc_s_fcat>
    WHERE fieldname = 'ZZDEPTO'.
    PERFORM set_field_cat_value USING:
          'FIELDNAME' <lvc_s_fcat>-fieldname 'SCRTEXT_S' 'Depto',
          'FIELDNAME' <lvc_s_fcat>-fieldname 'SCRTEXT_M' 'Depto',
          'FIELDNAME' <lvc_s_fcat>-fieldname 'SCRTEXT_L' 'Depto'.
  ENDLOOP.
  LOOP AT lvc_t_fcat ASSIGNING <lvc_s_fcat>
    WHERE fieldname = 'BUKRS'.
    PERFORM set_field_cat_value USING:
          'FIELDNAME' <lvc_s_fcat>-fieldname 'SCRTEXT_S' 'Empr.',
          'FIELDNAME' <lvc_s_fcat>-fieldname 'SCRTEXT_M' 'Empr',
          'FIELDNAME' <lvc_s_fcat>-fieldname 'SCRTEXT_L' 'Empr'.
  ENDLOOP.
  LOOP AT lvc_t_fcat ASSIGNING <lvc_s_fcat>
  WHERE fieldname = 'MATKL'.
    PERFORM set_field_cat_value USING:
          'FIELDNAME' <lvc_s_fcat>-fieldname 'SCRTEXT_S' 'Gr.Merc.',
          'FIELDNAME' <lvc_s_fcat>-fieldname 'SCRTEXT_M' 'Gr.Merc.',
          'FIELDNAME' <lvc_s_fcat>-fieldname 'SCRTEXT_L' 'Gr.Merc.'.
  ENDLOOP.
  LOOP AT lvc_t_fcat ASSIGNING <lvc_s_fcat>
  WHERE fieldname = 'GNETW'.
    PERFORM set_field_cat_value USING:
          'FIELDNAME' <lvc_s_fcat>-fieldname 'SCRTEXT_S' 'Valor',
          'FIELDNAME' <lvc_s_fcat>-fieldname 'SCRTEXT_M' 'Valor',
          'FIELDNAME' <lvc_s_fcat>-fieldname 'SCRTEXT_L' 'Valor'.
  ENDLOOP.

  LOOP AT lvc_t_fcat ASSIGNING <lvc_s_fcat>
  WHERE fieldname = 'DISPO'.
    PERFORM set_field_cat_value USING:
          'FIELDNAME' <lvc_s_fcat>-fieldname 'SCRTEXT_S' 'Envio',
          'FIELDNAME' <lvc_s_fcat>-fieldname 'SCRTEXT_M' 'Envio',
          'FIELDNAME' <lvc_s_fcat>-fieldname 'SCRTEXT_L' 'Envio'.
  ENDLOOP.
  LOOP AT lvc_t_fcat ASSIGNING <lvc_s_fcat>
  WHERE fieldname = 'WERKS'.
    PERFORM set_field_cat_value USING:
          'FIELDNAME' <lvc_s_fcat>-fieldname 'SCRTEXT_S' 'Centro'.
  ENDLOOP.


ENDFORM. " SET_FIELD_CAT_CLASS_DESCR


*&---------------------------------------------------------------------*
*&      Form  user_command
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->UCOMM      text
*      -->SELFIELD   text
*----------------------------------------------------------------------*
FORM user_command USING ucomm LIKE sy-ucomm selfield TYPE slis_selfield.
  DATA : ok_code TYPE sy-ucomm.
  ok_code = ucomm.
  CASE ok_code.
    WHEN '&IC1'. "for double click on alv grid line
      IF selfield-fieldname(4) = 'FRGC'.
        CHECK v_file_uploaded IS INITIAL.
        PERFORM reset_filter.
        PERFORM filter_by_release_code USING selfield-value.
        selfield-row_stable = selfield-col_stable = selfield-refresh =
  'X'.
        v_filtered = 'X'.
      ENDIF.
      IF selfield-fieldname = 'FRGGR'.
        CHECK v_file_uploaded IS INITIAL.
        PERFORM reset_filter.
        PERFORM filter_by_release_group USING selfield-value.
        selfield-row_stable = selfield-col_stable
                            = selfield-refresh = 'X'.
        v_filtered = 'X'.
      ENDIF.
      DATA ref1 TYPE REF TO cl_gui_alv_grid.
      CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
        IMPORTING
          e_grid = ref1.
      CALL METHOD ref1->check_changed_data.

    WHEN 'ZDOWN'.
      PERFORM download_file.
     selfield-row_stable = selfield-col_stable = selfield-refresh = 'X'.
    WHEN 'ZUP'.
      PERFORM upload_file.
      PERFORM process_data.
      PERFORM call_alv.


  ENDCASE.
ENDFORM. "user_command


*&---------------------------------------------------------------------*
*&      Form  set_pf_status
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->RT_EXTAB   text
*----------------------------------------------------------------------*
FORM set_pf_status USING rt_extab TYPE slis_t_extab.
  PERFORM load_tvarv_data.

  DATA: t_tvarvc_name TYPE TABLE OF tvarvc,
        w_tvarvc LIKE LINE OF t_tvarvc,
        n_button(1) TYPE n,
        pf_button(16) TYPE c,
        f_code(10) TYPE c,
        w_extab TYPE slis_extab.
  FIELD-SYMBOLS:
  <dyn_wa>,
  <dyn_field>.

  t_tvarvc_name[] = t_tvarvc[].
  DELETE ADJACENT DUPLICATES FROM t_tvarvc_name COMPARING name.
  SORT t_tvarvc_name BY name.
  DO 5 TIMES.
    n_button = sy-index.
    CONCATENATE 'ZSEL' n_button INTO f_code.
    READ TABLE t_tvarvc_name INDEX sy-index INTO w_tvarvc.
    IF sy-subrc IS INITIAL.
      DELETE rt_extab WHERE fcode = f_code.
      CONCATENATE 'V_DISPLAY_SEL' n_button INTO pf_button.
      ASSIGN (pf_button) TO <dyn_field>.
      CHECK <dyn_field> IS ASSIGNED.
      <dyn_field> = w_tvarvc-name+10(4).
    ELSE.
      CLEAR w_extab.
      w_extab-fcode = f_code.
      APPEND w_extab TO rt_extab.
    ENDIF.
  ENDDO.

  DELETE rt_extab WHERE fcode = 'ZPROC'.
  ASSIGN dy_table->* TO <dyn_table>.
  IF v_file_uploaded IS INITIAL.
    w_extab-fcode = 'ZPROC'.
    APPEND w_extab TO rt_extab.
    w_extab-fcode = 'ZREQ'.
    APPEND w_extab TO rt_extab.
  ELSE.
    CLEAR w_extab-fcode.
*    LOOP AT <dyn_table> ASSIGNING <dyn_wa>.
*      CHECK w_extab-fcode IS INITIAL.
*      ASSIGN COMPONENT 'STATUS' OF STRUCTURE <dyn_wa> TO <dyn_field>.
*      IF <dyn_field> IS NOT INITIAL.
*        w_extab-fcode = 'ZPROC'.
*      ENDIF.
*    ENDLOOP.
*    IF w_extab-fcode IS INITIAL.
*      APPEND w_extab TO rt_extab.
*    ENDIF.
    w_extab-fcode = 'ZDOWN'.
    APPEND w_extab TO rt_extab.
    IF v_trkorr IS INITIAL.
      v_display_request = 'Request'.
    ELSE.
      CONCATENATE 'Request: ' v_trkorr INTO v_display_request
RESPECTING BLANKS.
    ENDIF.
  ENDIF.
  IF v_filtered IS INITIAL.
    w_extab-fcode = 'ZNOFILTER'.
    APPEND w_extab TO rt_extab.
  ENDIF.
  IF t_log[] IS NOT INITIAL.
    w_extab-fcode = 'ZDOWN'.
    APPEND w_extab TO rt_extab.
    w_extab-fcode = 'ZUP'.
    APPEND w_extab TO rt_extab.
  ENDIF.
  IF t_code[] IS INITIAL.
    w_extab-fcode = 'ZCODE'.
    APPEND w_extab TO rt_extab.
  ENDIF.

  SET PF-STATUS 'STANDARD' EXCLUDING rt_extab.
ENDFORM. "Set_pf_status
*&---------------------------------------------------------------------*
*&      Form  LOAD_TVARV_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM load_tvarv_data .
  REFRESH t_tvarvc.
  SELECT * FROM tvarvc INTO TABLE t_tvarvc
  WHERE name LIKE 'ZMMR50230%' AND type = 'S'.
ENDFORM. " LOAD_TVARV_DATA
*&---------------------------------------------------------------------*
*&      Form  DOWNLOAD_FILE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM download_file .
  FIELD-SYMBOLS:
  <dyn_wa>,
  <dyn_field>.
  DATA:
  dy_line  TYPE REF TO data.

  DATA: ref_cl_abap_tabledescr TYPE REF TO cl_abap_tabledescr,
        abap_keydescr_tab TYPE abap_keydescr_tab.
  ASSIGN dy_table->* TO <dyn_table>.
  TYPES: ty_line(20000) TYPE c.
  DATA: field LIKE LINE OF  abap_keydescr_tab,
        line TYPE ty_line,
        field_cat LIKE LINE OF  lvc_t_fcat,
        t_file_save TYPE TABLE OF ty_line.

  CHECK <dyn_table> IS ASSIGNED.
  ref_cl_abap_tabledescr ?= cl_abap_typedescr=>describe_by_data(
<dyn_table> ).
  abap_keydescr_tab = ref_cl_abap_tabledescr->key.

  DATA: fullpath TYPE string,
        filename TYPE string,
        path TYPE string,
        user_action TYPE i,
        encoding TYPE abap_encoding.
  CALL METHOD cl_gui_frontend_services=>file_save_dialog
  EXPORTING
    window_title         = 'Download'
    "with_encoding        = 'X'
    "initial_directory    = 'C:\'
  CHANGING
    filename             = filename
    path                 = path
    fullpath             = fullpath
    user_action          = user_action
    file_encoding        = encoding
  EXCEPTIONS
    cntl_error           = 1
    error_no_gui         = 2
    not_supported_by_gui = 3
    OTHERS               = 4.
  IF sy-subrc <> 0.
    EXIT.
  ENDIF.
  IF user_action <> cl_gui_frontend_services=>action_ok.
    EXIT.
  ENDIF.

  " Write Header
  CLEAR line.
  LOOP AT abap_keydescr_tab INTO field.
    READ TABLE lvc_t_fcat INTO field_cat WITH KEY fieldname = field.
    CHECK sy-subrc IS INITIAL.
    IF field_cat-no_out IS INITIAL.
      IF line IS INITIAL.
        line = field.
      ELSE.
        CONCATENATE line c_tab field INTO line.
      ENDIF.
    ENDIF.
  ENDLOOP.
  APPEND line TO t_file_save.

  " Write Data
  LOOP AT <dyn_table> ASSIGNING <dyn_wa>.
    CLEAR line.
    ASSIGN COMPONENT 'DISPLAY' OF STRUCTURE <dyn_wa> TO <dyn_field>.
    CHECK <dyn_field> IS ASSIGNED.
    CHECK <dyn_field> = 'X'.
    LOOP AT abap_keydescr_tab INTO field.
      READ TABLE lvc_t_fcat INTO field_cat WITH KEY fieldname = field.
      CHECK sy-subrc IS INITIAL.
      IF field_cat-no_out IS INITIAL.
        ASSIGN COMPONENT field OF STRUCTURE <dyn_wa> TO <dyn_field>.
        CHECK <dyn_field> IS ASSIGNED.
        IF line IS INITIAL.
          line = <dyn_field>.
        ELSE.
          CONCATENATE line c_tab <dyn_field> INTO line.
        ENDIF.
      ENDIF.
    ENDLOOP.
    APPEND line TO t_file_save.
  ENDLOOP.
  DATA: length TYPE i.
  CALL FUNCTION 'GUI_DOWNLOAD'
    EXPORTING
      filename                = fullpath
      filetype                = 'ASC'
    IMPORTING
      filelength              = length
    TABLES
      data_tab                = t_file_save
    EXCEPTIONS
      file_write_error        = 1
      no_batch                = 2
      gui_refuse_filetransfer = 3
      invalid_type            = 4
      no_authority            = 5
      unknown_error           = 6
      header_not_allowed      = 7
      separator_not_allowed   = 8
      filesize_not_allowed    = 9
      header_too_long         = 10
      dp_error_create         = 11
      dp_error_send           = 12
      dp_error_write          = 13
      unknown_dp_error        = 14
      access_denied           = 15
      dp_out_of_memory        = 16
      disk_full               = 17
      dp_timeout              = 18
      file_not_found          = 19
      dataprovider_exception  = 20
      control_flush_error     = 21
      OTHERS                  = 22.
ENDFORM. " DOWNLOAD_FILE
*&---------------------------------------------------------------------*
*&      Form  UPLOAD_FILE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM upload_file .
  DATA:
        fullpath TYPE string,
        filename TYPE filetable,
        path TYPE string,
        user_action TYPE i,
        rc TYPE i,
        encoding TYPE abap_encoding,
        field_cat LIKE LINE OF  lvc_t_fcat.

  CALL METHOD cl_gui_frontend_services=>file_open_dialog
  EXPORTING
    window_title            = 'Upload'
*     default_extension       =
*     default_filename        =
*     file_filter             =
*     with_encoding           =
*     initial_directory       =
*     multiselection          =
  CHANGING
    file_table              = filename
    rc                      = rc
    user_action             = user_action
    "file_encoding           = abap_encoding
  EXCEPTIONS
    file_open_dialog_failed = 1
    cntl_error              = 2
    error_no_gui            = 3
    not_supported_by_gui    = 4
    OTHERS                  = 5.
  IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.


  DATA: string_filename TYPE string.
  READ TABLE filename INDEX 1 INTO string_filename.
  CALL FUNCTION 'GUI_UPLOAD'
  EXPORTING
    filename                      = string_filename
*     FILETYPE                      = 'ASC'
*     HAS_FIELD_SEPARATOR           = ' '
*     HEADER_LENGTH                 = 0
*     READ_BY_LINE                  = 'X'
*     DAT_MODE                      = ' '
*     CODEPAGE                      = ' '
*     IGNORE_CERR                   = ABAP_TRUE
*     REPLACEMENT                   = '#'
*     CHECK_BOM                     = ' '
*     VIRUS_SCAN_PROFILE            =
*     NO_AUTH_CHECK                 = ' '
*   IMPORTING
*     FILELENGTH                    =
*     HEADER                        =
  TABLES
    data_tab                      = t_file
  EXCEPTIONS
    file_open_error               = 1
    file_read_error               = 2
    no_batch                      = 3
    gui_refuse_filetransfer       = 4
    invalid_type                  = 5
    no_authority                  = 6
    unknown_error                 = 7
    bad_data_format               = 8
    header_not_allowed            = 9
    separator_not_allowed         = 10
    header_too_long               = 11
    unknown_dp_error              = 12
    access_denied                 = 13
    dp_out_of_memory              = 14
    disk_full                     = 15
    dp_timeout                    = 16
    OTHERS                        = 17
    .
  IF sy-subrc IS INITIAL.
    v_file_uploaded = 'X'.
    CLEAR t_log[].
  ELSE.
    CLEAR v_file_uploaded.
  ENDIF.
ENDFORM. " UPLOAD_FILE
*&---------------------------------------------------------------------*
*&      Form  ADJUST_LAYOUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM adjust_layout .
  CLEAR lvc_w_layout.
  lvc_w_layout-info_fname = 'COLOR'.
  lvc_w_layout-box_fname = 'MARK'.
  lvc_w_layout-no_toolbar = 'X'.
  "lvc_w_layout-ctab_fname = 'CELL'.
ENDFORM. " ADJUST_LAYOUT

*&---------------------------------------------------------------------*
*&      Form  FILL_NEW_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM fill_new_data .
  DATA: header TYPE string,
        fields TYPE table_of_strings,
        i_field TYPE i,
        field TYPE string,
        w_line TYPE string,
        w_value TYPE string,
        t_values TYPE table_of_strings,
  dy_line  TYPE REF TO data.
  FIELD-SYMBOLS: <dyn_wa>,
  <dyn_field>.

  CHECK v_file_uploaded IS NOT INITIAL.
  ASSIGN dy_table->* TO <dyn_table>.
  CHECK <dyn_table> IS ASSIGNED.

  READ TABLE t_file INDEX 1 INTO v_header.
  DELETE t_file INDEX 1.

  SPLIT v_header AT c_tab INTO TABLE fields.
  LOOP AT t_file INTO w_line.
    SPLIT w_line AT c_tab INTO TABLE t_values.
    CHECK LINES( t_values ) > 8.
    CREATE DATA dy_line LIKE LINE OF <dyn_table>.
    ASSIGN dy_line->* TO <dyn_wa>.

    LOOP AT fields INTO field.
      i_field = sy-tabix.
      READ TABLE t_values INTO w_value INDEX i_field.
      CHECK sy-subrc IS INITIAL.
      CHECK field IS NOT INITIAL.
      ASSIGN COMPONENT field OF STRUCTURE <dyn_wa>
      TO <dyn_field>.
      CHECK <dyn_field> IS ASSIGNED.
      IF field = 'FRGSX'.
        DATA: frgsx TYPE frgsx.
        frgsx = w_value.
        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
          EXPORTING
            input  = frgsx
          IMPORTING
            output = frgsx.
        <dyn_field> = frgsx.
      ELSE.
        <dyn_field> = w_value.
      ENDIF.
    ENDLOOP.
    ASSIGN COMPONENT 'TYPE' OF STRUCTURE <dyn_wa>
    TO <dyn_field>.
    CHECK <dyn_field> IS ASSIGNED.
    <dyn_field> = 'N'.
    APPEND <dyn_wa> TO <dyn_table>.
  ENDLOOP.

  " Get Characteristics from Class to check Lenght
  " of Currency Fields.
  DATA: w_characteristics LIKE LINE OF t_characteristics.
  IF t_characteristics[] IS INITIAL.
    DATA: classnum TYPE bapi1003_key-classnum.
    PERFORM get_characteristics TABLES t_characteristics.

  ENDIF.
  IF v_classnum IS INITIAL.

  ENDIF.

  " Verify Lenght of Currency Fields
  DATA: field_len TYPE i.
  LOOP AT fields INTO field.
    field_len = STRLEN( field ).
    CHECK field_len >= 5.
    READ TABLE t_characteristics INTO w_characteristics
    WITH KEY table_field = field(5).
    CHECK sy-subrc IS INITIAL.
    CHECK w_characteristics-data_type = 'CURR'.
    LOOP AT <dyn_table> ASSIGNING <dyn_wa>.
      ASSIGN COMPONENT field OF STRUCTURE <dyn_wa> TO <dyn_field>.
      CHECK <dyn_field> IS ASSIGNED.
      REPLACE ALL OCCURRENCES OF '"' IN:
      <dyn_field> WITH ''.
      field_len = STRLEN( <dyn_field> ).
      IF field_len > v_curr_column_output_len.
        v_curr_column_output_len = field_len.
      ENDIF.
    ENDLOOP.
  ENDLOOP.
ENDFORM. " FILL_NEW_DATA
*&---------------------------------------------------------------------*
*&      Form  COMPARE_ALL_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM compare_all_data .
  DATA: w_t16fs TYPE t16fs,
        w_type TYPE c.
  FIELD-SYMBOLS: <dyn_wa>,
  <dyn_check>,
  <dyn_field>.

  CHECK v_file_uploaded IS NOT INITIAL.
  ASSIGN dy_table->* TO <dyn_table>.
  CHECK <dyn_table> IS ASSIGNED.

  " Search for new entries.
  LOOP AT <dyn_table> ASSIGNING <dyn_wa>.
    ASSIGN COMPONENT 'TYPE' OF STRUCTURE <dyn_wa> TO <dyn_field>.
    w_type = <dyn_field>.
    CHECK w_type = 'N'.

    CLEAR w_t16fs.
    ASSIGN COMPONENT 'FRGGR' OF STRUCTURE <dyn_wa> TO <dyn_field>.
    w_t16fs-frggr = <dyn_field>.
    ASSIGN COMPONENT 'FRGSX' OF STRUCTURE <dyn_wa> TO <dyn_field>.
    w_t16fs-frgsx = <dyn_field>.
    READ TABLE <dyn_table>
    WITH KEY ('FRGGR') = w_t16fs-frggr ('FRGSX') = w_t16fs-frgsx
    ('TYPE') = 'C' TRANSPORTING NO FIELDS.

    IF sy-subrc IS NOT INITIAL.
      ASSIGN COMPONENT 'STATUS' OF STRUCTURE <dyn_wa> TO <dyn_field>.
      <dyn_field> = 'NEW'.
      ASSIGN COMPONENT 'DISPLAY' OF STRUCTURE <dyn_wa> TO <dyn_field>.
      <dyn_field> = 'X'.
      ASSIGN COMPONENT 'COLOR' OF STRUCTURE <dyn_wa> TO <dyn_field>.
      <dyn_field> = 'C500'.
    ENDIF.
  ENDLOOP.

  " Search for changes
  DATA: v_old(20000) TYPE c,
        v_new(20000) TYPE c.
  LOOP AT <dyn_table> ASSIGNING <dyn_wa>.
    ASSIGN COMPONENT 'TYPE' OF STRUCTURE <dyn_wa> TO <dyn_field>.
    w_type = <dyn_field>.
    CHECK w_type = 'C'.
    v_old = <dyn_wa>.
    CLEAR w_t16fs.
    ASSIGN COMPONENT 'FRGGR' OF STRUCTURE <dyn_wa> TO <dyn_field>.
    w_t16fs-frggr = <dyn_field>.
    ASSIGN COMPONENT 'FRGSX' OF STRUCTURE <dyn_wa> TO <dyn_field>.
    w_t16fs-frgsx = <dyn_field>.
    READ TABLE <dyn_table>
    WITH KEY ('FRGGR') = w_t16fs-frggr ('FRGSX') = w_t16fs-frgsx
    ('TYPE') = 'N' ASSIGNING <dyn_check>.
    IF sy-subrc IS INITIAL.
      ASSIGN COMPONENT 'TYPE' OF STRUCTURE <dyn_check> TO <dyn_field>.
      <dyn_field> = 'C'.
      v_new = <dyn_check>.
      <dyn_field> = 'N'.
      IF v_old <> v_new.
        ASSIGN COMPONENT 'STATUS' OF STRUCTURE <dyn_wa> TO <dyn_field>.
        <dyn_field> = 'OLD'.
        ASSIGN COMPONENT 'COLOR' OF STRUCTURE <dyn_wa> TO <dyn_field>.
        <dyn_field> = 'C600'.
        ASSIGN COMPONENT 'STATUS' OF STRUCTURE <dyn_check> TO
<dyn_field>.
        <dyn_field> = 'MOD'.
        ASSIGN COMPONENT 'COLOR' OF STRUCTURE <dyn_check> TO
<dyn_field>.
        <dyn_field> = 'C300'.
      ELSE.
        ASSIGN COMPONENT 'DISPLAY' OF STRUCTURE <dyn_wa> TO <dyn_field>.
        CLEAR <dyn_field>.
        ASSIGN COMPONENT 'DISPLAY' OF STRUCTURE <dyn_check> TO
<dyn_field>.
        CLEAR <dyn_field>.
      ENDIF.
    ELSE.
      ASSIGN COMPONENT 'DISPLAY' OF STRUCTURE <dyn_wa> TO <dyn_field>.
      CLEAR <dyn_field>.
    ENDIF.
  ENDLOOP.
  DATA: l_field(5) TYPE c,
        l_char(1) TYPE c,
        w_code LIKE LINE OF t_code.
  FIELD-SYMBOLS: <dy_frggr> TYPE ANY.
  LOOP AT <dyn_table> ASSIGNING <dyn_wa>.
    ASSIGN COMPONENT 'FRGGR' OF STRUCTURE <dyn_wa> TO <dy_frggr>.
    CHECK sy-subrc IS INITIAL.
    DO 8 TIMES.
      l_char = sy-index.
      CONCATENATE 'FRGC' l_char INTO l_field.
      ASSIGN COMPONENT l_field OF STRUCTURE <dyn_wa> TO <dyn_field>.
      CHECK sy-subrc IS INITIAL.
      CHECK <dy_frggr> IS NOT INITIAL.
      CHECK <dyn_field> IS NOT INITIAL.
      READ TABLE t_t16fc
      WITH KEY frggr = <dy_frggr> frgco = <dyn_field>
      TRANSPORTING NO FIELDS.
      IF sy-subrc IS NOT INITIAL.
        CLEAR w_code.
        w_code-frggr = <dy_frggr>.
        w_code-frgco = <dyn_field>.
        APPEND w_code TO t_code.
      ENDIF.
    ENDDO.
  ENDLOOP.
ENDFORM. " COMPARE_ALL_DATA
*&---------------------------------------------------------------------*
*&      Form  ADJUST_FILTER
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM adjust_filter .
  DATA: w_filter LIKE LINE OF lvc_t_filt.
  REFRESH lvc_t_filt.
  IF v_file_uploaded IS NOT INITIAL.
*    w_filter-fieldname = 'STATUS'.
*    w_filter-sign = 'E'.
*    w_filter-option = 'EQ'.
*    w_filter-low = ' '.
*    APPEND w_filter TO lvc_t_filt.
*    CLEAR w_filter.
*    w_filter-fieldname = 'TYPE'.
*    w_filter-sign = 'E'.
*    w_filter-option = 'EQ'.
*    w_filter-low = 'C'.
*    APPEND w_filter TO lvc_t_filt.
  ENDIF.
  CLEAR w_filter.
  w_filter-fieldname = 'DISPLAY'.
  w_filter-sign = 'I'.
  w_filter-option = 'EQ'.
  w_filter-low = 'X'.
  APPEND w_filter TO lvc_t_filt.
ENDFORM. " ADJUST_FILTER
*&---------------------------------------------------------------------*
*&      Form  RESET_FILTER
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM reset_filter .

  FIELD-SYMBOLS: <dyn_wa>,
  <dyn_check>,
  <dyn_field>.

  ASSIGN dy_table->* TO <dyn_table>.
  CHECK <dyn_table> IS ASSIGNED.

  LOOP AT <dyn_table> ASSIGNING <dyn_wa>.
    ASSIGN COMPONENT 'DISPLAY' OF STRUCTURE <dyn_wa> TO <dyn_field>.
    <dyn_field> = 'X'.
  ENDLOOP.
ENDFORM. " RESET_FILTER
*&---------------------------------------------------------------------*
*&      Form  FILTER_BY_RELEASE_CODE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_SELFIELD_VALUE  text
*----------------------------------------------------------------------*
FORM filter_by_release_code USING p_selfield_value.

  FIELD-SYMBOLS: <dyn_wa>,
  <dyn_check>,
  <display>,
  <frgc1>,
  <frgc2>,
  <frgc3>,
  <frgc4>,
  <frgc5>,
  <dyn_field>.

  ASSIGN dy_table->* TO <dyn_table>.
  CHECK <dyn_table> IS ASSIGNED.

  LOOP AT <dyn_table> ASSIGNING <dyn_wa>.
    ASSIGN COMPONENT 'DISPLAY' OF STRUCTURE <dyn_wa> TO <display>.
    ASSIGN COMPONENT 'FRGC1' OF STRUCTURE <dyn_wa> TO <frgc1>.
    ASSIGN COMPONENT 'FRGC2' OF STRUCTURE <dyn_wa> TO <frgc2>.
    ASSIGN COMPONENT 'FRGC3' OF STRUCTURE <dyn_wa> TO <frgc3>.
    ASSIGN COMPONENT 'FRGC4' OF STRUCTURE <dyn_wa> TO <frgc4>.
    ASSIGN COMPONENT 'FRGC5' OF STRUCTURE <dyn_wa> TO <frgc5>.
    IF   <frgc1> = p_selfield_value
    OR <frgc2> = p_selfield_value
    OR <frgc3> = p_selfield_value
    OR <frgc4> = p_selfield_value
    OR <frgc5> = p_selfield_value.
      <display> = 'X'.
    ELSE.
      CLEAR <display>.
    ENDIF.

  ENDLOOP.

ENDFORM. " FILTER_BY_RELEASE_CODE
*&---------------------------------------------------------------------*
*&      Form  FILTER_BY_RELEASE_GROUP
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_SELFIELD_VALUE  text
*----------------------------------------------------------------------*
FORM filter_by_release_group USING p_selfield_value.
  FIELD-SYMBOLS: <dyn_wa>,
  <dyn_check>,
  <display>,
  <frggr>,
  <dyn_field>.
  ASSIGN dy_table->* TO <dyn_table>.
  CHECK <dyn_table> IS ASSIGNED.

  LOOP AT <dyn_table> ASSIGNING <dyn_wa>.
    ASSIGN COMPONENT 'DISPLAY' OF STRUCTURE <dyn_wa> TO <display>.
    ASSIGN COMPONENT 'FRGGR' OF STRUCTURE <dyn_wa> TO <frggr>.
    IF   <frggr> = p_selfield_value.
      <display> = 'X'.
    ELSE.
      CLEAR <display>.
    ENDIF.
  ENDLOOP.

ENDFORM. " FILTER_BY_RELEASE_GROUP


*&---------------------------------------------------------------------*
*&  Include           ZMMR50230_CLASSIFICATION
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Form  GET_CLASSIFICATION
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_BAPI_NUMVALUES  text
*      -->P_BAPI_CHARVALUES  text
*      -->P_BAPI_CURRVALUES  text
*      -->P_W_T16FS_FRGGR  text
*      -->P_W_T16FS_FRGSX  text
*----------------------------------------------------------------------*
FORM get_classification TABLES p_bapi_numvalues STRUCTURE
bapi1003_alloc_values_num
  p_bapi_charvalues STRUCTURE bapi1003_alloc_values_char
  p_bapi_currvalues STRUCTURE bapi1003_alloc_values_curr
USING    p_frggr TYPE frggr
      p_frgsx TYPE frgsx.

  DATA: object_key LIKE bapi1003_key-object,
        t_bapiret2 TYPE TABLE OF bapiret2.


  CONCATENATE p_frggr p_frgsx  INTO object_key RESPECTING BLANKS.


  IF t_characteristics[] IS INITIAL.
    PERFORM get_characteristics TABLES t_characteristics.
  ENDIF.
  IF v_classnum IS INITIAL.
    DATA: w_t16fg LIKE LINE OF t_t16fg.
    READ TABLE t_t16fg INTO w_t16fg INDEX 1.
    CHECK sy-subrc IS INITIAL.
    v_classnum = w_t16fg-frgkl.
  ENDIF.
  CALL FUNCTION 'BAPI_OBJCL_GETDETAIL'
  EXPORTING
    objectkey              = object_key
    objecttable            = 'T16FS'
    classnum               = v_classnum
    classtype              = '032'
*   KEYDATE                = SY-DATUM
*   UNVALUATED_CHARS       = ' '
*   LANGUAGE               = SY-LANGU
* IMPORTING
*   STATUS                 =
*   STANDARDCLASS          =
  TABLES
    allocvaluesnum         = p_bapi_numvalues
    allocvalueschar        = p_bapi_charvalues
    allocvaluescurr        = p_bapi_currvalues
    return                 = t_bapiret2.


ENDFORM. " GET_CLASSIFICATION


*&---------------------------------------------------------------------*
*&      Form  change_classification
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM change_classification
TABLES p_return STRUCTURE bapiret2
USING p_frggr TYPE frggr
      p_frgsx TYPE frgsx.
  DATA:
        w_t16fg LIKE LINE OF t_t16fg,
        object_key TYPE bapi1003_key-object,
        t_numvalues_new TYPE TABLE OF  bapi1003_alloc_values_num,
        t_charvalues_new TYPE TABLE OF bapi1003_alloc_values_char,
        t_currvalues_new TYPE TABLE OF bapi1003_alloc_values_curr,
        w_numvalues_new LIKE LINE OF  t_numvalues_new,
        w_charvalue_new LIKE LINE OF t_charvalues_new,
        w_currvalue_new LIKE LINE OF t_currvalues_new,
        t_return TYPE TABLE OF bapiret2.

  READ TABLE t_t16fg INDEX 1 INTO w_t16fg.
  CONCATENATE p_frggr p_frgsx  INTO object_key RESPECTING BLANKS.

  DATA: t_bapi_char TYPE TABLE OF bapi_char,
        w_bapi_char LIKE LINE OF t_bapi_char,
        t_bapi_char_values TYPE TABLE OF bapi_char_values.

  CALL FUNCTION 'BAPI_CLASS_GET_CHARACTERISTICS'
  EXPORTING
    classnum              = w_t16fg-frgkl
    classtype             = '032'
*   LANGU_ISO             =
*   LANGU_INT             =
*   KEY_DATE              = SY-DATUM
*   WITH_VALUES           = 'X'
* IMPORTING
*   RETURN                =
  TABLES
    characteristics       = t_bapi_char
    char_values           = t_bapi_char_values.
  .

  FIELD-SYMBOLS: <dyn_wa>, <dyn_field>.
  ASSIGN dy_table->* TO <dyn_table>.
  CHECK <dyn_table> IS ASSIGNED.

  DATA: cl_typedescr TYPE REF TO cl_abap_structdescr,
        components TYPE abap_compdescr_tab,
        column_name LIKE LINE OF components.

  READ TABLE <dyn_table> ASSIGNING <dyn_wa>
  WITH KEY ('FRGGR') = p_frggr ('FRGSX') = p_frgsx ('TYPE') = 'N'.
  CHECK <dyn_wa> IS ASSIGNED.
  cl_typedescr ?= cl_abap_typedescr=>describe_by_data( <dyn_wa> ).
  components = cl_typedescr->components.

  LOOP AT components INTO column_name.
    READ TABLE t_bapi_char WITH KEY table_field = column_name-name(5)
    INTO w_bapi_char.
    IF sy-subrc IS INITIAL.
      ASSIGN COMPONENT column_name-name OF STRUCTURE <dyn_wa> TO
<dyn_field>.
      CHECK <dyn_field> IS ASSIGNED.
      IF w_bapi_char-data_type = 'CHAR'.
        CLEAR w_charvalue_new.
        IF column_name-name(5) <> 'EKGRP'.
          w_charvalue_new-charact = w_bapi_char-name_char.
          w_charvalue_new-value_char = <dyn_field>.
          IF w_charvalue_new-value_char IS NOT INITIAL.
            APPEND w_charvalue_new TO t_charvalues_new.
          ENDIF.
        ELSE.
          w_charvalue_new-charact = w_bapi_char-name_char.
          w_charvalue_new-value_char = column_name-name+6(3).
          IF <dyn_field> = 'X'.
            APPEND w_charvalue_new TO t_charvalues_new.
          ENDIF.
        ENDIF.
      ELSEIF w_bapi_char-data_type = 'CURR'.
        CLEAR w_currvalue_new.
        CHECK <dyn_field> IS NOT INITIAL.
        CALL FUNCTION 'CTBP_CONVERT_VALUE_EXT_TO_INT'
        EXPORTING
          charactname           = w_bapi_char-name_char
          value_external        = <dyn_field>
*           CHARACTDETAIL         =
*           CLASSTYPE             = ' '
*           IV_NO_AUTHORITY_CHECK = ' '
        IMPORTING
          value_from            = w_currvalue_new-value_from
          value_to              = w_currvalue_new-value_to
          value_relation        = w_currvalue_new-value_relation
        EXCEPTIONS
          no_authority          = 1
          charact_not_found     = 2
          wrong_data_type       = 3
          wrong_value           = 4
          wrong_input           = 5
          OTHERS                = 6.
        w_currvalue_new-charact = w_bapi_char-name_char.
        APPEND w_currvalue_new TO t_currvalues_new.

        IF sy-subrc <> 0.
* Implement suitable error handling here
        ENDIF.

      ENDIF.
    ENDIF.
  ENDLOOP.

  CALL FUNCTION 'BAPI_OBJCL_CHANGE'
  EXPORTING
    objectkey                = object_key
    objecttable              = 'T16FS'
    classnum                 = w_t16fg-frgkl
    classtype                = '032'
*     STATUS                   = '1'
*     STANDARDCLASS            =
*     CHANGENUMBER             =
*     KEYDATE                  = SY-DATUM
*     NO_DEFAULT_VALUES        = ' '
*   IMPORTING
*     CLASSIF_STATUS           =
  TABLES
    allocvaluesnumnew        = t_numvalues_new
    allocvaluescharnew       = t_charvalues_new
    allocvaluescurrnew       = t_currvalues_new
    return                   = t_return.
  .

  READ TABLE t_return WITH KEY type = 'E' TRANSPORTING NO FIELDS.
  IF sy-subrc IS INITIAL.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'
*     IMPORTING
*       RETURN        =
    .
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
    EXPORTING
      wait          = 'X'
*     IMPORTING
*       RETURN        =
      .
  ENDIF.
  p_return[] = t_return[].



ENDFORM. "change_classification
*&---------------------------------------------------------------------*
*&      Form  GET_CHARACTERISTICS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM get_characteristics
TABLES p_t_characteristics STRUCTURE bapi_char.
  DATA:  bapi_char TYPE TABLE OF  bapi_char,
        w_t16fg LIKE LINE OF t_t16fg,
        bapi_char_values TYPE TABLE  OF bapi_char_values.

  IF v_classnum IS INITIAL.
    READ TABLE t_t16fg INTO w_t16fg INDEX 1.
    CHECK sy-subrc IS INITIAL.
    v_classnum = w_t16fg-frgkl.
  ENDIF.
  CALL FUNCTION 'BAPI_CLASS_GET_CHARACTERISTICS'
  EXPORTING
    classnum              = v_classnum
    classtype             = '032'
*     LANGU_ISO             =
*     LANGU_INT             =
*     KEY_DATE              = SY-DATUM
*     WITH_VALUES           = 'X'
*   IMPORTING
*     RETURN                =
  TABLES
    characteristics       = bapi_char
    char_values           =  bapi_char_values .
  p_t_characteristics[] = bapi_char[].
ENDFORM. " GET_CHARACTERISTICS


*----------------------------------------------------------------------*
***INCLUDE ZMMR50230_DATA .
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Form  SELECT_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM select_data.

  PERFORM refresh_data.
  " Get Release Strategy Group
  SELECT t16fg~mandt t16fg~frggr t16fg~frgot t16fg~frgkl t16fg~frgfg
  t16fh~frggt
  INTO CORRESPONDING FIELDS OF TABLE t_t16fg
  FROM t16fg INNER JOIN t16fh
  ON t16fg~mandt  = t16fh~mandt
  AND t16fg~frggr  =  t16fh~frggr
  WHERE t16fg~frgot = v_type
  AND t16fh~spras = sy-langu.

  " Get Relase Codes
  SELECT t16fc~mandt t16fc~frggr t16fc~frgco t16fc~frgwf t16fd~frgct
  t16fg~frgot
  INTO CORRESPONDING FIELDS OF TABLE t_t16fc
  FROM t16fc INNER JOIN t16fd
  ON t16fc~mandt  = t16fd~mandt
  AND t16fc~frggr  =  t16fd~frggr
  AND t16fc~frgco  =  t16fd~frgco
  INNER JOIN t16fg
  ON t16fg~mandt  = t16fc~mandt
  AND t16fg~frggr  =  t16fc~frggr.

  DATA: w_t16fc LIKE LINE OF t_t16fc.
  LOOP AT t_t16fc INTO w_t16fc.
    READ TABLE t_t16fg WITH KEY frggr = w_t16fc-frggr
    TRANSPORTING NO FIELDS.
    IF sy-subrc IS NOT INITIAL.
      DELETE t_t16fc WHERE frggr = w_t16fc-frggr.
    ENDIF.
  ENDLOOP.

  " Get Release Strategy
  DATA: w_t16fs LIKE LINE OF t_t16fs.
  SELECT t16fs~mandt t16fs~frggr t16fs~frgsx t16fs~frgc1 t16fs~frgc2
t16fs~frgc3 t16fs~frgc4
  t16fs~frgc5 t16fs~frgc6 t16fs~frgc7 t16fs~frgc8 t16ft~frgxt
t16fg~frgot
  INTO CORRESPONDING FIELDS OF TABLE t_t16fs
  FROM t16fs INNER JOIN t16ft
  ON t16fs~mandt = t16ft~mandt AND t16fs~frggr = t16ft~frggr
  AND  t16fs~frgsx = t16ft~frgsx
  INNER JOIN t16fg
  ON t16fg~mandt = t16fs~mandt
  AND  t16fg~frggr = t16fs~frggr.
  LOOP AT t_t16fs INTO w_t16fs.
    READ TABLE t_t16fg WITH KEY frggr = w_t16fs-frggr
    TRANSPORTING NO FIELDS.
    IF sy-subrc IS NOT INITIAL.
      DELETE t_t16fs WHERE frggr = w_t16fs-frggr.
    ENDIF.
  ENDLOOP.

  " Get Release Status and Pre-Requisites
  SELECT * FROM t16fk INTO TABLE t_t16fk
  FOR ALL ENTRIES IN t_t16fg
  WHERE frggr = t_t16fg-frggr.

  " Get Release Classification
  DATA: bapi_numvalues TYPE TABLE OF bapi1003_alloc_values_num,
        w_bapi_numvalue TYPE bapi1003_alloc_values_num,
        bapi_charvalues TYPE TABLE OF bapi1003_alloc_values_char,
        w_bapi_charvalue TYPE bapi1003_alloc_values_char,
        bapi_currvalues TYPE TABLE OF bapi1003_alloc_values_curr,
        w_bapi_currvalue TYPE bapi1003_alloc_values_curr,
        w_characteristics LIKE LINE OF t_characteristics.
  DATA: w_charvalue TYPE s_charvalue,
        w_numvalue TYPE s_numvalue,
        w_currvalue TYPE s_currvalue,
        entry TYPE i.

  REFRESH: t_charvalues, t_numvalues, t_currvalues.
  LOOP AT t_t16fs INTO w_t16fs.
    PERFORM get_classification
    TABLES bapi_numvalues bapi_charvalues bapi_currvalues
    USING w_t16fs-frggr w_t16fs-frgsx.

    SORT bapi_numvalues BY charact.
    SORT bapi_charvalues BY charact.
    SORT bapi_currvalues BY charact.

    LOOP AT bapi_numvalues INTO w_bapi_numvalue.
      AT NEW charact.
        CLEAR entry.
      ENDAT.
      entry = entry + 1.
      CLEAR w_numvalue.
      MOVE-CORRESPONDING w_bapi_numvalue TO w_numvalue.
      w_numvalue-frggr = w_t16fs-frggr.
      w_numvalue-frgsx = w_t16fs-frgsx.
      READ TABLE t_characteristics INTO w_characteristics
      WITH KEY name_char = w_bapi_numvalue-charact.
      IF sy-subrc IS INITIAL.
        w_numvalue-table_field = w_characteristics-table_field.
      ENDIF.
      w_numvalue-entry = entry.
      APPEND w_numvalue TO t_numvalues.
    ENDLOOP.

    LOOP AT bapi_charvalues INTO w_bapi_charvalue.
      AT NEW charact.
        CLEAR entry.
      ENDAT.
      entry = entry + 1.
      CLEAR w_charvalue.
      MOVE-CORRESPONDING w_bapi_charvalue TO w_charvalue.
      w_charvalue-frggr = w_t16fs-frggr.
      w_charvalue-frgsx = w_t16fs-frgsx.
      READ TABLE t_characteristics INTO w_characteristics
      WITH KEY name_char = w_bapi_charvalue-charact.
      IF sy-subrc IS INITIAL.
        w_charvalue-table_field = w_characteristics-table_field.
      ENDIF.
      w_charvalue-entry = entry.
      APPEND w_charvalue TO t_charvalues.
    ENDLOOP.

    LOOP AT bapi_currvalues INTO w_bapi_currvalue.
      AT NEW charact.
        CLEAR entry.
      ENDAT.
      entry = entry + 1.
      CLEAR w_currvalue.
      MOVE-CORRESPONDING w_bapi_currvalue TO w_currvalue.
      w_currvalue-frggr = w_t16fs-frggr.
      w_currvalue-frgsx = w_t16fs-frgsx.
      READ TABLE t_characteristics INTO w_characteristics
      WITH KEY name_char = w_bapi_currvalue-charact.
      IF sy-subrc IS INITIAL.
        w_currvalue-table_field = w_characteristics-table_field.
      ENDIF.
      w_currvalue-entry = entry.
      APPEND w_currvalue TO t_currvalues.
    ENDLOOP.
  ENDLOOP.
ENDFORM. " SELECT_DATA

*&---------------------------------------------------------------------*
*&      Form  REFRESH_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM refresh_data .
  REFRESH: t_t16fg, t_t16fc, t_t16fs, t_t16fk, t_t024, t_log, t_code,
  t_currvalues , t_numvalues , t_charvalues, t_characteristics.
ENDFORM. " REFRESH_DATA
*&---------------------------------------------------------------------*
*&      Form  PREPARE_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM process_data .
  DATA: t_classification_work TYPE TABLE OF s_table_fields.

  PERFORM get_fields_current.
  PERFORM build_dytable_structure
    TABLES t_classification_current
    USING lvc_t_fcat.
  PERFORM fill_current_data.
  PERFORM sort_all_data.
  PERFORM reset_filter.


ENDFORM. " PREPARE_DATA
*&---------------------------------------------------------------------*
*&      Form  BUILD_DYTABLE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM build_dytable_structure TABLES p_t_classification LIKE
t_classification_current
USING lvc_t_fcat TYPE lvc_t_fcat..
  DATA: xfc TYPE lvc_s_fcat,
        ifc TYPE lvc_t_fcat,
        num_field(3) TYPE n,
        dd_x031l_table TYPE dd_x031l_table,
        x031l TYPE x031l,
        ref_cl_abap_elemdescr TYPE REF TO cl_abap_elemdescr,
        w_classification LIKE LINE OF p_t_classification.

  REFRESH ifc.
  SORT p_t_classification BY data_element.
  CLEAR w_classification.
  w_classification-data_element = 'FRGGR'.
  w_classification-columns = 0.
  INSERT w_classification INTO p_t_classification INDEX 1 .
  CLEAR w_classification.
  w_classification-data_element = 'FRGSX'.
  w_classification-columns = 0.
  INSERT w_classification INTO p_t_classification INDEX 2 .
  CLEAR w_classification.
  w_classification-data_element = 'CHAR1'.
  w_classification-column_name = 'TYPE'.
  w_classification-columns = 0.
  INSERT w_classification INTO p_t_classification INDEX 3.
  CLEAR w_classification.
  w_classification-data_element = 'CHAR4'.
  w_classification-column_name = 'LOG_STATUS'.
  w_classification-columns = 0.
  INSERT w_classification INTO p_t_classification INDEX 4 .
  CLEAR w_classification.
  w_classification-data_element = 'CHAR3'.
  w_classification-column_name = 'STATUS'.
  w_classification-columns = 0.
  INSERT w_classification INTO p_t_classification INDEX 5 .

  CLEAR w_classification.
  w_classification-data_element = 'NUMC3'.
  w_classification-column_name = 'SEQ'.
  w_classification-columns = 0.
  INSERT w_classification INTO p_t_classification INDEX 6 .

  CLEAR w_classification.
  w_classification-data_element = 'FRGCO'.
  w_classification-column_name = 'FRGC1'.
  w_classification-columns = 0.
  INSERT w_classification INTO p_t_classification INDEX 7 .
  CLEAR w_classification.
  w_classification-data_element = 'FRGCO'.
  w_classification-column_name = 'FRGC2'.
  w_classification-columns = 0.
  INSERT w_classification INTO p_t_classification INDEX 8 .
  CLEAR w_classification.
  w_classification-data_element = 'FRGCO'.
  w_classification-column_name = 'FRGC3'.
  w_classification-columns = 0.
  INSERT w_classification INTO p_t_classification INDEX 9 .
  CLEAR w_classification.
  w_classification-data_element = 'FRGCO'.
  w_classification-column_name = 'FRGC4'.
  w_classification-columns = 0.
  INSERT w_classification INTO p_t_classification INDEX 10 .
  CLEAR w_classification.
  w_classification-data_element = 'FRGCO'.
  w_classification-column_name = 'FRGC5'.
  w_classification-columns = 0.
  INSERT w_classification INTO p_t_classification INDEX 11 .
  CLEAR w_classification.
  w_classification-data_element = 'FRGCO'.
  w_classification-column_name = 'FRGC6'.
  w_classification-columns = 0.
  INSERT w_classification INTO p_t_classification INDEX 12 .
  CLEAR w_classification.
  w_classification-data_element = 'FRGCO'.
  w_classification-column_name = 'FRGC7'.
  w_classification-columns = 0.
  INSERT w_classification INTO p_t_classification INDEX 13 .
  CLEAR w_classification.
  w_classification-data_element = 'FRGCO'.
  w_classification-column_name = 'FRGC8'.
  w_classification-columns = 0.
  INSERT w_classification INTO p_t_classification INDEX 14.
  CLEAR w_classification.
  w_classification-data_element = 'CHAR1'.
  w_classification-column_name = 'MARK'.
  w_classification-columns = 0.
  APPEND w_classification TO p_t_classification.
  CLEAR w_classification.
  w_classification-data_element = 'CHAR4'.
  w_classification-column_name = 'COLOR'.
  w_classification-columns = 0.
  APPEND w_classification TO p_t_classification.
  CLEAR w_classification.
  w_classification-data_element = 'CHAR1'.
  w_classification-column_name = 'DISPLAY'.
  w_classification-columns = 0.
  APPEND w_classification TO p_t_classification.

  LOOP AT p_t_classification
    INTO w_classification.
    CLEAR xfc.
    ref_cl_abap_elemdescr ?=
    cl_abap_typedescr=>describe_by_name( w_classification-data_element
  ).
    dd_x031l_table = ref_cl_abap_elemdescr->get_ddic_object( ).
    READ TABLE dd_x031l_table INDEX 1 INTO x031l.
    IF x031l-dtyp = 'CURR'.
      ref_cl_abap_elemdescr ?= cl_abap_typedescr=>describe_by_name(
  'ATWRT' ).
    ENDIF.
    CASE ref_cl_abap_elemdescr->type_kind.
      WHEN 'C'.
        xfc-datatype = 'CHAR'.
      WHEN 'N'.
        xfc-datatype = 'NUMC'.
      WHEN 'D'.
        xfc-datatype = 'DATE'.
      WHEN 'P'.
        xfc-datatype = 'PACK'.
      WHEN OTHERS.
        xfc-datatype = ref_cl_abap_elemdescr->type_kind.
    ENDCASE.

    xfc-inttype = ref_cl_abap_elemdescr->type_kind.
    xfc-intlen = ref_cl_abap_elemdescr->length.
    xfc-decimals = ref_cl_abap_elemdescr->decimals.
    IF w_classification-column_name IS INITIAL.
      xfc-fieldname = w_classification-data_element.
    ELSE.
      xfc-fieldname = w_classification-column_name.
    ENDIF.
    READ TABLE ifc WITH KEY fieldname = xfc-fieldname
      TRANSPORTING NO FIELDS.
    IF sy-subrc IS NOT INITIAL.
      APPEND xfc TO ifc.
    ENDIF.
  ENDLOOP.

  DATA: fieldname TYPE lvc_fname,
        insert_pos TYPE i.
  insert_pos = LINES( ifc ).
  insert_pos = insert_pos - 10.

  CHECK ifc[] IS NOT INITIAL.
  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      it_fieldcatalog  = ifc
      i_length_in_byte = 'X' "added by Paul Robert Oct 28, 2009 17:04
    IMPORTING
      ep_table         = dy_table.
  lvc_t_fcat = ifc.
ENDFORM. " BUILD_DYTABLE
*&---------------------------------------------------------------------*
*&      Form  GET_FIELDS_CURRENT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM get_fields_current .
  DATA: w_numvalue LIKE LINE OF t_numvalues,
        w_charvalue LIKE LINE OF t_charvalues,
        w_currvalue LIKE LINE OF t_currvalues,
        w_classification TYPE s_table_fields.
  FIELD-SYMBOLS:
  <classification> TYPE s_table_fields.
  REFRESH t_classification_current.
  LOOP AT t_numvalues INTO w_numvalue.
    CLEAR w_classification.
    w_classification-data_element = w_numvalue-table_field.
    w_classification-columns =  w_numvalue-entry.
    APPEND w_classification TO t_classification_current.
  ENDLOOP.
  LOOP AT t_charvalues INTO w_charvalue.
    CLEAR w_classification.
    IF w_charvalue-table_field = 'WERKS'.
      w_classification-data_element = 'WERKS_D'.
      w_classification-column_name = 'WERKS'.
    ELSEIF w_charvalue-table_field = 'ZZDEPTO'.
      w_classification-data_element = 'CHAR10'.
      w_classification-column_name = 'ZZDEPTO'.
    ELSE.
      w_classification-data_element = w_charvalue-table_field.
    ENDIF.
    APPEND w_classification TO t_classification_current.
  ENDLOOP.

  LOOP AT t_currvalues INTO w_currvalue.
    CLEAR w_classification.
    w_classification-data_element = w_currvalue-table_field.
    w_classification-columns =  w_currvalue-entry.
    APPEND w_classification TO t_classification_current.
  ENDLOOP.
ENDFORM. " GET_FIELDS_CURRENT
*&---------------------------------------------------------------------*
*&      Form  SORT_ALL_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM sort_all_data .
  ASSIGN dy_table->* TO <dyn_table>.
  CHECK <dyn_table> IS ASSIGNED.
  SORT <dyn_table> BY ('FRGGR') ('FRGSX') ('SEQ').
ENDFORM. " SORT_ALL_DATA
*&---------------------------------------------------------------------*
*&      Form  PROCESS_CHANGES

*&---------------------------------------------------------------------*
*&      Form  export_log
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM export_log.
  EXPORT t_log TO MEMORY ID c_memory_id.
ENDFORM. "export_log
*&---------------------------------------------------------------------*
*&      Form  PROCESS_BAPI_LOG
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_T_RETURN  text
*      -->P_W_T16FS_FRGGR  text
*      -->P_W_T16FS_FRGSX  text
*----------------------------------------------------------------------*
FORM process_bapi_log TABLES p_return STRUCTURE bapiret2
USING    p_frggr TYPE frggr
      p_frgsx TYPE frgsx.
  DATA: w_log TYPE s_log.
  CLEAR w_log.
  w_log-frggr = p_frggr.
  w_log-frgsx = p_frgsx.
  w_log-type = 'B'.

  DATA: cl_log TYPE REF TO support_log,
        object TYPE  balobj_d,
        subobject TYPE balsubobj,
        id TYPE balnrext.

  object = 'LOG'.
  subobject = 'PO_RELEASE'.
  CONCATENATE p_frggr p_frgsx INTO id RESPECTING BLANKS .

  CREATE OBJECT cl_log
    EXPORTING
      OBJECT    = object
      subobject = subobject
      id        = id.

  CHECK cl_log IS BOUND.
  w_log-ballog = cl_log->get_log_handler( ).
  READ TABLE p_return WITH KEY type = 'E' TRANSPORTING NO FIELDS.
  IF sy-subrc IS INITIAL.
    w_log-has_error = 'X'.
  ELSE.
    CLEAR w_log-has_error.
  ENDIF.
  APPEND w_log TO t_log.

  DATA: return TYPE bapiret2.
  LOOP AT p_return INTO return.
    CALL METHOD
      cl_log->log_message
      EXPORTING
        msgid = return-id
        msgty = return-type
        msgno = return-number
        msgv1 = return-message_v1
        msgv2 = return-message_v2
        msgv3 = return-message_v3
        msgv4 = return-message_v4.
  ENDLOOP.




ENDFORM. " PROCESS_BAPI_LOG
*&---------------------------------------------------------------------*
*&      Form  PROCESS_SCPR_LOG
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_W_T16FS_FRGGR  text
*      -->P_W_T16FS_FRGSX  text
*      -->P_SCPR_HANDL  text
*----------------------------------------------------------------------*
FORM process_scpr_log USING p_frggr TYPE frggr
      p_frgsx TYPE frgsx
      p_scpr_handl.
  DATA: w_log TYPE s_log.
  CLEAR w_log.
  w_log-frggr = p_frggr.
  w_log-frgsx = p_frgsx.
  w_log-type = 'S'.
  w_log-scprlog = p_scpr_handl.

  DATA: w_scpracpm TYPE scpracpm.
  SELECT * UP TO 1 ROWS FROM scpracpm
  INTO w_scpracpm
  WHERE msgty = 'E' AND act_id = p_scpr_handl.
  ENDSELECT.
  IF sy-subrc IS INITIAL.
    w_log-has_error = 'X'.
  ELSE.
    CLEAR w_log-has_error.
  ENDIF.
  APPEND w_log TO t_log.


ENDFORM. " PROCESS_SCPR_LOG
*&---------------------------------------------------------------------*
*&      Form  PROCESS_DATA_LOG
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*



*&---------------------------------------------------------------------*
*&      Form  log_full_message
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->LOGGER        text
*      -->VALUE(MSGTY)  text
*      -->VALUE(MSGID)  text
*      -->VALUE(MSGNO)  text
*      -->VALUE(MSGV1)  text
*      -->VALUE(MSGV2)  text
*      -->VALUE(MSGV3)  text
*      -->VALUE(MSGV4)  text
*----------------------------------------------------------------------*
FORM log_full_message USING
      value(msgty) value(msgid) value(msgno)
      value(msgv1) value(msgv2) value(msgv3) value(msgv4).
  DATA: logger TYPE REF TO support_log.
  logger = support_log=>self_instance.
  CHECK logger IS BOUND.

  DATA: v_msgty TYPE syst-msgty,
        v_msgid TYPE syst-msgid,
        v_msgno TYPE syst-msgno,
        v_msgv1 TYPE syst-msgv1,
        v_msgv2 TYPE syst-msgv2,
        v_msgv3 TYPE syst-msgv3,
        v_msgv4 TYPE syst-msgv4.
  CHECK msgid IS NOT INITIAL.
  CHECK msgno IS NOT INITIAL.
  CHECK msgty IS NOT INITIAL.
  v_msgty = msgty.
  v_msgid = msgid.
  v_msgno = msgno.
  v_msgv1 = msgv1.
  v_msgv2 = msgv2.
  v_msgv3 = msgv3.
  v_msgv4 = msgv4.

  logger->log_message(
  msgid = v_msgid
  msgno = v_msgno
  msgty = v_msgty
  msgv1 = v_msgv1
  msgv2 = v_msgv2
  msgv3 = v_msgv3
  msgv4 = v_msgv4 ).

ENDFORM. "log_message


*&---------------------------------------------------------------------*
*&      Form  log_msg
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->VALUE(MESSAGE_REF)  text
*      -->VALUE(MSGV1)        text
*      -->VALUE(MSGV2)        text
*      -->VALUE(MSGV3)        text
*      -->VALUE(MSGV4)        text
*----------------------------------------------------------------------*
FORM log_msg USING
      value(message_ref) "'e000(salv_bs_msg)'
      value(msgv1) value(msgv2) value(msgv3) value(msgv4).
  DATA: logger TYPE REF TO support_log.
  logger = support_log=>self_instance.
  CHECK logger IS BOUND.

  DATA: pos_open TYPE i, pos_close TYPE i, length TYPE i.
  FIND FIRST OCCURRENCE OF '(' IN message_ref MATCH OFFSET pos_open.
  CHECK sy-subrc IS INITIAL.
  FIND FIRST OCCURRENCE OF ')' IN message_ref MATCH OFFSET pos_close.
  CHECK sy-subrc IS INITIAL.
  pos_open = pos_open + 1.
  length = pos_close - pos_open.

  DATA: v_msgty TYPE syst-msgty,
        v_msgid TYPE syst-msgid,
        v_msgno TYPE syst-msgno,
        v_msgv1 TYPE syst-msgv1,
        v_msgv2 TYPE syst-msgv2,
        v_msgv3 TYPE syst-msgv3,
        v_msgv4 TYPE syst-msgv4.
  v_msgty = message_ref(1).
  v_msgid = message_ref+pos_open(length).
  v_msgno = message_ref+1(3).
  v_msgv1 = msgv1.
  v_msgv2 = msgv2.
  v_msgv3 = msgv3.
  v_msgv4 = msgv4.

  logger->log_message(
  msgid = v_msgid
  msgno = v_msgno
  msgty = v_msgty
  msgv1 = v_msgv1
  msgv2 = v_msgv2
  msgv3 = v_msgv3
  msgv4 = v_msgv4 ).

ENDFORM. "Log_msg

*&---------------------------------------------------------------------*
*&      Form  log_string
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->LOGGER       text
*      -->VALUE(TEXT)  text
*----------------------------------------------------------------------*
FORM log_text USING
      value(text) TYPE c.

  DATA: logger TYPE REF TO support_log.
  logger = support_log=>self_instance.
  CHECK logger IS BOUND.


  logger->log_text( text ).
ENDFORM. "log_string


*&---------------------------------------------------------------------*
*&      Form  log_system_stack
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM log_system_stack.
  DATA: logger TYPE REF TO support_log.
  logger = support_log=>self_instance.
  CHECK logger IS BOUND.
  logger->log_system_stack( ).
ENDFORM. "log_system_stack

*&---------------------------------------------------------------------*
*&      Form  log_string
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->VALUE(STRING_VALUE)  text
*----------------------------------------------------------------------*
FORM log_string USING value(string_value) TYPE string.
  DATA: logger TYPE REF TO support_log.
  logger = support_log=>self_instance.
  CHECK logger IS BOUND.
  logger->log_string( string_value ).
ENDFORM. "log_string

*&---------------------------------------------------------------------*
*&      Form  log_message_symsg
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM log_message_symsg.
  DATA: logger TYPE REF TO support_log.
  logger = support_log=>self_instance.
  CHECK logger IS BOUND.
  logger->log_message_symsg( ).
ENDFORM. "log_message_symsg

*&---------------------------------------------------------------------*
*&      Form  log_spool_close
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM log_spool_close.
  DATA: logger TYPE REF TO support_log.
  logger = support_log=>self_instance.
  CHECK logger IS BOUND.
  logger->spool_close( ).
ENDFORM. "log_spool_close

DEFINE log_full_message.
  perform log_full_message using &1 &2 &3 &4 &5 &6 &7.
END-OF-DEFINITION.

DEFINE log_msg.
  perform log_msg using &1 &2 &3 &4 &5.
END-OF-DEFINITION.

DEFINE log_system_stack.
  perform log_system_stack.
END-OF-DEFINITION.

DEFINE log_string.
  perform log_string using &1.
END-OF-DEFINITION.

DEFINE log_text.
  perform log_text using &1.
END-OF-DEFINITION.

DEFINE log_symsg.
  perform log_message_symsg.
END-OF-DEFINITION.

DEFINE log_spool_close.
  perform log_spool_close.
END-OF-DEFINITION.
*&---------------------------------------------------------------------*
*&      Form  SET_TYPE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM set_type .
  CASE 'X'.
    WHEN p_rc.
      v_type = '1'.
    WHEN p_po.
      v_type = '2'.
    WHEN p_fs.
      v_type = '3'.
  ENDCASE.



ENDFORM.                    " SET_TYPE