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

Totals in ALV block display does not work...

aris_hidalgo
Contributor
0 Kudos

Hello Experts,

I want to total my currency fields in my ALV block display. I did put 'X'

in the DO_SUM in the fieldcatalog but it still does not work.

What maybe the cause of this? I also tried putting 'P' in the INTTYPE of the

fieldcatalog but it also didn't work.

Thank you guys and take care!

1 ACCEPTED SOLUTION

former_member188685
Active Contributor
0 Kudos

Why it is working for me.. here is the working example./.

REPORT  ztest_alv_block.

TYPE-POOLS:slis.
DATA: it_fieldcat TYPE  slis_t_fieldcat_alv,
      wa_fcat LIKE LINE OF it_fieldcat,
      it_event TYPE  slis_t_event,
      is_layout TYPE  slis_layout_alv.

DATA: it_flight TYPE sflight_tab1.

SELECT * FROM sflight
INTO TABLE it_flight
UP TO 20 ROWS.

CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
  EXPORTING
    i_program_name         = sy-repid
    i_structure_name       = 'SFLIGHT'
  CHANGING
    ct_fieldcat            = it_fieldcat
  EXCEPTIONS
    inconsistent_interface = 1
    program_error          = 2.
wa_fcat-do_sum = 'X'.
MODIFY it_fieldcat FROM wa_fcat TRANSPORTING do_sum
WHERE fieldname = 'SEATSOCC'.


CALL FUNCTION 'REUSE_ALV_BLOCK_LIST_INIT'
  EXPORTING
    i_callback_program = sy-repid.
CALL FUNCTION 'REUSE_ALV_BLOCK_LIST_APPEND'
  EXPORTING
    is_layout                  = is_layout
    it_fieldcat                = it_fieldcat
    i_tabname                  = 'IT_FLIGHT'
    it_events                  = it_event
  TABLES
    t_outtab                   = it_flight
  EXCEPTIONS
    program_error              = 1
    maximum_of_appends_reached = 2.
CALL FUNCTION 'REUSE_ALV_BLOCK_LIST_DISPLAY'
  .

6 REPLIES 6

former_member188685
Active Contributor
0 Kudos

Why it is working for me.. here is the working example./.

REPORT  ztest_alv_block.

TYPE-POOLS:slis.
DATA: it_fieldcat TYPE  slis_t_fieldcat_alv,
      wa_fcat LIKE LINE OF it_fieldcat,
      it_event TYPE  slis_t_event,
      is_layout TYPE  slis_layout_alv.

DATA: it_flight TYPE sflight_tab1.

SELECT * FROM sflight
INTO TABLE it_flight
UP TO 20 ROWS.

CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
  EXPORTING
    i_program_name         = sy-repid
    i_structure_name       = 'SFLIGHT'
  CHANGING
    ct_fieldcat            = it_fieldcat
  EXCEPTIONS
    inconsistent_interface = 1
    program_error          = 2.
wa_fcat-do_sum = 'X'.
MODIFY it_fieldcat FROM wa_fcat TRANSPORTING do_sum
WHERE fieldname = 'SEATSOCC'.


CALL FUNCTION 'REUSE_ALV_BLOCK_LIST_INIT'
  EXPORTING
    i_callback_program = sy-repid.
CALL FUNCTION 'REUSE_ALV_BLOCK_LIST_APPEND'
  EXPORTING
    is_layout                  = is_layout
    it_fieldcat                = it_fieldcat
    i_tabname                  = 'IT_FLIGHT'
    it_events                  = it_event
  TABLES
    t_outtab                   = it_flight
  EXCEPTIONS
    program_error              = 1
    maximum_of_appends_reached = 2.
CALL FUNCTION 'REUSE_ALV_BLOCK_LIST_DISPLAY'
  .

0 Kudos

Hi Vijay,

I think I am missing something in my code. I have posted my code below. In the latter part of my code, if the data type = 'P', then I move 'X' to do_sum.


LOOP AT lt_components ASSIGNING <fs_components>.
      CLEAR: lv_outputlen, lv_seltext_s, lv_seltext_m,
             lv_seltext_l, lv_do_sum, lv_inttype,
             lv_hotspot, lv_fix_column, lv_ddictxt,
             lv_tabname, lv_no_zero, lv_strlen,
             lv_no_out, lv_name, lv_ktx,
             lv_mnr_start, lv_mnr_end, lv_ktx_start,
             lv_ktx_end, lv_just, lv_prev_year,
             lv_prev_month.

*     Company code
      IF <fs_components>-name = lc_bukrs_text.
        lv_strlen = STRLEN( text-t01 ).
        MOVE text-t01 TO: lv_seltext_s, lv_seltext_m, lv_seltext_l.
        lv_just      = lc_just_c.
        lv_outputlen = lv_strlen.
        MOVE 'X' TO lv_no_out.
