SAP ABAP简易酒店入退押金系统

*&---------------------------------------------------------*
*& Report ZYOUKIN
*&---------------------------------------------------------*
*&
*&---------------------------------------------------------*
REPORT ZYOUKIN.

TYPES:
  TY_YOUKIN   TYPE ZYOUKIN,
  TY_T_YOUKIN TYPE STANDARD TABLE OF TY_YOUKIN,

  TY_GINKOU   TYPE ZGINKOU,
  TY_T_GINKOU TYPE STANDARD TABLE OF TY_GINKOU.

DATA:
  GT_YOUKIN TYPE TY_T_YOUKIN,
  GT_GINKOU TYPE TY_T_GINKOU.

*&---------------------------------------------------------*
*&  選択画面
*&---------------------------------------------------------*
* チェックイン情報
SELECTION-SCREEN BEGIN OF BLOCK BLK1 WITH FRAME TITLE TEXT-003.
  PARAMETERS:
    P_ID    TYPE ZYOUKIN-ID   ,                             "IDカード
    P_NAME  TYPE ZYOUKIN-NAME ,                             "名前
    P_PHONE TYPE ZYOUKIN-PHONE,                             "電話番号
    P_NUMB  TYPE ZYOUKIN-NUMB .                             "部屋番号
SELECTION-SCREEN END OF BLOCK BLK1.

* 入金
SELECTION-SCREEN BEGIN OF LINE.
  PARAMETERS P_BUT1 RADIOBUTTON GROUP G1
    USER-COMMAND UCOM1 DEFAULT 'X'.
  SELECTION-SCREEN COMMENT 3(8) TEXT-001 FOR FIELD P_BUT1.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF BLOCK BLK2 WITH FRAME.
  PARAMETERS P_MONEY TYPE ZYOUKIN-MONEY.                    "入金金額
SELECTION-SCREEN END OF BLOCK BLK2.

* 返金
SELECTION-SCREEN BEGIN OF LINE.
  PARAMETERS P_BUT2 RADIOBUTTON GROUP G1.
  SELECTION-SCREEN COMMENT 3(8) TEXT-002 FOR FIELD P_BUT2.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF BLOCK BLK3 WITH FRAME.
  PARAMETERS P_BUT3  RADIOBUTTON GROUP G2                   "全額返金
    USER-COMMAND UCOM2 DEFAULT 'X'.
  PARAMETERS P_BUT4  RADIOBUTTON GROUP G2.                  "非全額返金
  PARAMETERS P_MON_K TYPE ZYOUKIN-MONEY_K.                  "引落金額
SELECTION-SCREEN END OF BLOCK BLK3.

*&---------------------------------------------------------*
*&  画面制御
*&---------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.
  LOOP AT SCREEN.

    IF SCREEN-NAME = 'P_ID'                                 "IDカード
    OR SCREEN-NAME = 'P_NAME'                               "名前
    OR SCREEN-NAME = 'P_PHONE'                              "電話番号
    OR SCREEN-NAME = 'P_NUMB'.                              "部屋番号
        SCREEN-REQUIRED = 2.                                "必須入力
        MODIFY SCREEN.
    ENDIF.

*   返金の場合
    IF P_BUT2 = 'X'.
      IF SCREEN-NAME = 'P_ID'                               "IDカード
      OR SCREEN-NAME = 'P_NAME'                             "名前
      OR SCREEN-NAME = 'P_PHONE'.                           "電話番号
        SCREEN-INPUT = 0.                                   "入力禁止
        SCREEN-REQUIRED = 0.                                "必須入力
        MODIFY SCREEN.
      ENDIF.
    ENDIF.

*   全額返金の場合
    IF P_BUT3 = 'X'.
      IF SCREEN-NAME = 'P_MON_K'.                           "引落金額
        SCREEN-INPUT = 0.                                   "入力禁止
        MODIFY SCREEN.
      ENDIF.
    ENDIF.

*   入金の場合
    IF P_BUT1 = 'X'.
      IF SCREEN-NAME = 'P_MONEY'.                           "入金金額
        SCREEN-REQUIRED = 2.                                "必須入力
        MODIFY SCREEN.
      ENDIF.
      IF SCREEN-NAME = 'P_BUT3'                             "全額返金
      OR SCREEN-NAME = 'P_BUT4'.                            "非全額返金
        SCREEN-INPUT = 0.                                   "入力禁止
        MODIFY SCREEN.
      ENDIF.

