简体   繁体   中英

ALV Column Text and Color won't change

I got a SAP ALV problem. I want to change the text and the color of a column. It works if I call the column directly ('BONUS') but when I use it within a DO-clause and concatenate the name of the column it won't work for some reason. Though the column is found and the attributes are changed, at least this is what I see in while debugging.

I hope someone can help me out here.

The following is a part of my coding where the attributes should be changed.

        Data: Count Type i.
  DATA: h_fieldname TYPE char30.
  DATA: col_s         TYPE scrtext_s.

  DATA: col_m         TYPE scrtext_m.

  DATA: col_l         TYPE scrtext_l.

  DATA: colname(30) TYPE c.

DATA: lr_functions TYPE REF TO cl_salv_functions_list.

 DATA: gr_columns    TYPE REF TO cl_salv_columns_table.

 DATA: gr_column     TYPE REF TO cl_salv_column_table.

DATA: alv TYPE REF TO cl_salv_table.

  lv_color_red-col = 7.
  lv_color_red-int = 1.
  lv_color_red-inv = 0.

  lv_color_blue-col = 4.
  lv_color_blue-int = 1.
  lv_color_blue-inv = 0.

  lv_color_green-col = 5.
  lv_color_green-int = 1.
  lv_color_green-inv = 0.
            DO gv_row_count TIMES.

          ADD 1 TO count.
          new = count.

          CLEAR: h_fieldname, colname.
          CONCATENATE 'JAHR' new 'P' INTO h_fieldname.
          CONCATENATE 'Jahr' new INTO colname.
          col_s = colname.
          col_m = colname.
          col_l = colname.
          gr_column ?= gr_columns->get_column( h_fieldname ).
          gr_column->set_short_text( col_s ).
          gr_column->set_medium_text( col_m ).
          gr_column->set_long_text( col_l ).
          gr_column->set_color( lv_color_blue ).

          CLEAR: h_fieldname, colname.
          CONCATENATE 'JAHR' new 'W' INTO h_fieldname.
          CONCATENATE 'Jahr' new INTO colname.
          col_s = colname.
          col_m = colname.
          col_l = colname.
          gr_column ?= gr_columns->get_column( h_fieldname ).
          gr_column->set_short_text( col_s ).
          gr_column->set_medium_text( col_m ).
          gr_column->set_long_text( col_l ).
        ENDDO.

I'm posting the code of both methods. The first one is building a fieldcatalog an creating a global table so the fieldcatalog could be used in the second method. This one should fill the fieldcatalog, configure the ALV (like column texts and colors) and display the result.

EDIT: Here are also the attributes etc. used inside the methods:
  data GT_DATATAB type ref to DATA .
  class ZCL_BONUS_PROCESSING definition load .
  data GT_STANDARD type ZCL_BONUS_PROCESSING=>TTY_FINAL_STANDARD .
  data GT_ADVANCED type ZCL_BONUS_PROCESSING=>TTY_FINAL_ADVANCED .
  data GV_ROW_COUNT type I .


METHOD build_fieldcatalog.

  FIELD-SYMBOLS: <t_itab> TYPE table.
  DATA: t_fieldcat  TYPE lvc_t_fcat.
  DATA: s_fieldcat  TYPE LINE OF lvc_t_fcat.
  DATA: count TYPE i.
*  DATA: new(2) TYPE c.
  DATA: new TYPE string.
  DATA: final_count TYPE i.
  DATA: h_fieldname TYPE char30.

  " Personalnummer
  CLEAR: s_fieldcat.
  s_fieldcat-fieldname  = 'PERNR'.
  s_fieldcat-ref_table  = 'P0000'.
  s_fieldcat-ref_field  = 'PERNR'.
  s_fieldcat-key        = 'X'.
  APPEND s_fieldcat TO t_fieldcat.

  " Zielbonus
  CLEAR: s_fieldcat.
  s_fieldcat-fieldname  = 'BONUS'.
  s_fieldcat-inttype = 'C'.
  s_fieldcat-outputlen = '15'.
*  s_fieldcat-ref_table  = 'P0014'.
*  s_fieldcat-ref_field  = 'YY_BETRAG'.
  s_fieldcat-key        = 'X'.
  APPEND s_fieldcat TO t_fieldcat.

  " Bonusanspruch
  CLEAR: s_fieldcat.
  s_fieldcat-fieldname  = 'BONAN'.
  s_fieldcat-inttype = 'C'.
  s_fieldcat-outputlen = '15'.
*  s_fieldcat-ref_table  = 'P0014'.
*  s_fieldcat-ref_field  = 'YY_BETRAG'.
  s_fieldcat-key        = ''.
  APPEND s_fieldcat TO t_fieldcat.

  " Anspruch
  CLEAR: s_fieldcat.
  s_fieldcat-fieldname  = 'ANSPR'.
