-1

How can I display the row where the sum of ls_out is 1900? How can I improve below code?

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. "FERT
    SELECT-OPTIONS: so_werks FOR marc-werks. " 1000 to 1998


    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 "e merr auto
        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.

    *-conditionally populate the color
    LOOP AT LS_OUT.
      IF LS_OUT-sum eq 21.
       LS_OUT-color = 'C311'.
      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'
        it_fieldcat        = fcat[]
      TABLES
        t_outtab           = lt_out
      EXCEPTIONS
        program_error      = 1
        OTHERS             = 2.
Sandra Rossi
  • 11,934
  • 5
  • 22
  • 48
Demotivated
  • 117
  • 3
  • 13
  • 2
    It's very unclear what you're asking. Do you want every other row to be colored? Do you want specific values of some field to be colored? Please clarify your question, making it as succinct as possible. – gkubed Jul 18 '17 at 19:12
  • @gkubed I have,I am asking to color rows where sum is LT 5000 – Demotivated Jul 18 '17 at 19:29

3 Answers3

1

Adding the following parameter to your call to REUSE_ALV_GRID_DISPLAY should fix your problem

is_layout = layout

Gert Beukema
  • 2,510
  • 1
  • 17
  • 18
  • Sorry it doesnt! even if I make the ls_out-SUM or ay other column LT 5000 it doesnt make yellow none – Demotivated Jul 19 '17 at 07:12
  • Right now your program colors with the condition IF LS_OUT-sum eq 21, change that to the relevant condition. Also set clear the value if the condition fails, i.e. add an ELSE clause. – Gert Beukema Jul 20 '17 at 00:17
1

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 a form or method called REFRESH Since I wrote an implentation of class CL_GUI_ALV_GRID I dont use FORMs but methods :

METHOD REFRESH.
  DATA ls_stable TYPE lvc_s_stbl.
  ls_stable-row = 'X'.
  ls_stable-col = 'X'.

  CALL METHOD me->refresh_table_display
  EXPORTING
  is_stable  = ls_stable
  EXCEPTIONS
  finished  = 1
  OTHERS  = 2.
ENDMETHOD.

x and y are not mandatory fields so I can loop over all lines 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 my fieldcatalog 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

ABAP Alv_grid Merge cells and style formating of cells

0
LOOP AT Lt_OUT.
 IF lt_out-sum >= 50000.
  lt_out-color = 'C311'.
 ENDIF.
 MODIFY  Lt_OUT.
ENDLOOP.
layout-info_fieldname = 'COLOR".
Suncatcher
  • 10,355
  • 10
  • 52
  • 90
Demotivated
  • 117
  • 3
  • 13