（初）第二弾　ABAPー言語

:writing_hand_tone1:[第一弾](https://qiita.com/luyu1567/items/03583bb450a65a7dcc1a)
:writing_hand_tone1:[SAP 訓練目次](https://qiita.com/items/dd1fdf83a42f90a78c6e)
#1.実例ニーズ

- 学生登録画面

番号[     ]  名前[　　　　]
性別　○男性　●女性
生年月日[2019/02/17]
住所[                    ]
連絡情報[                ]
※実行[F8]を押下すると結果

- 学生検索ヘルプ画面
表示項目
番号　名前　性別　生年月日

※新規登録と移送依頼
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185058/176a65eb-2cae-ece0-abdc-77fc91f39bab.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/185058/1981a62c-4044-ba53-e169-530d250068e8.png)


#2. イベント

- AT SELECTION-SCREEN.
- SELECTION-SCREEN OUT.
- START-OF-SELECTION.
- END-OF-SELECTION.

#3. ロジック

- 条件分析
IF < 条件1>.
  < 命令ブロック>
ELSEIF < 条件2>
  < 命令ブロック>.
ELSEIF < 条件3>.
  < 命令ブロック>
.....
ELSE.
  < 命令ブロック>
ENDIF.

- CASE 制御構造

CASE <f>.
  WHEN <f11> [OR <f12> OR ...].
       < 命令ブロック>
  WHEN <f21>.[OR <f22> OR ...]
       < 命令ブロック>
  WHEN <f31> [OR <f32> OR ...].
       < 命令ブロック>
   WHEN ...
  ......
  WHEN OTHERS.
       < 命令ブロック>
ENDCASE.

- ループ
　DO 命令を使用した無条件ループ

```ruby:ABAP
  DO 2 TIMES.
    WRITE / SY-INDEX.
  ENDDO.
```

　WHILE 命令を使用した条件ループ

```ruby:ABAP

  DATA:ldf_index TYPE int1.

  WHILE ldf_index < 10.
    ldf_index = ldf_index + 1.
  ENDWHILE.
```

　LOOP 命令を使用した、内部テーブルおよび抽出データセットに対するループ

```ruby:ABAP
  DATA:
      LDT_ZSTUD TYPE TABLE OF ZSTUDENT001,
      LDS_ZSTUD LIKE LINE OF LDT_ZSTUD.
  
  LOOP AT ZSTUDENT001 INTO LDS_ZSTUD.
    WRITE / LDS_ZSTUD-ZNM001.
  ENDLOOP.
```

#4. 宣言

- CONSTANTS:
- TYPES:
- DATA: 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185058/7d15cba9-2051-6f06-59cf-fd3865cc50d6.png)

- SELECT-OPTIONS:
- PARAMETERS:


#5. 内部テーブル＆構造

