此博客为原创博客,都是个人工作经历所得,转载请注明出处

YHMMR003 农户基本信息的维护程序

***********************************************************************
* Title           :                                           *
* Application     : MM                                               *
* Subject         : 农户基本信息的维护程序                            *
* Requested by    :        (YH_MM)                                    *
* Execution       : Online when required                              *
* Ref no:         :                                          *
* Author          :                                          *
* Req Date        : 20120709                                          *
***********************************************************************
*              农户信息及商品关系维护程序                         *
***********************************************************************
*              设计主要逻辑与原理说明   :::                    *
***********************************************************************
* 1.程序流程及功能:自建农户基表创建农户基本信息的新增,修改,及查询  *
* 2,取数:从自建农户基本信息表中取得需要展示的数据用ALV显示.          *
* 3.输入:农户名称,身份证号码。                                      *
* 4.输出:农户编码, 农户名称,身份证号码,状态。                     *
* 5.事件:用Tabel Control实现自建表的新增功能用ALV实现自建表的修改功能*
***********************************************************************
***********************************************************************
* MODIFICATIONS (latest entry at the top)                             *
* ------------------------------------------------------------------- *
* REL  DATE    NAME (COMPANY)   DESCRIPTION               TASK-NO     *
* ---  ----    ---- ---------     -----------             -------     *
*                                                                     *
***********************************************************************
REPORT  YHMMR003 NO STANDARD PAGE HEADING
                 LINE-SIZE  132
                 LINE-COUNT 65(1)
                 MESSAGE-ID YH_MM1.



*---------------------------------------------------------------------------------
*---------------------- 声明类型池----------------------*
*---------------------------------------------------------------------------------
TYPE-POOLS: SLIS,
            VRM.

*---------------------------------------------------------------------------------
*----------------------声明数据字典---------------------*
*---------------------------------------------------------------------------------
TABLES: YTNAH,
        YTNHCG.

*---------------------------------------------------------------------------------
*--------------------- 结构定义-------------------------*
*---------------------------------------------------------------------------------
TYPES: BEGIN OF TY_YTNAH,
       NHBM  TYPE YTNAH-NHBM,
       NHMC  TYPE YTNAH-NHMC,
       SFZHM TYPE YTNAH-SFZHM,
       ZHTA  TYPE YTNAH-ZHTA,
       CPUTM TYPE YTNAH-CPUTM,
       AEDAT TYPE YTNAH-AEDAT,
       USNAM TYPE YTNAH-USNAM,
       END OF TY_YTNAH.
TYPES: TY_TAB_YTNAH TYPE TY_YTNAH OCCURS 0.
DATA: G_LINE TYPE I.
DATA :BEGIN OF GT_ITAB OCCURS 0.
        INCLUDE STRUCTURE YTNAH.
DATA:  SEL TYPE C,
       UPD.
DATA: END OF GT_ITAB.

DATA: WA_TAB LIKE GT_ITAB.
DATA: WA_TAB1 LIKE GT_ITAB.

DATA :BEGIN OF GT_ITAB1 OCCURS 0.
        INCLUDE STRUCTURE YTNAH.
DATA:  SEL TYPE C,
       UPD.
DATA: END OF GT_ITAB1.

*---------------------------------------------------------------------------------
*----------------------- 内表定义 -----------------------*
*---------------------------------------------------------------------------------

DATA: BEGIN OF GT_DATA OCCURS 0.
        INCLUDE STRUCTURE YTNAH.
DATA: ROWCOLOR(4) TYPE C,
      CELLCOLOR TYPE LVC_T_SCOL,
      PEYPE_DD_HNDL TYPE INT4.
DATA: END OF GT_DATA.
DATA: WA_DATA LIKE GT_DATA.

DATA: GT_CHANGE    TYPE TABLE OF YTNAH WITH HEADER LINE,
      GT_CH  TYPE TABLE OF YTNAH WITH HEADER LINE,
      WA_CHANGE    TYPE YTNAH.
DATA: GT_YTNAH   TYPE TABLE OF YTNAH WITH HEADER LINE,
      WA_YTNAH   TYPE YTNAH.

*---------------------------------------------------------------------------------
*---------------------- ALV参数定义 ---------------------*
*---------------------------------------------------------------------------------
DATA: G_PROGRAM    TYPE SY-REPID,
      GW_LAYOUT    TYPE SLIS_LAYOUT_ALV,
      GT_FIELDCAT  TYPE SLIS_T_FIELDCAT_ALV,
      WA_FIELDCAT  TYPE SLIS_FIELDCAT_ALV,
      GT_EVENT     TYPE SLIS_T_EVENT,
      WA_EVENT     TYPE SLIS_ALV_EVENT.
DATA: G_GRID  TYPE REF TO CL_GUI_ALV_GRID.
*---------------------------------------------------------------------------------
*--------------------- 常量定义 -------------------------*
*---------------------------------------------------------------------------------
DATA: G_LINNO  LIKE SY-TABIX,
      G_LINES  TYPE I,
      G_LINES1 TYPE I,
      G_CREA   TYPE C,
      G_COUNT  TYPE I.

