在CX项目中,根据需求,自定义一个表,维护供应商的银行账号信息,当输入供应商编号时,自动在供应商名称列里自动填写供应商名称,用到了ALV  DataChange 事件 ,下面是源代码:

*&---------------------------------------------------------------------*
*& REPORT  ZMM_LIFNR_BANK
*&
*&---------------------------------------------------------------------*
*& PROGRAM NAME     : ZMM_LIFNR_BANK
*& DESCRIPTION      :
*& AUTHOR           :
*& DATE WRITTEN     :
*& TCODE            :
*& NOTE             :
*&---------------------------------------------------------------------*

REPORT ZMM_LIFNR_BANK.
*INCLUDE ZMMLIFNRBANKTOP.

TABLES:ZXK001.
TYPE-POOLS:SLIS.

TYPES BEGIN OF TY_ITAB.
TYPES CHK.
      INCLUDE TYPE ZXK001.
TYPES END OF TY_ITAB.

DATA: IT_ZXK001 TYPE TABLE OF  TY_ITAB WITH HEADER LINE.
DATA: WA_IT_ZXK001 TYPE TY_ITAB.

DATA: ITZXK001 LIKE TABLE OF ZXK001 WITH HEADER LINE.

DATA: GT_FIELDCAT TYPE LVC_T_FCAT WITH HEADER LINE.
DATA: GC_GLAY TYPE LVC_S_GLAY.
DATA: GS_LAYOUT    TYPE LVC_S_LAYO,     "SLIS_LAYOUT_ALV,
      WK_REPID     LIKE SY-REPID.
DATA GS_GRID TYPE LVC_S_GLAY.
DATA TEM_GRID TYPE REF TO CL_GUI_ALV_GRID.
DATA GT_EVENTS TYPE SLIS_T_EVENT.
DATA GS_EVENTS LIKE LINE OF GT_EVENTS.

*----------------------------------------------------------------------*
*       CLASS LCL_EVENT_RECEIVER DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS LCL_EVENT_RECEIVER DEFINITION. "定义类 捕捉各种事件
  PUBLIC SECTION.
    METHODS HANDLE_MODIFY                   "回车
    FOR EVENT DATA_CHANGED_FINISHED OF CL_GUI_ALV_GRID
    IMPORTING E_MODIFIED ET_GOOD_CELLS.

METHODS HANDLE_ONF4                     "F4
    FOR EVENT ONF4 OF CL_GUI_ALV_GRID
    IMPORTING E_FIELDNAME ES_ROW_NO ER_EVENT_DATA.
ENDCLASS.                    "LCL_EVENT_RECEIVER DEFINITION
DATA GT_EVENT_RECEIVER TYPE REF TO LCL_EVENT_RECEIVER .

SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-B01.
SELECT-OPTIONS:
         S_LIFNR FOR ZXK001-LIFNR.
SELECTION-SCREEN END OF BLOCK B1.

START-OF-SELECTION.
  PERFORM GET_DATA.
  PERFORM DISPLAY_DATA.

*&---------------------------------------------------------------------*
*&      FORM  GET_DATA
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
FORM GET_DATA.

SELECT * INTO CORRESPONDING FIELDS OF TABLE IT_ZXK001 FROM ZXK001 WHERE LIFNR IN S_LIFNR.

ENDFORM.                    "GET_DATA

*&---------------------------------------------------------------------*
*&      FORM  DISPLAY_DATA
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*  -->  P1        TEXT
*  <--  P2        TEXT
*----------------------------------------------------------------------*
FORM DISPLAY_DATA .
  DEFINE FILL_ALV.
    CLEAR GT_FIELDCAT.
    GT_FIELDCAT-FIELDNAME = &1.
    GT_FIELDCAT-SCRTEXT_M = &2 .
*    GT_FIELDCAT-OUTPUTLEN = &3.
    GT_FIELDCAT-NO_ZERO   = &3.
    GT_FIELDCAT-DECIMALS_O   = &4.
    APPEND GT_FIELDCAT.
  END-OF-DEFINITION.

