一个带单元格颜色的动态ALV

*&---------------------------------------------------------------------*
*& Form FRM_GENERATION_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
DATA LT_TABLE TYPE TABLE OF DFIES. 
DATA LS_TABLE TYPE DFIES.
DATA LR_STRUC TYPE REF TO DATA.
DATA LR_TABLE TYPE REF TO DATA.
DATA LR_TYPE  TYPE REF TO CL_ABAP_TYPEDESCR.
DATA LR_DATA  TYPE REF TO CL_ABAP_DATADESCR.
DATA LT_COMP  TYPE ABAP_COMPONENT_TAB.

DATA:
  LR_ITAB_TYPE   TYPE REF TO CL_ABAP_TABLEDESCR,
  LR_STRUCT_TYPE TYPE REF TO CL_ABAP_STRUCTDESCR,
  LT_COMP_TAB    TYPE CL_ABAP_STRUCTDESCR=>COMPONENT_TABLE WITH HEADER LINE.

DATA LV_FIELD TYPE CHAR10.
DATA LV_VALUE.

DATA DYN_WA TYPE REF TO DATA.
DATA DYN_TABLE TYPE REF TO DATA.

DATA LS_CELL TYPE LVC_S_SCOL.
DATA LT_CELL TYPE LVC_T_SCOL.

DATA L_STRING TYPE STRING.

FIELD-SYMBOLS: <DYN_TABLE> TYPE STANDARD TABLE,
               <DYN_WA>    TYPE ANY,
               <DYN_FIELD> TYPE ANY,
               <DYN_CELL>  TYPE ANY.

CONSTANTS LC_STATUS TYPE CHAR10 VALUE 'STATUS'.
CONSTANTS LC_CELLCOLOR TYPE CHAR10 VALUE 'CELLCOLOR'.
CONSTANTS LC_1 TYPE C VALUE '1'.
CONSTANTS LC_2 TYPE C VALUE '2'.
CONSTANTS LC_3 TYPE C VALUE '3'.
CONSTANTS LC_0 TYPE C VALUE '0'.
CONSTANTS LC_STRUC TYPE DDOBJNAME VALUE 'ZPMS_INSPLOG'.

DATA LV_DATE TYPE D.
DATA LV_POSITION(4) TYPE N.
DATA LV_OFFSET(6) TYPE N.


*1.获取表中的字段结构
CALL FUNCTION 'DDIF_NAMETAB_GET'
  EXPORTING
    TABNAME   = LC_STRUC
  TABLES
    DFIES_TAB = LT_TABLE
  EXCEPTIONS
    NOT_FOUND = 1
    OTHERS    = 2.
IF SY-SUBRC <> 0.
  MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
          WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
LOOP AT LT_TABLE INTO LS_TABLE.
  IF LS_TABLE-FIELDNAME = LC_STATUS.
    LV_DATE = GV_DATE_S.
    WHILE LV_DATE <= GV_DATE_E.
      LS_TABLE-LFIELDNAME = LC_STATUS && LV_DATE+6(2).
      PERFORM FRM_ADD_COMP USING LS_TABLE CHANGING LT_COMP.
      PERFORM FRM_ADD_FCAT USING LS_TABLE.
      LV_DATE = LV_DATE + 1.
    ENDWHILE.
  ELSE.
    PERFORM FRM_ADD_FCAT USING LS_TABLE.
    PERFORM FRM_ADD_COMP USING LS_TABLE CHANGING LT_COMP.
  ENDIF.
ENDLOOP.

CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
  EXPORTING
    IT_FIELDCATALOG           = GT_FIELDCAT
  IMPORTING
    EP_TABLE                  = LR_TABLE
  EXCEPTIONS
    GENERATE_SUBPOOL_DIR_FULL = 1
    OTHERS                    = 2.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
