Showing posts with label ALV. Show all posts
Showing posts with label ALV. Show all posts

Wednesday, November 10, 2010

Making ALV to react to Change data automatically
Scenario:
To make ALV to react to data change automatically without any need for the user to click on ENTER or any other button/menu item.
Procedure:
In order to make the system react to an edit event, we need to first register the edit event.  
To register the edit event, call the method REGISTER_EDIT_EVENT
CALL METHOD cont_editalvgd -> register_edit_event
    Exporting
            {}I_event_id = cl_gui_alv_grid => mc_evt_modified.
When user press 'ENTER' the event MC_EVT_ENTER is triggered which automatically sets the variable M_cell_edit to 'X'.
But if the user bypasses the enter key then the variable M_CELL_EDIT has to be set explicitly which is done by passing mc_evt_modified to the exporting parameter I_EVENT_ID instead of mc_evt_enter.
In the PAI event, call the method CHECK_CHANGED_DATA. This method automatically triggers the data_changed event.
By default, SAP recognizes 'ENTER' event.  When only the CHECK_CHANGED_DATA is called in PAI event, then the 'ENTER' event is not recognized by the system.  In order to have both the events recognized by the system, we need to register the edit event.

Scenario 1: When there is no call to the method REGISTER_EVT_MODIFIED and just go with the calling of the method CHECK_CHANGED_DATA in the PAI event.
The whole scenario would work fine when you change the data and press the "OK" button on the application toolbar.
But, when you change the data and press the 'ENTER' key then the event data_changed is not triggered.
1.  Change the data in the editable ALV and press 'ENTER' key.


The changes are not reflected in the ALV as no data_changed event has been triggered.

Scenario 2: When you register the edit event and call the method CHECK_CHANGED_DATA in the PAI event.
1. Change the data in the editable ALV and press the 'OK' button on the application toolbar.

The changed data is recognized and is reflected on to the editable ALV

In the same case, when you change the data in the ALV and press 'ENTER' key, you can still see the changes reflected.

Click on ENTER.

The change event is triggered and the data has been changed accordingly.
Sample code:

REPORT  Z_ALV_EDIT_EVENT.


*"Table declarations...................................................
TABLES:
  spfli.                               " Flight Schedule Details

*" Data declarations...................................................
*"--------------------------------------------------------------------*
* Work variables                                                      *
*"--------------------------------------------------------------------*
DATA:
  w_grid TYPE REF TO cl_gui_alv_grid,  " Reference object for alv grid
  w_container TYPE REF TO cl_gui_custom_container.
                                       " Reference object for container

*"--------------------------------------------------------------------*
* Structure to hold Flight Schedule details                           *
*"--------------------------------------------------------------------*
data:
  fs_spfli type spfli.
*"--------------------------------------------------------------------*
* Structure to hold Field Catalog details                             *
*"--------------------------------------------------------------------*
data:
  wa_field_catalog TYPE lvc_s_fcat.

*"--------------------------------------------------------------------*
* Structure to hold Layout of the ALV Report                          *
*"--------------------------------------------------------------------*
data:

  wa_layout TYPE lvc_s_layo.


*"--------------------------------------------------------------------*
* Internal table to hold Flight Schedule details from table SPFLI     *
*"--------------------------------------------------------------------*
DATA:
  t_spfli like
 STANDARD TABLE
       OF fs_spfli.
*"--------------------------------------------------------------------*
* Internal table to hold Field Catalog Details                        *
*"--------------------------------------------------------------------*

data:
  t_field_catalog TYPE  lvc_t_fcat.

*"--------------------------------------------------------------------*
*                       START-OF-SELECTION EVENT                      *
*"--------------------------------------------------------------------*
START-OF-SELECTION.

* Data retrieval from the database table

SELECT * FROM spfli INTO TABLE t_spfli.

CALL SCREEN 100.

*&---------------------------------------------------------------------*
*&      Module  set_layout  OUTPUT
*&---------------------------------------------------------------------*
*   This module is used to set the layout for the alv grid display     *
*----------------------------------------------------------------------*
MODULE set_layout OUTPUT.
  wa_layout-grid_title = 'SPFLI TABLE DETAILS'.
  wa_layout-zebra = 'X'.
  wa_layout-edit = 'X'.

ENDMODULE.                             " set_layout  OUTPUT

*&---------------------------------------------------------------------*
*&      Module  field_catalog  OUTPUT
*&---------------------------------------------------------------------*
*   This module is used to populate the field catalog                  *
*----------------------------------------------------------------------*
MODULE field_catalog OUTPUT.

  CLEAR wa_field_catalog.
  wa_field_catalog-fieldname = 'CARRID'.
  wa_field_catalog-ref_field = 'CARRIDS'.
  wa_field_catalog-ref_table = 'SPFLI'.
  wa_field_catalog-col_pos   = 1.
  APPEND wa_field_catalog TO t_field_catalog.

  CLEAR wa_field_catalog.
  wa_field_catalog-fieldname = 'CONNID'.
  wa_field_catalog-ref_field = 'CONNID'.
  wa_field_catalog-ref_table = 'SPFLI'.
  wa_field_catalog-col_pos   = 2.
  APPEND wa_field_catalog TO t_field_catalog.

  CLEAR wa_field_catalog.
  wa_field_catalog-fieldname = 'CITYFROM'.
  wa_field_catalog-ref_field = 'CITYFROM'.
  wa_field_catalog-ref_table = 'SPFLI'.
  wa_field_catalog-col_pos   = 3.
  APPEND wa_field_catalog TO t_field_catalog.

  CLEAR wa_field_catalog.
  wa_field_catalog-fieldname = 'CITYTO'.
  wa_field_catalog-ref_field = 'CITYTO'.
  wa_field_catalog-ref_table = 'SPFLI'.
  wa_field_catalog-col_pos   = 4.
  APPEND wa_field_catalog TO t_field_catalog.

