トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS

ABAP/INSERT の変更点

Top/ABAP/INSERT

[[データベーステーブル>SAPのオブジェクト/テーブル]]に対し、レコードを追加する命令。

----
#contents
----


* 概要 [#j4d77dd6]
[[標準テーブル>SAPのオブジェクト/標準テーブル]]に対しては、[[BAPI>SAPのオブジェクト/BAPI]]や[[バッチインプット>SAPの拡張手段/バッチインプット]]で行われるし、何より行ってはならないため、主に[[アドオンテーブル>SAPのオブジェクト/アドオンテーブル]]に対する操作として用いられる。

** 用法 [#m1e61e8f]
とにかく挿入。
内部テーブルに対しては[[APPEND>ABAP/APPEND]]を使い、実テーブルに対してはこちらを使う。

サンプルに出てくるが、構造を使うパターンと内部テーブルを使うパターンがある。

** サンプル [#p8e30ede]
*** 基本形式 [#o56d4e18]
 INSERT INTO テーブル名 VALUES 構造

一件一件処理する場合は、こちら。

 INSERT テーブル名 FROM 内部テーブル

恐らく多いであろう一括処理をするならば、こちら。

*** 動的テーブル指定 [#x39af412]
 INSERT (L_TABNAME) 

似たような[[アドオンテーブル>SAPのオブジェクト/アドオンテーブル]]があり、登録先を切り分ける場合などに使用する。

・・・が、[[アドオンテーブル>SAPのオブジェクト/アドオンテーブル]]名からオブジェクト検索で出てこないなどの弊害があるので、余程のことがない限り実テーブル名を指定した方が無難。
切り分けなければならない程にアドオンテーブル数があるとしたら、はっきりいって設計がクソなのだと思う。

*** ACCEPTING DUPLICATE KEY [#j4455e22]
 ACCEPTING DUPLICATE KEY

[[内部テーブル>ABAP/内部テーブル]]を使用した一括処理で、一件でも登録済みデータがあるとショートダンプが発生してしまうため、よく指定される。

そうならないために事前の存在チェックを行ったりしたりすることもあるが、一括挿入してみて登録済みデータがある場合はロールバックを発行するか、いっそのこと洗い替えしてしまうか、設計次第。

中途半端に更新されても困る!というケースもあれば、少しのエラーのために多くを巻き添えにされても困る!という話もあるし。

* CLIENT SPECIFIED [#r4b57d6a]
*** CLIENT SPECIFIED [#r4b57d6a]
 CLIENT SPECIFIED

[[Open SQL>ABAP/SQL]]にはクライアント処理というものがあり、クライアント依存テーブルにある項目のMANDTには態々値を指定しなくとも実行クライアントの値を自動的にセットするという動きがあるが、これをすっとばす。
対象データで指定したクライアント番号を使って挿入処理がなされ、他のクライアントのデータを追加する場合に使用する。

使用頻度は高くないが、INSERTだけでなく[[SELECT>ABAP/SELECT]]にもあるし、覚えておいて損はない命令。

* その他 [#lb3435f1]
すべてのデータで挿入処理が成功した場合はSY-SUBRCに0、一件でも失敗した場合には4がセットされ、またSY=DBCNTに挿入した件数が格納される。

なお、この命令を発行してから[[COMMIT WORK>ABAP/COMMIT WORK]]または[[ROLLBACK WORK>ABAP/ROLLBACK WORK]]が発行されるまでデータベースがロックされる。逆に言えばコミットやロールバックの発行で初めてロックが解除されるため、正しく使用しなければ[[デッドロック>ABAP/デッドロック]]の原因となる。

~
~
CENTER:【スポンサードリンク】
#htmlinsert(amazon_book_sap_system_implement)
~
~
----
#pcomment(reply)