FILL_ALV 'LIFNR'   '供应商编号    '  '' ''.
  FILL_ALV 'NAME1'   '供应商名称    '  '' ''.
  FILL_ALV 'BANKN'   '开户银行 '    '  ' ''.
  FILL_ALV 'IBAN'    '银行账号    '   '' ''.

LOOP AT GT_FIELDCAT WHERE FIELDNAME = 'LIFNR'
                         OR  FIELDNAME = 'BANKN'
                         OR  FIELDNAME = 'NAME1'
                         OR  FIELDNAME = 'IBAN'.

IF GT_FIELDCAT-FIELDNAME <> 'NAME1'.
       GT_FIELDCAT-EDIT = 'X'.
    ENDIF.

IF GT_FIELDCAT-FIELDNAME = 'NAME1'.
       GT_FIELDCAT-OUTPUTLEN = '30'.
    ENDIF.
    IF GT_FIELDCAT-FIELDNAME = 'LIFNR'.
*      GT_FIELDCAT-REF_FIELD = 'LIFNR'.
*      GT_FIELDCAT-REF_TABLE = 'LFA1'.
      GT_FIELDCAT-OUTPUTLEN = '20'.

ENDIF.
    IF GT_FIELDCAT-FIELDNAME = 'BANKN'.
      GT_FIELDCAT-REF_FIELD = 'BANKN'.
      GT_FIELDCAT-REF_TABLE = 'TIBAN'.
      GT_FIELDCAT-OUTPUTLEN = '35'.

ENDIF.
    IF GT_FIELDCAT-FIELDNAME = 'IBAN'.
      GT_FIELDCAT-REF_FIELD = 'IBAN'.
      GT_FIELDCAT-REF_TABLE = 'TIBAN'.
      GT_FIELDCAT-OUTPUTLEN = '34'.
    ENDIF.

MODIFY GT_FIELDCAT.
  ENDLOOP.

GS_LAYOUT-STYLEFNAME   = 'FSTYLE'.
  GS_LAYOUT-ZEBRA        = 'X'.
*  GS_LAYOUT-CWIDTH_OPT   = 'X'.
  GS_LAYOUT-BOX_FNAME = 'CHK'.

GS_GRID-EDT_CLL_CB = 'X'.

*  **************定义事件FORM名称*********************
  GS_EVENTS-NAME = 'CALLER_EXIT'.
  GS_EVENTS-FORM = 'CALLER_EXIT'.
  APPEND GS_EVENTS TO GT_EVENTS.

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      I_CALLBACK_PROGRAM       = SY-REPID
      I_CALLBACK_USER_COMMAND  = 'USER_COMMAND'
*      I_CALLBACK_TOP_OF_PAGE   = 'TOP_OF_PAGE'
      I_CALLBACK_PF_STATUS_SET = 'SET_PF_STATUS'
      IT_FIELDCAT_LVC          = GT_FIELDCAT[]
      I_GRID_SETTINGS          = GS_GRID
      IS_LAYOUT_LVC            = GS_LAYOUT
      I_SAVE                   = 'X'
      IT_EVENTS                = GT_EVENTS
    TABLES
      T_OUTTAB                 = IT_ZXK001.

ENDFORM.                    " DISPLAY_DATA

*&---------------------------------------------------------------------*
*&      FORM  SET_PF_STATUS
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*      -->EXTAB      TEXT
*----------------------------------------------------------------------*
FORM SET_PF_STATUS  USING EXTAB TYPE SLIS_T_EXTAB.          "#EC CALLED
  SET PF-STATUS '1000' .
ENDFORM.                    "WHOLE_TOOLBAR

*&---------------------------------------------------------------------*
*&      FORM  USER_COMMAND
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*      -->RF_UCOMM   TEXT
*      -->RS         TEXT
*----------------------------------------------------------------------*
FORM USER_COMMAND USING RF_UCOMM LIKE SY-UCOMM
                          RS TYPE SLIS_SELFIELD.
  DATA:P_COUNT TYPE I.
  DATA: P_ANSWER(1).
  DATA: LR_GRID TYPE REF TO CL_GUI_ALV_GRID.
  DATA LV_ANSWER.
  DATA LS_STYLEROW TYPE LVC_S_STYL .
  DATA LT_STYLETAB TYPE LVC_T_STYL .

CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      E_GRID = LR_GRID.
  CALL METHOD LR_GRID->CHECK_CHANGED_DATA.
  RS-REFRESH = 'X'.  "自动刷新

CASE RF_UCOMM.
    WHEN '&NEW'.
        IT_ZXK001-LIFNR = ''.
        IT_ZXK001-NAME1 = ''.
        IT_ZXK001-BANKN = ''.
        IT_ZXK001-IBAN  = ''.
        APPEND IT_ZXK001.
        CLEAR IT_ZXK001.

WHEN '&DEL'.

CLEAR P_COUNT.

LOOP AT IT_ZXK001 WHERE CHK = 'X'.
              P_COUNT = 1.
              EXIT.
        ENDLOOP.

IF P_COUNT <= 0.
            MESSAGE '请选择要删除的数据!' TYPE 'I'.
            RETURN.
        ELSE.
            CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
                     EXPORTING
                         TEXTLINE1            = '确认要删除所选记录吗?'
                         TITEL                = '确认提示'
                         CANCEL_DISPLAY       = ''
                     IMPORTING
                         ANSWER               = P_ANSWER.
                CHECK P_ANSWER = 'J'.
                IF P_ANSWER = 'J'.
                    LOOP AT IT_ZXK001 WHERE CHK = 'X'.
                         DELETE FROM ZXK001 WHERE LIFNR = IT_ZXK001-LIFNR.
                         DELETE IT_ZXK001.
                    ENDLOOP.
                ENDIF.
        ENDIF.
    WHEN '&SAVE'.

CLEAR P_COUNT.

LOOP AT IT_ZXK001 WHERE LIFNR = ''.
              P_COUNT = 1.
              EXIT.
        ENDLOOP.
        IF P_COUNT > 0.
            MESSAGE '供应商字段不能为空!' TYPE 'I'.
            RETURN.
        ELSE.

REFRESH ITZXK001.
            CLEAR ITZXK001.
            LOOP AT IT_ZXK001.
                  MOVE-CORRESPONDING IT_ZXK001 TO ITZXK001.
                  APPEND ITZXK001.
                  CLEAR ITZXK001.
            ENDLOOP.

MODIFY ZXK001 FROM TABLE ITZXK001.
            IF SY-SUBRC EQ 0.
               COMMIT WORK.
               MESSAGE S000(ZMM001).
            ELSE.
               ROLLBACK WORK.
               MESSAGE S001(ZMM001).
            ENDIF.
        ENDIF.

WHEN OTHERS.

ENDCASE.
ENDFORM.                    "USER_COMMAND

*&---------------------------------------------------------------------*
*&      FORM  CALLER_EXIT
*&---------------------------------------------------------------------*
*       TEXT
*----------------------------------------------------------------------*
*      -->E_GRID     TEXT
*----------------------------------------------------------------------*
FORM CALLER_EXIT USING E_GRID TYPE SLIS_DATA_CALLER_EXIT.

DATA: L_FIELD TYPE LVC_FNAME,
        LT_F4   TYPE LVC_T_F4,
        LS_F4   TYPE LVC_S_F4.

*  LS_F4-FIELDNAME  = 'UMSKZ'.
*  LS_F4-REGISTER   = 'X'.
  "LS_F4-GETBEFORE  = 'X'. "打'X'会在弹出窗体之前先刷新ALV数据
  "LS_F4-CHNGEAFTER = 'X'. "打'X'会在关闭窗体之后刷新ALV数据
  "LS_F4-INTERNAL   = ''.
  INSERT LS_F4 INTO TABLE LT_F4.

CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      E_GRID = TEM_GRID.