*  s_fieldcat-ref_table  = 'P0008'.
*  s_fieldcat-ref_field  = 'TRFGR'.
  s_fieldcat-inttype = 'C'.
  s_fieldcat-outputlen = '1'.
  s_fieldcat-key        = ''.
  APPEND s_fieldcat TO t_fieldcat.

  " Sonderregelung
  CLEAR: s_fieldcat.
  s_fieldcat-fieldname  = 'SONDE'.
  s_fieldcat-inttype    = 'I'.
  s_fieldcat-outputlen  = '1'.
  s_fieldcat-key        = ''.
  APPEND s_fieldcat TO t_fieldcat.

  " Kommentar
  CLEAR: s_fieldcat.
  s_fieldcat-fieldname  = 'COMM'.
  s_fieldcat-inttype    = 'C'.
  s_fieldcat-outputlen  = '50'.
  s_fieldcat-key        = ''.
  APPEND s_fieldcat TO t_fieldcat.

  " Mitarbeiterkreis
  CLEAR: s_fieldcat.
  s_fieldcat-fieldname  = 'PERSK'.
  s_fieldcat-ref_table  = 'P0001'.
  s_fieldcat-ref_field  = 'PERSK'.
  s_fieldcat-key        = 'X'.
  APPEND s_fieldcat TO t_fieldcat.

  count = 0.

  DO gv_row_count TIMES.

    ADD 1 TO count.
    new = count.

    " Lohnart (Jahr) Prozent
    CLEAR: h_fieldname.
    CONCATENATE 'JAHRP' new INTO h_fieldname.
    CONDENSE h_fieldname NO-GAPS.
    CLEAR: s_fieldcat.
    s_fieldcat-fieldname  = h_fieldname.
*    s_fieldcat-ref_table  = 'PZI02'.
*    s_fieldcat-ref_field  = 'ANZHL'.
    s_fieldcat-inttype    = 'C'.
    s_fieldcat-outputlen  = '15'.
    s_fieldcat-coltext    = h_fieldname.
    s_fieldcat-seltext    = h_fieldname.
    s_fieldcat-key        = ''.
    APPEND s_fieldcat TO t_fieldcat.

    " Lohnart (Jahr) Währung
    CLEAR: h_fieldname.
    CONCATENATE 'JAHRW' new INTO h_fieldname.
    CONDENSE h_fieldname NO-GAPS.
    CLEAR: s_fieldcat.
    s_fieldcat-fieldname  = h_fieldname.
*    s_fieldcat-ref_table  = 'P0014'.
*    s_fieldcat-ref_field  = 'YY_BETRAG'.
    s_fieldcat-inttype    = 'C'.
    s_fieldcat-outputlen  = '15'.
    s_fieldcat-coltext    = h_fieldname.
    s_fieldcat-seltext    = h_fieldname.
    s_fieldcat-key        = ''.
    APPEND s_fieldcat TO t_fieldcat.

  ENDDO.

  " Probezeit
  CLEAR: s_fieldcat.
  s_fieldcat-fieldname  = 'PROBE'.
  s_fieldcat-inttype    = 'D'.
  s_fieldcat-outputlen  = '10'.
  s_fieldcat-key        = ''.
  s_fieldcat-col_opt    = 'X'.
  APPEND s_fieldcat TO t_fieldcat.

* Datentabelle aus Feldkatalog erstellen
  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      it_fieldcatalog = t_fieldcat
    IMPORTING
      ep_table        = gt_datatab.

ENDMETHOD.


METHOD fill_and_display_alv.

  DATA: lstab     TYPE REF TO data.
  DATA: lv_offset TYPE i.
  DATA: dat       TYPE begda.
*  DATA: new(2) TYPE c.
  DATA: new TYPE string.
  DATA: count TYPE i.
  DATA: h_fieldname TYPE char30.
  DATA: col_s         TYPE scrtext_s.
  DATA: col_m         TYPE scrtext_m.
  DATA: col_l         TYPE scrtext_l.
  DATA: colname TYPE char30.
  DATA: lr_functions TYPE REF TO cl_salv_functions_list.
  DATA: gr_columns    TYPE REF TO cl_salv_columns_table.
  DATA: gr_column     TYPE REF TO cl_salv_column_table.
  DATA: alv TYPE REF TO cl_salv_table.
  DATA: exc TYPE REF TO cx_salv_msg.
*  DATA: t_standard TYPE TABLE OF sty_standard.
  DATA: s_standard TYPE zcl_bonus_data_collect=>sty_final_standard.
