BDC書き方
BDC書き方について、大体二つがあります。前提条件としては外部からデータを内部テーブルに読み込むこと。
一、
①
OPEN_GROUP処理を行う
②
テーブルBDCTABにデータを書き込む
③
INSERT処理を行う
④
CLOSE GROUP処理を行う
例:前処理でテーブルTD_IN_ZC30へデータを書き込んで、チェックした。
*- OPEN_GROUP処理を行う
PERFORM FRM_BDC_OPEN_GROUP.
*&---------------------------------------------------------------------*
* OPEN_GROUP処理
*----------------------------------------------------------------------*
* なし
*----------------------------------------------------------------------*
FORM FRM_BDC_OPEN_GROUP .
CALL FUNCTION 'BDC_OPEN_GROUP'
EXPORTING
CLIENT = SY-MANDT "クライアント
GROUP = SY-TITLE "セッションネーム
USER = SY-UNAME "バッチインプットネーム
PROG = SY-CPROG
EXCEPTIONS
CLIENT_INVALID = 1
DESTINATION_INVALID = 2
GROUP_INVALID = 3
GROUP_IS_LOCKED = 4
HOLDDATE_INVALID = 5
INTERNAL_ERROR = 6
QUEUE_ERROR = 7
RUNNING = 8
SYSTEM_LOCK_ERROR = 9
USER_INVALID = 10
OTHERS = 11.
*- OPEN
しなかった場合
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_BDC_OPEN_GROUP
*- ワークアリアのクリア
CLEAR:
TH_IN_ZC30.
*- テーブル月次原価振替をループする
LOOP AT TD_BDC_ZC30 INTO TH_IN_ZC30.
*- 内部指図登録(月次原価振替)
*-- ①内部指図登録:第一画面
PERFORM FRM_INPUT_BDCDATA USING 'SAPMKAUF'
'0100'
'X'
'BDC_OKCODE'
'=KOKR'.
PERFORM FRM_INPUT_BDCDATA USING ' '
' '
' '
'COAS-AUART'
'TH_IN_ZC30-AUART'.
*-- ②
管理領域設定
PERFORM FRM_INPUT_BDCDATA USING 'SAPLSPO4'
'0300'
'X'
'BDC_OKCODE'
'=FURT'.
PERFORM FRM_INPUT_BDCDATA USING ' '
' '
' '
'SVALD-VALUE(01)'
'TH_IN_ZC30-KOKRS'.
*-- ③内部指図登録:第一画面
PERFORM FRM_INPUT_BDCDATA USING 'SAPMKAUF'
'0100'
'X'
'BDC_OKCODE'
'/00'.
*-- ④内部指図登録:マスタデータ
IF TH_IN_ZC30-FURIW IS INITIAL.
PERFORM FRM_INPUT_BDCDATA USING 'SAPMKAUF'
'0600'
'X'
'BDC_OKCODE'
'=ABVO'.
ELSE.
PERFORM FRM_INPUT_BDCDATA USING 'SAPMKAUF'
'0600'
' '
'BDC_OKCODE'
'=BUT3'.
ENDIF.
PERFORM FRM_INPUT_BDCDATA USING ' '
' '
' '
'COAS-AUFNR'
'TH_IN_ZC30-AUFNR'.
PERFORM FRM_INPUT_BDCDATA USING ' '
' '
' '
'COAS-KTEXT'
'TH_IN_ZC30-KTEXT'.
PERFORM FRM_INPUT_BDCDATA USING ' '
' '
' '
'COAS-BUKRS'
'C001'.
PERFORM FRM_INPUT_BDCDATA USING ' '
' '
' '
'COAS-KOSTV'
'TH_IN_ZC30-KOSTV'.
*-- ⑤
決済規則更新
:
概要
PERFORM FRM_INPUT_BDCDATA USING 'SAPLKOBS'
'0130'
'X'
'BDC_OKCODE'
'=BACK'.
PERFORM FRM_INPUT_BDCDATA USING ' '
' '
' '
'COBRB-KONTY(01)'
'G/L'.
PERFORM FRM_INPUT_BDCDATA USING ' '
' '
' '
'DKOBR-EMPGE(01)'
'TH_IN_ZC30-FURIWA'.
PERFORM FRM_INPUT_BDCDATA USING ' '
' '
' '
'COBRB-PERBZ(01)'
'TH_IN_ZC30-KTYPE'.
*-- ⑥内部指図登録:マスタデータ
PERFORM FRM_INPUT_BDCDATA USING 'SAPMKAUF'
'0600'
' '
'BDC_OKCODE'
'=VARI'.
*-- ⑦内部指図登録:マスタデータ
PERFORM FRM_INPUT_BDCDATA USING 'SAPMKAUF'
'0600'
' '
'BDC_OKCODE'
'=SICH'.
上記の書き方が不正です。原因としてはテーブルTD_BDCDATAの中で、下記の五つのフィールドが存在しています。PROGRAM(BDC モジュールプール), DYNPRO(BDC Dynpro 番号), DYNBEGIN(BDC Dynpro 開始), FNAM(項目名), FVAL(BDC 項目値)です。中で、DYNBEGIN(BDC Dynpro 開始)=
’
X
’
の場合、BDCSCREENです。こういう場合だったら、FNAM(項目名), FVAL(BDC 項目値)がスペースでなければなりません。それ以外の場合さえすれば、FNAM(項目名), FVAL(BDC 項目値)がスペースいがいとなります。ですから、DynproとFILEDを二つのFROMに分けて、書くことにしました。
*- 内部指図登録(月次原価振替)
*-- ①内部指図登録:第一画面
PERFORM FRM_INPUT_DYNPRO USING 'SAPMKAUF' '0100'.
PERFORM FRM_INPUT_FIELD USING: 'BDC_OKCODE' '=KOKR',
'COAS-AUART' TH_IN_ZC30-AUART.
*-- ②管理領域設定(プログラム:SAPLSPO4 Dynpro:0300)
PERFORM FRM_INPUT_DYNPRO USING 'SAPLSPO4' '0300'.
PERFORM FRM_INPUT_FIELD USING: 'BDC_OKCODE' '=FURT',
'SVALD-VALUE(01)' TH_IN_ZC30-KOKRS
.
*-- ③内部指図登録:第一画面(プログラム:SAPMKAUF Dynpro:0100)
PERFORM FRM_INPUT_DYNPRO USING 'SAPMKAUF' '0100'.
PERFORM FRM_INPUT_FIELD USING 'BDC_OKCODE' '/00'.
*-- ④内部指図登録:マスタデータ(プログラム:SAPMKAUF Dynpro:0600)
PERFORM FRM_INPUT_DYNPRO USING 'SAPMKAUF' '0600'.
PERFORM FRM_INPUT_FIELD USING: 'BDC_OKCODE' '=ABVO',
'COAS-AUFNR' TH_IN_ZC30-AUFNR,
'COAS-KTEXT' TH_IN_ZC30-KTEXT,
'COAS-BUKRS' 'C001',
'COAS-KOSTV' TH_IN_ZC30-KOSTL.
*-- ⑤決済規則更新:概要(プログラム:SAPLKOBS Dynpro:0130)
PERFORM FRM_INPUT_DYNPRO USING 'SAPLKOBS' '0130'.
PERFORM FRM_INPUT_FIELD USING: 'BDC_OKCODE' '=BACK',
'COBRB-KONTY(01)' 'G/L',
'DKOBR-EMPGE(01)'
TH_IN_ZC30-FURIW,
'COBRB-PERBZ(01)'
TH_IN_ZC30-KTYPE.
CLEAR:
TH_IN_ZC30.
ENDLOOP.
*&---------------------------------------------------------------------*
* ディンプロのセット
*----------------------------------------------------------------------*
* -->I_PROGRAM BDC モジュールプール(USINGパラメータ)
* -->I_DYNPRO BDC Dynpro 番号(USINGパラメータ)
*----------------------------------------------------------------------*
FORM FRM_SET_BDC_DYNPRO USING I_PROGRAM
I_DYNPRO.
DATA:
LTH_BDC LIKE BDCDATA.
LTH_BDC-PROGRAM = I_PROGRAM.
LTH_BDC-DYNPRO = I_DYNPRO.
LTH_BDC-DYNBEGIN = 'X'.
APPEND LTH_BDC TO TD_BDC.
ENDFORM. " FRM_SET_BDC_DYNPRO
*&---------------------------------------------------------------------*
*& Form FRM_SET_BDC_FIELD
*&---------------------------------------------------------------------*
* 項目値のセット
*----------------------------------------------------------------------*
* -->I_FNAM 項目名(USINGパラメータ)
* -->I_FVAL BDC 項目値(USINGパラメータ)
*----------------------------------------------------------------------*
FORM FRM_SET_BDC_FIELD USING I_FNAM
I_FVAL.
DATA:
LTH_BDC LIKE BDCDATA.
LTH_BDC-FNAM = I_FNAM.
LTH_BDC-FVAL = I_FVAL.
APPEND LTH_BDC TO TD_BDC.
ENDFORM. " FRM_SET_BDC_FIELD
*&---------------------------------------------------------------------*
*& Form FRM_INPUT_BDCDATA
*&---------------------------------------------------------------------*
* BDC登録
*----------------------------------------------------------------------*
* -->I_PROGRAM (USINGパラメータ)
* -->I_DYNPRO (USINGパラメータ)
* -->I_DYNBEGIN (USINGパラメータ)
* -->I_FNAM (USINGパラメータ)
* -->I_FVAL (USINGパラメータ)
*----------------------------------------------------------------------*
FORM FRM_INPUT_BDCDATA USING I_PROGRAM
I_DYNPRO
I_DYNBEGIN
I_FNAM
I_FVAL.
TD_BDCTAB-PROGRAM = I_PROGRAM. "BDC
モジュールプール
TD_BDCTAB-DYNPRO = I_DYNPRO. "BDC Dynpro
番号
TD_BDCTAB-DYNBEGIN = I_DYNBEGIN. "BDC Dynpro
開始
TD_BDCTAB-FNAM = I_FNAM. "
項目名
TD_BDCTAB-FVAL = I_FVAL. "BDC
項目値
APPEND TD_BDCTAB.
CLEAR TD_BDCTAB.
ENDFORM. " FRM_INPUT_BDCDATA
*- INSERT
処理を行う
PERFORM FRM_BDC_INSERT TABLES TD_BDCTAB.
*- CLOSE GROUP
PERFORM FRM_BDC_CLOSE_GROUP.
ENDFORM. " FRM_ZC30_BDC
*- INSERT
処理を行う
PERFORM FRM_BDC_INSERT TABLES TD_BDCTAB.
*&---------------------------------------------------------------------*
*& Form FRM_BDC_INSERT
*&---------------------------------------------------------------------*
* INSERT処理を行う
*----------------------------------------------------------------------*
* -->T_TAB BDCDATA(USINGパラメータ)
*----------------------------------------------------------------------*
FORM FRM_BDC_INSERT TABLES T_TAB.
CALL FUNCTION 'BDC_INSERT'
EXPORTING
TCODE = 'KO01'
TABLES
DYNPROTAB = T_TAB
EXCEPTIONS
INTERNAL_ERROR = 1
NOT_OPEN = 2
QUEUE_ERROR = 3
TCODE_INVALID = 4
PRINTING_INVALID = 5
POSTING_INVALID = 6
OTHERS = 7.
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_BDC_INSERT
*- CLOSE GROUP
PERFORM FRM_BDC_CLOSE_GROUP.
*&---------------------------------------------------------------------*
*& Form FRM_BDC_CLOSE_GROUP
*&---------------------------------------------------------------------*
* CLOSE GROUP
*----------------------------------------------------------------------*
* なし
*---------------------------------------------------------------------
-*
FORM FRM_BDC_CLOSE_GROUP .
CALL FUNCTION 'BDC_CLOSE_GROUP'
EXCEPTIONS
NOT_OPEN = 1
QUEUE_ERROR = 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_BDC_CLOSE_GROUP
二、
①
テーブルBDCTABにデータを書き込む
②
トランザクションを呼び出す
方法1と同じように引数をBDCTABに受け渡して、ループを終わるまでに、トランザクションをコールする。
* LOOP AT TD_BDCGETU INTO TH_GETUJI.
loop at td_getuji into th_getuji.
REFRESH TD_BDC.
* ①
内部指図登録
:
第一画面
(
プログラム
:SAPMKAUF Dynpro:0100)
PERFORM FRM_SET_BDC_DYNPRO USING 'SAPMKAUF' '0100'.
PERFORM FRM_SET_BDC_FIELD USING: 'BDC_OKCODE' '=KOKR',
'COAS-AUART' TH_GETUJI-AUART.
* ②
管理領域設定
(
プログラム
:SAPLSPO4 Dynpro:0300)
PERFORM FRM_SET_BDC_DYNPRO USING 'SAPLSPO4' '0300'.
PERFORM FRM_SET_BDC_FIELD USING: 'BDC_OKCODE' '=FURT',
'SVALD-VALUE(01)' TH_GETUJI-KOKRS.
* ③内部指図登録:第一画面(プログラム:SAPMKAUF Dynpro:0100)
PERFORM FRM_SET_BDC_DYNPRO USING 'SAPMKAUF' '0100'.
PERFORM FRM_SET_BDC_FIELD USING 'BDC_OKCODE' '/00'.
* ④内部指図登録:マスタデータ(プログラム:SAPMKAUF Dynpro:0600)
PERFORM FRM_SET_BDC_DYNPRO USING 'SAPMKAUF' '0600'.
PERFORM FRM_SET_BDC_FIELD USING: 'BDC_OKCODE' '=ABVO',
'COAS-AUFNR' TH_GETUJI-AUFNR,
'COAS-KTEXT' TH_GETUJI-KTEXT,
'COAS-BUKRS' 'C001',
'COAS-KOSTV' TH_GETUJI-KOSTL.
* ⑤決済規則更新:概要(プログラム:SAPLKOBS Dynpro:0130)
PERFORM FRM_SET_BDC_DYNPRO USING 'SAPLKOBS' '0130'.
PERFORM FRM_SET_BDC_FIELD USING: 'BDC_OKCODE' '=BACK',
'COBRB-KONTY(01)' 'G/L',
'DKOBR-EMPGE(01)'
TH_GETUJI-FURIWAKEKAMOKU,
'COBRB-PERBZ(01)'
TH_GETUJI-KESSAITYPE.
* バッチインプット処理の実行
CALL TRANSACTION
'KO01'
“
TCODE
USING TD_BDC
“
BDC用TABLE
MODE 'A'
“
処理モード
UPDATE 'S'.
“
更新モード
ENDLOOP.
注
:
MODEに下記の四種類があります。
'A'
画面表示
'E' エラー発生時のみ表示
'N' 表示なし
'P' 表示なし ; デバッグ可
'E' エラー発生時のみ表示
'N' 表示なし
'P' 表示なし ; デバッグ可
MODE
オプションを省略すると、処理モードは
'A'
になります。
処理モード 'E' で BDC データの最後に到達したために画面が表 示されると、処理モード 'A' に自動的に切り替わります。
処理モード 'E' で BDC データの最後に到達したために画面が表 示されると、処理モード 'A' に自動的に切り替わります。
UPDATE f
機能
機能
更新モード
f は更新タイプを指定します。可能値は次のとおりで す。
'A' (非同期更新)
'S' (同期更新)
'L' (ローカル更新)
オプション UPDATE を省略すると、更新モードは 'A' になります。
'A' (非同期更新)
'S' (同期更新)
'L' (ローカル更新)
オプション UPDATE を省略すると、更新モードは 'A' になります。
まとめ:二つの方法の中で、方法2がよく使われています。両者の区別として、方法2で作成したBDCが直接に更新することができます。方法1で作成したのは関連部門の許可をもらわないと、更新できないです。
例2:以下はBDCDATAの編集の書き方です。とても簡単で、分かりやすいです。
*&---------------------------------------------------------------------*
*&
Form SET_BDCDATA
*&---------------------------------------------------------------------*
*
BDCDATAの編集
*----------------------------------------------------------------------*
*
-->I_DYNBEGIN 開始フラグ
*
-->I_FNAM プログラムID or 項目名
*
-->I_FVAL DYNPRO番号 or 項目値
*----------------------------------------------------------------------*
FORM SET_BDCDATA USING
I_DYNBEGIN TYPE ANY
I_FNAM TYPE ANY
I_FVAL TYPE ANY.
CLEAR TH_BDCDATA.
* プログラム名,Dynpro番号を指定
IF I_DYNBEGIN = ‘X’.
TH_BDCDATA-PROGRAM = I_FNAM.
TH_BDCDATA-DYNPRO = I_FVAL.
TH_BDCDATA-DYNBEGIN = 'X'.
ELSE.
* 項目名,編集値を設定
TH_BDCDATA-FNAM = I_FNAM.
TH_BDCDATA-FVAL = I_FVAL.
ENDIF.
* バッチインプット用内部テーブルへ追加
APPEND TH_BDCDATA TO TD_BDCDATA.
ENDFORM.
" SET_BDCDATA