在使用REUSE_ALV_GRID_DISPLAY创建ALV时,点击执行按钮之后,程序崩溃
问题
程序调试和查找原因
原因
解决方案
程序
*&---------------------------------------------------------------------*
*& Report ZALVTEST01
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZALVTEST01.
*第一步:声明ALV相关变量
TYPE-POOLS:SILS. "引入slis包 ,专门用于定义ALV
DATA: lt_fieldcat TYPE SLIS_T_FIELDCAT_ALV, "用于存储fieldcatn内表
ls_fieldcat TYPE SLIS_FIELDCAT_ALV,
* wa_fieldcat TYPE SLIS_FIELDCAT_ALV, "定义使用工作区
* ls_fieldcat like LINE OF lt_fieldcat,
ls_layout TYPE SLIS_LAYOUT_ALV, "ALV格式控制结构体
lt_event TYPE slis_T_event, "事件的内表
ls_event TYPE slis_alv_event. "事件的工作区
DATA: pgm LIKE sy-repid.
DATA lt_sort TYPE slis_T_SORTINFO_ALV.
DATA wa_sort TYPE slis_sortinfo_alv.
DATA ls_setting TYPE LVC_S_GLAY.
DATA: lv_colpos TYPE int2.
*第二步:定义内表
*定义类型
TYPES:BEGIN OF ty_alvshow,
carrid TYPE spfli-carrid, "航线代码
cityfrom TYPE spfli-cityfrom, "起飞城市
cityto TYPE spfli-cityto, "目标城市
fldate TYPE sflight-fldate, "到达时间
planetype TYPE sflight-planetype, "飞机类型
seatsmax TYPE sflight-seatsmax, "飞机容量
END OF ty_alvshow.
* TYPES:BEGIN OF ty_alvshow,
* carrid TYPE C, "航线代码
* cityfrom TYPE C, "起飞城市
* cityto TYPE C, "目标城市
* fldate TYPE D, "到达时间
* planetype TYPE C, "飞机类型
* seatsmax TYPE I, "飞机容量
* END OF ty_alvshow.
DATA: lt_alvshow TYPE TABLE OF ty_alvshow,
wa_alvshow TYPE ty_alvshow.
*第三步:读取数据
SELECT
a~carrid cityfrom cityto fldate planetype seatsmax
FROM spfli as a INNER JOIN sflight as b ON a~carrid = b~carrid
INTO TABLE lt_alvshow
UP TO 30 ROWS.
*第四步:ALV字段格式控制.layout
ls_layout-zebra = 'X'. "列出输出位置
ls_layout-detail_popup = 'X'."是否弹出详细明细窗口
ls_layout-detail_TITLEBAR = '详细信息'.
ls_layout-f2code = '&ETA'. "设置触发弹窗信息功能
ls_layout-colwidth_optimize = 'X'. "设置自动优化列宽
*fieldcat设置
lv_colpos = 1. "字段显示为第几行
ls_fieldcat-fieldname = 'carrid'. "关联哪个字段
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-key = 'X'.
ls_fieldcat-datatype = 'CHAR'.
ls_fieldcat-outputlen = '3'.
ls_fieldcat-seltext_M = '飞机编号'.
APPEND ls_fieldcat to lt_fieldcat.
clear ls_fieldcat.
lv_colpos = lv_colpos + 1. "字段显示为第几行
ls_fieldcat-fieldname = 'cityfrom'. "关联哪个字段
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-key = 'X'.
ls_fieldcat-datatype = 'CHAR'.
ls_fieldcat-outputlen = '20'.
ls_fieldcat-seltext_M = '出发城市'.
APPEND ls_fieldcat to lt_fieldcat.
clear ls_fieldcat.
lv_colpos = lv_colpos + 1. "字段显示为第几行
ls_fieldcat-fieldname = 'cityto'. "关联哪个字段
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-key = 'X'.
ls_fieldcat-datatype = 'CHAR'.
ls_fieldcat-outputlen = '20'.
ls_fieldcat-seltext_M = '到达城市'.
APPEND ls_fieldcat to lt_fieldcat.
clear ls_fieldcat.
lv_colpos = lv_colpos + 1. "字段显示为第几行
ls_fieldcat-fieldname = 'fldate'. "关联哪个字段
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-key = 'X'.
ls_fieldcat-datatype = 'DATS'.
ls_fieldcat-outputlen = '8'.
ls_fieldcat-seltext_M = '航班日期'.
APPEND ls_fieldcat to lt_fieldcat.
clear ls_fieldcat.
lv_colpos = lv_colpos + 1. "字段显示为第几行
ls_fieldcat-fieldname = 'planetype'. "关联哪个字段
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-key = 'X'.
ls_fieldcat-datatype = 'char'.
ls_fieldcat-outputlen = '10'.
ls_fieldcat-seltext_M = '飞机类型'.
APPEND ls_fieldcat to lt_fieldcat.
clear ls_fieldcat.
lv_colpos = lv_colpos + 1. "字段显示为第几行
ls_fieldcat-fieldname = 'seatsmax'. "关联哪个字段
ls_fieldcat-col_pos = lv_colpos.
ls_fieldcat-key = 'X'.
ls_fieldcat-datatype = 'int4'.
ls_fieldcat-outputlen = '20'.
ls_fieldcat-seltext_M = '飞机容量'.
APPEND ls_fieldcat to lt_fieldcat.
clear ls_fieldcat.
*第五步:定义用户事件
ls_event-name = 'USER_COMMAND'. "定义用户相应事件
ls_event-form = 'FORM_USER_COMMAND'. "定义用户事件表单
APPEND ls_event TO lt_event.
CLEAR ls_event.
ls_event-name = 'TOP_OF_PAGE'. "定义显示标题
ls_event-form = 'FORM_TOP_OF_PAGE'.
APPEND ls_event TO lt_event.
CLEAR ls_event.
ls_event-name = 'PF_STATUS_SET'. "定义显示状态栏事件
ls_event-form = 'FORM_PF_STATUS_SET'.
APPEND ls_event TO lt_event.
CLEAR ls_event.
*第六步:排序(常用功能)
"wa_sort-fieldname = 'seatsmax'. "DELETE BY LHY 20240817
wa_sort-fieldname = 'carrid'. "ADD BY LHY 20240817
wa_sort-down = 'X'.
append wa_sort TO lt_sort.
clear wa_sort. "清空工作区
*第七步:显示ALV数据
*操作
*光标要留在数据的位置,然后点 模式-->调用功能输入-->REUSE_ALV_GRID_DISPLAY
*-->按回车.-->自动生成代码
ls_setting-edt_cll_cb = 'X'. "编辑单元格之后,返回给程序编辑后的
pgm = sy-repid. "回调对象
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
* I_INTERFACE_CHECK = ' '
* I_BYPASSING_BUFFER = ' '
* I_BUFFER_ACTIVE = ' '
I_CALLBACK_PROGRAM = pgm
I_CALLBACK_PF_STATUS_SET = 'PF_STATUS_SET'
I_CALLBACK_USER_COMMAND = 'USER_COMMAND'
I_CALLBACK_TOP_OF_PAGE = 'TOP_OF_PAGE'
* I_CALLBACK_HTML_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_END_OF_LIST = ' '
* I_STRUCTURE_NAME =
* I_BACKGROUND_ID = ' '
* I_GRID_TITLE =
I_GRID_SETTINGS = ls_setting "编辑单元格后,返回给cheng'xu编辑后的值
IS_LAYOUT = ls_layout
IT_FIELDCAT = lt_fieldcat
* IT_EXCLUDING =
* IT_SPECIAL_GROUPS =
IT_SORT = lt_sort
* IT_FILTER =
* IS_SEL_HIDE =
* I_DEFAULT = 'X'
* I_SAVE = ' '
* IS_VARIANT =
IT_EVENTS = lt_event
* IT_EVENT_EXIT =
* IS_PRINT =
* IS_REPREP_ID =
* I_SCREEN_START_COLUMN = 0
* I_SCREEN_START_LINE = 0
* I_SCREEN_END_COLUMN = 0
* I_SCREEN_END_LINE = 0
* I_HTML_HEIGHT_TOP = 0
* I_HTML_HEIGHT_END = 0
* IT_ALV_GRAPHICS =
* IT_HYPERLINK =
* IT_ADD_FIELDCAT =
* IT_EXCEPT_QINFO =
* IR_SALV_FULLSCREEN_ADAPTER =
* O_PREVIOUS_SRAL_HANDLER =
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER =
* ES_EXIT_CAUSED_BY_USER =
TABLES
t_outtab = lt_alvshow
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2
.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
*第8步:按钮操作标题栏等配置
*按钮 gui
FORM FORM_PF_STATUS_SET USING RT_EXTAB TYPE SLIS_T_EXTAB.
SET PF-STATUS 'ZALV_GUI'.
ENDFORM.
*标题
FORM FORM_TOP_OF_PAGE.
*定义数据 内表和工作区
DATA lt_commentary TYPE slis_t_listheader.
DATA wa_commentary TYPE slis_listheader.
wa_commentary-typ = 'H'.
wa_commentary-info = '飞机飞行清单'.
APPEND wa_commentary TO lt_commentary.
wa_commentary-typ = 'S'.
wa_commentary-info = '中号标题'.
APPEND wa_commentary TO lt_commentary.
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
it_list_commentary = lt_commentary.
* I_LOGO =
* I_END_OF_LIST_GRID =
* I_ALV_FORM =
ENDFORM.
*用户操作按钮
FORM FORM_USER_COMMAND USING R_UCOMM LIKE SY-UCOMM
RS_SELFIELD TYPE SLIS_SELFIELD.
DATA: lt_sflight TYPE TABLE OF sflight, "定义内表
wa_sflight TYPE sflight. "定义工作区
IF R_UCOMM = 'ZYDD1'.
MESSAGE '你触发了按钮' TYPE 'I'.
ELSEIF R_UCOMM = 'Z_SAVE1'.
SELECT * FROM sflight INTO TABLE lt_sflight
FOR ALL ENTRIES IN lt_alvshow
WHERE carrid = lt_alvshow-carrid.
ENDIF.
LOOP AT lt_sflight INTO wa_sflight. "从工作区中取数 循环
READ TABLE lt_alvshow INTO wa_alvshow WITH KEY carrid = wa_sflight-carrid.
IF sy-subrc = 0.
*MESSAGE wa_alvshow-planetype type 'I'.
wa_sflight-planetype = wa_alvshow-planetype.
MODIFY lt_sflight FROM wa_sflight. "更新内表
ENDIF.
CLEAR wa_sflight.
CLEAR wa_alvshow.
ENDLOOP.
UPDATE sflight FROM TABLE lt_sflight.
if sy-subrc = 0.
COMMIT WORK. "数据库提交
MESSAGE '保存成功' TYPE 'I'.
else.
ROLLBACK WORK. "数据库回滚
MESSAGE '保存失败' TYPE 'I'.
ENDIF.
ENDFORM.