*   返金の場合
    ELSE.
      IF SCREEN-NAME = 'P_MONEY'.                           "入金金額
        SCREEN-INPUT = 0.                                   "入力禁止
        MODIFY SCREEN.
      ENDIF.

*     非全額返金の場合
      IF P_BUT4 = 'X'.
        IF SCREEN-NAME = 'P_MON_K'.                         "引落金額
          SCREEN-REQUIRED = 2.                              "必須入力
          MODIFY SCREEN.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDLOOP.

*&---------------------------------------------------------*
*&  画面チェック
*&---------------------------------------------------------*
AT SELECTION-SCREEN.
  IF P_ID    = SPACE
  OR P_NAME  = SPACE
  OR P_PHONE = SPACE
  OR P_NUMB  = SPACE.
    MESSAGE TEXT-004 TYPE 'S' DISPLAY LIKE 'E'.
    LEAVE SCREEN.
  ENDIF.

  IF  P_BUT1  <> SPACE
  AND P_ID    <> SPACE
  AND P_NAME  <> SPACE
  AND P_PHONE <> SPACE
  AND P_NUMB  <> SPACE
  AND P_MONEY  = SPACE.
    MESSAGE TEXT-005 TYPE 'S' DISPLAY LIKE 'E'.
    LEAVE SCREEN.
  ENDIF.

  IF  P_BUT2 <> SPACE
  AND P_BUT4 <> SPACE
  AND P_MON_K = SPACE.
    MESSAGE TEXT-006 TYPE 'S' DISPLAY LIKE 'E'.
    LEAVE SCREEN.
  ENDIF.

*&---------------------------------------------------------*
*&  主処理
*&---------------------------------------------------------*
START-OF-SELECTION.

  PERFORM F_MAIN.
*&---------------------------------------------------------------------*
*& Form F_MAIN
*&---------------------------------------------------------------------*
*& 主処理
*&---------------------------------------------------------------------*
FORM F_MAIN .

*  PERFORM F_DATA_SELECT.
*  PERFORM F_DATA_EDIT.

 DATA:
   LS_YOUKIN TYPE TY_YOUKIN,
   LS_GINKOU TYPE TY_GINKOU,

   L_FLAG TYPE CHAR1.

* 入金の場合
  IF P_BUT1 = 'X'.

*   銀行情報の取得
    SELECT *
      FROM ZGINKOU
     WHERE ID    = @P_ID
       AND NAME  = @P_NAME
       AND PHONE = @P_PHONE
      INTO TABLE @GT_GINKOU[].

    SORT GT_GINKOU[] BY RYUSUI DESCENDING.

    READ TABLE GT_GINKOU[] INTO LS_GINKOU WITH KEY ID = P_ID.

    IF LS_GINKOU-MONEY < P_MONEY.
*     銀行カードには残高が足りないです。
      MESSAGE TEXT-007 TYPE 'S' DISPLAY LIKE 'E'.
      LEAVE LIST-PROCESSING.
    ELSE.
      LS_GINKOU-RYUSUI  = LS_GINKOU-RYUSUI + 1.
      LS_GINKOU-MONEY   = LS_GINKOU-MONEY  - P_MONEY.
      LS_GINKOU-FLAG    = '-'.
      LS_GINKOU-MONEY_L = P_MONEY.
      INSERT ZGINKOU FROM LS_GINKOU.

      IF SY-SUBRC = 0.

      ELSE.
        ROLLBACK WORK.
*       銀行情報を更新することが失敗しました。
        MESSAGE TEXT-008 TYPE 'S' DISPLAY LIKE 'E'.
        LEAVE LIST-PROCESSING.
      ENDIF.

      LS_YOUKIN-ID       = P_ID.
      LS_YOUKIN-NAME     = P_NAME.
      LS_YOUKIN-PHONE    = P_PHONE.
      LS_YOUKIN-NUMB     = P_NUMB.
      LS_YOUKIN-DATE_IN  = SY-DATUM.
      LS_YOUKIN-DATE_OUT = SPACE.
      LS_YOUKIN-MONEY    = P_MONEY.
      LS_YOUKIN-MONEY_K  = 0.
      LS_YOUKIN-WAERS    = LS_GINKOU-WAERS.
      LS_YOUKIN-CARD     = LS_GINKOU-CARD.
      LS_YOUKIN-FLAG_IN  = 'X'.
      LS_YOUKIN-FLAG_OUT = SPACE.
      INSERT ZYOUKIN FROM LS_YOUKIN.

      IF SY-SUBRC = 0.
        COMMIT WORK.
      ELSE.
        ROLLBACK WORK.
