ABAP④ SQL

・SELECT操作

REPORT プログラム名.
  DATA:
    *内部テーブル(テーブル型変数)
    MyTable LIKE TABLE OF SCARR,
    *作業領域(行型変数)
    MyRow LIKE SCARR.  

  *テーブル[SCARR]のSELECT結果を内部テーブルへ格納。
  SELECT *
  INTO TABLE MyTable
  FROM SCARR.
  *内部テーブル全件LOOP(作業領域へレコード情報をコピー)
  LOOP AT MyTable INTO MyRow
    WRITE:/ MyRow-フィールド名1, MyRow-フィールド名2.
  ENDLOOP.
  ※VB.NET的書き方
  For Each MyRow In MyTable
    Debug.Print( MyRow.Item(“フィールド名1”) & “,” & MyRow.Item(“フィールド名2”) )
  Next MyRow

・INSERT操作

  DATA:
   MyRow LIKE SCARR,         *行型変数
   MyCol_Fld1 LIKE SCARR-フィールド1,   *列型変数
   MyCol_Fld2 LIKE SCARR-フィールド2.   *列型変数
  *列の値設定
  MyCol_Fld1 = ‘aa’.
  MyCol_Fld2 = ‘bb’.
  *行の値設定(行←列)
  MyRow-フィールド1 = MyCol_Fld1.
  MyRow-フィールド2 = MyCol_Fld2.
  *テーブルにInsert(テーブル←行)
  INSERT INTO SCARR VALUES MyRow.
  IF SY-SUBRC = 0.
   MESSAGE ID ‘SABAPDCU’ TYPE ‘S’ NUMBER 888 WITH ‘INSERT成功’.
  ELSE.
   MESSAGE ID ‘SABAPDCU’ TYPE ‘E’ NUMBER 888 WITH ‘INSERT失敗’.
  ENDIF

・UPDATE操作

  UPDATE SCARR
  SET フィールド2 = ‘~’
  WHERE フィールド1 = ‘~’.
または
  DATA:
   MyRow LIKE SCARR,         *行型変数
   MyCol_Fld1 LIKE SCARR-フィールド1,   *列型変数
   MyCol_Fld2 LIKE SCARR-フィールド2.   *列型変数
  MyCol_Fld1 = ‘aa’.
  MyCol_Fld2 = ‘bb’.
  MyRow-フィールド1 = MyCol_Fld1.
  MyRow-フィールド2 = MyCol_Fld2.
  UPDATE SCARR FROM MyRow.
  ※変更前後でキー値は同じでなければならない。

・DELETE操作

  DELETE FROM SCARR
  WHERE フィールド1 = ‘~’.
または
  DATA:
   MyRow LIKE SCARR,         *行型変数
   MyCol_Fld1 LIKE SCARR-フィールド1,   *列型変数
   MyCol_Fld2 LIKE SCARR-フィールド2.   *列型変数
  MyCol_Fld1 = ‘aa’.
  MyCol_Fld2 = ‘bb’.
  MyRow-フィールド1 = MyCol_Fld1.
  MyRow-フィールド2 = MyCol_Fld2.
  DELETE SCARR FROM MyRow.

・上位n件取得

  SELECT *
  FROM SCARR
  INTO TABLE MyTable
  UP TO 100 ROWS

・上位1件取得

  SELECT SINGLE *
  FROM SCARR
  INTO TABLE MyTable
  ※データが必ずある事が分かっている場合にはSINGLEの方が早い。
   分からない時は「UP TO 1 ROW」を用いる。

・内部テーブル(テーブル型変数)

  TYPES:
    BEGIN OF TypeId,
      Name TYPE String,
      Old TYPE I,
      Tel TYPE String,
    END OF TypeId.
  DATA MyTable TYPE STANDARD TABLE OF TypeId.
  DATA MyRow  TYPE TypeId.
  *テーブル型、行型、列型はLIKEを用いる(実在のDBの構造を用いる場合)
  DATA myTable  LIKE TABLE OF テーブル名
  DATA myRow   LIKE テーブル名
  DATA myCol   LIKE テーブル名-フィールド名

・内部テーブルのSORT

  SORT MyTable ASCENDING By フィールド名1 フィールド名2.
  SORT MyTable DESCENDING By フィールド名1 フィールド名2.

・FOR ALL ENTRIES IN(≒JOIN)

  *内部テーブル(MyType)をキーとしてSCARRをSELECTする。
  *ABAPではJOINは遅いらしい。
  SELECT *
  FROM SCARR
  INTO TABLE MyTable
  FOR ALL ENTRIES IN MyType

・選択テーブル

    BEGIN OF LineType,
      ’I’:Inclusive
      ’E’;Exclusive
      SIGN(1)  TYPE C,
      ※「HIGH」未指定の時に指定
      ’EQ’:Equal
      ’NE’:NotEqual
      ’GT’:GreaterThan
      ’LE’:LessEqual
      ’LT’:LessThan
      ’CP’:パターンが含まれる
      ’NP’:パターンが含まれない
      OPTION(2) TYPE C,
      LOW    TYPE ~ / LIKE ~,
      HIGH    TYPE ~ / LIKE ~,
    END OF LineType.

  DATA MyRange TYPE RANGE OF テーブル名-フィールド1.
  DATA MyLine LIKE LINE OF MyRange.
  MyLine-SIGN = ‘I’.
  MyLine-OPTION = ‘EQ’.
  MyLine-LOW = ‘AAA’.
  APPEND MyLine TO MyRange.

  SELECT *
  FROM SCARR
  INTO TABLE MyTable
  WHERE CATEGORY IN MyRange.