二维码

[ooalv] ooalv中通过alv控件修改和删除alv数据并更新到数据库

Twilight发表于 2014-01-19 22:00Twilight 最后回复于 2014-01-19 22:00 [复制链接] 9455 0

程序执行效果如下:
OOALV_delete_modify_1.jpg 修改第三行的一项数据,再删除第一和第二行,然后点击保存按钮,在点击退出,获得如下结果:
OOALV_delete_modify_2.jpg

注:该实例是在屏幕上建立custom control控件,实现oolav输出报表 的扩展,如阅读有困难可先参考它。
     工具栏需要再定义一个save保存按钮。

处理过程如下:
(1)、设定ALV控件可以编辑;
(2)、退出屏幕时将数据更新到内表;
(3)、捕捉alv控件的数据更改信息,将alv控件的删除行信息保存到内表中;
(4)、在输出时,比较删除行和最后的内表,删除重复行;
(5)、将数据更新到数据库表。

主程序:
  1. REPORT  ZDEMON_006.
  2. DATA OK_CODE TYPE SY-UCOMM. " SY-UCOMM:Function code that PAI triggered

  3. TABLES SPFLI.
  4. DATA LS_SPFLI TYPE SPFLI.

  5. DATA IT_SPFLI TYPE TABLE OF SPFLI.
  6. DATA IT_DEL_SPFLI TYPE TABLE OF SPFLI.

  7. DATA:S_CONTAINER TYPE SCRFNAME VALUE 'ALVDATA',  " SCRFNAME: Name of a Screen Element  只能为该类型
  8.       ALV_GRID TYPE REF TO CL_GUI_ALV_GRID, "参考CL_GUI_ALV_GRID类,定义对象ALV_GRID
  9.       LO_CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER.
  10. CLASS LCL_EVENT_RECEIVER DEFINITION DEFERRED."DEFERRED大概就是 “预定义”类,先告诉你会有这么一个类,可被别的地方用,之后它还是要定义的
  11. DATA EVENT_RECEIVER TYPE REF TO  LCL_EVENT_RECEIVER. "定义事件

  12. SELECT *
  13.   INTO CORRESPONDING FIELDS OF TABLE IT_SPFLI
  14.   FROM SPFLI.
  15. *alv控制 布局结构
  16. DATA GS_LAYOUT TYPE LVC_S_LAYO.
  17. *定义可编辑
  18. GS_LAYOUT-EDIT = 'X'.

  19. *定义事件的属性和方法
  20. CLASS LCL_EVENT_RECEIVER DEFINITION.
  21.   PUBLIC SECTION.
  22. *删除内表
  23.     TYPES:DEL_ROWS TYPE STANDARD TABLE OF SPFLI.
  24.     DATA:DDEL_ROWS TYPE STANDARD TABLE OF SPFLI.
  25. *alv数据修改事件
  26.     METHODS:
  27.     HANDLE_DATA_CHANGED
  28.       FOR EVENT DATA_CHANGED OF CL_GUI_ALV_GRID
  29.           IMPORTING ER_DATA_CHANGED.
  30. *读取内表更新的数据
  31.     METHODS:
  32.       UPDATE_DELTA_TABLES
  33.         IMPORTING
  34.           PR_DATA_CHANGED TYPE REF TO CL_ALV_CHANGED_DATA_PROTOCOL.
  35. *读取删除的内表   
  36.     METHODS:
  37.       GET_DELETED_ROWS
  38.         EXPORTING
  39.           DELETED_ROWS TYPE DEL_ROWS.
  40. ENDCLASS.
  41. *实现
  42. CLASS LCL_EVENT_RECEIVER IMPLEMENTATION.
  43. *alv数据修改事件  
  44.   METHOD HANDLE_DATA_CHANGED.
  45.     CALL METHOD UPDATE_DELTA_TABLES( ER_DATA_CHANGED ).
  46.   ENDMETHOD.
  47. *读取内表更新的数据
  48. *仅需要读取删除的记录,因为还能通过alv的方法取更新后的内表  
  49.   METHOD UPDATE_DELTA_TABLES.
  50. *取得删除的内表记录
  51. *逐行将删除数据存入删除内表        
  52.   DATA:L_DEL_ROW TYPE LVC_S_MOCE.
  53.   LOOP AT PR_DATA_CHANGED->MT_DELETED_ROWS INTO L_DEL_ROW.
  54.     READ TABLE IT_SPFLI INTO LS_SPFLI INDEX L_DEL_ROW-ROW_ID.
  55.     IF SY-SUBRC NE 0.
  56.        MESSAGE E208(00) WITH '处理错误'.
  57.     ELSE.
  58.       APPEND LS_SPFLI TO DDEL_ROWS.
  59.     ENDIF.
  60.   ENDLOOP.
  61.   ENDMETHOD.
  62. *定义取内表的方法
  63.   METHOD GET_DELETED_ROWS.
  64.     DELETED_ROWS = ME->DDEL_ROWS.
  65.   ENDMETHOD.
  66. ENDCLASS.

  67. START-OF-SELECTION.
  68. CALL SCREEN 100.

  69. WRITE / '删除的内表记录:'.
  70. WRITE / '-----------------'.
  71. *通过事件对象取删除的记录
  72. CALL METHOD EVENT_RECEIVER->GET_DELETED_ROWS
  73.       IMPORTING DELETED_ROWS = IT_DEL_SPFLI.
  74. *在屏幕上输出删除记录,查阅数据有无变化
  75. LOOP AT IT_DEL_SPFLI INTO SPFLI.
  76.     WRITE:/ SPFLI-CARRID,SPFLI-CONNID,SPFLI-CITYFROM.
  77. ENDLOOP.

  78. WRITE:/ '更新后的内表记录'.
  79. WRITE / '----------------'.
  80. *在屏幕上输出删除记录,查阅数据有无变化
  81. LOOP AT IT_SPFLI INTO SPFLI.
  82.     WRITE:/ SPFLI-CARRID,SPFLI-CONNID,SPFLI-CITYFROM.
  83. ENDLOOP.

  84. MODULE STATUS_0100 OUTPUT.
  85.   SET PF-STATUS 'STATUS1'.
  86.   SET TITLEBAR 'ALV TITLEBAR'.
  87. ENDMODULE.                 " STATUS_0100  OUTPUT

  88. MODULE USER_COMMAND_0100 INPUT.
  89. CASE OK_CODE.
  90.   WHEN 'CANCEL'.
  91.     LEAVE PROGRAM.
  92.   WHEN 'BACK' OR 'EXIT'.

  93.     DATA L_RET VALUE 'X'.
  94.     CALL METHOD ALV_GRID->CHECK_CHANGED_DATA
  95.           IMPORTING
  96.             E_VALID = L_RET.
  97.     LEAVE TO SCREEN 0.
  98.    
  99. *将更新后的内表数据更新到数据库 并按删除的内部数据删除数据库记录        
  100.   WHEN 'SAVE'.
  101.     MODIFY SPFLI FROM TABLE IT_SPFLI.
  102. *若不成功提示错误
  103.     IF SY-SUBRC NE 0.
  104.        MESSAGE I005(ZDEMON) WITH '修改更新数据错误!'.
  105.        EXIT.
  106.     ELSE.
  107.       MESSAGE I005(ZDEMON) WITH '修改更新数据ok!'.
  108.     ENDIF.

  109.     DELETE SPFLI FROM TABLE IT_DEL_SPFLI.
  110.     IF SY-SUBRC NE 0.
  111.         MESSAGE I005(ZDEMON) WITH '删除更新数据错误!'.
  112.     ELSE.
  113.         MESSAGE I005(ZDEMON) WITH '删除更新数据ok!'.
  114.     ENDIF.
  115. ENDCASE.
  116. ENDMODULE.                 " USER_COMMAND_0100  INPUT

  117. MODULE CLEAR_OK_CODE OUTPUT.
  118.   CLEAR OK_CODE.
  119. ENDMODULE.                 " CLEAR_OK_CODE  OUTPUT

  120. MODULE DISPLAY_OOALV OUTPUT.
  121.   IF LO_CUSTOM_CONTAINER IS INITIAL. "如果LO_CUSTOM_CONTAINE RDialog容器对象不存在,实例化该对象
  122.     CREATE OBJECT LO_CUSTOM_CONTAINER
  123.            EXPORTING CONTAINER_NAME = S_CONTAINER.
  124.     CREATE OBJECT ALV_GRID "实例化alv对象
  125.            EXPORTING I_PARENT = LO_CUSTOM_CONTAINER.
  126. *将更新事件赋给alv对象
  127.     CREATE OBJECT EVENT_RECEIVER.
  128.     SET HANDLER EVENT_RECEIVER->HANDLE_DATA_CHANGED FOR ALV_GRID.

  129.     CALL METHOD ALV_GRID->SET_TABLE_FOR_FIRST_DISPLAY "调用alv对象的方法显示报表
  130.          EXPORTING I_STRUCTURE_NAME = 'SPFLI'
  131.                    IS_LAYOUT = GS_LAYOUT
  132.            CHANGING IT_OUTTAB = IT_SPFLI.
  133.   ENDIF.
  134. ENDMODULE.                 " DISPLAY_OOALV  OUTPUT
复制代码
回复

使用道具 举报

快速回帖

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

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