ENDMODULE.                             " field_catalog  OUTPUT

*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*  This module is used to handle the PAI events
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
  CASE sy-ucomm.
    WHEN 'OK'.

* Calling the check_changed_data method to trigger the data_changed
* event
*
      CALL METHOD w_grid->check_changed_data
*  IMPORTING
*    E_VALID   =
*  CHANGING
*    C_REFRESH = 'X'
          .
      update spfli from table t_spfli.
    WHEN 'BACK' OR 'EXIT' OR 'CANCEL'.
      LEAVE TO SCREEN 0.

  ENDCASE.                             " CASE SY-UCOMM
ENDMODULE.                             " USER_COMMAND_0100  INPUT


*&---------------------------------------------------------------------*
*&      Module  manage_alv_grid  OUTPUT
*&---------------------------------------------------------------------*
*   This module is used to manage the Grid display
*----------------------------------------------------------------------*
MODULE manage_alv_grid OUTPUT.


  IF w_grid IS INITIAL.

    CREATE OBJECT w_container
      EXPORTING
        container_name              =   'CONTAINER1'
      EXCEPTIONS
        cntl_error                  = 1
        cntl_system_error           = 2
        create_error                = 3
        lifetime_error              = 4
        lifetime_dynpro_dynpro_link = 5
        OTHERS                      = 6
        .
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                 WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.                             " IF SY-SUBRC NE 0

    CREATE OBJECT w_grid
      EXPORTING
        i_parent          =  w_container
      EXCEPTIONS
        error_cntl_create = 1
        error_cntl_init   = 2
        error_cntl_link   = 3
        error_dp_create   = 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.                             " IF SY-SUBRC NE 0


    CALL METHOD w_grid->set_table_for_first_display
      EXPORTING
        i_structure_name              = 'SPFLI'
        is_layout                     = wa_layout
      CHANGING
        it_outtab                     = t_spfli[]
        it_fieldcatalog               = t_field_catalog
      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.                             " IF SY-SUBRC NE 0

  ENDIF.                               " IF W_GRID IS INITIAL

*  Registering the EDIT Event


CALL METHOD w_grid->register_edit_event
  EXPORTING
    i_event_id = cl_gui_alv_grid=>mc_evt_modified
  EXCEPTIONS
    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.                                 " IF SY-SUBRC NE 0

ENDMODULE.                             " manage_alv_grid  OUTPUT

*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*   This module is used to set the PF-Status and title bar             *
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  SET PF-STATUS 'ALVS_GUI'.
  SET TITLEBAR 'ALV_TITLE'.
ENDMODULE.                             " STATUS_0100  OUTPUT
ref: http://wiki.sdn.sap.com/wiki/display/ABAP/Making+ALV+to+react+to+Change+data+automatically

Sunday, November 7, 2010

Display two or more ALVs on one screen using Splitter Control

Data: custom_container TYPE REF TO cl_gui_custom_container,
splitter TYPE REF TO cl_gui_splitter_container,
graphic_parent1 TYPE REF TO cl_gui_container,
graphic_parent2 TYPE REF TO cl_gui_container.

DATA ref_grid TYPE REF TO cl_gui_alv_grid.
DATA ref_grid1 TYPE REF TO cl_gui_alv_grid.

** create container in which to place splitter
** (place it in the custom control named CONTAINER
** defined using screenpainter in dynpro 100)

CREATE OBJECT custom_container
EXPORTING
container_name = 'CONTAINER'. "use uppercase letters!
*
** create splitter container in which to place graphics
CREATE OBJECT splitter
EXPORTING
parent = custom_container
rows = 2
columns = 1
align = 15. " (splitter fills the hole custom container)

** get part of splitter container for 1st table
CALL METHOD splitter->get_container
EXPORTING
row = 1
column = 1
RECEIVING
container = graphic_parent1.
** get part of splitter container for 2nd table
CALL METHOD splitter->get_container
EXPORTING
row = 2
column = 1
RECEIVING
container = graphic_parent2.

CREATE OBJECT ref_grid EXPORTING i_parent = graphic_parent1.
** Display first ALV
PERFORM set_display.

CREATE OBJECT ref_grid1 EXPORTING i_parent = graphic_parent2.
** Display second ALV
PERFORM set_display1.