CALL METHOD TEM_GRID->REGISTER_EDIT_EVENT     "注册GRID事件
    EXPORTING
      I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_ENTER"事件:回车
    EXCEPTIONS
      ERROR      = 1
      OTHERS     = 2.

*  CALL METHOD TEM_GRID->REGISTER_F4_FOR_FIELDS
*    EXPORTING
*      IT_F4 = LT_F4.

CREATE OBJECT GT_EVENT_RECEIVER.
  SET HANDLER GT_EVENT_RECEIVER->HANDLE_MODIFY FOR TEM_GRID.
  SET HANDLER GT_EVENT_RECEIVER->HANDLE_ONF4   FOR TEM_GRID.

ENDFORM.                    "CALLER_EXIT

*----------------------------------------------------------------------*
*       CLASS LCL_EVENT_RECEIVER IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS LCL_EVENT_RECEIVER IMPLEMENTATION. "实现类 处理回车事件

METHOD HANDLE_MODIFY.
    DATA LS_STYLEROW TYPE LVC_S_STYL .
    DATA LT_STYLETAB TYPE LVC_T_STYL .
    DATA STBL TYPE LVC_S_STBL.

LOOP AT IT_ZXK001 INTO WA_IT_ZXK001.

SELECT SINGLE
                NAME1
                INTO WA_IT_ZXK001-NAME1
                FROM LFA1
                WHERE LIFNR = WA_IT_ZXK001-LIFNR.
         MODIFY IT_ZXK001 FROM WA_IT_ZXK001.
    ENDLOOP.

STBL-ROW = 'X'." 基于行的稳定刷新
    STBL-COL = 'X'." 基于列稳定刷新
    CALL METHOD TEM_GRID->REFRESH_TABLE_DISPLAY
      EXPORTING
        IS_STABLE = STBL.
  ENDMETHOD.                    "HANDLE_MODIFY

METHOD HANDLE_ONF4.
    DATA :PT_RET TYPE TABLE OF DDSHRETVAL ,
          PS_RET TYPE DDSHRETVAL ,
          LS_MODI TYPE LVC_S_MODI.
    FIELD-SYMBOLS <MODTAB> TYPE LVC_T_MODI.

*    SELECT SHBKZ AS UMSKZ
*           LTEXT
*      INTO TABLE ITHELP
*      FROM T074T
*      WHERE KOART = 'D'
*      AND   SPRAS = '1'.
*
*    CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
*      EXPORTING
*        RETFIELD        = 'UMSKZ'        "内表的关键字段名
*        VALUE_ORG       = 'S'             "'S'
*        DYNPPROG        = SY-REPID      "文本框PROGRAM
*        DYNPNR          = SY-DYNNR       "文本框所在屏幕
*        DYNPROFIELD     = '特殊总账标识'  "文本框名
*        WINDOW_TITLE    = '标题'         "窗体标题
*      TABLES
*        VALUE_TAB       = ITHELP "内表
*                                                                                                                                                                                                                                   "FIELD_TAB       = T_FIELD
*        RETURN_TAB      = PT_RET "返回选择的数据
*      EXCEPTIONS
*        PARAMETER_ERROR = 1
*        NO_VALUES_FOUND = 2
*        OTHERS          = 3.

**    处理 PT_RET 返回的数据,更新ALV CELL即可
    READ TABLE PT_RET INTO PS_RET INDEX 1 .
    IF SY-SUBRC = 0.
      LS_MODI-ROW_ID = ES_ROW_NO-ROW_ID.
      LS_MODI-FIELDNAME = E_FIELDNAME.
      LS_MODI-VALUE = PS_RET-FIELDVAL.
      ASSIGN ER_EVENT_DATA->M_DATA->* TO <MODTAB>.
      APPEND LS_MODI TO <MODTAB>.
    ENDIF.

ER_EVENT_DATA->M_EVENT_HANDLED = 'X'. "通知系统搜索事件处理完毕,停止调用系统标准的SEARCH HELP。
  ENDMETHOD.                    "HANDLE_ONF4
ENDCLASS.                    "LCL_EVENT_RECEIVER IMPLEMENTATION