IF LR_TABLE IS BOUND.
*   Add 'CELLCOLOR' to Table
  ASSIGN LR_TABLE->* TO <DYN_TABLE>.
  LR_ITAB_TYPE ?= CL_ABAP_TABLEDESCR=>DESCRIBE_BY_DATA( <DYN_TABLE> ).
  LR_STRUCT_TYPE ?= LR_ITAB_TYPE->GET_TABLE_LINE_TYPE( ).
  LT_COMP_TAB[] = LR_STRUCT_TYPE->GET_COMPONENTS( ).
  LT_COMP_TAB-NAME = LC_CELLCOLOR.
  LR_STRUCT_TYPE ?= CL_ABAP_TYPEDESCR=>DESCRIBE_BY_NAME( 'LVC_S_SCOL' ).
  LT_COMP_TAB-TYPE = CL_ABAP_TABLEDESCR=>CREATE( LR_STRUCT_TYPE ).
  INSERT LT_COMP_TAB INTO LT_COMP_TAB INDEX 1.
  LR_STRUCT_TYPE = CL_ABAP_STRUCTDESCR=>CREATE( LT_COMP_TAB[] ).
  LR_ITAB_TYPE = CL_ABAP_TABLEDESCR=>CREATE( LR_STRUCT_TYPE ).

  CREATE DATA LR_TABLE TYPE HANDLE LR_ITAB_TYPE.
  ASSIGN LR_TABLE->* TO <DYN_TABLE>.
  CREATE DATA LR_STRUC LIKE LINE OF <DYN_TABLE>.
  ASSIGN LR_STRUC->* TO <DYN_WA>.
ENDIF.

"organize the output table
LOOP AT GT_DATA INTO GS_DATA.
  MOVE-CORRESPONDING GS_DATA TO <DYN_WA>.

  LV_DATE = GV_DATE_S.
  "check schedule lines
  CLEAR LT_CELL.
  LOOP AT GT_MHIS INTO GS_MHIS WHERE WARPL = GS_DATA-WARPL.
    LV_FIELD = TEXT-T00 && GS_MHIS-NPLDA+6(2).
    ASSIGN COMPONENT LV_FIELD OF STRUCTURE <DYN_WA> TO <DYN_FIELD>.
    IF GS_MHIS-TSARB = 'X'.
      <DYN_FIELD> = '3'.
      "check ztable result
      LOOP AT LT_ORDER INTO DATA(LS_ORDER) WHERE WARPL = GS_DATA-WARPL.
        READ TABLE GT_ZXJG INTO DATA(LS_ZXJG) WITH KEY QMNUM = LS_ORDER-QMNUM
                                                 PLNNR = GS_DATA-PLNNR
                                                 PLNAL = GS_DATA-PLNAL
                                                 VORNR = GS_DATA-VORNR.
        IF SY-SUBRC = 0 AND LS_ZXJG-ZSTATUS = '1'.
          <DYN_FIELD> = '1'.
        ELSEIF SY-SUBRC = 0 AND LS_ZXJG-ZSTATUS = '2'.
          <DYN_FIELD> = '2'.
        ELSE.
        ENDIF.
      ENDLOOP.
    ELSE.
      <DYN_FIELD> = '0'.
    ENDIF.
    PERFORM FRM_SET_CELL_COLOR USING LV_FIELD <DYN_FIELD> CHANGING LT_CELL.
    "Cell color
*      CLEAR: LV_VALUE.
*      LV_VALUE = <DYN_FIELD>.
  ENDLOOP.
  ASSIGN COMPONENT LC_CELLCOLOR OF STRUCTURE <DYN_WA> TO <DYN_CELL>.
  <DYN_CELL> = LT_CELL.
  APPEND <DYN_WA> TO <DYN_TABLE>.
  CLEAR <DYN_WA>.
ENDLOOP.
*Layout
GS_LAYOUT-CWIDTH_OPT = 'X'.
GS_LAYOUT-CTAB_FNAME = LC_CELLCOLOR.
"Alv Dispaly
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
  EXPORTING
    I_CALLBACK_PROGRAM = SY-REPID
    IS_LAYOUT_LVC      = GS_LAYOUT
    IT_FIELDCAT_LVC    = GT_FIELDCAT
  TABLES
    T_OUTTAB           = <DYN_TABLE>
  EXCEPTIONS
    PROGRAM_ERROR      = 1
    OTHERS             = 2.
IF SY-SUBRC <> 0.
  MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
  WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
*&---------------------------------------------------------------------*
*& Form frm_add_comp
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> LS_TABLE
*&      <-- LT_COMP
*&---------------------------------------------------------------------*
FORM FRM_ADD_COMP  USING    PS_TABLE TYPE DFIES
                   CHANGING PT_COMP TYPE  ABAP_COMPONENT_TAB.
  DATA LS_TABLE TYPE DFIES.
  DATA LS_COMP LIKE LINE OF  PT_COMP.
  DATA LR_TYPE TYPE REF TO CL_ABAP_TYPEDESCR.
  DATA L_STRING TYPE STRING.

  LS_TABLE = PS_TABLE.
  CONCATENATE LS_TABLE-TABNAME '-' LS_TABLE-FIELDNAME INTO L_STRING.

  LS_COMP-NAME = LS_TABLE-LFIELDNAME.