*&--------------------------------------------------------------------*
*& Form set_display
*&--------------------------------------------------------------------*
* text Display first ALV
*---------------------------------------------------------------------*
FORM set_display.
CALL METHOD ref_grid->set_table_for_first_display
EXPORTING
is_variant = st_var
i_save = save
is_layout = loyo
CHANGING
it_outtab = itab_final[]
it_fieldcatalog = fcat.
ENDFORM. "set_display

*&--------------------------------------------------------------------*
*& Form set_display1
*&--------------------------------------------------------------------*
* text Display second ALV
*---------------------------------------------------------------------*
FORM set_display1.
CALL METHOD ref_grid1->set_table_for_first_display
EXPORTING
is_variant = st_var
i_save = save
is_layout = loyo1
CHANGING
it_outtab = itab_final1[]
it_fieldcatalog = fcat1.
ENDFORM. "set_display1

ref:http://wiki.sdn.sap.com/wiki/display/ABAP/Display+two+or+more+ALVs+on+one+screen+using+Splitter+Control

Friday, November 5, 2010

ALV Tree program

*&---------------------------------------------------------------------*
*& Report ZALV_TREE
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT ZALV_TREE MESSAGE-ID zer14.

*&---------------------------------------------------------------------*
*& DECLERATION OF TYPE POOL.
*&---------------------------------------------------------------------*
TYPE-POOLS slis.

*&---------------------------------------------------------------------*
*& DECLERATION OF TABLES.
*&---------------------------------------------------------------------*
TABLES: aufk,bkpf,proj,tj02t,prps,jcds,coep.

*&---------------------------------------------------------------------*
* TYPE DECLARATION
*&---------------------------------------------------------------------*

TYPES:
*FOR aufk TABLE
BEGIN OF t_aufk,
aufnr TYPE aufk-aufnr, "ORDER NUMBER
objnr TYPE aufk-objnr, "OBJECT NUMBER
pspel TYPE aufk-pspel, "WBS ELEMENT
stat TYPE jcds-stat, "OBJECT STATUS
udate TYPE jcds-udate, "CREATION DATE
inact TYPE jcds-inact, "INACTIVE STATUS
utime TYPE jcds-utime, "TIME CHANGED
chgnr TYPE jcds-chgnr, "Change number
END OF t_aufk,

*FOR PROJ TABLE

BEGIN OF t_proj,
pspnr TYPE proj-pspnr, "PROJECT DEFINATION (INITIAL)
pspid TYPE proj-pspid, "PROJECT DEFINATION
post1 TYPE proj-post1, "PROJECT DESCRIPTION
profl TYPE proj-profl,
END OF t_proj,
*FOR PRPS TABLE

BEGIN OF t_prps,
pspnr TYPE prps-pspnr, "WBS ELEMENT
objnr TYPE prps-objnr, "OBJECT NUMBER
psphi TYPE prps-psphi, "CURRENT NUMBER OF THE APPROPIATE OBJECT
post1 TYPE prps-post1, "WBS DESCRIPTION
END OF t_prps,

*FOR COEP TABLE

BEGIN OF t_coep,
wtgbtr TYPE coep-wtgbtr, "Total Value in Transaction Currency
objnr TYPE coep-objnr, "OBJECT NUMBER
END OF t_coep,

*FOR COEP TABLE

BEGIN OF t_coep1,
wtgbtr TYPE coep-wtgbtr, "Total Value in Transaction Currency
objnr TYPE coep-objnr, "OBJECT NUMBER
END OF t_coep1,

*FOR TJ02T TABLE
BEGIN OF t_tj02t,
istat TYPE tj02t-istat, "System status
txt04 TYPE tj02t-txt04, "ndividual status of an object (short form)
END OF t_tj02t,

* FOR T056P TABLE
BEGIN OF t_t056p,
zsoll TYPE t056p-zsoll, "Interest Rate
datab TYPE t056p-datab, "Effective-From Date
END OF t_t056p,

* FOR BKPF TABLE

BEGIN OF t_bkpf,
gjahr TYPE bkpf,
END OF t_bkpf,

*FOR FINAL INTERNAL TABLE

BEGIN OF t_final,
aufnr TYPE aufk-aufnr, "ORDER NUMBER
objnr TYPE aufk-objnr, "OBJECT NUMBER
pspel TYPE aufk-pspel, "WBS ELEMENT
post1 TYPE proj-post1, "PROJECT DESCRIPTION
post11 TYPE prps-post1, "WBS DESCRIPTION
stat TYPE jcds-stat, "OBJECT STATUS
udate TYPE jcds-udate, "CREATION DATE
inact TYPE jcds-inact, "INACTIVE STATUS
utime TYPE jcds-utime, "TIME CHANGED
pspnr TYPE prps-pspnr, "WBS ELEMENT
psphi TYPE prps-psphi, "CURRENT NUMBER OF THE APPROPIATE OBJECT
wtgbtr TYPE coep-wtgbtr, "Total Value in Transaction Currency
wtgbtr1 TYPE coep-wtgbtr, "Total Value in Transaction Currency
zsoll TYPE t056p-zsoll, "Interest Rate
zsoll1 TYPE t056p-zsoll, "Interest Rate
v_var1 TYPE p DECIMALS 2, "FOR CALCULATION OF DEBT AMOUNT
v_var2 TYPE p DECIMALS 2, "FOR CLCULATION OF EQUITY AMOUNT
v_total TYPE p DECIMALS 2, " TOTAL OF V_VAR1 AND V_VAR2
v_e_bal TYPE p DECIMALS 2, "ENDING TOTAL
END OF t_final.

*&---------------------------------------------------------------------*
* PARAMETERS FOR SELECTION-SCREEN
*&---------------------------------------------------------------------*
* SELECTION SCREEN BLOCK FOR SELECTING VALUE
*&---------------------------------------------------------------------*

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
SELECT-OPTIONS :
s_profl FOR proj-profl,
s_pspnr FOR proj-pspnr.

PARAMETERS :
* P_MONAT TYPE BKPF-MONAT OBLIGATORY,
p_gjahr TYPE bkpf-gjahr OBLIGATORY,
v_fm_dt TYPE sy-datum OBLIGATORY,
v_to_dt TYPE sy-datum OBLIGATORY.
SELECTION-SCREEN END OF BLOCK b1.

*&---------------------------------------------------------------------*
* VARIABLE DECLARATIONS
*&---------------------------------------------------------------------*

DATA: v_istat TYPE tj02t-istat,
v_cal TYPE p DECIMALS 2, " FOR CALCULATION OF wa_final-zsoll / 12
v_cal1 TYPE p DECIMALS 2. " FOR CALCULATION OF wa_final-zsoll1 / 12

*&---------------------------------------------------------------------*
* CONTANTS DECLARATION
*&---------------------------------------------------------------------*

CONSTANTS : c_x(1) VALUE 'X', " value used to set X for a field
c_repid(40) VALUE sy-repid, " report id
c_teco(4) VALUE 'TECO', " object status description

c_check(1) VALUE 'X'. " value used to set X for a field

CLASS cl_gui_column_tree DEFINITION LOAD.
CLASS cl_gui_cfw DEFINITION LOAD.

DATA tree1 TYPE REF TO cl_gui_alv_tree.
DATA mr_toolbar TYPE REF TO cl_gui_toolbar.

INCLUDE .
INCLUDE bcalv_toolbar_event_receiver.
INCLUDE bcalv_tree_event_receiver.

DATA: toolbar_event_receiver TYPE REF TO lcl_toolbar_event_receiver.

DATA: it_field TYPE lvc_t_fcat, "Fieldcatalog
ok_code LIKE sy-ucomm. "OK-Code

*------------------------------------
* INTERNAL TABLE
*------------------------------------

DATA: it_aufk TYPE STANDARD TABLE OF t_aufk, " INTERNAL TABLE OF TYPE I_AUFK
it_proj TYPE STANDARD TABLE OF t_proj, " INTERNAL TABLE OF TYPE I_PROJ
it_prps TYPE STANDARD TABLE OF t_prps, " INTERNAL TABLE OF TYPE I_PRPS
it_coep TYPE STANDARD TABLE OF t_coep, " INTERNAL TABLE OF TYPE I_COEP
it_coep1 TYPE STANDARD TABLE OF t_coep1, " INTERNAL TABLE OF TYPE I_COPE1
it_tj02t TYPE STANDARD TABLE OF t_tj02t, " INTERNAL TABLE OF TYPE I_TJ02P
it_t056p TYPE STANDARD TABLE OF t_t056p, " INTERNAL TABLE OF TYPE I_T056T
it_final TYPE STANDARD TABLE OF t_final, " INTERNAL TABLE OF TYPE I_FIANL
it_bkpf TYPE STANDARD TABLE OF t_bkpf,
it_final1 TYPE STANDARD TABLE OF t_final.

*------------------------------------
* WORK AREA
*------------------------------------

DATA:wa_aufk TYPE t_aufk,
wa_proj TYPE t_proj,
wa_prps TYPE t_prps,
wa_coep TYPE t_coep,
wa_coep1 TYPE t_coep1,
wa_tj02t TYPE t_tj02t,
wa_t056p TYPE t_t056p,
wa_final TYPE t_final,
wa_bkpf TYPE t_bkpf,
wa_final1 TYPE t_final.

START-OF-SELECTION.

*********************************************************
* perform for passing the hard code value
*********************************************************
* PERFORM hard_code.

******************************************************************
* PERFORM for get the value
******************************************************************
PERFORM get_data.

END-OF-SELECTION.

CALL SCREEN 9000.
*&---------------------------------------------------------------------*
*& Module STATUS_9000 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE status_9000 OUTPUT.
SET PF-STATUS 'ZMAIN'.
* SET TITLEBAR 'xxx'.

IF tree1 IS INITIAL.
PERFORM init_tree.
ENDIF.
CALL METHOD cl_gui_cfw=>flush.

ENDMODULE. " STATUS_9000 OUTPUT
*&---------------------------------------------------------------------*
*& Form INIT_TREE
*&---------------------------------------------------------------------*
* text

*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM init_tree .

it_final1[] = it_final[] .
* create fieldcatalog for structure sflight

PERFORM build_fieldcatalog.

* create container for alv-tree
DATA: alv_containor(30) TYPE c,
l_custom_container TYPE REF TO cl_gui_custom_container.
alv_containor = 'TREE1'.