*&SPWIZARD: LINES OF TABLECONTROL 'TC_ITEM'
DATA:     G_TC_ITEM_LINES  LIKE SY-LOOPC.
*&SPWIZARD: LINES OF TABLECONTROL 'TC_ITEM1'
DATA:     G_TC_ITEM1_LINES  LIKE SY-LOOPC.
*---------------------------------------------------------------------------------
*--------------------- 全局变量定义 ----------------------*
*---------------------------------------------------------------------------------
DATA: G_INDEX    TYPE SY-TABIX.
DATA: OK_CODE    TYPE SY-UCOMM,
      G_DUP_FLAG TYPE C.
DATA  G_ANSWER   TYPE C.
DATA: VID        TYPE VRM_ID,
      VLIST      TYPE VRM_VALUES,
      WA_VALUE   LIKE LINE OF VLIST.
*---------------------------------------------------------------------------------
*--------------------- 屏幕定义 --------------------------*
*---------------------------------------------------------------------------------
*&SPWIZARD: DECLARATION OF TABLECONTROL 'TC_ITEM' ITSELF
CONTROLS: TC_ITEM TYPE TABLEVIEW USING SCREEN 0100.
*&SPWIZARD: DECLARATION OF TABLECONTROL 'TC_ITEM1' ITSELF
CONTROLS: TC_ITEM1 TYPE TABLEVIEW USING SCREEN 0200.


*=================================================================================
*                                SELECTION-SCREEN
*=================================================================================
SELECTION-SCREEN BEGIN OF BLOCK BLK0 WITH FRAME TITLE TEXT-001.
SELECTION-SCREEN SKIP 1.
*& 农户编码
*& 身份证号码
SELECT-OPTIONS: S_NHBM   FOR YTNAH-NHBM  MATCHCODE OBJECT YH_NHBM NO-EXTENSION NO INTERVALS,
                S_SFZHM  FOR YTNAH-SFZHM MATCHCODE OBJECT YH_SFZHM ,
*& 农户采购组织区分标识:
                S_NHSIG  FOR YTNHCG-NHSIG NO INTERVALS NO-EXTENSION
                MATCHCODE OBJECT YH_NHSIG ." OBLIGATORY. "农户对应的采购组织信息。

*& 查询
*& 修改
*& 新增
PARAMETERS:     RB_QUERY  RADIOBUTTON GROUP G1,
                RB_CHANG  RADIOBUTTON GROUP G1,
                RB_ADD    RADIOBUTTON GROUP G1. " DEFAULT 'X'.

SELECTION-SCREEN END OF BLOCK BLK0.

*----------------------------------------------------------------------
*  INITIALIZATION
*----------------------------------------------------------------------
INITIALIZATION.

* 初始化数据
*  PERFORM frm_initial.

*----------------------------------------------------------------------
*  AT SELECTION-SCREEN
*----------------------------------------------------------------------
AT SELECTION-SCREEN.

  PERFORM FRM_INIT_DATA.
* 权限检查部分
  PERFORM FRM_CHECK_AUTHOR.

*=================================================================================
*                                MAIN PROGRAM
*=================================================================================
*---------------------------------------------------------------------------------
*  START-OF-SELECTION
*---------------------------------------------------------------------------------
START-OF-SELECTION.
*&S1 查询时
  IF RB_QUERY IS NOT INITIAL.
*&S1.1取数
    PERFORM FRM_GET_DATA.
*&S1.2ALV显示
    PERFORM FRM_OUTPUT_DATA.
  ENDIF.

*&S2 修改时
  IF RB_CHANG IS NOT INITIAL.
    CLEAR: GT_DATA, WA_DATA.
*&S2.1获取修改数据
    PERFORM GET_DATA_MODIFY.
*&S2.2数据修改操作
    PERFORM FRM_MODIFY_DATA.
  ENDIF.



*&S3 TB维护农户表
  IF RB_ADD NE SPACE.
*& 以采购组织对农户进行区分:
    IF S_NHSIG IS INITIAL.
      MESSAGE I006 WITH  '请选择创建农户对应的采购组织!!!'.
      STOP.
    ENDIF.

    TC_ITEM-LINES = 0 .
    TC_ITEM-TOP_LINE = 1.

*& 进行维护的时候,锁定数据表。
    PERFORM FRM_LOCK_YTNAH USING SY-MANDT.
    CALL SCREEN 0100.
  ENDIF.
*---------------------------------------------------------------------------------
*  END-OF-SELECTION
*---------------------------------------------------------------------------------


*&---------------------------------------------------------------------*
*&      Form  FRM_INIT_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_INIT_DATA .
*& 查询时候的必输条件:
  IF RB_QUERY IS NOT INITIAL.
    IF S_NHBM IS INITIAL.
      MESSAGE I006 WITH '请输入农户编码作为查询条件!'.
      STOP.
    ENDIF.
  ENDIF.

*& 修改时候的必输条件:
  IF RB_CHANG IS NOT INITIAL.
    IF S_NHBM IS INITIAL.
      MESSAGE I006 WITH '请输入农户编码作为查询条件!'.
      STOP.
    ENDIF.
  ENDIF.

ENDFORM.                    " FRM_INIT_DATA


*&---------------------------------------------------------------------*
*&      Form  FRM_CHECK_AUTHOR
*&---------------------------------------------------------------------*
*  *& 权限检查
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_CHECK_AUTHOR .

*    AUTHORITY-CHECK OBJECT 'M_MATE_WGR'
*                 ID 'ADD' FIELD RB_ADD
*                 ID 'ACTVT' FIELD '01'.
*  IF SY-SUBRC <> 0.
*    MESSAGE i012 with '没有农户信息' RB_ADD '创建的权限!'.
*    stop.
*  ENDIF.

ENDFORM.                    " FRM_CHECK_AUTHOR

*&---------------------------------------------------------------------*
*&      Form  frm_get_data
*&---------------------------------------------------------------------*
*       从数据表中取数(从自建表ytnah中取数到gt_data)
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_GET_DATA .

*&S1.1.1从农户表中取得数据
  SELECT NHBM
         NHMC
         SFZHM
         ZHTA
         CPUTM
         AEDAT
         USNAM
    INTO CORRESPONDING FIELDS OF  TABLE GT_DATA
    FROM YTNAH
   WHERE NHBM  IN S_NHBM
     AND SFZHM IN S_SFZHM.

*&S1.1.2检查有没有数据
  DESCRIBE TABLE GT_DATA LINES G_LINES.
  IF G_LINES = 0.
    MESSAGE I001 WITH '根据查询条件未找到数据!'.
    STOP.
  ENDIF.

*&S1.1.3内表排序:
  SORT GT_DATA BY NHBM.

ENDFORM.                    " frm_get_data



*&---------------------------------------------------------------------*
*&      Form  FRM_OUTPUT_DATA
*&---------------------------------------------------------------------*
*        ALV显示
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_OUTPUT_DATA .

  DEFINE ADD_FIELDCAT.
    CLEAR WA_FIELDCAT.

    WA_FIELDCAT-FIELDNAME    =  &1.
    WA_FIELDCAT-SELTEXT_L    =  &2.
    WA_FIELDCAT-COL_POS      =  &3.
    WA_FIELDCAT-JUST         =  &4.
    WA_FIELDCAT-OUTPUTLEN    =  &5.
    WA_FIELDCAT-FIX_COLUMN   =  &6.
    WA_FIELDCAT-CHECKBOX     =  &7.

    APPEND WA_FIELDCAT TO GT_FIELDCAT.
  END-OF-DEFINITION.

  CLEAR GT_FIELDCAT.

  ADD_FIELDCAT  'NHBM'       '农户编码'    1  'L'  7  ''  ''.
  ADD_FIELDCAT  'NHMC'       '农户名称'    2  'L'  40 ''  ''.
  ADD_FIELDCAT  'SFZHM'      '身份证号码'  3  'L'  18 ''  ''.
  ADD_FIELDCAT  'ZHTA'       '状态'        4  'R'  3  ''  ''.
  ADD_FIELDCAT  'CPUTM'      '输入时间'    5  'L'  6  ''  ''.
  ADD_FIELDCAT  'AEDAT'      '更改时间'    6  'L'  8  ''  ''.
  ADD_FIELDCAT  'USNAM'      '用户名'      7  'L'  12 ''  ''.


  GW_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.  "优化列

  G_PROGRAM = SY-REPID.


  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      I_CALLBACK_PROGRAM = G_PROGRAM
      IS_LAYOUT          = GW_LAYOUT
      IT_FIELDCAT        = GT_FIELDCAT[]
      I_SAVE             = 'A'
    TABLES
      T_OUTTAB           = GT_DATA.


ENDFORM.                    " FRM_OUTPUT_DATA

*&---------------------------------------------------------------------*
*&      Form  GET_DATA_MODIFY
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM GET_DATA_MODIFY .


*&S2.1.1从农户表中取得数据
  SELECT NHBM
         NHMC
         SFZHM
         ZHTA
         CPUTM
         AEDAT
         USNAM
    INTO CORRESPONDING FIELDS OF  TABLE GT_CHANGE
    FROM YTNAH
   WHERE NHBM  IN S_NHBM
     AND SFZHM IN S_SFZHM.

*&2.1.2检查有没有数据
  DESCRIBE TABLE GT_CHANGE LINES G_LINES.
  IF G_LINES = 0.
    MESSAGE E001 WITH '根据查询条件未找到数据!'.
    STOP.
  ENDIF.
*&2.1.3内表排序:
  SORT GT_CHANGE BY NHBM.

ENDFORM.                    " GET_DATA_MODIFY


*&---------------------------------------------------------------------*
*&      Form  FRM_MODIFY_DATA
*&---------------------------------------------------------------------*
*       ALV显示,然后用ALV界面进行修改
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_MODIFY_DATA .

  CLEAR WA_EVENT.
  MOVE 'PF_STATUS_SET' TO WA_EVENT-NAME.
  MOVE 'F_PF_STATUS_SET' TO WA_EVENT-FORM.
  APPEND WA_EVENT TO GT_EVENT.

  CLEAR WA_EVENT.
  MOVE 'USER_COMMAND' TO WA_EVENT-NAME.
  MOVE 'F_USER_COMMAND' TO WA_EVENT-FORM.
  APPEND WA_EVENT TO GT_EVENT.

  DEFINE ADD_FIELDCAT.
    CLEAR WA_FIELDCAT.
    WA_FIELDCAT-FIELDNAME    =  &1.
    WA_FIELDCAT-SELTEXT_L    =  &2.
    WA_FIELDCAT-COL_POS      =  &3.
    WA_FIELDCAT-JUST         =  &4.
    WA_FIELDCAT-OUTPUTLEN    =  &5.
    WA_FIELDCAT-FIX_COLUMN   =  &6.
    WA_FIELDCAT-CHECKBOX     =  &7.
    WA_FIELDCAT-EDIT         =  &8.
    WA_FIELDCAT-EDIT_MASK    =  &9.
*    wa_fieldcat-datatype     =  &10.

    APPEND WA_FIELDCAT TO GT_FIELDCAT.
  END-OF-DEFINITION.

  CLEAR GT_FIELDCAT.

  ADD_FIELDCAT  'NHBM'       '农户编码'    1  'L'  7  ''  '' ''   '' .
  ADD_FIELDCAT  'NHMC'       '农户名称'    2  'L'  40 ''  '' 'X'  '' .
  ADD_FIELDCAT  'SFZHM'      '身份证号码'  3  'L'  18 ''  '' 'X'  '' .
  ADD_FIELDCAT  'ZHTA'       '状态'        4  'R'  3  ''  '' 'X'  '' .
  ADD_FIELDCAT  'CPUTM'      '输入时间'    5  'L'  6  ''  ''  ''  '' .
  ADD_FIELDCAT  'AEDAT'      '更改时间'    6  'L'  8  ''  ''  ''  '' .
  ADD_FIELDCAT  'USNAM'      '用户名'      7  'L'  12 ''  ''  ''  ' '.


  GW_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.  "优化列
  GW_LAYOUT-BOX_FIELDNAME = 'ZSEL'.
  G_PROGRAM = SY-REPID.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      I_CALLBACK_PROGRAM       = G_PROGRAM
      I_CALLBACK_USER_COMMAND  = 'USER_COMMAND'
      I_CALLBACK_PF_STATUS_SET = 'SET_PF_STATUS'
      IS_LAYOUT                = GW_LAYOUT
      IT_FIELDCAT              = GT_FIELDCAT
      I_SAVE                   = 'A'
      IT_EVENTS                = GT_EVENT
    TABLES
      T_OUTTAB                 = GT_CHANGE
    EXCEPTIONS
      PROGRAM_ERROR            = 1
      OTHERS                   = 2.
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

ENDFORM.                     "FRM_MODIFY_DATA


*&---------------------------------------------------------------------*
*&      ALV EVENT Form  FRM_SET_LAYOUT
*&      ALV状态栏事件  状态:STATUS
*&---------------------------------------------------------------------*
FORM F_PF_STATUS_SET  USING EXTAB TYPE SLIS_T_EXTAB.

  SET PF-STATUS '0200' EXCLUDING EXTAB.

ENDFORM.                     "f_pf_status_set


*&---------------------------------------------------------------------*
*&      ALV EVENT Form f_user_command
*&---------------------------------------------------------------------*
FORM F_USER_COMMAND USING RF_UCOMM LIKE SY-UCOMM
                   RS_SELFIELD TYPE SLIS_SELFIELD.


  DATA: LR_GRID TYPE REF TO CL_GUI_ALV_GRID.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      E_GRID = LR_GRID.
  CALL METHOD LR_GRID->CHECK_CHANGED_DATA.
  CALL METHOD LR_GRID->REFRESH_TABLE_DISPLAY.

  RS_SELFIELD-REFRESH = 'X'.

  CASE RF_UCOMM.

**& 删除操作
*    WHEN 'DELETE'.
*      CLEAR OK_CODE.
*      PERFORM FRM_DELETE_DATA_ALV.

*& 保存操作
    WHEN 'SAVE'.
      CLEAR OK_CODE.
      PERFORM FRM_SAVE_DATA_ALV.

*& 退出操作
    WHEN 'BACK'.
      CLEAR OK_CODE.
      PERFORM FRM_UNLOCK  USING SY-MANDT.
      LEAVE TO SCREEN 0.

    WHEN OTHERS.

      CLEAR OK_CODE.

  ENDCASE.
ENDFORM.                    " f_user_command

*&---------------------------------------------------------------------*
*&      Form  FRM_DELETE_DATA_ALV
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_DELETE_DATA_ALV .
  DATA: L_INDEX  TYPE SY-TABIX.
*& 检查数据是否存在:
    PERFORM FRM_CHECK_YTNAM.

  CALL FUNCTION 'POPUP_TO_CONFIRM'
    EXPORTING
      TITLEBAR              = '确认'
      TEXT_QUESTION         = '确定删除此信息吗?'
      TEXT_BUTTON_1         = ''
      TEXT_BUTTON_2         = ''
      DEFAULT_BUTTON        = '1'
      DISPLAY_CANCEL_BUTTON = ' '
      START_COLUMN          = 25
      START_ROW             = 6
      POPUP_TYPE            = 'ICON_MESSAGE_WARNING'
    IMPORTING
      ANSWER                = G_ANSWER
    EXCEPTIONS
      TEXT_NOT_FOUND        = 1
      OTHERS                = 2.
  CHECK G_ANSWER EQ  '1'.