*       チェックイン情報を登録することが失敗しました。
        MESSAGE TEXT-009 TYPE 'S' DISPLAY LIKE 'E'.
        LEAVE LIST-PROCESSING.
      ENDIF.
    ENDIF.

    MESSAGE TEXT-012 TYPE 'S'.

*   返金の場合
  ELSE.
*   チェックイン情報の取得
    SELECT *
      FROM ZYOUKIN
     WHERE ID    = @P_ID
       AND NAME  = @P_NAME
       AND PHONE = @P_PHONE
       AND NUMB  = @P_NUMB
      INTO TABLE @GT_YOUKIN[].

*   チェックイン情報が存在する場合
    IF SY-SUBRC = 0.
      SORT GT_YOUKIN[] BY DATE_IN DESCENDING.
      READ TABLE GT_YOUKIN[] INTO LS_YOUKIN WITH KEY ID = P_ID.

      IF LS_YOUKIN-DATE_OUT IS INITIAL.
        L_FLAG = SPACE.
      ENDIF.

*   チェックイン情報が存在しない場合
    ELSE.
      L_FLAG = 'X'.
    ENDIF.

*   銀行情報の取得
    SELECT *
      FROM ZGINKOU
     WHERE ID    = @P_ID
       AND NAME  = @P_NAME
       AND PHONE = @P_PHONE
      INTO TABLE @GT_GINKOU[].

    SORT GT_GINKOU[] BY RYUSUI DESCENDING.

    READ TABLE GT_GINKOU[] INTO LS_GINKOU WITH KEY ID = P_ID.

    LS_GINKOU-RYUSUI  = LS_GINKOU-RYUSUI + 1.
    LS_GINKOU-FLAG    = '+'.
    IF P_BUT3 = 'X'.
       LS_GINKOU-MONEY_L = LS_YOUKIN-MONEY.
    ELSE.
       LS_GINKOU-MONEY_L = LS_YOUKIN-MONEY - P_MON_K.
    ENDIF.
    LS_GINKOU-MONEY   = LS_GINKOU-MONEY + LS_GINKOU-MONEY_L.
    INSERT ZGINKOU FROM LS_GINKOU.

    IF SY-SUBRC = 0.

    ELSE.
      ROLLBACK WORK.
*     銀行情報を更新することが失敗しました。
      MESSAGE TEXT-008 TYPE 'S' DISPLAY LIKE 'E'.
      LEAVE LIST-PROCESSING.
    ENDIF.

    IF L_FLAG = SPACE.
      LS_YOUKIN-ID       = P_ID.
      LS_YOUKIN-NAME     = P_NAME.
      LS_YOUKIN-PHONE    = P_PHONE.
      LS_YOUKIN-NUMB     = P_NUMB.
      LS_YOUKIN-DATE_IN  = LS_YOUKIN-DATE_IN.
      LS_YOUKIN-DATE_OUT = SY-DATUM.
      LS_YOUKIN-MONEY    = LS_YOUKIN-MONEY.
      IF P_BUT3 = 'X'.
        LS_YOUKIN-MONEY_K  = LS_YOUKIN-MONEY.
      ELSE.
        LS_YOUKIN-MONEY_K  = LS_YOUKIN-MONEY - P_MON_K.
      ENDIF.
      LS_YOUKIN-WAERS    = LS_GINKOU-WAERS.
      LS_YOUKIN-CARD     = LS_GINKOU-CARD.
*     LS_YOUKIN-FLAG_IN  = 'X'.
      LS_YOUKIN-FLAG_OUT = 'X'.
      UPDATE ZYOUKIN FROM LS_YOUKIN.

      IF SY-SUBRC = 0.
        COMMIT WORK.
      ELSE.
        ROLLBACK WORK.
*       チェックイン情報を更新することが失敗しました。
        MESSAGE TEXT-009 TYPE 'S' DISPLAY LIKE 'E'.
        LEAVE LIST-PROCESSING.
      ENDIF.

    ELSE.
*     チェックイン情報は存在しません。
      MESSAGE TEXT-011 TYPE 'S' DISPLAY LIKE 'E'.
      LEAVE LIST-PROCESSING.
    ENDIF.

    MESSAGE TEXT-013 TYPE 'S'.
  ENDIF.
ENDFORM.


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值