ALV DataChange EVENT的更多相关文章

  1. SAP Grid control( ALV Grid 列表 自定义 按钮)

    ALV 列表和按钮 效果 源代码 PROGRAM bcalvc_tb_menu_with_def_but. *&&&&&&&&& ...

  2. Model-View-Controller Explained in C++

    The Permanent URL is: Model-View-Controller Explained in C++. The Model-View-Controller (MVC) is not ...

  3. ALV TREE中双击触发PAI事件的方法

    用事件类实现双击事件,实例化后使用set handler注册到ALV对象.斜体部分为事件方法的具体实现. 代码如下 CLASS lcl_tree_event_receiver DEFINITION. ...

  4. 00 alv抬头等

    *&---------------------------------------------------------------------* *& Report ZHJ_TEST0 ...

  5. ABAP ALV单个单元格状态编辑

    *&---------------------------------------------------------------------* *& Report  ZPPR0024 ...

  6. SAP ALV显示并打印(非OO方式)

    *&---------------------------------------------------------------------* *& Report  Z_SD_CPF ...

  7. SAP ALV OO 选择行打印

    &---------------------------------------------------------------------* *& Report  ZSDF001 * ...

  8. ALV用例大全

    一.ALV介绍  The ALV Grid Control (ALV = SAP List Viewer)是一个显示列表的灵活的工具,它提供了基本功能的列表操作,也可以通过自定义来进行增强,因此可以允 ...

  9. ALV详解:OO ALV

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

随机推荐

  1. mysql 父子结构排序

    项目中常常会遇到父子结构显示的问题,不同的数据库有不同的写的方式,比方SqlServer中用with union 实现.而Mysql则没有这么方便的语句. 例如以下category表.食品有pizaa ...

  2. hdu1869 六度分离(Floyd)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1869 转载请注明出处:http://blog.csdn.net/u012860063?viewmode ...

  3. 细说UI线程和Windows消息队列

    在 Windows应用程序中,窗体是由一种称为“ UI线程( User Interface Thread)”的特殊类型的线程创建的. 首先, UI线程是一种“线程”,所以它具有一个线程应该具有的所有特 ...

  4. 外国的Delphi网站

    www.phidels.com delphifr.com http://www.swissdelphicenter.com/torry/showcode.php?id=787 B4A delphifa ...

  5. 591 - Box of Bricks

     Box of Bricks  Little Bob likes playing with his box of bricks. He puts the bricks one upon another ...

  6. BZOJ 1212 HNOI 2004 L语言 Trie树

    标题效果:给一些词.和几个句子,当且仅当句子可以切子可以翻译词典,这意味着该子将被翻译. 找到最长前缀长度可以被翻译. 思维:使用Trie树阵刷.你可以刷到最长的地方是最长的字符串可以翻译到的地方. ...

  7. TControl的消息覆盖函数大全(15个WM_函数和17个CM_函数,它的WndProc就处理鼠标与键盘消息)

    注意,这些函数只有Private一种形式(也就是不允许覆盖,但仍在动态表格中)(特别注意,这里居然没有WM_PAINT函数): TControl = class(TComponent) private ...

  8. Access Violation at address 00000000.Read of address 00000000 解决办法

    是数组越标或没有初始化某个对象之类的问题,搂住细细检查一下代码, 使用指针前未做检查,而这个指针未初始化. 可能是new后没有delete,这样出现溢出的可能性比较大     检查代码或者跟踪试试 使 ...

  9. newlisp 注释生成文档

    最近写了一个newlisp_armory库,用来实现一些newlisp自身不支持的操作.比如跨windows和ubuntu的目录拷贝功能等. 自己用的时候,发现没有API reference文档参考, ...

  10. iOS 史上最全的图片压缩方法集合

    做上传图片功能,特别是类似于微信,QQ里面,公布9张图片, 少不了碰到一个问题,就是图片压缩问题,当然我也遇到了. 我研究了这个问题,发现网上普遍的方法是例如以下 //压缩图片质量 +(UIImage ...