![image.png](https://qiita-image-store.s3.amazonaws.com/0/185058/50c50c24-39b8-6f34-83e7-71c4e3d98459.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/185058/3ad73621-d301-a9ac-55e8-a51f7334090f.png)


##OPEN SQL
###１．データ読込 
![h-00100100000_SELECT.gif](https://qiita-image-store.s3.amazonaws.com/0/185058/04ae82b2-5327-dfb9-5b34-5b212fed1b28.gif)

```ruby:ABAP

REPORT Z_SEL001.

DATA wa TYPE ZSTUDENT.

SELECT  *
  INTO  CORRESPONDING FIELDS OF wa
  FROM  ZSTUDENT
  WHERE ZNO001 EQ 'LH'.

  WRITE: / sy-dbcnt,
           wa-zno001, wa-znm001, wa-zsex001, wa-ZADDRESS001.

ENDSELECT.
```
###２．INSERT

```ruby:ABAP
DATA: itab TYPE HASHED TABLE OF ZSTUDENT001
                WITH UNIQUE KEY zno001,
      wa LIKE LINE OF itab.

wa-zno001 = '100'. 
wa-znm001 = '田中太郎'. 

INSERT wa INTO TABLE itab.

wa-zno001 = '101'. 
wa-znm001 = '井上花子'. 

INSERT wa INTO TABLE itab.


INSERT ZSTUDENT001 FROM TABLE itab ACCEPTING DUPLICATE KEYS.

IF sy-subrc = 0.
  ...
ELSEIF sy-subrc = 4.
  ...
ENDIF.
```

###３．UPDATE

```ruby:ABAP
UPDATE ZSTUDENT001 SET znm001 = '田中太郎１'
               WHERE zno001 = '100'.
```

###４．DELETE

```ruby:ABAP
DELETE FROM ZSTUDENT001 WHERE zno001 = '100'.
```

###５．データの整合性

[詳細](https://help.sap.com/doc/saphelp_nw70/7.0.12/ja-JP/41/7af4b6a79e11d1950f0000e82de14a/content.htm?no_cache=true)

#ABAPサンプル

```ruby:ABAP
*&---------------------------------------------------------------------*
*& Report  Z_STUD_001
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  Z_STUD_001.

DATA:
      GDW_ZSTUD TYPE ZSTUDENT001.

CONSTANTS:
  CNS_ON_FLG TYPE FLAG VALUE 'X',
  CNS_MAN    TYPE CHAR1 VALUE 'M',
  CNS_WOMAN  TYPE CHAR1 VALUE 'F'.

PARAMETERS:
  P_ZNO TYPE ZSTUDENT001-ZNO001 OBLIGATORY,
  P_ZNM TYPE ZSTUDENT001-ZNM001,
  P_ZSEX_F RADIOBUTTON GROUP GR1 DEFAULT 'X' USER-COMMAND COMMAND,
  P_ZSEX_M RADIOBUTTON GROUP GR1,
  P_ZCLASS TYPE ZSTUDENT001-ZCLASS001 NO-DISPLAY,
  P_ZBIRTH TYPE ZSTUDENT001-ZBIRTHDAY_DT001,
  P_ZADDR TYPE ZSTUDENT001-ZADDRESS001,
  P_ZCONT TYPE ZSTUDENT001-ZCONTACT001.

***********************************************************************
* 初期化
***********************************************************************
INITIALIZATION.


***********************************************************************
* 入力チェック
***********************************************************************
AT SELECTION-SCREEN.

***********************************************************************
* 実行（Ｆ８）
***********************************************************************
START-OF-SELECTION.


  PERFORM F_INPUT.

  PERFORM F_INSERT.


  WRITE  / GDW_ZSTUD.
***********************************************************************
* 終了
***********************************************************************
END-OF-SELECTION.
*&---------------------------------------------------------------------*
*&      Form  F_INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM F_INPUT .
  IF P_ZSEX_F = CNS_ON_FLG.
    GDW_ZSTUD-ZSEX001 = CNS_WOMAN.
  ELSE.
    GDW_ZSTUD-ZSEX001 = CNS_MAN.
  ENDIF.

  GDW_ZSTUD-ZNO001 = P_ZNO.
  GDW_ZSTUD-ZNO001 = P_ZNO.
  GDW_ZSTUD-ZNM001 = P_ZNM.
  GDW_ZSTUD-ZBIRTHDAY_DT001 = P_ZBIRTH.
  GDW_ZSTUD-ZADDRESS001 = P_ZADDR.
  GDW_ZSTUD-ZCONTACT001 = P_ZCONT.
  GDW_ZSTUD-ZCREATE_DT001 = SY-DATUM.
  GDW_ZSTUD-ZCREATER001 = SY-UNAME.
  GDW_ZSTUD-ZUPDATE_DT001 = SY-DATUM.
  GDW_ZSTUD-ZUPDATER001 = SY-UNAME.
ENDFORM.                    " F_INPUT
*&---------------------------------------------------------------------*
*&      Form  F_INSERT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM F_INSERT .

  INSERT INTO ZSTUDENT001 VALUES GDW_ZSTUD.

ENDFORM.                    " F_INSERT
```
:writing_hand_tone1:[第三弾](https://qiita.com/luyu1567/items/df2c17dc02300757d646)
:writing_hand_tone1:[SAP 訓練目次](https://qiita.com/items/dd1fdf83a42f90a78c6e)