簡體   English   中英

ALV 列文本和顏色不會改變

[英]ALV Column Text and Color won't change

我遇到了 SAP ALV 問題。 我想更改列的文本和顏色。 如果我直接調用該列('BONUS'),它會起作用,但是當我在 DO 子句中使用它並連接該列的名稱時,由於某種原因它不起作用。 雖然找到了列並且更改了屬性,但至少這是我在調試時看到的。

我希望有人能在這里幫助我。

以下是我編碼中應該更改屬性的部分。

        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.

我正在發布這兩種方法的代碼。 第一個是構建一個 fieldcatalog 並創建一個全局表,這樣 fieldcatalog 可以在第二種方法中使用。 這個應該填寫 fieldcatalog,配置 ALV(如列文本和顏色)並顯示結果。

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.

嗯...你沒有指定變量new的類型,但我會假設它是STRING 如果它正在做這樣的分配

new = count.

不會去掉count變量末尾的空格。

這個簡單的程序顯示了它。

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.

輸出是JAHR30 P而不是JAHR30P

要解決此問題,您可以將以下語句放在CONCATENATE之后。

CONDENSE h_fieldname NO-GAPS.

或者更簡潔的只是使用字符串模板而不是連接,那么您將不需要變量new

h_fieldname = |JAHR{ count }P|.

如果它適用於一列,則沒有理由不適用於另一列。

像往常一樣對代碼進行故障排除。 確保列名寫得很好,並且是 ALV 表中現有列的名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM