abap alv 更改数据_abap_alv 示例程序

这篇博客展示了如何在ABAP中处理ALV数据,包括数据定义、选择屏幕、双击事件和单元格数据更改。通过实例程序解释了如何读取和展示KNA1表数据,并实现用户命令响应。
摘要由CSDN通过智能技术生成

.

*---------------------------------数据定义区域-------------------*

* 数据定义区域(全局变量,表,常量,数据类型等)

TYPE-POOLS:SLIS.

TABLES:KNA1,KNC3,T074T,TKUKT,BSIS,BSAS.

DATA:G_DOCKING TYPE REF TO CL_GUI_DOCKING_CONTAINER,

G_SPLITER TYPE REF TO CL_GUI_SPLITTER_CONTAINER,

G_CONTAINER TYPE REF TO CL_GUI_CONTAINER.

DATA:BEGIN OF IT_KNA1 OCCURS 0,

GSBER TYPE GSBER,

KUNNR LIKE KNA1-KUNNR,

KUKLA LIKE KNA1-KUKLA,

NAME1 LIKE KNA1-NAME1,

LTEXT LIKE T074T-LTEXT,

VTEXT TYPE BEZEI20,"直通车描述

END OF IT_KNA1.

DATA:BEGIN OF IT_DATA OCCURS 0,

CHECKBOX TYPE C,

KUNNR LIKE KNA1-KUNNR,

KUKLA LIKE KNA1-KUKLA,

NAME1 LIKE KNA1-NAME1,

LTEXT LIKE T074T-LTEXT,

VTEXT TYPE BEZEI20,"直通车描述

HABNL LIKE KNC3-HABNL,

HABNLX LIKE KNC3-HABNL,

GSBER TYPE GSBER,

BELNR LIKE BSIS-BELNR,

COLORX(4) TYPE C,

END OF IT_DATA.

DATA:IT_KNC3 LIKE TABLE OF KNC3 WITH HEADER LINE.

DATA:IT_ITAB_ALV LIKE TABLE OF IT_DATA WITH HEADER LINE.

DATA:BEGIN OF IT_KUNNR OCCURS 0,

KUNNR LIKE KNA1-KUNNR,

GSBER TYPE GSBER,

END OF IT_KUNNR.

*&--POST ACC

DATA: DOCUMENTHEADER LIKE TABLE OF BAPIACHE09 WITH HEADER LINE,

AC TYPE BAPIACGL09,"WA

ACCOUNTGL TYPE TABLE OF BAPIACGL09,

CU TYPE BAPIACCR09,"WA

CURRENCYAMOUNT TYPE TABLE OF BAPIACCR09,

ACCOUNTRECEIVABLE TYPE TABLE OF BAPIACAR09,

ACC TYPE BAPIACAR09,

RE TYPE BAPIRET2,

RETURN TYPE TABLE OF BAPIRET2.

DATA: BEGIN OF WA_OBJKEY ,

OBJ_KEY TYPE BAPIACHE09-OBJ_KEY,

END OF WA_OBJKEY.

DATA: IT_OBJKEY LIKE TABLE OF WA_OBJKEY,

OBJ_KEY TYPE BAPIACHE09-OBJ_KEY.

DATA: WA_RETURN TYPE BAPIRET2.

*DATA:BEGIN OF IT_ERROR OCCURS 10000,

* ERROR(100) TYPE C,

* END OF IT_ERROR.

*DATA: ERROR_TEXT TYPE STRING.

* 架构

DATA: GT_HEADER TYPE TABLE OF SLIS_LISTHEADER"头文件定义,固定.

WITH HEADER LINE,

GT_FIELDCAT_LVC TYPE LVC_T_FCAT

WITH HEADER LINE,

GR_FIELDCAT_LVC TYPE LVC_T_FCAT

WITH HEADER LINE,

GT_SORT_GRID TYPE LVC_T_SORT

WITH HEADER LINE,

GT_ROW_TABLE TYPE LVC_T_ROW

WITH HEADER LINE, "行选择数据

OK_CODE LIKE SY-UCOMM.

* 固定格式

DATA: GRID TYPE REF TO CL_GUI_ALV_GRID, "ALVOO

GS_LAYOUT_ALV TYPE LVC_S_LAYO, "ALV布局

GS_TOOLBAR TYPE STB_BUTTON, "工具栏按钮

G_CUSTOM_CONTAINER TYPE REF TO

CL_GUI_CUSTOM_CONTAINER. "ALV容器

