Skip to Content
avatar image
Former Member

Color this row in ALV

TABLES: mara, marc.
    "marc is N 181
    "mara is 1 157
    DATA: lt_mara TYPE TABLE OF mara,
          ls_mara TYPE mara,
          lt_marc TYPE TABLE OF marc,
          ls_marc TYPE marc,
          BEGIN OF ls_out OCCURS 0,
            mtart LIKE  mara-mtart,
            matnr LIKE  marc-matnr,
            werks LIKE  marc-werks,
            ntgew LIKE  mara-ntgew,
            brgew LIKE  mara-brgew,
            sum   LIKE  mara-brgew,
          color(4).
    DATA:  END OF ls_out.
    DATA: lt_out  LIKE TABLE OF ls_out,
          fcat    TYPE slis_t_fieldcat_alv,
          ls_fcat LIKE LINE OF fcat,
           layout TYPE  slis_layout_alv.
    FIELD-SYMBOLS: <fsym> LIKE LINE OF fcat.
    PARAMETERS: p_mtart TYPE mara-mtart.
    SELECT-OPTIONS: so_werks FOR marc-werks.
    SELECT * FROM mara INTO TABLE lt_mara
      WHERE mtart = p_mtart.
    IF sy-subrc = 0.
      SELECT * FROM marc INTO TABLE lt_marc
      FOR ALL ENTRIES IN lt_mara
      WHERE  matnr = lt_mara-matnr
      AND werks IN so_werks.
      LOOP AT lt_marc INTO ls_marc.
        READ TABLE lt_mara INTO ls_mara
       WITH KEY matnr = ls_marc-matnr.
        ls_out-sum = ls_mara-brgew + ls_mara-ntgew .
        MOVE-CORRESPONDING ls_marc TO ls_out.
        MOVE-CORRESPONDING ls_mara TO ls_out.
        APPEND ls_out TO lt_out.
        CLEAR ls_out.
      ENDLOOP.
    ELSE.
      MESSAGE TEXT-e02 TYPE 'E' .
    ENDIF.
    CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
      EXPORTING
        i_program_name         = sy-repid
        i_internal_tabname     = 'LS_OUT'
        i_client_never_display = 'X'
        i_inclname             = sy-repid
      CHANGING
        ct_fieldcat            = fcat[]
      EXCEPTIONS
        inconsistent_interface = 1
        program_error          = 2
        OTHERS                 = 3.
    READ TABLE fcat INDEX 6  ASSIGNING <fsym>.
    <fsym>-outputlen = 15.
    LOOP AT LS_OUT.
      IF LS_OUT-SUM LT 5000.
       LS_OUT-color = 'C311'.
       else.
         LS_OUT-color = 'C511'.
      ENDIF.
      MODIFY  LS_OUT.
    ENDLOOP.
    layout-info_fieldname = 'COLOR'.
    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
      EXPORTING
        i_callback_program = sy-repid
        i_structure_name   = 'LS_OUT'
         is_layout = layout
        it_fieldcat        = fcat[]
      TABLES
        t_outtab           = lt_out
      EXCEPTIONS
        program_error      = 1
        OTHERS             = 2.
WHat is missing in this report!why doesnt it color any row
Add comment
10|10000 characters needed characters exceeded

  • Get RSS Feed