IF sy-batch IS INITIAL.
CREATE OBJECT l_custom_container
EXPORTING
container_name = 'ALV_CONTAINOR'
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5.
IF sy-subrc <> 0.
MESSAGE x208(00) WITH 'ERROR'. "#EC NOTEXT
ENDIF.
ENDIF.

* create tree control
CREATE OBJECT tree1
EXPORTING
parent = l_custom_container
node_selection_mode = cl_gui_column_tree=>node_sel_mode_multiple
item_selection = space
no_html_header = ''
no_toolbar = ''
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
illegal_node_selection_mode = 5
failed = 6
illegal_column_name = 7.
IF sy-subrc <> 0.
MESSAGE x208(00) WITH 'ERROR'. "#EC NOTEXT
ENDIF.

* create Hierarchy-header
DATA l_hierarchy_header TYPE treev_hhdr.
PERFORM build_hierarchy_header CHANGING l_hierarchy_header.

* create info-table for html-header
DATA: lt_list_commentary TYPE slis_t_listheader,
l_logo TYPE sdydo_value.
* perform build_comment using
* lt_list_commentary
* l_logo.

* repid for saving variants
DATA: ls_variant TYPE disvariant.
ls_variant-report = sy-repid.
break spcandxx.
REFRESH it_final.
* create emty tree-control
CALL METHOD tree1->set_table_for_first_display
EXPORTING
is_hierarchy_header = l_hierarchy_header
it_list_commentary = lt_list_commentary
i_logo = l_logo
i_background_id = 'ALV_BACKGROUND'
i_save = 'A'
is_variant = ls_variant
CHANGING
it_outtab = it_final[] "table must be emty !!
it_fieldcatalog = it_field[].
break spcandxx.
* create hierarchy
PERFORM create_hierarchy.

* add own functioncodes to the toolbar
PERFORM change_toolbar.

* register events
* perform register_events.

* adjust column_width
* call method tree1->COLUMN_OPTIMIZE.

ENDFORM. " INIT_TREE

*&---------------------------------------------------------------------*
*& Form build_fieldcatalog
*&---------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
FORM build_fieldcatalog .

DATA: wa_field TYPE lvc_s_fcat.

* get fieldcatalog
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
i_structure_name = 'ZSTRUC'
CHANGING
ct_fieldcat = it_field.

SORT it_field BY scrtext_l.

* change fieldcatalog
* data: wa_field type lvc_s_fcat.
LOOP AT it_field INTO wa_field.
CASE wa_field-fieldname.
WHEN 'POST1' OR 'POST11' OR 'AUFNR'.
wa_field-no_out = 'X'.
wa_field-key = ''.
WHEN 'WTGBTR' .
wa_field-outputlen = 20. " output length on screen
wa_field-coltext = text-003. " header information
wa_field-do_sum = 'X'. " DOING SUM

WHEN 'WTGBTR1' .
wa_field-outputlen = 20. " output length on screen
wa_field-coltext = text-004. " header information
wa_field-do_sum = 'X'. " DOING SUM
WHEN 'ZSOLL' .
wa_field-outputlen = 20. " output length on screen
wa_field-coltext = text-005. " header information
wa_field-do_sum = 'X'. " DOING SUM

WHEN 'ZSOLL1'.
wa_field-outputlen = 20. " output length on screen
wa_field-coltext = text-006. " header information
wa_field-do_sum = 'X'. " DOING SUM

WHEN 'V_VAR1' .
wa_field-outputlen = 20. " output length on screen
wa_field-coltext = text-007. " header information
wa_field-do_sum = 'X'. " DOING SUM

WHEN 'V_VAR2' .
wa_field-outputlen = 20. " output length on screen
wa_field-coltext = text-008. " header information
wa_field-do_sum = 'X'. " DOING SUM

WHEN 'V_TOTAL' .
wa_field-outputlen = 20. " output length on screen
wa_field-coltext = text-009. " header information
wa_field-do_sum = 'X'. " DOING SUM

WHEN 'V_E_BAL' .
wa_field-outputlen = 20. " output length on screen
wa_field-coltext = text-010. " header information
wa_field-do_sum = 'X'. " DOING SUM
ENDCASE.
MODIFY it_field FROM wa_field.
ENDLOOP.

ENDFORM.. "build_fieldcatalog
*&---------------------------------------------------------------------*
*& Form BUILD_HIERARCHY_HEADER
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* <--P_L_HIERARCHY_HEADER text
*----------------------------------------------------------------------*
FORM build_hierarchy_header CHANGING p_hierarchy_header TYPE treev_hhdr.

p_hierarchy_header-heading = 'Business Segment'. "#EC NOTEXT
p_hierarchy_header-tooltip =
'This is the Hierarchy Header !'. "#EC NOTEXT
p_hierarchy_header-width = 30.
p_hierarchy_header-width_pix = ''.

ENDFORM. " BUILD_HIERARCHY_HEADER
*&---------------------------------------------------------------------*
*& Form BUILD_COMMENT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_LT_LIST_COMMENTARY text
* -->P_L_LOGO text
*----------------------------------------------------------------------*
FORM build_comment USING

pt_list_commentary TYPE slis_t_listheader
p_logo TYPE sdydo_value.

DATA: ls_line TYPE slis_listheader.
*
* LIST HEADING LINE: TYPE H
CLEAR ls_line.
ls_line-typ = 'H'.
* LS_LINE-KEY: NOT USED FOR THIS TYPE
ls_line-info = 'ALV-tree-demo: flight-overview'. "#EC NOTEXT
APPEND ls_line TO pt_list_commentary.
* STATUS LINE: TYPE S
CLEAR ls_line.
ls_line-typ = 'S'.
ls_line-key = 'valid until'. "#EC NOTEXT
ls_line-info = 'January 29 1999'. "#EC NOTEXT
APPEND ls_line TO pt_list_commentary.
ls_line-key = 'time'.
ls_line-info = '2.00 pm'. "#EC NOTEXT
APPEND ls_line TO pt_list_commentary.
* ACTION LINE: TYPE A
CLEAR ls_line.
ls_line-typ = 'A'.
* LS_LINE-KEY: NOT USED FOR THIS TYPE
ls_line-info = 'actual data'. "#EC NOTEXT
APPEND ls_line TO pt_list_commentary.

p_logo = 'ENJOYSAP_LOGO'.

ENDFORM. " BUILD_COMMENT
*&---------------------------------------------------------------------*
*& Form CREATE_HIERARCHY
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM create_hierarchy .

* add data to tree
DATA: l_pspnr_key TYPE lvc_nkey,
l_pspnr1_key TYPE lvc_nkey,
l_last_key TYPE lvc_nkey.

SORT it_final1 BY post1 post11 aufnr.

LOOP AT it_final1 INTO wa_final1.
ON CHANGE OF wa_final1-post1.
PERFORM add_pspnr_line USING wa_final1
''
CHANGING l_pspnr_key.
ENDON.
ON CHANGE OF wa_final1-post11.
PERFORM add_pspnr1_line USING wa_final1
l_pspnr_key
CHANGING l_pspnr1_key.
ENDON.
PERFORM add_complete_line USING wa_final1
l_pspnr1_key
CHANGING l_last_key.

CLEAR wa_final1.
ENDLOOP.

* calculate totals
CALL METHOD tree1->update_calculations.

* this method must be called to send the data to the frontend
CALL METHOD tree1->frontend_update.

ENDFORM. " CREATE_HIERARCHY

*&---------------------------------------------------------------------*
*& Form GET_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_data .

*&---------------------------------------------------------------------*
* QUERY TO select ISTAT FROM TJ02T INTO IT_TJ02T
*&---------------------------------------------------------------------*

SELECT SINGLE
istat
FROM tj02t
INTO v_istat
WHERE
spras = sy-langu AND txt04 = c_teco.

IF sy-subrc <> 0.

MESSAGE e000.

ENDIF.

*&---------------------------------------------------------------------*
* QUERY TO select PSPNR PSPID FROM PROJ INTO IT_PROJ.
*&---------------------------------------------------------------------*

SELECT
pspnr
* PSPID
post1
FROM proj
INTO TABLE it_proj
WHERE
pspnr IN s_pspnr
AND profl IN s_profl.

IF sy-subrc <> 0.

MESSAGE e001.

ENDIF.

*&---------------------------------------------------------------------*
* QUERY TO select PSPNR OBJNR PSPHI FROM PRPS INTO IT_PRPS.
*&---------------------------------------------------------------------*

SELECT
pspnr
objnr
psphi
* PSPID
post1
FROM prps
INTO TABLE it_prps
FOR ALL ENTRIES IN it_proj
WHERE psphi = it_proj-pspnr.

IF sy-subrc <> 0 .

MESSAGE e002.

ENDIF.

*&---------------------------------------------------------------------*
* QUERY TO select AUFNR OBJNR STAT UDAT INACT UTIME FROM AUFK,JCDS INTO IT_AUFK.
*&---------------------------------------------------------------------*

SELECT
a~aufnr
a~objnr
a~pspel
b~stat
b~udate
b~inact
b~utime
b~chgnr
FROM
aufk AS a INNER JOIN jcds AS b
ON a~objnr = b~objnr
INTO TABLE it_aufk
FOR ALL ENTRIES IN it_prps
WHERE a~pspel = it_prps-pspnr AND
b~stat = v_istat AND
b~udate BETWEEN v_fm_dt AND v_to_dt
AND b~inact <> c_x.

IF sy-subrc <> 0 .

MESSAGE e003.

ENDIF.

*&---------------------------------------------------------------------*
* QUERY TO select WTGBTR FROM COEP INTO IT_COEP.
*&---------------------------------------------------------------------*

SELECT
wtgbtr
FROM coep
INTO TABLE it_coep
FOR ALL ENTRIES IN it_prps
WHERE
gjahr = p_gjahr AND objnr = it_prps-objnr.

IF sy-subrc <> 0 .

MESSAGE e004.

ENDIF.

*&---------------------------------------------------------------------*
* QUERY TO select WTGBTR FROM COEP INTO IT_COEP.
*&---------------------------------------------------------------------*

SELECT
wtgbtr
objnr
FROM coep
INTO TABLE it_coep1
FOR ALL ENTRIES IN it_prps
WHERE
gjahr = p_gjahr AND objnr = it_prps-objnr.

