二维码

[动态alv] 创建带有可编辑和着色单元格的动态alv

Twilight发表于 2014-08-28 11:15Twilight 最后回复于 2014-08-28 11:15 [复制链接] 4412 0

程序代码:
  1. TYPE-POOLS : ABAP.
  2. FIELD-SYMBOLS: <LINE> TYPE STANDARD TABLE,
  3.                 <WA>   TYPE ANY.
  4. DATA: DYN_TABLE     TYPE REF TO DATA,
  5.        DYN_LINE      TYPE REF TO DATA,
  6.        WA_FIELDCAT   TYPE LVC_S_FCAT,
  7.        IT_FIELDCAT   TYPE LVC_T_FCAT,
  8.        IT_FIELDCAT_1 TYPE LVC_T_FCAT,
  9.        OK_CODE       TYPE SY-UCOMM.
  10. TYPES: BEGIN OF TY_1,
  11.         TIME    TYPE T,
  12.         REMARKS TYPE CHAR50,
  13.        END OF TY_1.
  14. DATA: LV_FLD_1 TYPE TY_1.

  15. START-OF-SELECTION.
  16. * Create dynamic table stricture..
  17.    PERFORM GET_TABLE_STRUCTURE.
  18. *Create dynamic internale table..
  19.    PERFORM CREATE_ITAB_DYNAMICALLY.
  20. * filling the data into dynamic internal table..
  21.    PERFORM GET_DATA.
  22. END-OF-SELECTION.
  23. * display dynamic interal data.
  24.    PERFORM DISPLAY_ALV_REPORT.
  25.    CALL SCREEN 2000.
  26. *&---------------------------------------------------------------------*
  27. *&      Form  get_table_structure
  28. *&---------------------------------------------------------------------*
  29. *       Get structure of an SAP table
  30. *----------------------------------------------------------------------*
  31. FORM GET_TABLE_STRUCTURE.
  32.    DATA : REF_TABLE_DESCR TYPE REF TO CL_ABAP_STRUCTDESCR,
  33.           IT_TABDESCR TYPE ABAP_COMPDESCR_TAB,
  34.           WA_TABDESCR TYPE ABAP_COMPDESCR,
  35.           LV_NO_DAYS  TYPE P,
  36.           LV_DATE     TYPE SY-DATUM,
  37.           LV_DATUM    TYPE SY-DATUM,
  38.           LV_DAY      TYPE TEXT40,
  39.           LV_WEEK_DAY TYPE TEXT10,
  40.           LIN         TYPE SY-TFILL,
  41.           C_REM       TYPE STRING VALUE 'Remarks' .
  42. * fill the data into fieldcatlog of static field
  43.    PERFORM BUILD_FIELDCATALOG USING IT_FIELDCAT.
  44. * Return structure of the table.
  45.    REF_TABLE_DESCR ?= CL_ABAP_TYPEDESCR=>DESCRIBE_BY_DATA( LV_FLD_1 ).
  46.    IT_TABDESCR[] = REF_TABLE_DESCR->COMPONENTS[].

  47. * Get no of days in a month..
  48.    CALL FUNCTION 'HR_E_NUM_OF_DAYS_OF_MONTH'
  49.      EXPORTING
  50.        P_FECHA        = SY-DATUM
  51.      IMPORTING
  52.        NUMBER_OF_DAYS = LV_NO_DAYS.

  53. * get no of lines..
  54.    DESCRIBE TABLE IT_FIELDCAT LINES LIN .

  55.    LV_DATUM            = SY-DATUM.
  56.    LV_DATUM+6(2)       = 1.
  57.    WA_FIELDCAT-COL_POS = LIN.
  58. * fill dynamic field into fields cate..
  59.    DO LV_NO_DAYS TIMES.
  60.      LV_DATE = LV_DATUM  + SY-INDEX - 1.
  61.      CALL FUNCTION 'DATE_TO_DAY'
  62.        EXPORTING
  63.          DATE    = LV_DATE
  64.        IMPORTING
  65.          WEEKDAY = LV_WEEK_DAY.

  66.      CONCATENATE LV_DATE+6(2) ',' LV_WEEK_DAY INTO LV_DAY.

  67.      LOOP AT IT_TABDESCR INTO WA_TABDESCR.
  68.        WA_FIELDCAT-COL_POS   = WA_FIELDCAT-COL_POS + 1   .
  69.        IF SY-TABIX = 1.
  70.          WA_FIELDCAT-FIELDNAME = LV_DATE .
  71.          WA_FIELDCAT-COLTEXT   = LV_DAY.
  72.        ELSE.
  73.          CONCATENATE LV_DATE  '_R'  INTO WA_FIELDCAT-FIELDNAME.
  74.          WA_FIELDCAT-COLTEXT   = C_REM."'Remarks'.
  75.        ENDIF.
  76.        WA_FIELDCAT-INTTYPE   = WA_TABDESCR-TYPE_KIND.
  77.        WA_FIELDCAT-INTLEN    = WA_TABDESCR-LENGTH / 2.
  78.        APPEND  WA_FIELDCAT TO  IT_FIELDCAT.
  79.      ENDLOOP.
  80.    ENDDO.
  81. ENDFORM.                    "get_table_structure

  82. *&---------------------------------------------------------------------*
  83. *&      Form  create_itab_dynamically
  84. *&---------------------------------------------------------------------*
  85. *       Create internal table dynamically
  86. *----------------------------------------------------------------------*
  87. FORM CREATE_ITAB_DYNAMICALLY.
  88. * Create dynamic internal table and assign to Field-Symbol
  89.    CLEAR WA_FIELDCAT.
  90. *move fields from IT_FIELDCAT into IT_FIELDCAT_1.
  91.    IT_FIELDCAT_1 = IT_FIELDCAT.
  92. * Use ref table CALENDAR_TYPE and ref field 'COLTAB'
  93.   WA_FIELDCAT-FIELDNAME = 'CELLCOLOR'.
  94.    WA_FIELDCAT-REF_TABLE = 'CALENDAR_TYPE'.
  95.    WA_FIELDCAT-REF_FIELD = 'COLTAB'.
  96.    APPEND WA_FIELDCAT TO IT_FIELDCAT.
  97.    CLEAR WA_FIELDCAT.
  98. * create a table type 'ZCELLSTYL' with field 'CELLSTYLE' of type  LVC_T_STYL
  99.    WA_FIELDCAT-FIELDNAME = 'CELLSTYLE'.
  100.    WA_FIELDCAT-REF_TABLE = 'ZCELLSTYL'.
  101.    WA_FIELDCAT-REF_FIELD = 'CELLSTYLE'.
  102.    APPEND WA_FIELDCAT TO IT_FIELDCAT.
  103. *Create a dynamic table with IT_FIELDCAT.
  104. * and Use IT_FIELDCAT_1 to display ALV.
  105.    CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
  106.      EXPORTING
  107.        IT_FIELDCATALOG = IT_FIELDCAT
  108.      IMPORTING
  109.        EP_TABLE        = DYN_TABLE.
  110.    ASSIGN DYN_TABLE->* TO <LINE>.
  111. * Create dynamic work area and assign to Field Symbol
  112.    CREATE DATA DYN_LINE LIKE LINE OF <LINE> .
  113.    ASSIGN DYN_LINE->* TO <WA> .
  114. ENDFORM.                    "create_itab_dynamically
  115. *&---------------------------------------------------------------------*
  116. *&      Form  get_data
  117. *&---------------------------------------------------------------------*
  118. *       Populate dynamic itab
  119. *----------------------------------------------------------------------*
  120. FORM GET_DATA.
  121.    FIELD-SYMBOLS: <FS_PERNR> TYPE ANY,
  122.                   <FS_FIELD> TYPE ANY,
  123.                   <FS_COLOR> TYPE LVC_T_SCOL,
  124.                   <FS_STYLE> TYPE LVC_T_STYL,
  125.                   <WA_FIELDCAT> TYPE LVC_S_FCAT.
  126.    DATA: IT_CELLCOLOR TYPE LVC_T_SCOL,
  127.          IT_CELLSTYLE TYPE LVC_T_STYL,
  128.          L_DAY_P      TYPE P,
  129.          LV_MOD_DATE  TYPE DATUM,
  130.          C_HOL        TYPE CHAR10 VALUE ' Holiday '.
  131.    ASSIGN COMPONENT 'PERNR' OF STRUCTURE <WA> TO <FS_PERNR>.
  132.     LOOP  AT IT_FIELDCAT ASSIGNING <WA_FIELDCAT> ."WHERE
  133. * adde color to dynamci fields..
  134.      ASSIGN COMPONENT 'CELLCOLOR' OF STRUCTURE <WA> TO <FS_COLOR>.
  135.      IF <WA_FIELDCAT>-INTTYPE  = 'T'.
  136.        PERFORM  MODIFY_CELL_COLOR USING <WA_FIELDCAT>-FIELDNAME
  137.                                   CHANGING IT_CELLCOLOR.
  138.        <FS_COLOR> = IT_CELLCOLOR.
  139.      ELSE.
  140.        IF <WA_FIELDCAT>-FIELDNAME+8(2) = '_R'.
  141.          LV_MOD_DATE = <WA_FIELDCAT>-FIELDNAME+0(8).
  142.          L_DAY_P = LV_MOD_DATE  MOD 7.
  143.          IF L_DAY_P > 1.
  144.            L_DAY_P = L_DAY_P - 1.
  145.          ELSE.
  146.            L_DAY_P = L_DAY_P + 6.
  147.          ENDIF.
  148.          IF L_DAY_P = 6 OR L_DAY_P = 7.
  149.            PERFORM  MODIFY_CELL_COLOR USING <WA_FIELDCAT>-FIELDNAME
  150.                                       CHANGING IT_CELLCOLOR.
  151.            <FS_COLOR> = IT_CELLCOLOR.
  152.            ASSIGN COMPONENT <WA_FIELDCAT>-FIELDNAME OF STRUCTURE <WA> TO <FS_FIELD>.
  153.            <FS_FIELD> = C_HOL."' Holiday '.
  154.          ENDIF.
  155.        ENDIF.
  156.      ENDIF.
  157. *Dynamic editable
  158.      IF <WA_FIELDCAT>-FIELDNAME+0(8)  =  SY-DATUM.
  159.        ASSIGN COMPONENT 'CELLSTYLE' OF STRUCTURE <WA> TO <FS_STYLE>.
  160.        PERFORM EDITABLE_CELL USING <WA_FIELDCAT>-FIELDNAME
  161.                              CHANGING IT_CELLSTYLE.
  162.        <FS_STYLE> = IT_CELLSTYLE.
  163.      ENDIF.
  164.    ENDLOOP.
  165.    APPEND <WA> TO <LINE>.
  166. ENDFORM.                    "get_data

  167. *&---------------------------------------------------------------------*
  168. *&      Form  modify_cell_color
  169. *&---------------------------------------------------------------------*
  170. *      -->P_FIELDNAME   text
  171. *      -->PT_CELLCOLOR  text
  172. *----------------------------------------------------------------------*
  173. FORM MODIFY_CELL_COLOR  USING P_FIELDNAME   TYPE LVC_FNAME
  174.                          CHANGING PT_CELLCOLOR  TYPE TABLE.
  175.    DATA L_CELLCOLOR TYPE LVC_S_SCOL.
  176.    DATA : LV_DATE TYPE DATUM.
  177.    DATA: DAY_P TYPE P.
  178.    CLEAR L_CELLCOLOR.
  179.    IF P_FIELDNAME+8(2) = '_R'.
  180.      LV_DATE =  P_FIELDNAME+8(2).
  181.    ELSE.
  182.      LV_DATE =  P_FIELDNAME.
  183.    ENDIF.
  184.    DAY_P = LV_DATE  MOD 7.
  185.    IF DAY_P > 1.
  186.      DAY_P = DAY_P - 1.
  187.    ELSE.
  188.      DAY_P = DAY_P + 6.
  189.    ENDIF.
  190.    IF DAY_P = 6 OR DAY_P = 7.
  191.      IF P_FIELDNAME+8(2) = '_R'.
  192.        L_CELLCOLOR-COLOR-COL = 7.       " Red.
  193.        L_CELLCOLOR-COLOR-INT = 0.
  194.        L_CELLCOLOR-COLOR-INV = 0.
  195.      ELSE.
  196.        L_CELLCOLOR-COLOR-COL = 7.       " Red.
  197.        L_CELLCOLOR-COLOR-INT = 1.
  198.        L_CELLCOLOR-COLOR-INV = 1.
  199.      ENDIF.
  200.      L_CELLCOLOR-FNAME = P_FIELDNAME.
  201.      APPEND L_CELLCOLOR TO PT_CELLCOLOR.
  202.    ELSE.
  203.      CLEAR L_CELLCOLOR.
  204.    ENDIF.
  205.    IF P_FIELDNAME+0(8) = SY-DATUM.
  206.      L_CELLCOLOR-FNAME = P_FIELDNAME.
  207.      L_CELLCOLOR-COLOR-COL = 3.       " Red.
  208.      L_CELLCOLOR-COLOR-INT = 1.
  209.      L_CELLCOLOR-COLOR-INV = 1.
  210.      APPEND L_CELLCOLOR TO PT_CELLCOLOR.
  211.      CONCATENATE P_FIELDNAME '_R' INTO  L_CELLCOLOR-FNAME .
  212.      L_CELLCOLOR-COLOR-COL = 3.       " Red.
  213.      L_CELLCOLOR-COLOR-INT = 1.
  214.      L_CELLCOLOR-COLOR-INV = 1.
  215.      APPEND L_CELLCOLOR TO PT_CELLCOLOR.
  216.    ENDIF.
  217. ENDFORM.                    " MODIFY_CELL_COLOR

  218. *&---------------------------------------------------------------------*
  219. *&      Form  BUILD_FIELDCATALOG
  220. *&---------------------------------------------------------------------*
  221. *       Build Fieldcatalog for ALV Report, using SAP table structure
  222. *----------------------------------------------------------------------*
  223. FORM BUILD_FIELDCATALOG USING P_IT_FIELDCAT  TYPE LVC_T_FCAT."SLIS_T_FIELDCAT_ALV .
  224. ** ALV Function module to build field catalog from SAP table structure
  225.    CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
  226.     EXPORTING
  227. *   I_BUFFER_ACTIVE              =
  228.          I_STRUCTURE_NAME       = 'ZDYNAMIC_ALV_STR'
  229. *   I_CLIENT_NEVER_DISPLAY       = 'X'
  230. *   I_BYPASSING_BUFFER           =
  231. *   I_INTERNAL_TABNAME           =
  232.      CHANGING
  233.          CT_FIELDCAT            = P_IT_FIELDCAT
  234.   EXCEPTIONS
  235.     INCONSISTENT_INTERFACE       = 1
  236.     PROGRAM_ERROR                = 2
  237.     OTHERS                       = 3
  238.              .
  239.    IF SY-SUBRC <> 0.
  240.      MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
  241.              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  242.    ENDIF.
  243. ENDFORM.                    " BUILD_FIELDCATALOG

  244. *&---------------------------------------------------------------------*
  245. *&      Form  DISPLAY_ALV_REPORT
  246. *&---------------------------------------------------------------------*
  247. *       Display report using ALV grid
  248. *----------------------------------------------------------------------*
  249. FORM DISPLAY_ALV_REPORT.
  250.    DATA :G_GRID_I             TYPE REF TO CL_GUI_ALV_GRID,
  251.          G_CUSTOM_CONTAINER_I TYPE REF TO CL_GUI_CUSTOM_CONTAINER,
  252.          I_CONTAINER          TYPE SCRFNAME VALUE 'ALV',
  253.          GS_LAYOUT            TYPE LVC_S_LAYO.

  254.    CREATE OBJECT G_CUSTOM_CONTAINER_I
  255.      EXPORTING
  256.        CONTAINER_NAME = I_CONTAINER.

  257.    CREATE OBJECT G_GRID_I
  258.      EXPORTING
  259.        I_PARENT = G_CUSTOM_CONTAINER_I.

  260.    GS_LAYOUT-COL_OPT     = 'X'.
  261.    GS_LAYOUT-CWIDTH_OPT  = 'X'.
  262.    GS_LAYOUT-CTAB_FNAME  = 'CELLCOLOR'.
  263.    GS_LAYOUT-STYLEFNAME  = 'CELLSTYLE'."指明显示数据内表中表示样式的字段
  264.    CALL METHOD G_GRID_I->SET_TABLE_FOR_FIRST_DISPLAY
  265.      EXPORTING
  266.        IS_LAYOUT            = GS_LAYOUT
  267. *      IT_TOOLBAR_EXCLUDING = LT_EXCLUDE[]
  268.      CHANGING
  269.        IT_FIELDCATALOG      = IT_FIELDCAT_1
  270.        IT_OUTTAB            = <LINE>.
  271. *For Editable alv...
  272.    CALL METHOD G_GRID_I->SET_READY_FOR_INPUT
  273.      EXPORTING
  274.        I_READY_FOR_INPUT = 1.
  275. ENDFORM.                    " DISPLAY_ALV_REPORT
  276. *&---------------------------------------------------------------------*
  277. *&      Module  USER_COMMAND_2000  INPUT
  278. *&---------------------------------------------------------------------*
  279. *       text
  280. *----------------------------------------------------------------------*
  281. MODULE USER_COMMAND_2000 INPUT.
  282.    CASE OK_CODE.
  283.      WHEN 'BACK'.
  284.        LEAVE TO SCREEN 0.
  285.    ENDCASE.
  286. ENDMODULE.                 " USER_COMMAND_2000  INPUT
  287. *&---------------------------------------------------------------------*
  288. *&      Module  STATUS_2000  OUTPUT
  289. *&---------------------------------------------------------------------*
  290. *       text
  291. *----------------------------------------------------------------------*
  292. MODULE STATUS_2000 OUTPUT.
  293.    SET PF-STATUS 'STATUS_2000'.
  294. *  SET TITLEBAR 'xxx'.
  295. ENDMODULE.                 " STATUS_2000  OUTPUT
  296. *&---------------------------------------------------------------------*
  297. *&      Form  EDITABLE_CELL
  298. *&---------------------------------------------------------------------**      -->P_IT_CELLSTYLE  text
  299. *----------------------------------------------------------------------*
  300. FORM EDITABLE_CELL   USING     P_FIELDNAME    TYPE LVC_FNAME
  301.                       CHANGING  P_IT_CELLSTYLE TYPE LVC_T_STYL.
  302.    DATA : WA_CELLSTYLE TYPE LVC_S_STYL.
  303.    WA_CELLSTYLE-FIELDNAME =  P_FIELDNAME .
  304.    WA_CELLSTYLE-STYLE     = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED.
  305.    INSERT WA_CELLSTYLE INTO TABLE P_IT_CELLSTYLE.
  306. ENDFORM.                    " EDITABLE_CELL
复制代码

PS:
1、SCREEN 2000需创建container(ALV)、ok_code和back退出按钮
2、需了解'CALENDAR_TYPE'、'LVC_S_STYL'和'ZCELLSTYL' 结构
CELLSTYLE.png
程序执行效果:
动态alv.png
回复

使用道具 举报

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 返回列表