*& 修改时候删除记录操作:
  LOOP AT GT_CHANGE INTO WA_CHANGE WHERE ZSEL <> SPACE.
    L_INDEX = SY-TABIX.
*    DELETE GT_CHANGE INDEX L_INDEX.
    DELETE ytnah FROM GT_CHANGE.
   IF SY-SUBRC EQ 0.
      DELETE GT_CHANGE INDEX L_INDEX.
   ENDIF.

  ENDLOOP.

ENDFORM.                    " FRM_DELETE_DATA_ALV

*&---------------------------------------------------------------------*
*&      Form  FRM_SAVE_DATA_ALV
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_SAVE_DATA_ALV .
  PERFORM FRM_LOCK_YTNAH USING SY-MANDT.


  PERFORM FRM_CHECK_ZHTA.

  CALL FUNCTION 'POPUP_TO_CONFIRM'
    EXPORTING
      TITLEBAR              = '确认'
      TEXT_QUESTION         = '你真的要保存修改农户信息吗?'
      TEXT_BUTTON_1         = ''
      TEXT_BUTTON_2         = ''
      DEFAULT_BUTTON        = '1'
      DISPLAY_CANCEL_BUTTON = ' '
      START_COLUMN          = 25
      START_ROW             = 6
      POPUP_TYPE            = 'ICON_MESSAGE_WARNING'
    IMPORTING
      ANSWER                = G_ANSWER
    EXCEPTIONS
      TEXT_NOT_FOUND        = 1
      OTHERS                = 2.
  CHECK G_ANSWER EQ  '1'.

*& 时间,日期,用户赋值:
  LOOP AT GT_CHANGE WHERE NHBM IS NOT INITIAL.
    MOVE: SY-UZEIT TO GT_CHANGE-CPUTM,
          SY-DATUM TO GT_CHANGE-AEDAT,
          SY-UNAME TO GT_CHANGE-USNAM.
    MODIFY  GT_CHANGE.
  ENDLOOP.

*&888:通过内表更新数据表:
  MODIFY YTNAH FROM TABLE GT_CHANGE.
  IF SY-SUBRC EQ 0.
    COMMIT WORK.
    MESSAGE S006 WITH '数据保存成功!'.
  ELSE.
    ROLLBACK WORK.
    MESSAGE S006 WITH '数据保存失败!'.
  ENDIF.


ENDFORM.                    " FRM_SAVE_DATA_ALV

*&---------------------------------------------------------------------*
*&      Form  FRM_CHECK_ZHTA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_CHECK_ZHTA .

  DATA: BEGIN OF LT_NHBM OCCURS 0,
        NHBM LIKE YTNAH-NHBM,
        END OF LT_NHBM.

  DATA: L_NHBM LIKE YTNAH-NHBM,
        L_NHMC LIKE YTNAH-NHMC.

  DATA: L_LINES TYPE I.
*& 身份证重复性检查
  IF   GT_CHANGE-NHMC  NE SPACE
   AND GT_CHANGE-SFZHM NE SPACE
   AND GT_CHANGE-ZHTA  NE SPACE.

*& 取得内表
    GT_CH[] = GT_CHANGE[].
    DESCRIBE TABLE GT_CHANGE LINES G_LINES.

    SORT GT_CH BY SFZHM."  NHBM.

    DELETE ADJACENT DUPLICATES FROM GT_CH COMPARING SFZHM.
    DESCRIBE TABLE GT_CH LINES L_LINES.

*&判定记录是否存在:
    IF G_LINES NE L_LINES.
      MESSAGE E012 WITH '身份证号码重复输入,请检查!'.
      CLEAR G_LINES.
      STOP.
    ENDIF.

*&---检查身份证位数是否正常:
    G_LINE = STRLEN( GT_CHANGE-SFZHM ).
    IF G_LINE <> 18." AND G_LINE <> 15.
      MESSAGE E012 WITH '请输入18位身份证号码!' GT_CHANGE-SFZHM.
    ENDIF.

  DATA: BEGIN OF LT_YTNAH OCCURS 0,
         NHBM LIKE YTNAH-NHBM,
        END OF LT_YTNAH.

 BREAK AD_CAIXIANG.
*&---输入状态值进行检查
  LOOP AT GT_CHANGE INTO WA_CHANGE.
   CLEAR: LT_YTNAH, LT_YTNAH[].
   IF WA_CHANGE-ZHTA NE 'A' AND WA_CHANGE-ZHTA NE 'B'.
    MESSAGE E006 WITH '请输入合适的状态,A代表正常,B代表不正常!'.
    LEAVE TO SCREEN 0100 .
   ENDIF.

  IF WA_CHANGE-ZHTA EQ 'B'.