* 类声明

CLASS LCL_EVENT_RECEIVER DEFINITION DEFERRED.

DATA: EVENT_RECEIVER TYPE REF TO LCL_EVENT_RECEIVER.

* 常量定义

CONSTANTS:G_REPID LIKE SY-REPID VALUE SY-REPID, "当前系统

FCODE_BACK LIKE SY-UCOMM VALUE 'BACK', "返回

* FCODE_DISP LIKE SY-UCOMM VALUE 'DISP', "工具栏上的自定按钮

* FCODE_END LIKE SY-UCOMM VALUE 'END', "

FCODE_ENTER LIKE SY-UCOMM VALUE 'ENTER', "确定

FCODE_EXIT LIKE SY-UCOMM VALUE 'EXIT'. "退出

* FCODE_PLANE LIKE SY-UCOMM VALUE 'FLIGHT'. "工具栏上的自定按钮

*---------------------------------数据定义区域< END >-------------------*

*----------------------------------主程序区域--------------------*

INITIALIZATION.

PERFORM FRM_INI.

*1 选择屏幕

SELECTION-SCREEN BEGIN OF BLOCK BOX1

WITH FRAME TITLE TEXT-001.

PARAMETERS:P_BUKRS LIKE BSIS-BUKRS DEFAULT '1000',

P_GJAHR LIKE BSIS-GJAHR DEFAULT SY-DATUM+0(4).

SELECT-OPTIONS:S_SHBKZ FOR T074T-SHBKZ DEFAULT 'L'NO INTERVALS,

S_KTOKD FOR KNA1-KTOKD DEFAULT 'D001' TO 'D002',

S_KUKLA FOR KNA1-KUKLA DEFAULT '01' TO '02',

S_KUNNR FOR KNA1-KUNNR,

S_WERKS FOR KNA1-WERKS.

SELECTION-SCREEN BEGIN OF LINE.

SELECTION-SCREEN COMMENT 2(79) SCSHOW.

SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN END OF BLOCK BOX1.

START-OF-SELECTION.

PERFORM SET_QUANX. "权限

* 数据处理

PERFORM FRM_DATA_RD.

END-OF-SELECTION.

*调用DYPLNR

CALL SCREEN 100.

* &--------------------------- 类实例化

CLASS LCL_EVENT_RECEIVER DEFINITION.

PUBLIC SECTION.

METHODS:

*- 命令按钮

HANDLE_USER_COMMAND

FOR EVENT USER_COMMAND OF CL_GUI_ALV_GRID

IMPORTING E_UCOMM,

*- 双击列表栏事件

HANDLE_DOUBLE_CLICK

FOR EVENT DOUBLE_CLICK OF CL_GUI_ALV_GRID

IMPORTING E_ROW,

*- CHECKBOX

HANDLE_DATA_CHANGED

FOR EVENT DATA_CHANGED OF CL_GUI_ALV_GRID

IMPORTING ER_DATA_CHANGED.

PRIVATE SECTION.

ENDCLASS. "LCL_EVENT_RECEIVER DEFINITION

*----------------------------------------------------------------------*

* CLASS LCL_EVENT_RECEIVER IMPLEMENTATION

*----------------------------------------------------------------------*

*

*----------------------------------------------------------------------*

CLASS LCL_EVENT_RECEIVER IMPLEMENTATION.

*-------------------------------------------------------------------

* 事件方法

*---------------------------------------------------------------------------

METHOD HANDLE_USER_COMMAND.

*- 事件开始:

CASE E_UCOMM.

WHEN 'CHECKBOX'.

BREAK:WANGCHENGBIN.

ENDCASE.

ENDMETHOD. "handle_user_command

*-------------------------------------------------------------------

* 双击列表栏事件方法

METHOD HANDLE_DOUBLE_CLICK.

ENDMETHOD. "handle_button_click

*-----------------------------------------------------------------

* 单元格数据改变

METHOD HANDLE_DATA_CHANGED.

PERFORM HANDLE_DATA_CHANGED USING ER_DATA_CHANGED.

ENDMETHOD. "HANDLE_DATA_CHANGED

ENDCLASS. "l

*&---------------------------------------------------------------------*

*& Module STATUS_0100 OUTPUT

*&---------------------------------------------------------------------*

* 状态栏

*----------------------------------------------------------------------*

MODULE STATUS_0100 OUTPUT.

SET PF-STATUS 'STATUS_0100'.

