CX_SY_DYN_TABLE_ILL_COMP_VAL:创建ALV时排序内表异常崩溃

在使用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.

程序运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值