*& 修改农户状态时,先要检查农户商品对应关系信息:
    SELECT NHBM
      INTO TABLE LT_YTNAH
      FROM YTNAM
     WHERE NHBM EQ WA_CHANGE-NHBM
       AND ZHTA EQ 'A'.

    IF SY-SUBRC EQ 0.
     MESSAGE E012 WITH '此农户正常商品对应关系信息记录存在,请检查!' WA_CHANGE-NHBM.
    ENDIF.
  ENDIF.
 ENDLOOP.

  ELSE.
    MESSAGE I013 WITH '请保持农户基本信息的完整!'.
    STOP.
  ENDIF.

ENDFORM.                    " FRM_CHECK_ZHTA

*&---------------------------------------------------------------------*
*&      Form  FRM_UNLOCK_YTNAh
*&---------------------------------------------------------------------*
*       *&对自建表ytanh进行解锁
*----------------------------------------------------------------------*
*      -->P_SY_MANDT  text
*----------------------------------------------------------------------*
FORM FRM_UNLOCK_YTNAH  USING    P_SY_MANDT.

*& -解锁表YTNAH
  CALL FUNCTION 'DEQUEUE_EYTNAH'
    EXPORTING
      MODE_YTNAH     = 'E'
      MANDT          = SY-MANDT
    EXCEPTIONS
      FOREIGN_LOCK   = 1
      SYSTEM_FAILURE = 2
      OTHERS         = 3.
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

ENDFORM.                    " FRM_UNLOCK_YTNAh

*&---------------------------------------------------------------------*
*&      Form  FRM_LOCK_YTNAH
*&---------------------------------------------------------------------*
*       *&对自建表ytanh进行锁定
*----------------------------------------------------------------------*
*      -->P_SY_MANDT  text
*----------------------------------------------------------------------*
FORM FRM_LOCK_YTNAH  USING    P_SY_MANDT.

*& -锁表YTNAH
  CALL FUNCTION 'ENQUEUE_EYTNAH'
    EXPORTING
      MODE_YTNAH     = 'E'
      MANDT          = SY-MANDT
    EXCEPTIONS
      FOREIGN_LOCK   = 1
      SYSTEM_FAILURE = 2
      OTHERS         = 3.
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

ENDFORM.                    " FRM_LOCK_YTNAH

*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
  SET PF-STATUS '0100'.
ENDMODULE.                 " STATUS_0100  OUTPUT

*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.

  CASE OK_CODE.
*& 删除
      WHEN'DELETE'.
      CLEAR OK_CODE.
      PERFORM FRM_DELETE_DATA.

*& 保存操作处理
    WHEN 'SAVE'.
      CLEAR OK_CODE.
      PERFORM FMR_CREA_DATA.

*& 返回,删除,退出处理
    WHEN 'BACK' OR 'CANC' OR 'EXIT'.
      CLEAR OK_CODE.
      CLEAR: GT_ITAB.
      REFRESH: GT_ITAB.
      PERFORM FRM_UNLOCK USING SY-MANDT.
      LEAVE TO SCREEN 0.

*& 全选处理
    WHEN 'ALL'.
      CLEAR OK_CODE.
      WA_TAB-SEL = 'X'.
      MODIFY GT_ITAB FROM WA_TAB TRANSPORTING SEL
                                  WHERE SEL = ' '.

*& 取消全选处理
    WHEN 'RSAL'.
      CLEAR OK_CODE.
      WA_TAB-SEL = ' '.
      MODIFY GT_ITAB FROM WA_TAB TRANSPORTING SEL
                                  WHERE SEL = 'X'.

    WHEN 'P-' OR 'P--'  OR 'P+' OR 'P++'.
      CLEAR OK_CODE.
      PERFORM FRM_TURN_PAGE_100.

    WHEN OTHERS.
      CLEAR OK_CODE.

  ENDCASE.
ENDMODULE.                 " USER_COMMAND_0100  INPUT

*&---------------------------------------------------------------------*
*&      Module  PAI_MODIFY_DATA_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE PAI_MODIFY_DATA_0100 INPUT.

*&---数据改变处理逻辑流
  DESCRIBE TABLE GT_ITAB LINES G_LINES.
  G_COUNT = SY-LOOPC.
  TC_ITEM-LINES = G_LINES + 1.
  CLEAR GT_ITAB.
ENDMODULE.                 " PAI_MODIFY_DATA_0100  INPUT

*&---------------------------------------------------------------------*
*&      Module  PAI_EXIT_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE PAI_EXIT_0100 INPUT.

  CASE OK_CODE.
    WHEN 'EXIT' OR 'CANC'.
      CLEAR OK_CODE.
      LEAVE TO SCREEN 0.

*&解锁数据表:
      PERFORM FRM_UNLOCK USING SY-MANDT.

  ENDCASE.
ENDMODULE.                 " PAI_EXIT_0100  INPUT

*&---------------------------------------------------------------------*
*&      Module  PAI_CHECK_DATA_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE PAI_CHECK_DATA_0100 INPUT.
  DATA L_NHBM LIKE YTNAH-NHBM.
  DATA WA_ITAB LIKE GT_ITAB.

  IF GT_ITAB-NHMC  NE SPACE
     AND  GT_ITAB-SFZHM NE SPACE
     AND  GT_ITAB-ZHTA  NE SPACE.

