1、TABLE CONTROL是需要引用数据字典的表结构或者表的。
首先我们建立一个数据库表zaperson。
表结构:
2、建立一个屏幕 100 。
同时我们定义一个table control ZPER 同时引用表zaperson
当然我们同时需要在程序中定义这个同名的table control 。
TABLES : ZAPERSON.
CONTROLS : ZPER TYPE TABLEVIEW USING SCREEN 100 . “定义这个同名的table control
3、定义内表 且传值
DATA GI_ZP LIKE TABLE OF ZAPERSON .
DATA GW_ZP LIKE ZAPERSON .
START-OF-SELECTION .
SELECT * FROM ZAPERSON INTO TABLE GI_ZP .
4、调用屏幕
CALL SCREEN 100 .
PBO中给table control 赋值。
a、首先我们需要把内表的行数赋值给table control
MODULE INIT .
MODULE INIT OUTPUT.
DESCRIBE TABLE GI_ZP LINES ZPER-LINES.
ENDMODULE.
b、给table control赋值
LOOP AT GI_ZP INTO GW_ZP WITH CONTROL ZPER CURSOR ZPER-CURRENT_LINE .
MODULE DISPLAY .
ENDLOOP.
MODULE DISPLAY OUTPUT.
MOVE-CORRESPONDING GW_ZP TO ZAPERSON.
ENDMODULE.
4、现在差不多就可以显示结果了 但是不知道为啥 PAI里面不写点东西 总是爱报语法错误 。我们可以写个chain 进去 反正多一步检查总是好的
*
PROCESS AFTER INPUT.
* MODULE USER_COMMAND_0100.
LOOP AT GI_ZP .
CHAIN .
FIELD ZAPERSON-FNAME .
FIELD ZAPERSON-LNAME .
ENDCHAIN .
ENDLOOP .
5、下面我们就可以看到自己的成果了
6、当然有时候我们需要有一些自己的东西 刚才仅仅是展示 有时候 我们需要修改和保存 我们怎么实现数据的保存呢,其实很简单
table control的工作原理是:1、 在PBO中 我们将数据存储到table control 。那我们第一次打开的时候 就能看到内表的值
2、我们在页面上可能做一些修改 之后我们需要进行保存修改等按钮操作。这个中间 我们需要干的事情 就是 将table control的值重新赋予给内表
3、 在MODULE USER_COMMAND_XXXX中,我们进行按钮操作。将内表保存到数据库中。同时重新在PBO中进行展示。
大致如下:
PROCESS BEFORE OUTPUT.
MODULE INITS. "给当前的CONTROL 可用行数 一般为当前展示的内表的行数
MODULE STATUS_0200.
LOOP AT G_ZMAR_ITAB INTO G_ZMAR_WA WITH CONTROL ZMAR
CURSOR ZMAR-CURRENT_LINE .
MODULE DISPALY . "循环展示 此loop 是一行行的读取control的行 之后用display 填充值 对应上面的步骤一
ENDLOOP.
*
PROCESS AFTER INPUT.
LOOP AT G_ZMAR_ITAB.
CHAIN.
* FIELD ZMARKETDISPOSE-MANDT.
FIELD ZMARKETDISPOSE-ARTNR.
FIELD ZMARKETDISPOSE-BEGDA.
FIELD ZMARKETDISPOSE-ENDDA.
FIELD ZMARKETDISPOSE-ZPRICE.
FIELD ZMARKETDISPOSE-ERNAM.
FIELD ZMARKETDISPOSE-CRDATU.
FIELD ZMARKETDISPOSE-UPNAM.
FIELD ZMARKETDISPOSE-UPDATU.
ENDCHAIN.
MODULE UPDATE . 对应上面的步骤二
ENDLOOP.
MODULE USER_COMMAND_0200. 对应上面的步骤三
MODULE DISPALY OUTPUT.
MOVE-CORRESPONDING G_ZMAR_WA TO ZMARKETDISPOSE.
"设置指定单位***
IF G_ZMAR_WA-IFLAG = C_X .
LOOP AT SCREEN.
IF ( SCREEN-NAME = 'ZMARKETDISPOSE-ARTNR'
OR SCREEN-NAME = 'ZMARKETDISPOSE-BEGDA'
OR SCREEN-NAME = 'ZMARKETDISPOSE-ENDDA'
OR SCREEN-NAME = 'ZMARKETDISPOSE-ZPRICE'
OR SCREEN-NAME = 'ZMARKETDISPOSE-ZMEMBER'
OR SCREEN-NAME = 'ZMARKETDISPOSE-ZWAY'
).
SCREEN-INPUT = '1'.
SCREEN-COLOR = 00000000 .
MODIFY SCREEN.
ENDIF.
ENDLOOP .
ELSEIF G_ZMAR_WA-UFLAG = C_X.
LOOP AT SCREEN.
IF ( SCREEN-NAME = 'ZMARKETDISPOSE-ZPRICE'
).
SCREEN-INPUT = '1'.
ENDIF.
MODIFY SCREEN.
ENDLOOP .
ENDIF.
ENDMODULE.
MODULE UPDATE INPUT.
READ TABLE G_ZMAR_ITAB ASSIGNING <FS1> INDEX ZMAR-CURRENT_LINE. "再PAI中 将table control 赋值给内表
IF SY-SUBRC = 0.
<FS1>-ARTNR = ZMARKETDISPOSE-ARTNR.
<FS1>-BEGDA = ZMARKETDISPOSE-BEGDA.
<FS1>-ENDDA = ZMARKETDISPOSE-ENDDA.
<FS1>-ZPRICE = ZMARKETDISPOSE-ZPRICE.
<FS1>-ZMEMBER = ZMARKETDISPOSE-ZMEMBER.
<FS1>-ZWAY = ZMARKETDISPOSE-ZWAY.
<FS1>-ERNAM = ZMARKETDISPOSE-ERNAM.
<FS1>-CRDATU = ZMARKETDISPOSE-CRDATU.
<FS1>-UPNAM = ZMARKETDISPOSE-UPNAM.
<FS1>-UPDATU = ZMARKETDISPOSE-UPDATU.
<FS1>-MARK = ZMARKETDISPOSE-MARK.
ENDIF.
ENDMODULE.
MODULE USER_COMMAND_0200 INPUT.
CASE OK_CODE .
WHEN C_BACK.
PERFORM SUB_EXIT_SCREEN .
WHEN C_ADD.
PERFORM ADD_ROW.
WHEN C_MODI .
PERFORM MODI_ROW .
WHEN C_SAVE .
PERFORM SAVE_ROW.
WHEN C_SORT_U.
PERFORM SORT_U.
WHEN C_SORT_D.
PERFORM SORT_D.
WHEN OTHERS.
ENDCASE.
ENDMODULE.