SET TITLEBAR 'TITLE_0100'.

ENDMODULE. " STATUS_0100 OUTPUT

*&---------------------------------------------------------------------*

*& Module USER_COMMAND_0100 INPUT

*&---------------------------------------------------------------------*

* 命令区域

*----------------------------------------------------------------------*

MODULE USER_COMMAND_0100 INPUT.

DATA:ACTION LIKE SY-UCOMM.

ACTION = OK_CODE.

CLEAR: OK_CODE.

CASE ACTION.

WHEN 'BACK'.

LEAVE TO SCREEN 0.

WHEN 'EXIT'.

LEAVE PROGRAM.

WHEN 'ACCPOST'.

PERFORM FRM_ACCPOST.

WHEN OTHERS.

ENDCASE.

ENDMODULE. " USER_COMMAND_0100 INPUT

*&---------------------------------------------------------------------*

*& Module PBO_INCLUDE OUTPUT

*&---------------------------------------------------------------------*

* 处理区域

*----------------------------------------------------------------------*

MODULE PBO_INCLUDE OUTPUT.

IF G_DOCKING IS INITIAL .

CREATE OBJECT G_DOCKING

EXPORTING

REPID = G_REPID

DYNNR = '0100'

SIDE = CL_GUI_DOCKING_CONTAINER=>DOCK_AT_BOTTOM

EXTENSION = '440'

EXCEPTIONS

CNTL_ERROR = 1

CNTL_SYSTEM_ERROR = 2

CREATE_ERROR = 3

LIFETIME_ERROR = 4

LIFETIME_DYNPRO_DYNPRO_LINK = 5.

CREATE OBJECT G_SPLITER

EXPORTING

PARENT = G_DOCKING

ROWS = 1

COLUMNS = 1.

CALL METHOD G_SPLITER->GET_CONTAINER

EXPORTING

ROW = 1

COLUMN = 1

RECEIVING

CONTAINER = G_CONTAINER.

* 创建FIELDCAT

PERFORM FRM_FIELDCAT.

* 创建LAYOUT

PERFORM FRM_LAYOUT.

*3. ALV数据填充

CREATE OBJECT GRID

EXPORTING

I_PARENT = G_CONTAINER."使用画布,此画布放在上面的指定的容器中

CALL METHOD GRID->SET_TABLE_FOR_FIRST_DISPLAY

EXPORTING

* I_STRUCTURE_NAME = 'ZSFIR001' "参照结构

IS_LAYOUT = GS_LAYOUT_ALV "布局设置

CHANGING

IT_OUTTAB = IT_ITAB_ALV[] "数据源

IT_FIELDCATALOG = GR_FIELDCAT_LVC[]."字段

CALL METHOD GRID->SET_READY_FOR_INPUT

EXPORTING

I_READY_FOR_INPUT = 1. "使用方法set_ready_for_input 传入参数

"i_ready_for_input = 1 可以是ALV 进入编辑状态

CALL METHOD GRID->REGISTER_EDIT_EVENT "触发数据改变事件

EXPORTING

I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_MODIFIED. "1.按回车触发:mc_event_enter;2.MC_EVT_MODIFIED:单元格失去焦点

CALL METHOD CL_GUI_CONTROL=>SET_FOCUS

EXPORTING

CONTROL = GRID. "SET_READY_FOR_INPUT,REGISTER_EDIT_EVENT,OO-ALV的单元编辑

CREATE OBJECT EVENT_RECEIVER.

SET HANDLER EVENT_RECEIVER->HANDLE_USER_COMMAND FOR GRID.

SET HANDLER EVENT_RECEIVER->HANDLE_DOUBLE_CLICK FOR GRID.

SET HANDLER EVENT_RECEIVER->HANDLE_DATA_CHANGED FOR GRID. "ALV 单元编辑事件

ELSE.

CALL METHOD GRID->REFRESH_TABLE_DISPLAY.

ENDIF.

ENDMODULE. " PBO_INCLUDE OUTPUT

*&---------------------------------------------------------------------*

*& Form FRM_DATA_RD

*&---------------------------------------------------------------------*

* SQL语句 S_MTART

*----------------------------------------------------------------------*

FORM FRM_DATA_RD .

DATA:SALDV LIKE KNC3-SALDV, SOLLL LIKE KNC3-SOLLL,HABNL LIKE KNC3-HABNL,X1 LIKE KNC3-HABNL,X2 LIKE KNC3-HABNL.