*  DATA: t_advanced TYPE TABLE OF sty_advanced.
  DATA: s_advanced TYPE zcl_bonus_data_collect=>sty_final_advanced.

  DATA: lv_color_red TYPE lvc_s_colo.
  DATA: lv_color_blue TYPE lvc_s_colo.
  DATA: lv_color_green TYPE lvc_s_colo.

  lv_color_red-col = 7.
  lv_color_red-int = 1.
  lv_color_red-inv = 0.

  lv_color_blue-col = 4.
  lv_color_blue-int = 1.
  lv_color_blue-inv = 0.

  lv_color_green-col = 5.
  lv_color_green-int = 1.
  lv_color_green-inv = 0.

  FIELD-SYMBOLS: <ls_itab> TYPE ANY,
                 <ls_comp> TYPE ANY.
  FIELD-SYMBOLS: <t_itab> TYPE table.


* Datentabelle füllen
  ASSIGN gt_datatab->* TO <t_itab>.
  cl_salv_table=>factory( IMPORTING r_salv_table = alv  CHANGING t_table = <t_itab> ).

* Zeilenstruktur erzeugen
  CREATE DATA lstab LIKE LINE OF <t_itab>.
  ASSIGN lstab->* TO <ls_itab>.

  LOOP AT gt_standard INTO s_standard.

    CLEAR: s_advanced, <ls_itab>.

    " Personalnummer
    lv_offset = 1.
    ASSIGN COMPONENT lv_offset OF STRUCTURE <ls_itab> TO <ls_comp>.
    IF sy-subrc EQ 0.
      <ls_comp> = s_standard-pernr.
    ENDIF.

    " Zielbonus
    lv_offset = 2.
    ASSIGN COMPONENT lv_offset OF STRUCTURE <ls_itab> TO <ls_comp>.
    IF sy-subrc EQ 0.
      <ls_comp> = s_standard-ziel_bonus.
    ENDIF.

    " Höhe des Anspruchs auf Zielbonus
    lv_offset = 3.
    ASSIGN COMPONENT lv_offset OF STRUCTURE <ls_itab> TO <ls_comp>.
    IF sy-subrc EQ 0.
      <ls_comp> = s_standard-ziel_bonus_anspruch.
    ENDIF.

    " Anspruch
    lv_offset = 4.
    ASSIGN COMPONENT lv_offset OF STRUCTURE <ls_itab> TO <ls_comp>.
    IF sy-subrc EQ 0.
      <ls_comp> = s_standard-anspruch.
    ENDIF.

    " Sonderregelung
    lv_offset = 5.
    ASSIGN COMPONENT lv_offset OF STRUCTURE <ls_itab> TO <ls_comp>.
    IF sy-subrc EQ 0.
      <ls_comp> = s_standard-sonderreg.
    ENDIF.

    " Kommentar
    lv_offset = 6.
    ASSIGN COMPONENT lv_offset OF STRUCTURE <ls_itab> TO <ls_comp>.
    IF sy-subrc EQ 0.
      <ls_comp> = s_standard-comm.
    ENDIF.

    " Mitarbeiterkreis
    lv_offset = 7.
    ASSIGN COMPONENT lv_offset OF STRUCTURE <ls_itab> TO <ls_comp>.
    IF sy-subrc EQ 0.
      <ls_comp> = s_standard-persk.
    ENDIF.

    " Beginn Zeitintervalle
    LOOP AT gt_advanced INTO s_advanced WHERE pernr = s_standard-pernr.

      ADD 1 TO lv_offset.

      " Beschäftigungsgrad
      ASSIGN COMPONENT lv_offset OF STRUCTURE <ls_itab> TO <ls_comp>.
      IF sy-subrc EQ 0.
        <ls_comp> = s_advanced-year_percent.
      ENDIF.

      ADD 1 TO lv_offset.

      " Bonuswert (Basiswert)
      ASSIGN COMPONENT lv_offset OF STRUCTURE <ls_itab> TO <ls_comp>.
      IF sy-subrc EQ 0.
        <ls_comp> = s_advanced-year_quantity.
      ENDIF.

    ENDLOOP.

    lv_offset = gv_row_count * 2 + 7.


    ADD 1 TO lv_offset.

    " Probezeit
    ASSIGN COMPONENT lv_offset OF STRUCTURE <ls_itab> TO <ls_comp>.
    IF sy-subrc EQ 0.
      <ls_comp> = s_standard-probez.
    ENDIF.

    ADD 1 TO lv_offset.

* Struktur dem Feldkatalog übergeben
    APPEND <ls_itab> TO <t_itab>.

    TRY .

** Funktionsleiste
        lr_functions = alv->get_functions( ).
        lr_functions->set_all( if_salv_c_bool_sap=>true ).
        lr_functions->set_print( if_salv_c_bool_sap=>true ).