*&G1 身份证重复性检查
    SELECT SINGLE  NHBM INTO L_NHBM
            FROM YTNAH
            WHERE SFZHM EQ GT_ITAB-SFZHM.
    IF SY-SUBRC EQ 0.
      MESSAGE E014 WITH '此身份证:' GT_ITAB-SFZHM '已对应农户:' L_NHBM.
      LEAVE TO SCREEN 0100.
    ENDIF.

* BREAK AD_CAIXIANG.
*&G2 身份证长度检查
    G_LINE = STRLEN( GT_ITAB-SFZHM ).
    IF G_LINE <> 18." AND G_LINE <> 15.
      MESSAGE E012 WITH '请输入18位身份证号码!' GT_ITAB-SFZHM.
    ENDIF.

    CHECK SY-SUBRC <> 0.

*&G3 身份证号码重复性检查:
    READ TABLE GT_ITAB INTO WA_TAB1 WITH KEY SFZHM = GT_ITAB-SFZHM.
    IF SY-SUBRC = 0.
      MESSAGE E012 WITH '身份证号码重复输入,请检查输入的身份证号码!' GT_ITAB-SFZHM.
    ENDIF.

   IF GT_ITAB-ZHTA NE 'A' AND GT_ITAB-ZHTA NE 'B'.
        MESSAGE E006 WITH '请输入农户状态信息,A代表正常,B代表不正常!'.

        "LEAVE TO SCREEN 0100 .
   ENDIF.

    CHECK SY-SUBRC <> 0.

    COLLECT GT_ITAB.

  ELSE.
    MESSAGE I006 WITH ' 请输入完整的农户信息进行保存!!!'.

  ENDIF.


  CHECK GT_ITAB-SFZHM  NE SPACE.
ENDMODULE.                 " PAI_CHECK_DATA_0100  INPUT


*&---------------------------------------------------------------------*
*&      Module  INIT_LISTBOX_0100  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE INIT_LISTBOX_0100 OUTPUT.
  CLEAR VID.
  CLEAR VLIST.
  CLEAR WA_VALUE.
*&---下拉框设置
  MOVE 'GT_ITAB-ZHTA'  TO  VID.
  MOVE 'A'   TO   WA_VALUE-KEY.
  MOVE 'A' TO   WA_VALUE-TEXT.
  APPEND  WA_VALUE TO VLIST .

  MOVE 'GT_ITAB-ZHTA'  TO  VID.
  MOVE 'B'    TO   WA_VALUE-KEY.
  MOVE 'B' TO   WA_VALUE-TEXT.
  APPEND  WA_VALUE TO VLIST .

  CALL FUNCTION 'VRM_SET_VALUES'
    EXPORTING
      ID     = VID
      VALUES = VLIST.

ENDMODULE.                 " INIT_LISTBOX_0100  OUTPUT
**&---------------------------------------------------------------------*
**&      Module  INIT_LISTBOX_0100  OUTPUT
**&---------------------------------------------------------------------*
**       text
**----------------------------------------------------------------------*
*MODULE init_listbox_0100 OUTPUT.

*ENDMODULE.                 " INIT_LISTBOX_0100  OUTPUT

*&---------------------------------------------------------------------*
*&      Form  frm_delete_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_DELETE_DATA .

  CALL FUNCTION 'POPUP_TO_CONFIRM'
    EXPORTING
      TITLEBAR              = '确认'
      TEXT_QUESTION         = '要删除准备创建的农户信息吗?'
      TEXT_BUTTON_1         = ''
      TEXT_BUTTON_2         = ''
      DEFAULT_BUTTON        = '1'
      DISPLAY_CANCEL_BUTTON = ' '
      START_COLUMN          = 25
      START_ROW             = 6
      POPUP_TYPE            = 'ICON_MESSAGE_WARNING'
    IMPORTING
      ANSWER                = G_ANSWER
    EXCEPTIONS
      TEXT_NOT_FOUND        = 1
      OTHERS                = 2.
*& 维护时候农户信息的删除操作:
  CHECK G_ANSWER EQ  '1'.

 LOOP AT GT_ITAB INTO WA_TAB WHERE SEL = 'X'.

*& 删除内表数据:
    DELETE GT_ITAB WHERE "NHBM EQ WA_TAB-NHBM
                         SFZHM EQ WA_TAB-SFZHM
                     AND NHMC EQ WA_TAB-NHMC.
    IF SY-SUBRC EQ 0.
      MESSAGE S011 WITH '成功删除记录!'.
    ELSE.
      MESSAGE S011 WITH '删除记录失败!'.
    ENDIF.

  ENDLOOP.

*  stop.
  LEAVE TO SCREEN 0100.

ENDFORM.                    " frm_delete_data

*&---------------------------------------------------------------------*
*&      Form  FMR_CREA_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FMR_CREA_DATA .
  DATA: L_NUMBER(8).
  DATA :BEGIN OF LT_YTNAH OCCURS 0.
          INCLUDE STRUCTURE YTNAH.
  DATA: END OF LT_YTNAH.

  CLEAR: G_ANSWER.
  CALL FUNCTION 'POPUP_TO_CONFIRM'
    EXPORTING
      TITLEBAR              = '确认'
      TEXT_QUESTION         = '需要进行农户信息保存吗?'
      TEXT_BUTTON_1         = ''
      TEXT_BUTTON_2         = ''
      DEFAULT_BUTTON        = '1'
      DISPLAY_CANCEL_BUTTON = ' '
      START_COLUMN          = 25
      START_ROW             = 6
      POPUP_TYPE            = 'ICON_MESSAGE_WARNING'
    IMPORTING
      ANSWER                = G_ANSWER
    EXCEPTIONS
      TEXT_NOT_FOUND        = 1
      OTHERS                = 2.
  CHECK G_ANSWER EQ  '1'.