1 Answer

  • avatar image
    Former Member
    Sep 19, 2017 at 01:56 PM

    If you want to handle ANY /!\ formatting of a particular cell in ALV, here s the way.

    form update_style using 
      x  type lvc_fname  " x is 'MATNR', 'VBELN',  'BELNR'.... whatever in your fieldcatalog
      y  type int4  " y = 1,2,3.....
      update_mask  type xstring
      update_style  type xstring.
    
    READ table gt_alv into gs_alv index y.
    tabstyle = gs_alv-tabstyle.
    READ table tabstyle into s_style with key fieldname = x.
    
    " check if fieldname already exists in gs_alv-tabstyle (insert or update)
    
    s_style-style  = s_style-style  BIT-AND  update_mask.
    s_style-style  = s_style-style  BIT-OR  update_style.
    
    " Update or insert gs_alv-tabstyle from s_style
    " update gt_alv from gs_alv
    
    ENDFORM.


    How to assign a color to a row in ALV
    (But you cant have Cell background and Font Color at the same time !)

    perform update_style USING  x y 'FFFFFFE0' update_style.
    
    update_style can be : 
    
    '00000000'. " Disable any color
    '00000011'. " White Font
    '00000017'. " Red fond
    '00000013'. " gray font
    '00000014'. " Yellow font
    '00000015'. " blue font
    '00000016'. " green font
    '00000018'. " orange font 
    '00000011'. " black font
    
    '0000000D'. " background dark blue
    '0000000A'. " background fluo blue
    '00000005'. " background blue
    '00000003'. " background light blue
    '00000000'. " background gray
    '00000001'. " background light gray
    '00000004'. " backgorund yellow
    '0000000C'. " background dark yellow
    '00000006'. " background green
    '0000000E'. " background dark green
    '00000010'. " background dark orange
    '0000000F'. " background red
    '00000007'. " background pink
    '00000008'. " background orange
    '00000001'. " background standard 



    If you want to handle editable, bold, italic, underline... properties

    perform update_style  USING  x y 'FFFFFF9F' '00000020'.  " set bold
    perform update_style  USING  x y 'FFFFFF9F' '00000040'.  " unset bold property
    
    perform update_style  USING  x y 'FFFFF9FF' '00000200'.  " Underline
    perform update_style  USING  x y 'FFFFF9FF' '00000400'.  " stop underlying
    
    perform update_style  USING  x y 'FFFFF57F' '00000080'  " italic
    
    perform update_style  USING  x y 'FF9FFFFF' '00200000'  " hotspot
    perform update_style  USING  x y 'FF9FFFFF' '00400000'  " no hotspot 
    
    perform update_style  USING  x y 'F9E7FFFF'  '00080000'  " Editable
    perform update_style  USING  x y 'F9E7FFFF'  '00100000'  " Non Editable

    For alignments, update_mask is 'DFFFF57F'
    And update_style can be :

      DATA alv_style_align_left_top(4)  TYPE x VALUE '00000800'.
      DATA alv_style_align_center_top(4)  TYPE x VALUE '00001000'.
      DATA alv_style_align_right_top(4)  TYPE x VALUE '00001800'.
      DATA alv_style_align_left_center(4)  TYPE x VALUE '00002000'.
      DATA alv_style_align_center_center(4)  TYPE x VALUE '00002800'.
      DATA alv_style_align_right_center(4)  TYPE x VALUE '00003000'.
      DATA alv_style_align_left_bottom(4)  TYPE x VALUE '00003800'.
      DATA alv_style_align_center_bottom(4)  TYPE x VALUE '00004000'.
      DATA alv_style_align_right_bottom(4)  TYPE x VALUE '00004800'.


    If you want to handle borders, you have to modify s_style-style2 with :

    'FFFBFFFF' '00040000'  " Remove top border
    'FFF7FFFF' '00080000'  " Remove bottom border
    'FFFEFFFF' '00010000'  " Remove left border
    'FFFDFFFF' '00020000'  " Remove right border



    And after all of this (even after set_table_for_first_display)
    you just need to call :
    I dont use FORMs but METHODS because i wrote an implentation of class ZCL_GUI_ALV_GRID but Method REFRESH could be a FORM in your programs.

    METHOD REFRESH.
      DATA ls_stable TYPE lvc_s_stbl.
      ls_stable-row = 'X'.
      ls_stable-col = 'X'.
    
      me->set_frontend_layout( is_layout = me->is_layout ).
    
      CALL METHOD me->refresh_table_display
      EXPORTING
      is_stable  = ls_stable
    *  i_soft_refresh = 'X' " 
      EXCEPTIONS
      finished  = 1
      OTHERS  = 2.
      ret = me.
    ENDMETHOD.



    For me, x and y are not mandatory fields so :
    You can loop over all lines if you want to set a property to a column (y is unset)

      ASSIGN mt_outtab->* TO <tab>.
      CHECK <tab> IS ASSIGNED.
      LOOP AT <tab> ASSIGNING <line>.
          update_style( x sy-tabix update_mask update_style )


    or loop over your catalog when you want to set a property to a line (x is unset)

    LOOP at me->get_frontend_fieldcatalog( ) in ls_fcat
          update_style( ls_fcat-fieldname y update_mask update_style )
    


    For more possibilities, check link
    https://stackoverflow.com/questions/27000012/abap-alv-grid-merge-cells-and-style-formating-of-cells


    Simon

    Add comment
    10|10000 characters needed characters exceeded