** Optimierung der Spaltengröße
        gr_columns = alv->get_columns( ).
        gr_columns->set_optimize( abap_true ).


        count = 0.
        DO gv_row_count TIMES.

          ADD 1 TO count.
          new = count.

          CLEAR: h_fieldname, colname.
          CONCATENATE 'JAHRP' new INTO h_fieldname.
          CONDENSE h_fieldname NO-GAPS.
          CONCATENATE 'Jahr' new INTO colname.
          CONDENSE colname NO-GAPS.
          col_s = colname.
          col_m = colname.
          col_l = colname.
          gr_column ?= gr_columns->get_column( columnname = h_fieldname ).
          gr_column->set_short_text( col_s ).
          gr_column->set_medium_text( col_m ).
          gr_column->set_long_text( col_l ).
          gr_column->set_color( lv_color_blue ).

          CLEAR: h_fieldname, colname.
          CONCATENATE 'JAHRW' new INTO h_fieldname.
          CONDENSE h_fieldname NO-GAPS.
          CONCATENATE 'Jahr' new INTO colname.
          CONDENSE colname NO-GAPS.
          col_s = colname.
          col_m = colname.
          col_l = colname.
          gr_column ?= gr_columns->get_column( columnname = h_fieldname ).
          gr_column->set_short_text( col_s ).
          gr_column->set_medium_text( col_m ).
          gr_column->set_long_text( col_l ).
        ENDDO.

      CATCH cx_salv_msg INTO exc.
        MESSAGE exc TYPE 'I' DISPLAY LIKE 'E'.

    ENDTRY.

  ENDLOOP.

  cl_salv_table=>factory( IMPORTING r_salv_table = alv  CHANGING t_table = <t_itab> ).

* Funktionsleiste
  lr_functions = alv->get_functions( ).
  lr_functions->set_all( if_salv_c_bool_sap=>true ).
  lr_functions->set_print( if_salv_c_bool_sap=>true ).

* Optimierung der Spaltengröße
  gr_columns = alv->get_columns( ).
  gr_columns->set_optimize( abap_true ).

* Titel
  gr_column ?= gr_columns->get_column( 'BONUS' ).
  gr_column->set_short_text( 'Zielbonus' ).
  gr_column->set_medium_text( 'Zielbonus' ).
  gr_column->set_long_text( 'Aliq. Zielbonus' ).
  gr_column->set_color( lv_color_red ).

  gr_column ?= gr_columns->get_column( 'BONAN' ).
  gr_column->set_short_text( 'B.anspruch' ).
  gr_column->set_medium_text( 'Bonusanspruch' ).
  gr_column->set_long_text( 'Bonusanspruch' ).

  gr_column ?= gr_columns->get_column( 'ANSPR' ).
  gr_column->set_short_text( 'Anspruch' ).
  gr_column->set_medium_text( 'Anspruch' ).
  gr_column->set_long_text( 'Anspruch' ).

  gr_column ?= gr_columns->get_column( 'SONDE' ).
  gr_column->set_short_text( 'Sond.reg.' ).
  gr_column->set_medium_text( 'Sonderregel.' ).
  gr_column->set_long_text( 'Sonderregelung' ).

  gr_column ?= gr_columns->get_column( 'COMM' ).
  gr_column->set_short_text( 'Komm.' ).
  gr_column->set_medium_text( 'Kommentar' ).
  gr_column->set_long_text( 'Kommentar' ).

  gr_column ?= gr_columns->get_column( 'PROBE' ).
  gr_column->set_short_text( 'Probez.' ).
  gr_column->set_medium_text( 'Probezeit' ).
  gr_column->set_long_text( 'Probezeit' ).
  gr_column->set_color( lv_color_green ).


  alv->display( ).

ENDMETHOD.

Well... you did not specify the type of the variable new but I will assume it is STRING . If it is then making such an assignment

new = count.

will not get rid of the space at the end of the count variable.

This simple program shows it.

REPORT ZZZ.

DATA: gv_row_count TYPE i VALUE 30.
DATA: fieldname TYPE char30.
DATA: new TYPE string.

START-OF-SELECTION.
   new = gv_row_count.
   CONCATENATE 'JAHR' new 'P' INTO fieldname.
   WRITE fieldname.

The output is JAHR30 P and not JAHR30P .

To work around it you can put the following statement after the CONCATENATE one.

CONDENSE h_fieldname NO-GAPS.

or even neater just use string templates instead of concatenating then you will not need the variable new .

h_fieldname = |JAHR{ count }P|.

If it works for one column, there's no reason that it doesn't with another one.

Do as usual to troubleshoot your code. Make sure that the column name is well written, and is the name of an existing column in the ALV table.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM