SAP ABAP报表程序中Table Control无法显示数据求助
嘿,我来帮你搞定这个Table Control显示空白的问题!你提到内部表已经有数据但界面看不到,而且是把模块池程序改成报表程序后出现的问题,我仔细看了你的代码和屏幕流逻辑,发现几个关键的调整点:
1. 报表程序的屏幕调用逻辑问题
报表程序和模块池程序的运行上下文有差异,你当前的代码里存在重复调用屏幕的问题:
- 在
user_command_9001的DISP分支里,你直接调用了屏幕9002,但没先执行数据加载的get_po; - 又在
get_po里再次调用CALL SCREEN 9002,这会打乱屏幕的数据循环逻辑。
修改方案:
把get_po里的CALL SCREEN 9002删掉,先执行数据加载再打开屏幕:
MODULE user_command_9001 INPUT. CASE OK_CODE. WHEN 'DISP'. "Display button PERFORM get_po. "先加载数据到内部表 CALL SCREEN 9002. "再打开显示屏幕 WHEN 'CLR'. "Clear button CLEAR zcms_courses-course_id. WHEN 'BACK' OR 'EXIT' OR 'CANCEL'. LEAVE PROGRAM. ENDCASE. ENDMODULE.
同时优化get_po的查询逻辑,不需要先查单条再查整表,直接一次性捞数据:
FORM get_po . IF zcms_courses-course_id IS NOT INITIAL. REFRESH: itab_zcms_courses_hd . SELECT course_id course_content music_genre options course_name FROM zcms_courses INTO TABLE itab_zcms_courses_hd WHERE course_id = zcms_courses-course_id. IF sy-subrc = 0. SORT itab_zcms_courses_hd. REFRESH CONTROL 'ZCMS_COURSES_TC' FROM SCREEN 9002. ELSE. MESSAGE '未找到对应课程数据' TYPE 'I'. ENDIF. ELSE. MESSAGE '请输入课程ID' TYPE 'E'. ENDIF. ENDFORM.
2. Table Control的字段绑定与赋值错误
你在MODULE table_control里把工作区的值赋值给了全局表结构zcms_courses,但Table Control的字段应该直接绑定到循环用的工作区wa_zcms_courses,手动赋值反而会覆盖/清空正确的数据。
修改方案:
删掉MODULE table_control里所有赋值给zcms_courses的语句,只保留行数设置:
MODULE table_control OUTPUT. DESCRIBE TABLE itab_zcms_courses_hd LINES sy-dbcnt. zcms_courses_tc-lines = sy-dbcnt. "删掉所有zcms_course = wa_zcms_course的赋值语句 "删除zcms_courses_tc-current_line = sy-loopc. 这行是错误的,系统会自动维护当前行 ENDMODULE.
同时检查屏幕9002的Table Control字段属性:每个字段的程序字段要设置为WA_ZCMS_COURSES-XXX(比如WA_ZCMS_COURSES-COURSE_ID),而不是全局表的ZCMS_COURSES-XXX。
3. 报表程序的退出逻辑问题
在user_command_9002里,LEAVE LIST-PROCESSING是针对报表列表输出的命令,不适合屏幕退出场景,会导致屏幕上下文异常。
修改方案:
直接用返回初始屏幕的命令:
MODULE user_command_9002 INPUT. CASE ok_code. WHEN 'BACK' OR 'EXIT' OR 'CANCEL'. CLEAR ok_code. LEAVE TO SCREEN 9001. ENDCASE. ENDMODULE.
最后补充一个报表程序的关键细节
报表程序默认会执行列表输出,所以你需要在报表的主程序开头加上:
REPORT zyour_report_name. "你的报表名称 CALL SCREEN 9001. "直接跳转到初始屏幕,避免默认的列表输出打断屏幕流程
做完这些调整后,再测试一下:输入课程ID点击查询,内部表的数据应该就能正常显示在Table Control里了。
内容的提问来源于stack exchange,提问作者Nisha Nisha