*读取字段类型
  CALL METHOD CL_ABAP_DATADESCR=>DESCRIBE_BY_NAME
    EXPORTING
      P_NAME         = L_STRING
    RECEIVING
      P_DESCR_REF    = LR_TYPE
    EXCEPTIONS
      TYPE_NOT_FOUND = 1
      OTHERS         = 2.
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
               WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

  LS_COMP-TYPE ?= LR_TYPE.
  APPEND LS_COMP TO PT_COMP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_add_fcat
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> LS_TABLE
*&---------------------------------------------------------------------*
FORM FRM_ADD_FCAT  USING    PS_TABLE TYPE DFIES.

  DATA: LS_FIELDCAT LIKE LINE OF GT_FIELDCAT.
  LS_FIELDCAT-FIELDNAME   = PS_TABLE-FIELDNAME.
  LS_FIELDCAT-REF_TABLE   = PS_TABLE-TABNAME.
  LS_FIELDCAT-REF_FIELD   = PS_TABLE-FIELDNAME.
  CASE PS_TABLE-FIELDNAME.
    WHEN TEXT-T01.
      LS_FIELDCAT-COLTEXT     = TEXT-T11.
    WHEN TEXT-T02.
      LS_FIELDCAT-COLTEXT     = TEXT-T12.
    WHEN TEXT-T03.
      LS_FIELDCAT-COLTEXT     = TEXT-T13.
    WHEN TEXT-T04.
      LS_FIELDCAT-COLTEXT     = TEXT-T14.
    WHEN TEXT-T05.
      LS_FIELDCAT-COLTEXT     = TEXT-T15.
    WHEN TEXT-T06.
      LS_FIELDCAT-COLTEXT     = TEXT-T16.
    WHEN TEXT-T07.
      LS_FIELDCAT-COLTEXT     = TEXT-T17.
    WHEN TEXT-T08.
      LS_FIELDCAT-COLTEXT     = TEXT-T18.
    WHEN TEXT-T09.
      LS_FIELDCAT-COLTEXT     = TEXT-T19.
    WHEN TEXT-T00.
      LS_FIELDCAT-FIELDNAME   = TEXT-T00 && PS_TABLE-LFIELDNAME+6(2).
      LS_FIELDCAT-COLTEXT     = 'D' && PS_TABLE-LFIELDNAME+6(2).
      LS_FIELDCAT-REPTEXT = LS_FIELDCAT-COLTEXT.
      LS_FIELDCAT-INTTYPE = 'C'.
      LS_FIELDCAT-INTLEN = 4.

    WHEN OTHERS.
  ENDCASE.

  APPEND LS_FIELDCAT TO GT_FIELDCAT.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_CELL_COLOR
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> LV_FIELD
*&      --> LV_VALUE
*&      <-- LT_CELL
*&---------------------------------------------------------------------*
FORM FRM_SET_CELL_COLOR  USING    PV_FIELD
                                  PV_VALUE
                         CHANGING PT_CELL TYPE LVC_T_SCOL.
  DATA LS_CELL TYPE LVC_S_SCOL.

  CASE PV_VALUE.
    WHEN '0'.
      LS_CELL-FNAME = PV_FIELD.
      LS_CELL-COLOR-COL = '1' .
      LS_CELL-COLOR-INT = '1' .
      LS_CELL-COLOR-INV = '1' .
    WHEN '1'.
      LS_CELL-FNAME = PV_FIELD.
      LS_CELL-COLOR-COL = '5' .
      LS_CELL-COLOR-INT = '1' .
      LS_CELL-COLOR-INV = '1' .
    WHEN '2' OR '3'.
      LS_CELL-FNAME = PV_FIELD.
      LS_CELL-COLOR-COL = '6' .
      LS_CELL-COLOR-INT = '1' .
      LS_CELL-COLOR-INV = '1' .
    WHEN OTHERS.

  ENDCASE.
  IF LS_CELL IS NOT INITIAL.
    APPEND LS_CELL TO PT_CELL.
  ENDIF.
ENDFORM.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值