*     For other fields
      ELSE.
        MOVE <fs_components>-name TO: lv_name.
        TRANSLATE lv_name TO UPPER CASE.
*       Check if field is a month field
        READ TABLE lt_month_names ASSIGNING <fs_month_names>"#EC *
                                  WITH KEY spras = sy-langu
                                           ltx   = lv_name.
        IF sy-subrc = 0.
          IF <fs_month_names>-mnr NOT IN s_peraf[].
            MOVE 'X' TO lv_no_out.
          ENDIF.
          MOVE <fs_month_names>-ktx TO lv_ktx.
          CALL FUNCTION 'STRING_UPPER_LOWER_CASE'
            EXPORTING
              delimiter = ''
              string1   = lv_ktx
            IMPORTING
              string    = lv_ktx
            EXCEPTIONS
              not_valid = 1
              too_long  = 2
              too_small = 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.

          CONCATENATE lv_ktx p_gjahr
                 INTO lv_seltext_m
            SEPARATED BY space.

          MOVE lv_seltext_m TO: lv_seltext_s, lv_seltext_l.
        ELSE.
*/Routine for 'TOTAL' field
          IF <fs_components>-name = text-t07.
            CLEAR lv_strlen.
            lv_strlen = STRLEN( s_peraf-low ).
*           Start month
            IF lv_strlen > 2.
              MOVE s_peraf-low+1(2) TO lv_mnr_start.
            ELSEIF lv_strlen < 2.
              MOVE s_peraf-low TO lv_mnr_start.
            ENDIF.

*           End month
            CASE s_peraf-high.
              WHEN space.
                MOVE s_peraf-low TO s_peraf-high.
                CLEAR lv_strlen.
                lv_strlen = STRLEN( s_peraf-high ).
                IF lv_strlen > 2.
                  MOVE s_peraf-high+1(2) TO lv_mnr_end.
                ELSEIF lv_strlen < 2.
                  MOVE s_peraf-high TO lv_mnr_end.
                ENDIF.
              WHEN OTHERS.
                CLEAR lv_strlen.
                lv_strlen = STRLEN( s_peraf-high ).

                IF lv_strlen > 2.
                  MOVE s_peraf-high+1(2) TO lv_mnr_end.
                ELSEIF lv_strlen < 2.
                  MOVE s_peraf-high TO lv_mnr_end.
                ENDIF.
            ENDCASE.
*           Get month text(Short) of start month
            READ TABLE lt_month_names ASSIGNING <fs_month_names2>"#EC *
                                      WITH KEY spras = sy-langu
                                               mnr   = lv_mnr_start.
            IF sy-subrc = 0.
              MOVE <fs_month_names2>-ktx TO lv_ktx_start.
              CALL FUNCTION 'STRING_UPPER_LOWER_CASE'
                EXPORTING
                  delimiter = ''
                  string1   = lv_ktx_start
                IMPORTING
                  string    = lv_ktx_start
                EXCEPTIONS
                  not_valid = 1
                  too_long  = 2
                  too_small = 3
                  OTHERS    = 4.

              IF sy-subrc <> 0.
*                MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
*                        WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
              ENDIF.
            ENDIF.
*           Get month text(Short) of end month
            READ TABLE lt_month_names ASSIGNING <fs_month_names2>"#EC *
                                      WITH KEY spras = sy-langu
                                               mnr   = lv_mnr_end.
            IF sy-subrc = 0.
              MOVE <fs_month_names2>-ktx TO lv_ktx_end.
              CALL FUNCTION 'STRING_UPPER_LOWER_CASE'
                EXPORTING
                  delimiter = ''
                  string1   = lv_ktx_end
                IMPORTING
                  string    = lv_ktx_end
                EXCEPTIONS
                  not_valid = 1
                  too_long  = 2
                  too_small = 3
                  OTHERS    = 4.

              IF sy-subrc <> 0.
*                MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
*                        WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
              ENDIF.
            ENDIF.

            IF lv_ktx_start IS NOT INITIAL AND
               lv_ktx_end IS NOT INITIAL.

              CONCATENATE lv_ktx_start 'to' lv_ktx_end p_gjahr
                     INTO lv_seltext_l
                SEPARATED BY space.
            ENDIF.
*/Routine for 'GRAND_TOTAL' field
          ELSEIF <fs_components>-name = text-t08.
*           Get end month text
            IF s_peraf-high IS INITIAL.
              MOVE s_peraf-low TO s_peraf-high.
              CLEAR lv_strlen.
              lv_strlen = STRLEN( s_peraf-high ).

              IF lv_strlen > 2.
                MOVE s_peraf-high+1(2) TO lv_mnr_end.
              ELSEIF lv_strlen < 2.
                MOVE s_peraf-high TO lv_mnr_end.
              ENDIF.
            ELSE.
              CLEAR lv_strlen.
              lv_strlen = STRLEN( s_peraf-high ).

              IF lv_strlen > 2.
                MOVE s_peraf-high+1(2) TO lv_mnr_end.
              ELSEIF lv_strlen < 2.
                MOVE s_peraf-high TO lv_mnr_end.
              ENDIF.
            ENDIF.
*           Get month text(Short) of end month
            READ TABLE lt_month_names ASSIGNING <fs_month_names2>"#EC *
                                      WITH KEY spras = sy-langu
                                               mnr   = lv_mnr_end.
            IF sy-subrc = 0.
              MOVE <fs_month_names2>-ktx TO lv_ktx_end.
              CALL FUNCTION 'STRING_UPPER_LOWER_CASE'
                EXPORTING
                  delimiter = ''
                  string1   = lv_ktx_end
                IMPORTING
                  string    = lv_ktx_end
                EXCEPTIONS
                  not_valid = 1
                  too_long  = 2
                  too_small = 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.
              CONCATENATE text-t09 lv_ktx_end p_gjahr
                     INTO lv_seltext_l
                SEPARATED BY space.

              lv_just = lc_just_r.
            ENDIF.
          ELSE.
*/Routine for 'BALANCE' field
            IF <fs_components>-name = text-t10.
              IF s_peraf-low = 1.
                lv_prev_year = p_gjahr - 1.
                CONCATENATE text-t09 'Dec' lv_prev_year
                       INTO lv_seltext_l
                  SEPARATED BY space.
              ELSE.
                lv_prev_month = s_peraf-low - 1.
                READ TABLE lt_month_names ASSIGNING <fs_month_names2>"#EC *
                                          WITH KEY spras = sy-langu
                                                   mnr   = lv_prev_month.
                IF sy-subrc = 0.
                  CONCATENATE text-t09 <fs_month_names2>-ktx p_gjahr
                         INTO lv_seltext_l
                  SEPARATED BY space.
                ENDIF.
              ENDIF.
            ELSE.
              MOVE <fs_components>-name TO lv_seltext_m.
              CALL FUNCTION 'STRING_UPPER_LOWER_CASE'
                EXPORTING
                  delimiter = ''
                  string1   = lv_seltext_l
                IMPORTING
                  string    = lv_seltext_l
                EXCEPTIONS
                  not_valid = 1
                  too_long  = 2
                  too_small = 3
                  OTHERS    = 4.

              IF sy-subrc <> 0.
*              MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
*                      WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
              ENDIF.
            ENDIF.
          ENDIF.
        ENDIF.
      ENDIF.

      IF <fs_components>-type_kind = lc_type_kind_p.
*        lv_outputlen = ( <fs_components>-length * <fs_components>-decimals ) + 3.
        lv_just = lc_just_r.
        MOVE 'X' TO lv_do_sum.
*        MOVE lc_type_kind_p TO lv_inttype.
      ENDIF.

*     Asset class
      IF <fs_components>-name = lc_anlkl_text.
        CLEAR lv_strlen.
        lv_strlen = STRLEN( text-t02 ).
        MOVE text-t02 TO: lv_seltext_m, lv_seltext_l.
        MOVE text-t06 TO lv_seltext_s.
*        lv_outputlen = lv_strlen.
        MOVE 'X' TO lv_hotspot.
      ENDIF.

*     Asset description
      IF <fs_components>-name = lc_txk50_text.
        CLEAR lv_strlen.
        lv_strlen = STRLEN( text-t03 ).
        MOVE text-t03 TO: lv_seltext_s, lv_seltext_m, lv_seltext_l.
*        lv_outputlen = lv_strlen.
      ENDIF.

*     G/L account
      IF <fs_components>-name = lc_ktansw_text.
        CLEAR lv_strlen.
        lv_strlen = STRLEN( text-t04 ).
        MOVE text-t04 TO: lv_seltext_m, lv_seltext_l.
        MOVE text-t05 TO lv_seltext_s.
*        lv_outputlen = lv_strlen.
      ENDIF.

*     Reference internal table
      MOVE wa_itab_name-itab_name2 TO lv_tabname.

*     Build fieldcatalog manually
      me->build_fieldcat(
          EXPORTING
            im_fieldname  = <fs_components>-name
            im_outputlen  = lv_outputlen
            im_seltext_s  = lv_seltext_s
            im_seltext_m  = lv_seltext_m
            im_seltext_l  = lv_seltext_l
            im_do_sum     = lv_do_sum
            im_inttype    = lv_inttype
            im_hotspot    = lv_hotspot
            im_fix_column = lv_fix_column
            im_ddictxt    = lv_ddictxt
            im_tabname    = lv_tabname
            im_no_zero    = lv_no_zero
            im_no_out     = lv_no_out
            im_just       = lv_just
          IMPORTING
            ex_fieldcat   = gt_fieldcat ).
    ENDLOOP.

0 Kudos
wa_fieldcat-fieldname = <fs_components>--name .
  wa_fieldcat-datatype = <fs_components>--type_kind.
  wa_fieldcat-inttype = <fs_components>--type_kind.
  wa_fieldcat-intlen = <fs_components>--length.
  wa_fieldcat-decimals = <fs_components>--decimals.
  wa_fieldcat-coltext = <fs_components>--name.
  wa_fieldcat-outputlen = <fs_components>--length.

the above properties are must. I can't figure out from your code what is wrong. in Debug mode check all the properties for the field and change , and see./

0 Kudos

Hi Vijay,

Thank you for your reply. Ok, I'll just debug it and try to experiment putting values in the fieldcatalog.

Thanks again!

0 Kudos

I just tried it with the Dynamic internal table , there also it is working.

REPORT  ztest_alv_block.

TYPE-POOLS:slis, abap.
DATA: it_fieldcat TYPE  slis_t_fieldcat_alv,
      wa_fcat LIKE LINE OF it_fieldcat,
      it_event TYPE  slis_t_event,
      is_layout TYPE  slis_layout_alv.

DATA : table_des TYPE REF TO cl_abap_structdescr.
DATA : ifields TYPE abap_compdescr_tab,
       wa_field LIKE LINE OF ifields.
DATA:  it_fieldcat_lvc TYPE lvc_t_fcat,
       wa_fieldcat LIKE LINE OF it_fieldcat_lvc.

DATA: i_tab TYPE REF TO data.

FIELD-SYMBOLS: <fs> TYPE STANDARD TABLE.

PARAMETERS: p_table TYPE dd02l-tabname DEFAULT 'SFLIGHT'.


"Table definiton using the table name
table_des ?= cl_abap_typedescr=>describe_by_name( p_table ).
"Now Read all the fields to a table.
ifields = table_des->components.


LOOP AT ifields INTO wa_field.
  CLEAR wa_fieldcat.
  wa_fieldcat-fieldname = wa_field-name .
  wa_fieldcat-datatype = wa_field-type_kind.
  wa_fieldcat-inttype = wa_field-type_kind.
  wa_fieldcat-intlen = wa_field-length.
  wa_fieldcat-decimals = wa_field-decimals.
  wa_fieldcat-coltext = wa_field-name.
  wa_fieldcat-outputlen = wa_field-length.

  APPEND  wa_fieldcat TO it_fieldcat_lvc.
ENDLOOP.

CALL METHOD cl_alv_table_create=>create_dynamic_table
  EXPORTING
    it_fieldcatalog           = it_fieldcat_lvc
  IMPORTING
    ep_table                  = i_tab
*    e_style_fname             =
  EXCEPTIONS
    generate_subpool_dir_full = 1
    OTHERS                    = 2
        .
IF sy-subrc NE 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

ASSIGN i_tab->* TO <fs>.


SELECT  *
FROM (p_table)
INTO CORRESPONDING FIELDS OF TABLE <fs>
UP TO 20 ROWS.


CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
  EXPORTING
    i_program_name         = sy-repid
    i_structure_name       = 'SFLIGHT'
  CHANGING
    ct_fieldcat            = it_fieldcat
  EXCEPTIONS
    inconsistent_interface = 1
    program_error          = 2.
CALL FUNCTION 'LVC_TRANSFER_TO_SLIS'
  EXPORTING
    it_fieldcat_lvc         = it_fieldcat_lvc
  IMPORTING
    et_fieldcat_alv         = it_fieldcat
  EXCEPTIONS
    it_data_missing         = 1
    it_fieldcat_lvc_missing = 2.


wa_fcat-do_sum = 'X'.
MODIFY it_fieldcat FROM wa_fcat TRANSPORTING do_sum
WHERE fieldname = 'SEATSOCC'.


CALL FUNCTION 'REUSE_ALV_BLOCK_LIST_INIT'
  EXPORTING
    i_callback_program = sy-repid.
CALL FUNCTION 'REUSE_ALV_BLOCK_LIST_APPEND'
  EXPORTING
    is_layout                  = is_layout
    it_fieldcat                = it_fieldcat
    i_tabname                  = '<FS>'
    it_events                  = it_event
  TABLES
    t_outtab                   = <fs>
  EXCEPTIONS
    program_error              = 1
    maximum_of_appends_reached = 2.
CALL FUNCTION 'REUSE_ALV_BLOCK_LIST_DISPLAY'
  .

0 Kudos

Hi Vijay,

Could you please provide me the exact solution for this total in Block display problem?