*&准备数据:
  LOOP AT GT_ITAB WHERE NHBM EQ SPACE OR NHBM EQ ' ' .

    CLEAR L_NUMBER.
*& 生成农户编码流水号:
    PERFORM FRM_NHBM_NO CHANGING L_NUMBER.
    MOVE: L_NUMBER TO GT_ITAB-NHBM,
          SY-MANDT TO GT_ITAB-MANDT.
    MOVE: SY-UZEIT TO GT_ITAB-CPUTM,
          SY-DATUM TO GT_ITAB-AEDAT,
          SY-UNAME TO GT_ITAB-USNAM.
    MOVE GT_ITAB TO LT_YTNAH.
    MODIFY GT_ITAB .
    APPEND LT_YTNAH.
    CLEAR GT_ITAB.

  ENDLOOP.

  MODIFY YTNAH FROM TABLE LT_YTNAH.

  IF SY-SUBRC EQ 0.
    COMMIT WORK.
    MESSAGE S012 WITH '成功更新记录:' G_LINES.
    LEAVE TO SCREEN 100.
  ELSE.
    ROLLBACK WORK.
    MESSAGE I011 WITH '更新失败!'.
    PERFORM FRM_UNLOCK USING  SY-MANDT.
    LEAVE TO SCREEN 0.
  ENDIF.

ENDFORM.                    " FMR_CREA_DATA

*&---------------------------------------------------------------------*
*&      Form  FRM_NAHU_NO
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_NHBM_NO  CHANGING H_NUMBER.

*&---获取农户编码流水号
  DATA: L_NUMBER(5).

  CALL FUNCTION 'NUMBER_GET_NEXT'
    EXPORTING
      NR_RANGE_NR             = '01'
      OBJECT                  = 'YH_MM_03'
    IMPORTING
      NUMBER                  = L_NUMBER
    EXCEPTIONS
      INTERVAL_NOT_FOUND      = 01
      NUMBER_RANGE_NOT_INTERN = 02
      OBJECT_NOT_FOUND        = 03
      QUANTITY_IS_0           = 04.

  IF SY-SUBRC NE 0.
    MESSAGE I011 WITH '产生对账流水吗失败!'.
    EXIT.
  ELSE.
    CONCATENATE S_NHSIG+3(3) L_NUMBER INTO H_NUMBER.
  ENDIF.

ENDFORM.                    " FRM_NAHU_NO

*&---------------------------------------------------------------------*
*&      Form  FRM_turn_page_300
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_TURN_PAGE_100 .

  CALL FUNCTION 'FI_CUST_SCROLL'
    EXPORTING
      I_INPUT = '1'
      I_LNFIR = TC_ITEM-TOP_LINE
      I_LNMAX = G_LINES
      I_LOOPC = G_COUNT
      I_OKCOD = SY-UCOMM
    IMPORTING
      E_LNFIR = TC_ITEM-TOP_LINE
    EXCEPTIONS
      OTHERS  = 1.

ENDFORM.                    " FRM_turn_page_300

*&---------------------------------------------------------------------*
*&      Form  FRM_UNLOCK
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_SY_MANDT  text
*----------------------------------------------------------------------*
FORM FRM_UNLOCK  USING H_MANDT.

  CALL FUNCTION 'DEQUEUE_EYTNAH'
    EXPORTING
      MODE_YTNAH     = 'E'
      MANDT          = H_MANDT
    EXCEPTIONS
      FOREIGN_LOCK   = 1
      SYSTEM_FAILURE = 2
      OTHERS         = 3.
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

ENDFORM.                    " FRM_UNLOCK

*&---------------------------------------------------------------------*
*&      Form  FRM_CHECK_YTNAM
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_CHECK_YTNAM .

  DATA: BEGIN OF LT_YTNAM OCCURS 0,
        NHBM LIKE YTNAM-NHBM,
        END OF LT_YTNAM.

*& 删除数据时,需要检查要删除的数据在YTNAM表里面是否有条目:有的话,不允许删除:
 LOOP AT GT_CHANGE WHERE ZSEL <> SPACE.
    SELECT NHBM
           INTO TABLE LT_YTNAM
           FROM YTNAM
           WHERE NHBM = GT_CHANGE-NHBM.

   IF SY-SUBRC EQ 0.
     MESSAGE I012 WITH '此农户的商品对应关系信息已经存在,请检查!' GT_CHANGE-NHBM.
    " STOP.
   ENDIF.

ENDLOOP.

ENDFORM.                    " FRM_CHECK_YTNAM

 

posted @ 2016-11-23 15:57  Rainystuday  阅读(309)  评论(0编辑  收藏  举报