DATA:WA_KNC3 LIKE LINE OF IT_KNC3.

DATA:KUKLA LIKE KNA1-KUKLA,KUNNR LIKE KNA1-KUNNR.

DATA:BEGIN OF IT_KUNNR2 OCCURS 100,

KUNNR LIKE KNA1-KUNNR,

END OF IT_KUNNR2.

CLEAR:IT_KNA1[],IT_KUNNR[].

*&---客户数据,IT_KNA1

IF S_KUNNR[] IS NOT INITIAL.

CLEAR:S_WERKS[].

ENDIF.

IF S_WERKS[] IS NOT INITIAL.

SELECT KUNN2 AS KUNNR VKORG AS GSBER INTO TABLE IT_KUNNR FROM KNVP WHERE PARVW = 'RG' AND VKORG IN S_WERKS.

SORT IT_KUNNR BY KUNNR GSBER.

DELETE ADJACENT DUPLICATES FROM IT_KUNNR COMPARING KUNNR GSBER.

IF IT_KUNNR[] IS NOT INITIAL.

LOOP AT IT_KUNNR.

SELECT SINGLE KUNNR NAME1 KUKLA INTO (IT_KNA1-KUNNR,IT_KNA1-NAME1,IT_KNA1-KUKLA)

FROM KNA1 WHERE KUNNR = IT_KUNNR-KUNNR AND KTOKD IN S_KTOKD .

SELECT SINGLE VTEXT FROM TKUKT INTO IT_KNA1-VTEXT WHERE SPRAS = '1' AND KUKLA = IT_KNA1-KUKLA.

IF SY-SUBRC <> 0.

SELECT KUNNR INTO TABLE IT_KUNNR2 FROM KNVP WHERE KUNN2 = IT_KUNNR-KUNNR AND VKORG IN S_WERKS ORDER BY KUNNR.

DELETE ADJACENT DUPLICATES FROM IT_KUNNR2 COMPARING KUNNR.

LOOP AT IT_KUNNR2.

IF IT_KNA1-VTEXT IS NOT INITIAL.

CONTINUE.

ENDIF.

SELECT SINGLE KUKLA INTO KUKLA FROM KNA1 WHERE KUNNR = IT_KUNNR2-KUNNR.

IF SY-SUBRC = 0 AND KUKLA = '02'.

SELECT SINGLE VTEXT INTO IT_KNA1-VTEXT FROM TKUKT WHERE SPRAS = '1' AND KUKLA = KUKLA.

CONTINUE.

ENDIF.

ENDLOOP.

ENDIF.

IT_KNA1-GSBER = IT_KUNNR-GSBER.

APPEND IT_KNA1.

CLEAR:IT_KNA1,KUNNR,KUKLA,IT_KUNNR2[].

ENDLOOP.

SORT IT_KNA1 BY KUNNR.

ENDIF.

ELSE.

SELECT KUNN2 AS KUNNR VKORG AS GSBER INTO TABLE IT_KUNNR FROM KNVP WHERE PARVW = 'RG' AND KUNNR IN S_KUNNR.

SORT IT_KUNNR BY KUNNR GSBER.

DELETE ADJACENT DUPLICATES FROM IT_KUNNR COMPARING KUNNR GSBER.

LOOP AT IT_KUNNR.

SELECT SINGLE KUNNR NAME1 KUKLA INTO (IT_KNA1-KUNNR,IT_KNA1-NAME1,IT_KNA1-KUKLA)

FROM KNA1 WHERE KUNNR = IT_KUNNR-KUNNR AND KTOKD IN S_KTOKD .

SELECT SINGLE VTEXT FROM TKUKT INTO IT_KNA1-VTEXT WHERE SPRAS = '1' AND KUKLA = IT_KNA1-KUKLA.

IF SY-SUBRC <> 0.

SELECT KUNNR INTO TABLE IT_KUNNR2 FROM KNVP WHERE KUNN2 = IT_KUNNR-KUNNR AND VKORG IN S_WERKS ORDER BY KUNNR.

DELETE ADJACENT DUPLICATES FROM IT_KUNNR2 COMPARING KUNNR.

LOOP AT IT_KUNNR2.

IF IT_KNA1-VTEXT IS NOT INITIAL.

CONTINUE.

ENDIF.

SELECT SINGLE KUKLA INTO KUKLA FROM KNA1 WHERE KUNNR = IT_KUNNR2-KUNNR.

IF SY-SUBRC = 0 AND KUKLA = '02'.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值