IF sy-subrc <> 0 .

MESSAGE e005.

ENDIF.

*&---------------------------------------------------------------------*
* QUERY TO select ZSOLL FROM T056P INTO IT_T056P.
*&---------------------------------------------------------------------*

SELECT
zsoll
FROM t056p
INTO TABLE it_t056p
WHERE referenz = 'ZNWN DEBT' .

IF sy-subrc <> 0 .

MESSAGE e006.

ENDIF.

*&---------------------------------------------------------------------*
* QUERY TO select ZSOLL FROM T056P INTO IT_T056P.
*&---------------------------------------------------------------------*

SELECT
zsoll
FROM t056p
INTO TABLE it_t056p
WHERE referenz = 'ZNWNEQUITY' .

IF sy-subrc <> 0 .

MESSAGE e007.

ENDIF.

break spcandxx.
LOOP AT it_prps INTO wa_prps.

wa_final-pspnr = wa_prps-pspnr.
wa_final-objnr = wa_prps-objnr.
wa_final-psphi = wa_prps-psphi.
wa_final-post11 = wa_prps-post1.

READ TABLE it_proj INTO wa_proj WITH KEY pspnr = wa_prps-pspnr.

IF sy-subrc = 0.

wa_final-post1 = wa_proj-post1.

ELSE.
MESSAGE e003.

ENDIF.

READ TABLE it_aufk INTO wa_aufk WITH KEY pspel = wa_prps-pspnr.

IF sy-subrc = 0.

wa_final-aufnr = wa_aufk-aufnr.
wa_final-udate = wa_aufk-udate.
wa_final-inact = wa_aufk-inact.
wa_final-utime = wa_aufk-utime.
ELSE.
MESSAGE e003.

ENDIF.

READ TABLE it_coep INTO wa_coep WITH KEY objnr = wa_prps-objnr.

IF sy-subrc = 0.

wa_final-wtgbtr = wa_coep-wtgbtr.

ELSE.

MESSAGE e003.

ENDIF.

READ TABLE it_coep1 INTO wa_coep1 WITH KEY objnr = wa_prps-objnr.

IF sy-subrc = 0.

wa_final-wtgbtr1 = wa_coep1-wtgbtr.

ELSE.
MESSAGE e003.

ENDIF.

wa_final-zsoll = wa_t056p-zsoll.

APPEND wa_final TO it_final. "append wa_final into it_final.

LOOP AT it_final INTO wa_final.

v_cal = wa_final-zsoll / 12 .
v_cal1 = wa_final-zsoll1 / 12 .

wa_final-v_var1 = ( wa_final-wtgbtr ( v_cal ) + ( wa_final-wtgbtr1 ) ( v_cal / 2 ) ) .
wa_final-v_var2 = ( wa_final-wtgbtr ( v_cal1 ) + ( wa_final-wtgbtr1 ) ( v_cal1 ) / 2 ) .
wa_final-v_total = ( wa_final-v_var1 + wa_final-v_var2 ).
wa_final-v_e_bal = ( wa_final-wtgbtr wa_final-wtgbtr1 wa_final-v_total ).

MODIFY it_final FROM wa_final INDEX sy-tabix.
ENDLOOP.

ENDLOOP.

ENDFORM. " GET_DATA
*&---------------------------------------------------------------------*
*& Form CHANGE_TOOLBAR
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM change_toolbar .

* * get toolbar control
CALL METHOD tree1->get_toolbar_object
IMPORTING
er_toolbar = mr_toolbar.

CHECK NOT mr_toolbar IS INITIAL.

* add seperator to toolbar
CALL METHOD mr_toolbar->add_button
EXPORTING
fcode = ''
icon = ''
butn_type = cntb_btype_sep
text = ''
quickinfo = 'This is a Seperator'. "#EC NOTEXT

* add Standard Button to toolbar (for Delete Subtree)
CALL METHOD mr_toolbar->add_button
EXPORTING
fcode = 'DELETE'
icon = ' (18)'
butn_type = cntb_btype_button
text = ''
quickinfo = 'Delete subtree'. "#EC NOTEXT

* add Dropdown Button to toolbar (for Insert Line)
CALL METHOD mr_toolbar->add_button
EXPORTING
fcode = 'INSERT_LC'
icon = ' (17)'
butn_type = cntb_btype_dropdown
text = ''
quickinfo = 'Insert Line'. "#EC NOTEXT

* set event-handler for toolbar-control
CREATE OBJECT toolbar_event_receiver.
SET HANDLER toolbar_event_receiver->on_function_selected
FOR mr_toolbar.
SET HANDLER toolbar_event_receiver->on_toolbar_dropdown
FOR mr_toolbar.

ENDFORM. " CHANGE_TOOLBAR

*&---------------------------------------------------------------------*
*& Form ADD_PSPNR_LINE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_WA_FINAL text
* -->P_0958 text
* <--P_L_PSPNR_KEY text
*----------------------------------------------------------------------*
FORM add_complete_line USING wa_final1 TYPE t_final
p_relat_key TYPE lvc_nkey
CHANGING p_node_key TYPE lvc_nkey.

DATA: l_node_text TYPE lvc_value. ",
* wa_final2 LIKE it_final.

* set item-layout
DATA: lt_item_layout TYPE lvc_t_layi,
ls_item_layout TYPE lvc_s_layi.
ls_item_layout-t_image = ' (3P)'.
ls_item_layout-fieldname = tree1->c_hierarchy_column_name.
ls_item_layout-style =
cl_gui_column_tree=>style_intensifd_critical.
APPEND ls_item_layout TO lt_item_layout.

* add node
l_node_text = wa_final1-aufnr.

DATA: ls_node TYPE lvc_s_layn.
ls_node-n_image = space.
ls_node-exp_image = space.

CALL METHOD tree1->add_node
EXPORTING
i_relat_node_key = p_relat_key
i_relationship = cl_gui_column_tree=>relat_last_child
i_node_text = l_node_text
is_outtab_line = wa_final1
is_node_layout = ls_node
it_item_layout = lt_item_layout
IMPORTING
e_new_node_key = p_node_key.

ENDFORM. " add_carrid_line

*&---------------------------------------------------------------------*
*& Form ADD_PSPNR1_LINE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_WA_FINAL text
* -->P_L_PSPNR_KEY text
* <--P_L_PSPNR1_KEY text
*----------------------------------------------------------------------*
FORM add_pspnr1_line USING
wa_final1 TYPE t_final
p_relat_key TYPE lvc_nkey
CHANGING p_node_key TYPE lvc_nkey.

DATA: l_node_text TYPE lvc_value. ",
* wa_final2 type t_final.

* set item-layout
DATA: lt_item_layout TYPE lvc_t_layi,
ls_item_layout TYPE lvc_s_layi.
ls_item_layout-t_image = ' (3Y)'.
ls_item_layout-style =
cl_gui_column_tree=>style_intensified.
ls_item_layout-fieldname = tree1->c_hierarchy_column_name.
APPEND ls_item_layout TO lt_item_layout.

* add node
l_node_text = wa_final1-post11.
DATA: relat TYPE int4.
relat = cl_gui_column_tree=>relat_last_child.
CALL METHOD tree1->add_node
EXPORTING
i_relat_node_key = p_relat_key
i_relationship = relat
i_node_text = l_node_text
is_outtab_line = wa_final1
it_item_layout = lt_item_layout
IMPORTING
e_new_node_key = p_node_key.

ENDFORM. " ADD_PSPNR1_LINE

*&---------------------------------------------------------------------*
*& Form ADD_PSPNR_LINE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_WA_FINAL text
* -->P_0958 text
* <--P_L_PSPNR_KEY text
*----------------------------------------------------------------------*
FORM add_pspnr_line USING wa_final1 TYPE t_final
p_relat_key TYPE lvc_nkey
CHANGING p_node_key TYPE lvc_nkey.

DATA: l_node_text TYPE lvc_value. " ,
* wa_final2 TYPE t_final.

* set item-layout
DATA: lt_item_layout TYPE lvc_t_layi,
ls_item_layout TYPE lvc_s_layi.
ls_item_layout-t_image = ' (3P)'.
ls_item_layout-fieldname = tree1->c_hierarchy_column_name.
ls_item_layout-style =
cl_gui_column_tree=>style_intensifd_critical.
APPEND ls_item_layout TO lt_item_layout.

* add node
l_node_text = wa_final1-post1.

DATA: ls_node TYPE lvc_s_layn.
ls_node-n_image = space.
ls_node-exp_image = space.

CALL METHOD tree1->add_node
EXPORTING
i_relat_node_key = p_relat_key
i_relationship = cl_gui_column_tree=>relat_last_child
i_node_text = l_node_text
is_outtab_line = wa_final1
is_node_layout = ls_node
it_item_layout = lt_item_layout
IMPORTING
e_new_node_key = p_node_key.

ENDFORM. " add_carrid_line

*&---------------------------------------------------------------------*
*& Module USER_COMMAND_9000 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_9000 INPUT.

CASE ok_code.
WHEN 'EXIT' OR 'BACK' OR 'CANC'.

LEAVE PROGRAM.
WHEN OTHERS.
CALL METHOD cl_gui_cfw=>dispatch.
ENDCASE.
CLEAR ok_code.
CALL METHOD cl_gui_cfw=>flush.

ENDMODULE. " USER_COMMAND_9000 INPUT



SELECTION SCREEN
OUTPUT



ALV reports are very useful to create lists and to provide standard functionality like sums, order and so on. To do this without ALV you would have to code all of this functions on your own.

There are several examples in the SAP system to see all these functionalities; they all start with BCALV_TEST_*.

To make sure that all works fine, the ALV FM or class must be called with the appropriate parameters. To make sure you are doing this OK, you can use this trick: for ALV reports created by the FM's REUSE_ALV_LIST*, insert the value &SOS in the command line and press enter. For ALV objects or FM REUSE_ALV_GRID* double right-click on an empty place of the ALV container while pressing the SHIFT key. You will get a full report of many parameters regarding the ALV.

ref: http://www.abap-code.com

The value data type must be in decimals (datatype = 'DEC').
The Fieldcat DECIMALS_OUT = O. If you wanna show the value without decimals.