*&********************************************************************** *& PROGRAM : ZGMM001A0019 *&********************************************************************** *&********************************************************************** REPORT ZGMM001A0019 NO STANDARD PAGE HEADING LINE-SIZE 165 LINE-COUNT 58 MESSAGE-ID ZGMM001. *----------------------------------------------------------------------* * TYPES定義 *----------------------------------------------------------------------* TYPES TYP_TEXT TYPE C LENGTH 120. "結果内容 TYPES: *----- 汎用テーブル BEGIN OF TYP_ZGCMT0001, TEXT01 TYPE TMW_TEXT, TEXT02 TYPE TMW_TEXT, END OF TYP_ZGCMT0001, *----- 品目評価 BEGIN OF TYP_MBEW, MATNR TYPE MBEW-MATNR, "品目コード BWKEY TYPE MBEW-BWKEY, "評価レベル BWTAR TYPE MBEW-BWTAR, "評価タイプ ZPLP1 TYPE MBEW-ZPLP1, "予定計画原価1 ZPLD1 TYPE MBEW-ZPLD1, "有効開始日(予定計画原価1) PEINH TYPE MBEW-PEINH, "価格単位 WAERS TYPE T001-WAERS, "通貨コード END OF TYP_MBEW, *----- BDCDATARECORD BEGIN OF TYP_INFORECORD, MMTYPE(4), "品目タイプ:ZAP1標準、ZAP5外注 BESKZ(1), "調達タイプ:F外部調達、E内製 MODE(3), "モード:ADD新規、MOD変更. ZMATNR(18), "品目 LIFNR(10), "仕入先 EKORG(4), "購買組織 ZDATE_AVAIL_F(8), "有効開始日 ZWERTB0(15), "内訳合計 WAERS(3), "通貨コード ZA01(15), "原低額 ZA02(15), "材料値上げ ZA03(15), "設計変更 ZA04(15), "為替 ZA05(15), "支給品 ZA06(15), "市況変動 ZA07(15), "予備1 ZA08(15), "予備2 ZA09(15), "予備3 ZOA1(15), "通関費用 ZOB1(15), "運送費 ZOC1(15), "有償支給相当額 ZOD1(15), "その他 ZPB00(15), "期初単価 APLFZ(1), "予定納入時間 (単位: 日) NORBM(1), "標準購買発注数量 ZEPEIN(5), "価格単位 ZBBPRM(3), "数量単位(内訳テーブル) MEPRF(1), "価格設定日制御 (価格決定) EKGRP(3), "購買グループ TXZ01(40), "購買情報に対するテキスト (短)(元データ:品目マスタ) MATKL(9), "品目グループ INFNR(10), "購買情報番号 ZDATE_AVAIL_E(8), "有効終了日 MWSKZ(2), "税コード END OF TYP_INFORECORD, *----- 処理結果一覧 BEGIN OF TYP_LIST, EKORG TYPE ZGMMT0003-EKORG, "購買組織 ZMATNR TYPE ZGMMT0003-ZMATNR, "品目コード LIFNR TYPE ZGMMT0003-LIFNR, "仕入先 ZDATE TYPE ZGMMT0003-ZDATE_AVAIL_F, "有効開始日 PRICE TYPE ZGMMT0003-ZWERTB0, "価格 WAERS TYPE ZGMMT0003-WAERS, "通貨コード MENGE TYPE STPO-MENGE, "構成品目数量 MEINS TYPE STPO-MEINS, "構成品目数量単位 FUNC TYPE C LENGTH 18, "機能類型 TYPE TYPE C LENGTH 1, "結果タイプ TEXT TYPE TYP_TEXT, "結果内容 END OF TYP_LIST. *** ADD 20091217 0003 ST *----- ロジック変更情報 TYPES: BEGIN OF TYP_CHGLOGIC, EKORG TYPE ZGCMT0001-TEXT01, "購買組織 BSTAE TYPE ZGCMT0001-TEXT02, "確認管理キー MWSKZ TYPE ZGCMT0001-TEXT03, "税コード MEPRF TYPE ZGCMT0001-TEXT04, "価格設定日制御 END OF TYP_CHGLOGIC. *** ADD 20091217 0003 END *----------------------------------------------------------------------* * CONSTANTS定義 *----------------------------------------------------------------------* CONSTANTS: CNS_X TYPE C LENGTH 1 VALUE 'X', CNS_COLON TYPE C LENGTH 2 VALUE ':', CNS_KG TYPE C LENGTH 2 VALUE 'KG', CNS_G TYPE C LENGTH 1 VALUE 'G', CNS_STEUS_GAICHU1 TYPE PLPO-STEUS VALUE 'ZA13', "管理キー(外注(ありあり)) CNS_STEUS_GAICHU2 TYPE PLPO-STEUS VALUE 'ZA14', "管理キー(外注(なしなし)) CNS_N TYPE C LENGTH 1 VALUE 'N', "正常 CNS_E TYPE C LENGTH 1 VALUE 'E', "エラー CNS_ADD TYPE C LENGTH 3 VALUE 'ADD', CNS_MOD TYPE C LENGTH 3 VALUE 'MOD', CNS_STD TYPE C LENGTH 1 VALUE '0', "標準 CNS_OUT TYPE C LENGTH 1 VALUE '3', "外注 CNS_99991231 TYPE C LENGTH 8 VALUE '99991231', "有効終了日 CNS_BESKZ_F TYPE C LENGTH 1 VALUE 'F', "調達タイプ:F外部調達 CNS_BESKZ_E TYPE C LENGTH 1 VALUE 'E', "調達タイプ:E内製 *----- ロックオブジェクト CNS_RETRY_MAX TYPE I VALUE 4, "リトライ回数 *----- CALL TRANS用 CNS_UPDATE_S TYPE C VALUE 'S', "同期更新 CNS_TYPE_E TYPE BAPI_MTYPE VALUE 'E', "MSGTYPE: E 異常 CNS_100 TYPE I VALUE 100, CNS_M1 TYPE I VALUE -1, CNS_KEYNUM_00083 TYPE C LENGTH 5 VALUE '00083', CNS_KEYNUM_00102 TYPE C LENGTH 5 VALUE '00102', *** ADD 20091217 0003 ST CNS_KEYNUM_00128 TYPE ZGCMT0001-KEYNUM VALUE '00128', *** ADD 20091217 0003 END CNS_MWSKZ_V1 TYPE C LENGTH 2 VALUE 'V1'. *----------------------------------------------------------------------* * DATA定義(内部テーブル) *----------------------------------------------------------------------* DATA: TD_ZGCMT0001 TYPE HASHED TABLE OF TYP_ZGCMT0001 WITH UNIQUE KEY TEXT01, TD_ZGMMT0003 TYPE STANDARD TABLE OF ZGMMT0003, "購買単価内訳テーブル TD_LIST TYPE TABLE OF TYP_LIST, "処理結果一覧 TD_INFORECORD TYPE TABLE OF TYP_INFORECORD, "BDCデータ TD_MBEW TYPE TABLE OF TYP_MBEW, "品目評価 *----- BDCテーブル TD_BDCDATA TYPE STANDARD TABLE OF BDCDATA. *----------------------------------------------------------------------* * DATA定義(ワーク) *----------------------------------------------------------------------* *----- 内部テーブルヘッダ DATA: TH_ZGMMT0003 LIKE LINE OF TD_ZGMMT0003, "購買単価内訳テーブル TH_INFORECORD LIKE LINE OF TD_INFORECORD, "BDCデータ TH_LIST LIKE LINE OF TD_LIST, "処理結果一覧 TH_MBEW LIKE LINE OF TD_MBEW. "品目評価 *** ADD 20091217 0003 ST DATA: ST_CHGLOGIC TYPE TYP_CHGLOGIC. "ロジック変更情報 *** ADD 20091217 0003 END *----- SELECT-OPTIONS用 DATA: W_S_ZDATE TYPE DATAB, "有効開始日 W_S_LIFNR TYPE BSIK-LIFNR, "仕入先または債権者の勘定コード W_S_MATNR TYPE ZGMMT0003-ZMATNR. "品目コード DATA: W_BUKRS TYPE T024E-BUKRS. "会社コード *----------------------------------------------------------------------* * DATA定義(カウンタ) *----------------------------------------------------------------------* DATA: CTR_DATA TYPE I, "対象品目件数 CTR_UPDATE TYPE I, "購買情報更新件数 CTR_MM_UPDATE TYPE I, "品目マスタ更新件数 CTR_INSERT TYPE I, "購買情報追加件数 CTR_ERROR TYPE I. "エラー件数 *----------------------------------------------------------------------* * DATA定義(フラグ) *----------------------------------------------------------------------* DATA: FLG_ERROR TYPE C LENGTH 1. "エラーフラグ(X:エラー) *----------------------------------------------------------------------* * DATA定義 *----------------------------------------------------------------------* DATA: W_LIFNR_ZOA1 TYPE LIFNR, "予定配送費用仕入先 W_LIFNR_ZOB1 TYPE LIFNR, "予定配送費用仕入先 W_LIFNR_ZOD1 TYPE LIFNR. "予定配送費用仕入先 *----------------------------------------------------------------------* * PARAMETERS/SELECT-OPTIONS定義 *----------------------------------------------------------------------* SELECTION-SCREEN BEGIN OF BLOCK BLK1 WITH FRAME TITLE TEXT-001."抽出条件 SELECTION-SCREEN SKIP 1. PARAMETERS: CB_FLG TYPE C AS CHECKBOX DEFAULT SPACE. "年初処理フラグ SELECTION-SCREEN SKIP 1. PARAMETERS: P_EKORG TYPE EKORG OBLIGATORY. "購買組織 SELECT-OPTIONS: S_MATNR FOR W_S_MATNR. "品目コード SELECT-OPTIONS: S_LIFNR FOR W_S_LIFNR. "仕入先コード SELECT-OPTIONS: S_ZDATE FOR W_S_ZDATE. "有効開始日 PARAMETERS: P_WERKS TYPE T001W-WERKS OBLIGATORY. "プラント SELECTION-SCREEN SKIP 1. PARAMETERS: CB_FLG2 TYPE C AS CHECKBOX DEFAULT SPACE, "購買情報更新フラグ CB_FLG3 TYPE C AS CHECKBOX DEFAULT SPACE. "予定原価1更新フラグ SELECTION-SCREEN END OF BLOCK BLK1. *----------------------------------------------------------------------* * AT SELECTION-SCREEN *----------------------------------------------------------------------* AT SELECTION-SCREEN ON P_WERKS. *----- プラントの入力チェック PERFORM WERKS_INP_CHECK. *----------------------------------------------------------------------* * START-OF-SELECTION *----------------------------------------------------------------------* START-OF-SELECTION. PERFORM INIT_PROC. "初期処理 PERFORM MAIN_PROC. "主処理 PERFORM TERM_PROC. "終了処理 *----------------------------------------------------------------------* * TOP-OF-PAGE *----------------------------------------------------------------------* TOP-OF-PAGE. PERFORM OUT_HEADER. "ヘッダ出力 *&---------------------------------------------------------------------* *& FORM ENQUEUE_ZGMMT0003 *&---------------------------------------------------------------------* * ロックオブジェクト設定 *----------------------------------------------------------------------* FORM ENQUEUE_ZGMMT0003 . DATA: LCNT_COUNT TYPE I. DO CNS_RETRY_MAX TIMES. LCNT_COUNT = LCNT_COUNT + 1. *----- ロックオブジェクト設定 CALL FUNCTION 'ENQUEUE_EZGMMT0003' EXPORTING EKORG = P_EKORG EXCEPTIONS FOREIGN_LOCK = 1 SYSTEM_FAILURE = 2 OTHERS = 3. IF SY-SUBRC = 0. EXIT. ELSE. IF SY-SUBRC = 1. IF LCNT_COUNT < CNS_RETRY_MAX. WAIT UP TO 30 SECONDS. ELSE. FLG_ERROR = CNS_X. MESSAGE S036 WITH 'ZGMMT0003'. * テーブル & は現在ロックされています EXIT. ENDIF. ELSE. FLG_ERROR = CNS_X. MESSAGE S014(ZGCM001) WITH 'ENQUEUE_EZGMMT0003' SY-SUBRC. * 汎用モジュール "&1" でエラーが発生しました - リターンコード:&2 EXIT. ENDIF. ENDIF. ENDDO. ENDFORM. " ENQUEUE_ZGMMT0003 *&---------------------------------------------------------------------* *& FORM DEQUEUE_ZGMMT0003 *&---------------------------------------------------------------------* * ロックオブジェクト解除 *----------------------------------------------------------------------* FORM DEQUEUE_ZGMMT0003 . *----- ロックオブジェクト解除 CALL FUNCTION 'DEQUEUE_EZGMMT0003' EXPORTING EKORG = P_EKORG. ENDFORM. " DEQUEUE_ZGMMT0003 *&---------------------------------------------------------------------* *& FORM WERKS_INP_CHECK *&---------------------------------------------------------------------* * プラントの入力チェック *----------------------------------------------------------------------* FORM WERKS_INP_CHECK . DATA:LW_WERKS TYPE WERKS. *----- プラントの入力チェック SELECT WERKS INTO LW_WERKS FROM T001W UP TO 1 ROWS WHERE WERKS = P_WERKS. ENDSELECT. *----- プラント存在チェックエラー IF SY-SUBRC <> 0. * プラントが存在しません (プラント= &1) MESSAGE E006 WITH P_WERKS. ENDIF. ENDFORM. " WERKS_INP_CHECK *&---------------------------------------------------------------------* *& FORM INIT_PROC *&---------------------------------------------------------------------* * 初期処理 *----------------------------------------------------------------------* FORM INIT_PROC . CLEAR FLG_ERROR. PERFORM ENQUEUE_ZGMMT0003. "ロックオブジェクト設定 IF FLG_ERROR = CNS_X. RETURN. ENDIF. PERFORM GET_TRANS_LIFNR. "予定配送費用仕入先取得 PERFORM GET_SPECIAL_BKLAS. "特殊評価クラス取得 *** ADD 20091217 0003 ST PERFORM GET_CHGLOGIC_INFO. "ロジック変更情報取得 *** ADD 20091217 0003 END PERFORM GET_DATA_ZGMMT0003. "有償支給テーブルデータ取得 IF FLG_ERROR = CNS_X. PERFORM DEQUEUE_ZGMMT0003. "ロックオブジェクト解除 RETURN. ENDIF. *---- 購買組織から会社コード取得 SELECT SINGLE BUKRS INTO W_BUKRS FROM T024E WHERE EKORG = P_EKORG. ENDFORM. " INIT_PROC *&---------------------------------------------------------------------* *& FORM GET_DATA_ZGMMT0003 *&---------------------------------------------------------------------* * 購入品内訳テーブル *----------------------------------------------------------------------* FORM GET_DATA_ZGMMT0003 . CLEAR TD_ZGMMT0003. *----- 購入品内訳テーブルデータ抽出 SELECT * INTO CORRESPONDING FIELDS OF TABLE TD_ZGMMT0003[] FROM ZGMMT0003 WHERE ZMATNR IN S_MATNR AND EKORG = P_EKORG AND LIFNR IN S_LIFNR AND ZDATE_AVAIL_F IN S_ZDATE AND XSIDEL <> CNS_X AND ZFLG2 = CB_FLG2 ORDER BY EKORG ASCENDING LIFNR ASCENDING ZMATNR ASCENDING ZDATE_AVAIL_F DESCENDING ZCOUNT DESCENDING. *----- 重複削除(直前データ取得) DELETE ADJACENT DUPLICATES FROM TD_ZGMMT0003[] COMPARING EKORG LIFNR ZMATNR. CTR_DATA = LINES( TD_ZGMMT0003 ). "対象品目 IF CTR_DATA IS INITIAL. FLG_ERROR = CNS_X. MESSAGE S038. * 処理対象データが存在しません RETURN. ENDIF. ENDFORM. " GET_DATA_ZGMMT0003 *&---------------------------------------------------------------------* *& Form GET_ROUTING_INFNR *&---------------------------------------------------------------------* * 作業手順から購買情報番号取得 *----------------------------------------------------------------------* * -->IW_WERKS プラント * -->IW_MATNR 品目コード * -->IW_ZDATE 有効開始日 * -->IW_LIFNR 仕入先コード(内訳テーブル) * -->IW_ESOKZ 購買情報カテゴリ(内訳テーブル) * <--OW_INFNR 購買情報番号 *----------------------------------------------------------------------* FORM GET_ROUTING_INFNR USING IW_WERKS TYPE ANY IW_MATNR TYPE ANY IW_ZDATE TYPE ANY IW_LIFNR TYPE ANY IW_ESOKZ TYPE ANY CHANGING OW_INFNR TYPE ANY. *** ADD 20090611 0001 ST DATA:LTD_PLPO TYPE TABLE OF ZGPPS0004, LTH_PLPO LIKE LINE OF LTD_PLPO, LW_RETURN TYPE SY-SUBRC. CALL FUNCTION 'Z_GPPS_GET_ROUTING' EXPORTING I_MATNR = IW_MATNR I_WERKS = IW_WERKS I_DATUV = IW_ZDATE IMPORTING O_RETURN = LW_RETURN TABLES OT_PLPO = LTD_PLPO. LOOP AT LTD_PLPO INTO LTH_PLPO WHERE STEUS = CNS_STEUS_GAICHU1 OR STEUS = CNS_STEUS_GAICHU2. * 作業手順から取得した購買情報番号の仕入先と購買情報カテゴリが購買内訳テーブルのデータと一致する場合は IF LTH_PLPO-LIFNR = IW_LIFNR AND LTH_PLPO-ESOKZ = IW_ESOKZ. OW_INFNR = LTH_PLPO-INFNR. EXIT. ENDIF. ENDLOOP. *** ADD 20090611 0001 END *** DEL 20090611 0001 ST * DATA: LW_TEMP_INFNR TYPE EINA-INFNR. "購買情報番号 * DATA: LW_ESOKZ TYPE EINE-ESOKZ. "購買情報番号の購買情報カテゴリ * DATA: LW_LIFNR TYPE LIFNR. "仕入先 * * SELECT * PLPO~INFNR * PLPO~ESOKZ * MAPL~LIFNR * INTO (LW_TEMP_INFNR,LW_ESOKZ,LW_LIFNR) * FROM MAPL * INNER JOIN PLAS * ON PLAS~PLNTY = MAPL~PLNTY * AND PLAS~PLNNR = MAPL~PLNNR * AND PLAS~PLNAL = MAPL~PLNAL * AND PLAS~PLNFL = '000000' * AND PLAS~LOEKZ = MAPL~LOEKZ * INNER JOIN PLPO * ON PLPO~PLNTY = PLAS~PLNTY * AND PLPO~PLNNR = PLAS~PLNNR * AND PLPO~PLNKN = PLAS~PLNKN * AND PLPO~ZAEHL = PLAS~ZAEHL * WHERE MAPL~WERKS = IW_WERKS * AND MAPL~MATNR = IW_MATNR * AND MAPL~DATUV <= IW_ZDATE * AND MAPL~LOEKZ = SPACE * AND ( PLPO~STEUS = CNS_STEUS_GAICHU1 * OR PLPO~STEUS = CNS_STEUS_GAICHU2 ). * IF NOT LW_TEMP_INFNR IS INITIAL. * SELECT SINGLE LIFNR * INTO LW_LIFNR * FROM EINA * WHERE INFNR = LW_TEMP_INFNR. * ** 作業手順から取得した購買情報番号の仕入先と購買情報カテゴリが購買内訳テーブルのデータと一致する場合は * IF LW_LIFNR = IW_LIFNR AND LW_ESOKZ = IW_ESOKZ. * OW_INFNR = LW_TEMP_INFNR. * EXIT. * ENDIF. * ENDIF. * CLEAR LW_ESOKZ. * CLEAR LW_LIFNR. * CLEAR LW_TEMP_INFNR. * ENDSELECT. *** DEL 20090611 0001 END ENDFORM. " GET_ROUTING_INFNR *&---------------------------------------------------------------------* *& FORM MAIN_PROC *&---------------------------------------------------------------------* * 主処理 *----------------------------------------------------------------------* FORM MAIN_PROC . DATA: LW_SUM TYPE ZGMMT0003-ZMATNR. DATA: LFLG_UPDATE TYPE C LENGTH 1, "更新処理結果フラグ LFLG_INSERT TYPE C LENGTH 1. "登録処理結果フラグ DATA:LW_INFNR TYPE EINA-INFNR. DATA:LW_SUBRC TYPE SY-SUBRC. DATA: LW_MVAL TYPE I. "乗算値 DATA: LW_UNIT_P TYPE P LENGTH 7 DECIMALS 0. *----- バッチインプット実行 LOOP AT TD_ZGMMT0003 INTO TH_ZGMMT0003. CLEAR TH_INFORECORD. *----- 標準と外注 TH_INFORECORD-MMTYPE = TH_ZGMMT0003-ESOKZ. * 購買情報カテゴリが外注、標準以外の場合、エラー IF TH_INFORECORD-MMTYPE <> CNS_STD AND TH_INFORECORD-MMTYPE <> CNS_OUT. * 結果結果一覧作成 CLEAR TH_LIST. * 購買情報カテゴリが外注、標準以外になっています(品目コード = &1) MESSAGE S153 WITH TH_ZGMMT0003-ZMATNR INTO TH_LIST-TEXT. TH_LIST-EKORG = TH_ZGMMT0003-EKORG. TH_LIST-ZMATNR = TH_ZGMMT0003-ZMATNR. TH_LIST-LIFNR = TH_ZGMMT0003-LIFNR. TH_LIST-ZDATE = TH_ZGMMT0003-ZDATE_AVAIL_F. TH_LIST-TYPE = CNS_E. PERFORM SET_LIST USING TH_LIST. CTR_ERROR = CTR_ERROR + 1. CONTINUE. ENDIF. *----- 調達タイプの取得 SELECT SINGLE BESKZ "調達タイプ-F:外部調達、E:内製 INTO TH_INFORECORD-BESKZ FROM MARC WHERE MATNR = TH_ZGMMT0003-ZMATNR AND WERKS = P_WERKS. * 調達タイプがF、E以外の場合は、エラーメッセージ出力 IF TH_INFORECORD-BESKZ <> CNS_BESKZ_F AND TH_INFORECORD-BESKZ <> CNS_BESKZ_E . * 結果結果一覧作成 CLEAR TH_LIST. * 品目マスタの調達タイプがF、E以外になっています(品目コード = &1) MESSAGE S158 WITH TH_ZGMMT0003-ZMATNR INTO TH_LIST-TEXT. TH_LIST-EKORG = TH_ZGMMT0003-EKORG. TH_LIST-ZMATNR = TH_ZGMMT0003-ZMATNR. TH_LIST-LIFNR = TH_ZGMMT0003-LIFNR. TH_LIST-ZDATE = TH_ZGMMT0003-ZDATE_AVAIL_F. TH_LIST-TYPE = CNS_E. PERFORM SET_LIST USING TH_LIST. CTR_ERROR = CTR_ERROR + 1. CONTINUE. ENDIF. *----- 購買番号取得ロジック IF TH_INFORECORD-BESKZ = CNS_BESKZ_F. "調達タイプFの場合 SELECT A~INFNR "購買番号 INTO TH_INFORECORD-INFNR UP TO 1 ROWS FROM EINA AS A JOIN EINE AS B ON A~INFNR = B~INFNR WHERE A~MATNR = TH_ZGMMT0003-ZMATNR "品目 AND A~LIFNR = TH_ZGMMT0003-LIFNR AND B~EKORG = TH_ZGMMT0003-EKORG AND B~ESOKZ = TH_ZGMMT0003-ESOKZ AND A~LOEKZ <> CNS_X AND B~LOEKZ <> CNS_X ORDER BY A~INFNR DESCENDING. ENDSELECT. ELSEIF TH_INFORECORD-BESKZ = CNS_BESKZ_E. "調達タイプEの場合 * 購買情報番号の取得(作業手順から) CLEAR LW_INFNR. PERFORM GET_ROUTING_INFNR USING P_WERKS TH_ZGMMT0003-ZMATNR TH_ZGMMT0003-ZDATE_AVAIL_F TH_ZGMMT0003-LIFNR TH_ZGMMT0003-ESOKZ CHANGING LW_INFNR. TH_INFORECORD-INFNR = LW_INFNR. * 作業手順から取得した購買情報番号の仕入先や購買情報カテゴリが異なる場合は(作業手順から取得できない場合) IF TH_INFORECORD-INFNR IS INITIAL. SELECT A~INFNR "購買番号 INTO TH_INFORECORD-INFNR UP TO 1 ROWS FROM EINA AS A JOIN EINE AS B ON A~INFNR = B~INFNR WHERE A~URZZT = TH_ZGMMT0003-ZMATNR "番号 AND A~LIFNR = TH_ZGMMT0003-LIFNR AND B~EKORG = TH_ZGMMT0003-EKORG AND B~ESOKZ = TH_ZGMMT0003-ESOKZ AND A~LOEKZ <> CNS_X AND B~LOEKZ <> CNS_X ORDER BY A~INFNR DESCENDING. ENDSELECT. ENDIF. ENDIF. "購買番号取得ロジックのENDIF IF TH_INFORECORD-INFNR IS INITIAL. TH_INFORECORD-MODE = CNS_ADD. ELSE. TH_INFORECORD-MODE = CNS_MOD. ENDIF. *----- INFORECORD作成 PERFORM CALC_MULTI_VALUE CHANGING LW_MVAL. "乗算値計算 TH_INFORECORD-ZMATNR = TH_ZGMMT0003-ZMATNR. "品目 TH_INFORECORD-LIFNR = TH_ZGMMT0003-LIFNR. "仕入先 TH_INFORECORD-EKORG = TH_ZGMMT0003-EKORG. "購買組織 TH_INFORECORD-ZDATE_AVAIL_F = TH_ZGMMT0003-ZDATE_AVAIL_F. "有効開始日 TH_INFORECORD-ZWERTB0 = TH_ZGMMT0003-ZWERTB0 * LW_MVAL . "内訳合計 TH_INFORECORD-WAERS = TH_ZGMMT0003-WAERS. "通貨コード TH_INFORECORD-ZA01 = TH_ZGMMT0003-ZA01 * LW_MVAL * CNS_M1. "原低額 TH_INFORECORD-ZA02 = TH_ZGMMT0003-ZA02 * LW_MVAL * CNS_M1. "材料値上げ TH_INFORECORD-ZA03 = TH_ZGMMT0003-ZA03 * LW_MVAL * CNS_M1. "設計変更 TH_INFORECORD-ZA04 = TH_ZGMMT0003-ZA04 * LW_MVAL * CNS_M1. "為替 TH_INFORECORD-ZA05 = TH_ZGMMT0003-ZA05 * LW_MVAL * CNS_M1. "支給品 TH_INFORECORD-ZA06 = TH_ZGMMT0003-ZA06 * LW_MVAL * CNS_M1. "市況変動 TH_INFORECORD-ZA07 = TH_ZGMMT0003-ZA07 * LW_MVAL * CNS_M1. "予備1 TH_INFORECORD-ZA08 = TH_ZGMMT0003-ZA08 * LW_MVAL * CNS_M1. "予備2 TH_INFORECORD-ZA09 = TH_ZGMMT0003-ZA09 * LW_MVAL * CNS_M1. "予備3 TH_INFORECORD-ZOA1 = TH_ZGMMT0003-ZOA1 * LW_MVAL. "通関費用 TH_INFORECORD-ZOB1 = TH_ZGMMT0003-ZOB1 * LW_MVAL. "運送費 TH_INFORECORD-ZOC1 = TH_ZGMMT0003-ZOC1 * LW_MVAL. "有償支給相当額 TH_INFORECORD-ZOD1 = TH_ZGMMT0003-ZOD1 * LW_MVAL. "その他 TH_INFORECORD-ZPB00 = TH_ZGMMT0003-ZPB00 * LW_MVAL. "期初単価 TH_INFORECORD-ZBBPRM = TH_ZGMMT0003-ZBBPRM. "数量単位 TH_INFORECORD-NORBM = '1'. "標準購買発注数量 *** MOD 20091217 0003 ST * TH_INFORECORD-MEPRF = '2'. "価格設定日制御 (価格決定) IF TH_INFORECORD-EKORG = ST_CHGLOGIC-EKORG. TH_INFORECORD-MEPRF = ST_CHGLOGIC-MEPRF. "価格設定日制御 ELSE. TH_INFORECORD-MEPRF = '2'. "価格設定日制御 ENDIF. *** MOD 20091217 0003 END TH_INFORECORD-APLFZ = '0'. "予定納入時間 (単位: 日) LW_UNIT_P = TH_ZGMMT0003-ZEPEIN * LW_MVAL. "価格単位 *----- 価格単位5桁以内チェック IF LW_UNIT_P <= 99999. TH_INFORECORD-ZEPEIN = LW_UNIT_P. ELSE. * 結果結果一覧作成 CLEAR TH_LIST. * 価格単位の桁数が5桁を超えました(価格単位 = &1) MESSAGE S187 WITH LW_UNIT_P INTO TH_LIST-TEXT. TH_LIST-EKORG = TH_ZGMMT0003-EKORG. TH_LIST-ZMATNR = TH_ZGMMT0003-ZMATNR. TH_LIST-LIFNR = TH_ZGMMT0003-LIFNR. TH_LIST-ZDATE = TH_ZGMMT0003-ZDATE_AVAIL_F. TH_LIST-TYPE = CNS_E. PERFORM SET_LIST USING TH_LIST. CTR_ERROR = CTR_ERROR + 1. CONTINUE. ENDIF. *----- 税コード取得 PERFORM GET_MWSKZ USING TH_ZGMMT0003-LIFNR CHANGING TH_INFORECORD-MWSKZ LW_SUBRC. IF LW_SUBRC <> 0. *----- 結果結果一覧作成 CLEAR TH_LIST. * 仕入先マスタコメント欄の税コードが存在しません (仕入先= &1) MESSAGE S176 WITH TH_ZGMMT0003-LIFNR INTO TH_LIST-TEXT. TH_LIST-EKORG = TH_ZGMMT0003-EKORG. TH_LIST-ZMATNR = TH_ZGMMT0003-ZMATNR. TH_LIST-LIFNR = TH_ZGMMT0003-LIFNR. TH_LIST-ZDATE = TH_ZGMMT0003-ZDATE_AVAIL_F. TH_LIST-TYPE = CNS_E. PERFORM SET_LIST USING TH_LIST. CTR_ERROR = CTR_ERROR + 1. CONTINUE. ENDIF. *----- 金額チェック CLEAR LW_SUM. LW_SUM = TH_INFORECORD-ZA01 + TH_INFORECORD-ZA02 + TH_INFORECORD-ZA03 + TH_INFORECORD-ZA04 + TH_INFORECORD-ZA05 + TH_INFORECORD-ZA06 + TH_INFORECORD-ZA07 + TH_INFORECORD-ZA08 + TH_INFORECORD-ZA09 + TH_INFORECORD-ZPB00 + TH_INFORECORD-ZOA1 + TH_INFORECORD-ZOB1 + TH_INFORECORD-ZOC1 + TH_INFORECORD-ZOD1. IF LW_SUM < 0. *----- 結果結果一覧作成 CLEAR TH_LIST. * 条件金額合計は0より小さい(品目コード = &1) MESSAGE S129 WITH TH_INFORECORD-ZMATNR INTO TH_LIST-TEXT. TH_LIST-EKORG = TH_ZGMMT0003-EKORG. TH_LIST-ZMATNR = TH_ZGMMT0003-ZMATNR. TH_LIST-LIFNR = TH_ZGMMT0003-LIFNR. TH_LIST-ZDATE = TH_ZGMMT0003-ZDATE_AVAIL_F. TH_LIST-TYPE = CNS_E. PERFORM SET_LIST USING TH_LIST. CTR_ERROR = CTR_ERROR + 1. CONTINUE. ENDIF. *----- 新規の場合 IF TH_INFORECORD-MODE = CNS_ADD . *----- 購買グループ SELECT SINGLE EKGRP "購買グループ INTO TH_INFORECORD-EKGRP FROM MARC WHERE MATNR = TH_ZGMMT0003-ZMATNR AND WERKS = P_WERKS. IF TH_INFORECORD-EKGRP IS INITIAL. *----- 結果結果一覧作成 CLEAR TH_LIST. * 購買グループが存在しません (品目コード = &1) MESSAGE S110 WITH TH_INFORECORD-ZMATNR INTO TH_LIST-TEXT. TH_LIST-EKORG = TH_ZGMMT0003-EKORG. TH_LIST-ZMATNR = TH_ZGMMT0003-ZMATNR. TH_LIST-LIFNR = TH_ZGMMT0003-LIFNR. TH_LIST-ZDATE = TH_ZGMMT0003-ZDATE_AVAIL_F. TH_LIST-TYPE = CNS_E. PERFORM SET_LIST USING TH_LIST. CTR_ERROR = CTR_ERROR + 1. CONTINUE. ENDIF. IF TH_INFORECORD-BESKZ = CNS_BESKZ_E. "調達タイプEの場合 *----- 品目テキスト SELECT SINGLE MAKTX INTO TH_INFORECORD-TXZ01 FROM MAKT WHERE MATNR = TH_ZGMMT0003-ZMATNR AND SPRAS = SY-LANGU. IF TH_INFORECORD-TXZ01 IS INITIAL. *----- 結果結果一覧作成 CLEAR TH_LIST. * 品目テキストが存在しません(品目コード = &1) MESSAGE S108 WITH TH_INFORECORD-ZMATNR INTO TH_LIST-TEXT. TH_LIST-EKORG = TH_ZGMMT0003-EKORG. TH_LIST-ZMATNR = TH_ZGMMT0003-ZMATNR. TH_LIST-LIFNR = TH_ZGMMT0003-LIFNR. TH_LIST-ZDATE = TH_ZGMMT0003-ZDATE_AVAIL_F. TH_LIST-TYPE = CNS_E. PERFORM SET_LIST USING TH_LIST. CTR_ERROR = CTR_ERROR + 1. CONTINUE. ENDIF. *----- 品目グループ SELECT SINGLE MATKL INTO CORRESPONDING FIELDS OF TH_INFORECORD FROM MARA WHERE MATNR = TH_ZGMMT0003-ZMATNR. IF TH_INFORECORD-MATKL IS INITIAL. *----- 結果結果一覧作成 CLEAR TH_LIST. * 品目グループが存在しません(品目コード = &1) MESSAGE S107 WITH TH_INFORECORD-ZMATNR INTO TH_LIST-TEXT. TH_LIST-EKORG = TH_ZGMMT0003-EKORG. TH_LIST-ZMATNR = TH_ZGMMT0003-ZMATNR. TH_LIST-LIFNR = TH_ZGMMT0003-LIFNR. TH_LIST-ZDATE = TH_ZGMMT0003-ZDATE_AVAIL_F. TH_LIST-TYPE = CNS_E. PERFORM SET_LIST USING TH_LIST. CTR_ERROR = CTR_ERROR + 1. CONTINUE. ENDIF. ENDIF. ENDIF. *----- 有効終了日取得 PERFORM GET_ZDATE_AVAIL_E USING TH_ZGMMT0003 CHANGING TH_INFORECORD-ZDATE_AVAIL_E. *----- 品目マスタ予定原価1,2更新 (標準+調達タイプF+年初フラグX+予定原価1フラグXの場合)-------- IF TH_INFORECORD-MMTYPE = CNS_STD AND TH_INFORECORD-BESKZ = CNS_BESKZ_F AND CB_FLG = CNS_X AND CB_FLG3 = CNS_X. CLEAR TH_LIST. PERFORM BAPI_UPDATE_MM USING TH_INFORECORD CHANGING TH_LIST-TEXT TH_LIST-TYPE. *----- 結果結果一覧作成 TH_LIST-EKORG = TH_ZGMMT0003-EKORG. TH_LIST-ZMATNR = TH_ZGMMT0003-ZMATNR. TH_LIST-LIFNR = TH_ZGMMT0003-LIFNR. TH_LIST-ZDATE = TH_ZGMMT0003-ZDATE_AVAIL_F. TH_LIST-FUNC = TEXT-F01. "(品目マスタ更新) IF TH_LIST-TYPE = CNS_N . CTR_MM_UPDATE = CTR_MM_UPDATE + 1. "品目マスタ更新件数 * 内訳テーブルの品目マスタ更新フラグを更新 UPDATE ZGMMT0003 SET ZFLG3 = CNS_X UP_PROG = SY-CPROG UP_UNAME = SY-UNAME UP_DATUM = SY-DATUM UP_UZEIT = SY-UZEIT WHERE ZMATNR = TH_ZGMMT0003-ZMATNR AND LIFNR = TH_ZGMMT0003-LIFNR AND EKORG = TH_ZGMMT0003-EKORG AND ZDATE_AVAIL_F = TH_ZGMMT0003-ZDATE_AVAIL_F AND ZCOUNT = TH_ZGMMT0003-ZCOUNT. IF SY-SUBRC = 0. LFLG_UPDATE = CNS_X. ELSE. ROLLBACK WORK. * & & & & MESSAGE S398(00) WITH TEXT-201 SPACE SPACE SPACE. FLG_ERROR = CNS_X. CTR_ERROR = CTR_ERROR + 1. EXIT. ENDIF. ELSE. CTR_ERROR = CTR_ERROR + 1. ENDIF. PERFORM SET_LIST USING TH_LIST. ENDIF. *----- バッチインプットの実行 -------- CLEAR TH_LIST. PERFORM BDC_CALL USING TH_INFORECORD CHANGING TH_LIST-TEXT TH_LIST-TYPE. *----- 結果結果一覧作成 TH_LIST-EKORG = TH_ZGMMT0003-EKORG. TH_LIST-ZMATNR = TH_ZGMMT0003-ZMATNR. TH_LIST-LIFNR = TH_ZGMMT0003-LIFNR. TH_LIST-ZDATE = TH_ZGMMT0003-ZDATE_AVAIL_F. TH_LIST-FUNC = TEXT-F02. "(購買情報更新) IF TH_LIST-TYPE = CNS_N . IF TH_INFORECORD-MODE = CNS_ADD . CTR_INSERT = CTR_INSERT + 1. "購買情報インプット件数 ELSE. CTR_UPDATE = CTR_UPDATE + 1. "購買情報更新件数 ENDIF. * BDC成功後1:内訳テーブルで購買情報更新フラグをXにする UPDATE ZGMMT0003 SET ZFLG2 = CNS_X UP_PROG = SY-CPROG UP_UNAME = SY-UNAME UP_DATUM = SY-DATUM UP_UZEIT = SY-UZEIT WHERE ZMATNR = TH_ZGMMT0003-ZMATNR AND LIFNR = TH_ZGMMT0003-LIFNR AND EKORG = TH_ZGMMT0003-EKORG AND ZDATE_AVAIL_F = TH_ZGMMT0003-ZDATE_AVAIL_F AND ZCOUNT = TH_ZGMMT0003-ZCOUNT. IF SY-SUBRC = 0. LFLG_UPDATE = CNS_X. ELSE. ROLLBACK WORK. * & & & & MESSAGE S398(00) WITH TEXT-201 SPACE SPACE SPACE. FLG_ERROR = CNS_X. CTR_ERROR = CTR_ERROR + 1. EXIT. ENDIF. *** ADD 20100527 0006 ST * BDC成功後1':削除フラグ、購買情報フラグが未設定のものがあれば * それらのデータに対しても購買情報フラグを設定 UPDATE ZGMMT0003 SET ZFLG2 = CNS_X UP_PROG = SY-CPROG UP_UNAME = SY-UNAME UP_DATUM = SY-DATUM UP_UZEIT = SY-UZEIT WHERE ZMATNR = TH_ZGMMT0003-ZMATNR AND LIFNR = TH_ZGMMT0003-LIFNR AND EKORG = TH_ZGMMT0003-EKORG AND ZDATE_AVAIL_F = TH_ZGMMT0003-ZDATE_AVAIL_F AND ZCOUNT <> TH_ZGMMT0003-ZCOUNT AND XSIDEL <> CNS_X AND ZFLG2 <> CNS_X. IF SY-SUBRC = 0 OR SY-SUBRC = 4. LFLG_UPDATE = CNS_X. ELSE. ROLLBACK WORK. * & & & & MESSAGE S398(00) WITH TEXT-201 SPACE SPACE SPACE. FLG_ERROR = CNS_X. CTR_ERROR = CTR_ERROR + 1. EXIT. ENDIF. *** ADD 20100527 0006 END * BDC成功後2:内訳テーブルで有効開始日~年度最終日日付の間のレコードに削除フラグを立つ IF TH_INFORECORD-ZDATE_AVAIL_E <> CNS_99991231. UPDATE ZGMMT0003 SET XSIDEL = CNS_X UP_PROG = SY-CPROG UP_UNAME = SY-UNAME UP_DATUM = SY-DATUM UP_UZEIT = SY-UZEIT WHERE ZMATNR = TH_ZGMMT0003-ZMATNR AND LIFNR = TH_ZGMMT0003-LIFNR AND EKORG = TH_ZGMMT0003-EKORG AND ZDATE_AVAIL_F > TH_INFORECORD-ZDATE_AVAIL_F AND ZDATE_AVAIL_F <= TH_INFORECORD-ZDATE_AVAIL_E. IF SY-SUBRC = 0 OR SY-SUBRC = 4. LFLG_UPDATE = CNS_X. ELSE. ROLLBACK WORK. * & & & & MESSAGE S398(00) WITH TEXT-201 SPACE SPACE SPACE. FLG_ERROR = CNS_X. CTR_ERROR = CTR_ERROR + 1. EXIT. ENDIF. ENDIF. ELSE. CTR_ERROR = CTR_ERROR + 1. ENDIF. PERFORM SET_LIST USING TH_LIST. ENDLOOP. *----- 購買単価内訳テーブル(ZGMMT0003)更新フラグ更新 IF LFLG_UPDATE IS INITIAL AND LFLG_INSERT IS INITIAL. RETURN. ELSE. COMMIT WORK. ENDIF. PERFORM DEQUEUE_ZGMMT0003. "ロックオブジェクト解除 ENDFORM. " MAIN_PROC *&---------------------------------------------------------------------* *& FORM TERM_PROC *&---------------------------------------------------------------------* * 終了処理 *----------------------------------------------------------------------* FORM TERM_PROC . PERFORM OUT_LIST. "結果一覧出力 *----- 先の処理でエラーが発生した場合は処理終了 IF FLG_ERROR = CNS_X. * エラーがあります エラーを確認してください MESSAGE S058. RETURN. ENDIF. * 処理が正常終了しました MESSAGE S057. ENDFORM. " TERM_PROC *&---------------------------------------------------------------------* *& FORM OUT_HEADER *&---------------------------------------------------------------------* * ヘッダ出力 *----------------------------------------------------------------------* FORM OUT_HEADER . WRITE: /001(165) TEXT-101 CENTERED . "ヘッダタイトル WRITE: /131 TEXT-102, "PAGE 135 CNS_COLON, 137 SY-PAGNO RIGHT-JUSTIFIED NO-SIGN, /131 TEXT-103, "DATE 135 CNS_COLON, *** UPD 20091117 0002 ST * 137 SY-DATUM, * 148 SY-UZEIT. 137 SY-DATLO, 148 SY-TIMLO. *** UPD 20091117 0002 END WRITE: /001 TEXT-104, "対象品目 019 CNS_COLON, 021 CTR_DATA RIGHT-JUSTIFIED NO-SIGN, /001 TEXT-105, "購買情報更新件数 019 CNS_COLON, 021 CTR_UPDATE RIGHT-JUSTIFIED NO-SIGN, /001 TEXT-107, "購買情報追加件数 019 CNS_COLON, 021 CTR_INSERT RIGHT-JUSTIFIED NO-SIGN, /001 TEXT-115, "品目マスタ更新件数 019 CNS_COLON, 021 CTR_MM_UPDATE RIGHT-JUSTIFIED NO-SIGN, /001 TEXT-106, "エラー件数 019 CNS_COLON, 021 CTR_ERROR RIGHT-JUSTIFIED NO-SIGN. SKIP 1. WRITE: /001 TEXT-108, "PORG 007 TEXT-109, "品目 026(10) TEXT-114, "仕入先 039(10) TEXT-110 , "有効開始日 052 TEXT-113, "結果タイプ 074 TEXT-111. "結果内容 ULINE. ENDFORM. " OUT_HEADER *&---------------------------------------------------------------------* *& FORM OUT_LIST *&---------------------------------------------------------------------* * 結果一覧出力 *----------------------------------------------------------------------* FORM OUT_LIST . DATA: LTH_LIST LIKE LINE OF TD_LIST. LOOP AT TD_LIST INTO LTH_LIST. WRITE: /001 LTH_LIST-EKORG, "PORG 007 LTH_LIST-ZMATNR, "品目 026 LTH_LIST-LIFNR, "仕入先 039(10) LTH_LIST-ZDATE, "有効開始日 052 LTH_LIST-TYPE, "結果タイプ 054 LTH_LIST-FUNC, "機能種類 074 LTH_LIST-TEXT. "処理結果 ENDLOOP. ENDFORM. " OUT_LIST *&---------------------------------------------------------------------* *& FORM SET_LIST *&---------------------------------------------------------------------* * 処理結果一覧内容作成 *----------------------------------------------------------------------* * -->IST_LIST  結果リスト *----------------------------------------------------------------------* FORM SET_LIST USING IST_LIST TYPE TYP_LIST. APPEND IST_LIST TO TD_LIST. ENDFORM. " SET_LIST *&---------------------------------------------------------------------* *& FORM BDC_CALL *&---------------------------------------------------------------------* * バッチインプット処理 *----------------------------------------------------------------------* * <--OW_MESSAGE メッセージテキスト *----------------------------------------------------------------------* FORM BDC_CALL USING IST_INFORECORD TYPE TYP_INFORECORD CHANGING OW_MESSAGE TYPE ANY OW_RESULT_TYPE TYPE ANY. *----- SAP システム のメッセージ収集 DATA: LST_BDCMSG TYPE BDCMSGCOLL, LST_TMP_BDCMSG TYPE BDCMSGCOLL, LTD_BDCMSG TYPE STANDARD TABLE OF BDCMSGCOLL. *----- バッチインプットデータ格納 PERFORM BDC_DATA_CREATE. *----- バッチインプット処理 IF IST_INFORECORD-MODE = CNS_ADD. CALL TRANSACTION 'ME11' "購買情報登録 USING TD_BDCDATA "バッチインプット用 UPDATE CNS_UPDATE_S "同期更新 MODE 'N' "画面表示なし MESSAGES INTO LTD_BDCMSG. "BDCメッセージ ELSEIF IST_INFORECORD-MODE = CNS_MOD. CALL TRANSACTION 'ME12' "購買情報変更 USING TD_BDCDATA "バッチインプット用 UPDATE CNS_UPDATE_S "同期更新 MODE 'N' "画面表示なし MESSAGES INTO LTD_BDCMSG. "BDCメッセージ ENDIF. CLEAR OW_RESULT_TYPE . LOOP AT LTD_BDCMSG INTO LST_BDCMSG. LST_TMP_BDCMSG = LST_BDCMSG. *----- 最終メッセージ取得 AT LAST. IF LST_TMP_BDCMSG-MSGTYP = CNS_TYPE_E. OW_RESULT_TYPE = CNS_E. ELSE. OW_RESULT_TYPE = CNS_N. ENDIF. MESSAGE ID LST_TMP_BDCMSG-MSGID TYPE LST_TMP_BDCMSG-MSGTYP NUMBER LST_TMP_BDCMSG-MSGNR WITH LST_TMP_BDCMSG-MSGV1 LST_TMP_BDCMSG-MSGV2 LST_TMP_BDCMSG-MSGV3 LST_TMP_BDCMSG-MSGV4 INTO OW_MESSAGE. ENDAT. ENDLOOP. *初期化 FREE: TD_BDCDATA, "BDCテーブル LTD_BDCMSG. "BDCメッセージテーブル ENDFORM. " BDC_CALL *&---------------------------------------------------------------------* *& FORM BDC_DYNPRO *&---------------------------------------------------------------------* * 画面の設定 *----------------------------------------------------------------------* * -->IW_PROGRAM プログラム名 * -->IW_DYNPRO DYNPRO番号 *----------------------------------------------------------------------* FORM BDC_DYNPRO USING IW_PROGRAM TYPE ANY IW_DYNPRO TYPE ANY. DATA: LTH_BDCDATA TYPE BDCDATA. LTH_BDCDATA-PROGRAM = IW_PROGRAM. "プログラム名 LTH_BDCDATA-DYNPRO = IW_DYNPRO. "DYNPRO番号 LTH_BDCDATA-DYNBEGIN = CNS_X. "DYNPRO開始:X APPEND LTH_BDCDATA TO TD_BDCDATA. ENDFORM. " BDC_DYNPRO *&---------------------------------------------------------------------* *& FORM BDC_FIELD *&---------------------------------------------------------------------* * 項目と値のセット *----------------------------------------------------------------------* * --> IW_FNAM 項目名 * --> IW_FVAL 項目値 *----------------------------------------------------------------------* FORM BDC_FIELD USING IW_FNAM TYPE ANY IW_FVAL TYPE ANY. DATA: LTH_BDCDATA TYPE BDCDATA. LTH_BDCDATA-FNAM = IW_FNAM. "項目名 LTH_BDCDATA-FVAL = IW_FVAL. "項目値 APPEND LTH_BDCDATA TO TD_BDCDATA. ENDFORM. "BDC_FIELD *&---------------------------------------------------------------------* *& FORM BDC_DATA_CREATE *&---------------------------------------------------------------------* * バッチインプットデータ格納 *----------------------------------------------------------------------* FORM BDC_DATA_CREATE. *** ADD 20091117 0002 ST DATA: LW_DATAB TYPE D, LW_DATBI TYPE D, LW_DATAB_C TYPE C LENGTH 10, LW_DATBI_C TYPE C LENGTH 10. *** ADD 20091117 0002 END *** ADD 20091117 0002 ST *----- 日付をユーザ書式に変換 CLEAR:LW_DATAB, LW_DATBI. LW_DATAB = TH_INFORECORD-ZDATE_AVAIL_F. LW_DATBI = TH_INFORECORD-ZDATE_AVAIL_E. WRITE:LW_DATAB TO LW_DATAB_C, LW_DATBI TO LW_DATBI_C. *** ADD 20091117 0002 END *----- 調達タイプF・新規の場合 --------------------------------- IF TH_INFORECORD-BESKZ = CNS_BESKZ_F AND TH_INFORECORD-MODE = CNS_ADD. * FIRST SCREEN 100 PERFORM BDC_DYNPRO USING 'SAPMM06I' '0100'. PERFORM BDC_FIELD USING: 'BDC_CURSOR' 'EINA-LIFNR', 'BDC_OKCODE' '/00', 'EINA-LIFNR' TH_INFORECORD-LIFNR, 'EINA-MATNR' TH_INFORECORD-ZMATNR, 'EINE-EKORG' TH_INFORECORD-EKORG, 'EINE-WERKS' SPACE, 'EINA-INFNR' SPACE. IF TH_INFORECORD-MMTYPE = CNS_STD. "標準の場合 PERFORM BDC_FIELD USING 'RM06I-NORMB' CNS_X. ELSEIF TH_INFORECORD-MMTYPE = CNS_OUT. "外注の場合 PERFORM BDC_FIELD USING 'RM06I-LOHNB' CNS_X. ENDIF. * NEXT SCREEN 101 PERFORM BDC_DYNPRO USING 'SAPMM06I' '0101'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'EINA-MAHN1', 'BDC_OKCODE' '=EINE'. * NEXT SCREEN 102 PERFORM BDC_DYNPRO USING 'SAPMM06I' '0102'. *** MOD 20091217 0003 ST * PERFORM BDC_FIELD USING : * 'BDC_CURSOR' 'EINE-MEPRF', * 'BDC_OKCODE' 'KO', * 'EINE-APLFZ' TH_INFORECORD-APLFZ, * 'EINE-NORBM' TH_INFORECORD-NORBM, * 'EINE-MWSKZ' TH_INFORECORD-MWSKZ, * 'EINE-NETPR' TH_INFORECORD-ZWERTB0, * 'EINE-WAERS' TH_INFORECORD-WAERS, * 'EINE-PEINH' TH_INFORECORD-ZEPEIN, * 'EINE-BPRME' TH_INFORECORD-ZBBPRM, * 'EINE-MEPRF' TH_INFORECORD-MEPRF, * 'EINE-EKGRP' TH_INFORECORD-EKGRP. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'EINE-MEPRF', 'BDC_OKCODE' 'KO', 'EINE-APLFZ' TH_INFORECORD-APLFZ, 'EINE-NORBM' TH_INFORECORD-NORBM, 'EINE-MWSKZ' TH_INFORECORD-MWSKZ. IF TH_INFORECORD-EKORG = ST_CHGLOGIC-EKORG. PERFORM BDC_FIELD USING : 'EINE-BSTAE' ST_CHGLOGIC-BSTAE. IF TH_INFORECORD-ZWERTB0 = 0. PERFORM BDC_FIELD USING : 'EINE-NETPR' '1'. "←ダミー金額設定 ELSE. PERFORM BDC_FIELD USING : 'EINE-NETPR' TH_INFORECORD-ZWERTB0. ENDIF. ELSE. PERFORM BDC_FIELD USING : 'EINE-NETPR' TH_INFORECORD-ZWERTB0. ENDIF. PERFORM BDC_FIELD USING : 'EINE-WAERS' TH_INFORECORD-WAERS, 'EINE-PEINH' TH_INFORECORD-ZEPEIN, 'EINE-BPRME' TH_INFORECORD-ZBBPRM, 'EINE-MEPRF' TH_INFORECORD-MEPRF, 'EINE-EKGRP' TH_INFORECORD-EKGRP. *** MOD 20091217 0003 END * NEXT SCREEN 201 PERFORM BDC_DYNPRO USING 'SAPMV13A' '0201'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'RV13A-DATAB', 'BDC_OKCODE' '/00', *** UPD 20091117 0002 ST * 'RV13A-DATAB' TH_INFORECORD-ZDATE_AVAIL_F, * 'RV13A-DATBI' TH_INFORECORD-ZDATE_AVAIL_E. 'RV13A-DATAB' LW_DATAB_C, 'RV13A-DATBI' LW_DATBI_C. *** UPD 20091117 0002 END *** ADD 20091217 0003 ST IF TH_INFORECORD-EKORG = ST_CHGLOGIC-EKORG AND TH_INFORECORD-ZWERTB0 = 0. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'KONP-KBETR(01)', 'BDC_OKCODE' '/00', 'KONP-KONWA(01)' TH_INFORECORD-WAERS, 'KONP-KPEIN(01)' TH_INFORECORD-ZEPEIN, 'KONP-KMEIN(01)' TH_INFORECORD-ZBBPRM, 'KONP-KBETR(01)' '0'. "←ダミー金額解除 ENDIF. *** ADD 20091217 0003 END PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'KONP-KBETR(01)', 'BDC_OKCODE' '/00', 'KONP-KONWA(01)' TH_INFORECORD-WAERS, 'KONP-KPEIN(01)' TH_INFORECORD-ZEPEIN, 'KONP-KMEIN(01)' TH_INFORECORD-ZBBPRM, 'KONP-KBETR(01)' TH_INFORECORD-ZPB00. PERFORM BDC_CONDITION USING TH_INFORECORD. *----- 調達タイプF・変更の場合 --------------------------------- ELSEIF TH_INFORECORD-BESKZ = CNS_BESKZ_F AND TH_INFORECORD-MODE = CNS_MOD. * FIRST SCREEN 100 PERFORM BDC_DYNPRO USING 'SAPMM06I' '0100'. PERFORM BDC_FIELD USING: 'BDC_CURSOR' 'EINA-LIFNR', 'BDC_OKCODE' '/00', 'EINA-LIFNR' TH_INFORECORD-LIFNR, 'EINA-MATNR' TH_INFORECORD-ZMATNR, 'EINE-EKORG' TH_INFORECORD-EKORG, 'EINE-WERKS' SPACE, 'EINA-INFNR' SPACE. IF TH_INFORECORD-MMTYPE = CNS_STD. "標準の場合 PERFORM BDC_FIELD USING 'RM06I-NORMB' CNS_X. ELSEIF TH_INFORECORD-MMTYPE = CNS_OUT. "外注の場合 PERFORM BDC_FIELD USING 'RM06I-LOHNB' CNS_X. ENDIF. * NEXT SCREEN 101 PERFORM BDC_DYNPRO USING 'SAPMM06I' '0101'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'EINA-MAHN1', 'BDC_OKCODE' '=KO'. * NEXT SCREEN 000 PERFORM BDC_DYNPRO USING 'SAPLV14A' '0102'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'BLOCK1', 'BDC_OKCODE' '=NEWD'. * NEXT SCREEN 201 PERFORM BDC_DYNPRO USING 'SAPMV13A' '0201'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'RV13A-DATAB', 'BDC_OKCODE' '/00', *** UPD 20091117 0002 ST * 'RV13A-DATAB' TH_INFORECORD-ZDATE_AVAIL_F, * 'RV13A-DATBI' TH_INFORECORD-ZDATE_AVAIL_E. 'RV13A-DATAB' LW_DATAB_C, 'RV13A-DATBI' LW_DATBI_C. *** UPD 20091117 0002 END PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'KONP-KBETR(01)', 'BDC_OKCODE' '/00', 'KONP-KONWA(01)' TH_INFORECORD-WAERS, 'KONP-KPEIN(01)' TH_INFORECORD-ZEPEIN, 'KONP-KMEIN(01)' TH_INFORECORD-ZBBPRM, 'KONP-KBETR(01)' TH_INFORECORD-ZPB00. PERFORM BDC_CONDITION USING TH_INFORECORD. *----- 調達タイプE・新規の場合 --------------------------------- ELSEIF TH_INFORECORD-BESKZ = CNS_BESKZ_E AND TH_INFORECORD-MODE = CNS_ADD. * FIRST SCREEN 100 PERFORM BDC_DYNPRO USING 'SAPMM06I' '0100'. PERFORM BDC_FIELD USING: 'BDC_CURSOR' 'EINA-LIFNR', 'BDC_OKCODE' '/00', 'EINA-LIFNR' TH_INFORECORD-LIFNR, 'EINA-MATNR' SPACE, 'EINE-EKORG' TH_INFORECORD-EKORG, 'EINE-WERKS' SPACE, 'EINA-INFNR' SPACE. IF TH_INFORECORD-MMTYPE = CNS_STD. "標準の場合 PERFORM BDC_FIELD USING 'RM06I-NORMB' CNS_X. ELSEIF TH_INFORECORD-MMTYPE = CNS_OUT. "外注の場合 PERFORM BDC_FIELD USING 'RM06I-LOHNB' CNS_X. ENDIF. * NEXT SCREEN 101 PERFORM BDC_DYNPRO USING 'SAPMM06I' '0101'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'EINA-MEINS', 'BDC_OKCODE' '=EINE', 'EINA-TXZ01' TH_INFORECORD-TXZ01, 'EINA-MATKL' TH_INFORECORD-MATKL, 'EINA-URZZT' TH_INFORECORD-ZMATNR+0(16), 'EINA-SORTL' TH_INFORECORD-ZMATNR+0(10), 'EINA-MEINS' TH_INFORECORD-ZBBPRM. "発注単位対応20090520 * NEXT SCREEN 102 PERFORM BDC_DYNPRO USING 'SAPMM06I' '0102'. *** MOD 20091217 0003 ST * PERFORM BDC_FIELD USING : * 'BDC_CURSOR' 'EINE-EKKOL', * 'BDC_OKCODE' 'KO', * 'EINE-APLFZ' TH_INFORECORD-APLFZ, * 'EINE-NORBM' TH_INFORECORD-NORBM, * 'EINE-MWSKZ' TH_INFORECORD-MWSKZ, * 'EINE-NETPR' TH_INFORECORD-ZWERTB0, * 'EINE-WAERS' TH_INFORECORD-WAERS, * 'EINE-PEINH' TH_INFORECORD-ZEPEIN, * 'EINE-BPRME' TH_INFORECORD-ZBBPRM, * 'EINE-MEPRF' TH_INFORECORD-MEPRF, * 'EINE-EKGRP' TH_INFORECORD-EKGRP. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'EINE-EKKOL', 'BDC_OKCODE' 'KO', 'EINE-APLFZ' TH_INFORECORD-APLFZ, 'EINE-NORBM' TH_INFORECORD-NORBM, 'EINE-MWSKZ' TH_INFORECORD-MWSKZ. IF TH_INFORECORD-EKORG = ST_CHGLOGIC-EKORG. PERFORM BDC_FIELD USING : 'EINE-BSTAE' ST_CHGLOGIC-BSTAE. IF TH_INFORECORD-ZWERTB0 = 0. PERFORM BDC_FIELD USING : 'EINE-NETPR' '1'. "←ダミー金額設定 ELSE. PERFORM BDC_FIELD USING : 'EINE-NETPR' TH_INFORECORD-ZWERTB0. ENDIF. ELSE. PERFORM BDC_FIELD USING : 'EINE-NETPR' TH_INFORECORD-ZWERTB0. ENDIF. PERFORM BDC_FIELD USING : 'EINE-WAERS' TH_INFORECORD-WAERS, 'EINE-PEINH' TH_INFORECORD-ZEPEIN, 'EINE-BPRME' TH_INFORECORD-ZBBPRM, 'EINE-MEPRF' TH_INFORECORD-MEPRF, 'EINE-EKGRP' TH_INFORECORD-EKGRP. *** MOD 20091217 0003 END * NEXT SCREEN 201 PERFORM BDC_DYNPRO USING 'SAPMV13A' '0201'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'RV13A-DATAB', 'BDC_OKCODE' '/00', *** UPD 20091117 0002 ST * 'RV13A-DATAB' TH_INFORECORD-ZDATE_AVAIL_F, * 'RV13A-DATBI' TH_INFORECORD-ZDATE_AVAIL_E. 'RV13A-DATAB' LW_DATAB_C, 'RV13A-DATBI' LW_DATBI_C. *** UPD 20091117 0002 END *** ADD 20091217 0003 ST IF TH_INFORECORD-EKORG = ST_CHGLOGIC-EKORG AND TH_INFORECORD-ZWERTB0 = 0. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'KONP-KBETR(01)', 'BDC_OKCODE' '/00', 'KONP-KONWA(01)' TH_INFORECORD-WAERS, 'KONP-KPEIN(01)' TH_INFORECORD-ZEPEIN, 'KONP-KMEIN(01)' TH_INFORECORD-ZBBPRM, 'KONP-KBETR(01)' '0'. "←ダミー金額解除 ENDIF. *** ADD 20091217 0003 END PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'KONP-KBETR(01)', 'BDC_OKCODE' '/00', 'KONP-KONWA(01)' TH_INFORECORD-WAERS, 'KONP-KPEIN(01)' TH_INFORECORD-ZEPEIN, 'KONP-KMEIN(01)' TH_INFORECORD-ZBBPRM, 'KONP-KBETR(01)' TH_INFORECORD-ZPB00. PERFORM BDC_CONDITION USING TH_INFORECORD. *----- 調達タイプE・変更の場合 --------------------------------- ELSEIF TH_INFORECORD-BESKZ = CNS_BESKZ_E AND TH_INFORECORD-MODE = CNS_MOD. * FIRST SCREEN 100 PERFORM BDC_DYNPRO USING 'SAPMM06I' '0100'. PERFORM BDC_FIELD USING: 'BDC_CURSOR' 'EINA-LIFNR', 'BDC_OKCODE' '/00', 'EINA-LIFNR' TH_INFORECORD-LIFNR, 'EINA-MATNR' SPACE, 'EINE-EKORG' TH_INFORECORD-EKORG, 'EINE-WERKS' SPACE, 'EINA-INFNR' TH_INFORECORD-INFNR. IF TH_INFORECORD-MMTYPE = CNS_STD. "標準の場合 PERFORM BDC_FIELD USING 'RM06I-NORMB' CNS_X. ELSEIF TH_INFORECORD-MMTYPE = CNS_OUT. "外注の場合 PERFORM BDC_FIELD USING 'RM06I-LOHNB' CNS_X. ENDIF. * NEXT SCREEN 101 PERFORM BDC_DYNPRO USING 'SAPMM06I' '0101'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'EINA-TXZ01', 'BDC_OKCODE' '=KO'. * NEXT SCREEN 102 PERFORM BDC_DYNPRO USING 'SAPLV14A' '0102'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'VAKE-DATAB(01)', 'BDC_OKCODE' '=NEWD'. * NEXT SCREEN 201 PERFORM BDC_DYNPRO USING 'SAPMV13A' '0201'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'RV13A-DATAB', 'BDC_OKCODE' '/00', *** UPD 20091117 0002 ST * 'RV13A-DATAB' TH_INFORECORD-ZDATE_AVAIL_F, * 'RV13A-DATBI' TH_INFORECORD-ZDATE_AVAIL_E. 'RV13A-DATAB' LW_DATAB_C, 'RV13A-DATBI' LW_DATBI_C. *** UPD 20091117 0002 END PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'KONP-KBETR(01)', 'BDC_OKCODE' '/00', 'KONP-KONWA(01)' TH_INFORECORD-WAERS, 'KONP-KPEIN(01)' TH_INFORECORD-ZEPEIN, 'KONP-KMEIN(01)' TH_INFORECORD-ZBBPRM, 'KONP-KBETR(01)' TH_INFORECORD-ZPB00. PERFORM BDC_CONDITION USING TH_INFORECORD. ENDIF. ENDFORM. " BDC_DATA_CREATE. *&---------------------------------------------------------------------* *& FORM CONV_CURR_EXTERNAL *&---------------------------------------------------------------------* * 金額書式変換(内部→外部) *----------------------------------------------------------------------* * -->IW_AMOUNT 金額(内部) * -->IW_WAERS 通貨コード * <--OW_AMOUNT 金額(外部) *----------------------------------------------------------------------* FORM CONV_CURR_EXTERNAL USING IW_AMOUNT TYPE ANY IW_WAERS TYPE ANY CHANGING OW_AMOUNT TYPE BAPICURR-BAPICURR. DATA LW_WAERS TYPE TCURC-WAERS. LW_WAERS = IW_WAERS. CALL FUNCTION 'BAPI_CURRENCY_CONV_TO_EXTERNAL' EXPORTING CURRENCY = LW_WAERS AMOUNT_INTERNAL = IW_AMOUNT IMPORTING AMOUNT_EXTERNAL = OW_AMOUNT. ENDFORM. " CONV_CURR_EXTERNAL *&---------------------------------------------------------------------* *& FORM BAPI_UPDATE_MM *&---------------------------------------------------------------------* * TEXT *----------------------------------------------------------------------* * -->I IST_INFORECORD TEXT * <--OW_TEXT TEXT *----------------------------------------------------------------------* FORM BAPI_UPDATE_MM USING IST_INFORECORD TYPE TYP_INFORECORD CHANGING OW_TEXT TYPE ANY OW_RESULT_TYPE TYPE ANY. *----- BAPI:構造 DATA: LST_HEADER TYPE BAPIMATHEAD, "ヘッダ LST_VALDAT TYPE BAPI_MBEW, "評価データ LST_VALDATX TYPE BAPI_MBEWX, "評価データ構造 LST_RETURN TYPE BAPIRET2. "リターン構造 *----- BAPI:リターンテーブル DATA: LTD_RETURNT TYPE TABLE OF BAPI_MATRETURN2. *----- BAPI: DATA: LST_CURRENCY_DECIMALS TYPE BAPI1090_1. *----- 変数 *** ADD 20100210 0004 ST DATA: LW_PRICE1_EX TYPE BAPICURR-BAPICURR. "予定原価1(外部形式) *** ADD 20100210 0004 END DATA: LW_PRICE1 TYPE BAPI_MBEW-PLNDPRICE1. "予定計画原価1 * DATA: LW_PRICE2 TYPE BSIK-DMBTR. DATA: LW_PRICE2 TYPE BAPI_MBEW-PLNDPRICE1. DATA: LW_SUBRC TYPE SY-SUBRC. DATA: LW_MEINS TYPE MARA-MEINS. "基本数量単位 DATA: LW_UP TYPE SMEINH-UMREZ, "単位変換用分子 LW_DOWN TYPE SMEINH-UMREN. "単位変換用分母 *----- 品目マスタ(原価計算)取得 REFRESH TD_MBEW. SELECT MBEW~MATNR MBEW~BWKEY MBEW~BWTAR MBEW~ZPLP1 MBEW~ZPLD1 MBEW~PEINH T001~WAERS INTO TABLE TD_MBEW FROM MBEW INNER JOIN T001K ON MBEW~BWKEY = T001K~BWKEY INNER JOIN T001 ON T001K~BUKRS = T001~BUKRS WHERE MBEW~MATNR = IST_INFORECORD-ZMATNR AND MBEW~BWKEY = P_WERKS AND MBEW~BWTAR = SPACE. SORT TD_MBEW BY MATNR BWKEY BWTAR ASCENDING. CLEAR TH_MBEW. READ TABLE TD_MBEW INTO TH_MBEW BINARY SEARCH WITH KEY MATNR = IST_INFORECORD-ZMATNR BWKEY = P_WERKS BWTAR = SPACE. IF SY-SUBRC <> 0. *----- エラー * 原価計算ビューが存在しません(品目コード= &1) MESSAGE S106 WITH IST_INFORECORD-ZMATNR INTO OW_TEXT. OW_RESULT_TYPE = CNS_E. EXIT. ENDIF. *----- 品目マスタ(基本数量単位)取得 SELECT SINGLE MEINS INTO LW_MEINS FROM MARA WHERE MATNR = IST_INFORECORD-ZMATNR. IF SY-SUBRC <> 0. * 基本数量単位が存在しません (品目コード= &1) MESSAGE S109 WITH IST_INFORECORD-ZMATNR INTO OW_TEXT. OW_RESULT_TYPE = CNS_E. EXIT. ENDIF. *----- 数量単位変換:[品目マスタの基本数量単位にあわせる。例えばPC⇔KG] PERFORM CONVERT_MATERIAL_UNIT USING IST_INFORECORD-ZMATNR IST_INFORECORD-ZBBPRM LW_MEINS CHANGING LW_UP LW_DOWN LW_SUBRC. IF LW_SUBRC <> 0. * 単位変換エラー(前単位= &1,後単位= &2) MESSAGE S120 WITH TH_ZGMMT0003-ZBBPRM LW_MEINS INTO OW_TEXT. OW_RESULT_TYPE = CNS_E. EXIT. ENDIF. *----- ヘッダ CLEAR LST_HEADER. LST_HEADER-MATERIAL = IST_INFORECORD-ZMATNR. LST_HEADER-COST_VIEW = CNS_X. **----- データ CLEAR: LST_VALDAT, LST_VALDATX. LST_VALDAT-VAL_AREA = TH_MBEW-BWKEY. "評価レベル(キー項目) LST_VALDAT-VAL_TYPE = TH_MBEW-BWTAR. "評価タイプ(キー項目) *----- 予定計画原価1 IF IST_INFORECORD-ZEPEIN > 0. "0除算対応 LW_PRICE1 = ( IST_INFORECORD-ZWERTB0 + IST_INFORECORD-ZOA1 + IST_INFORECORD-ZOB1 + IST_INFORECORD-ZOD1 ) * TH_MBEW-PEINH * LW_UP / ( IST_INFORECORD-ZEPEIN * LW_DOWN ). ENDIF. *----- 通貨換算 IF IST_INFORECORD-WAERS = TH_MBEW-WAERS. LST_VALDAT-PLNDPRICE1 = LW_PRICE1. ELSE. CLEAR LW_PRICE2. *** ADD 20100210 0004 ST *----- 金額を内部形式にしてから通貨換算を行う LW_PRICE1_EX = LW_PRICE1. CLEAR LW_PRICE1. PERFORM CONV_CURR_INTERNAL USING LW_PRICE1_EX IST_INFORECORD-WAERS 23 CHANGING LW_PRICE1. *** ADD 20100210 0004 END PERFORM CONV_CURR USING TH_INFORECORD-ZDATE_AVAIL_F LW_PRICE1 IST_INFORECORD-WAERS TH_MBEW-WAERS CHANGING LW_PRICE2 LW_SUBRC. IF LW_SUBRC <> 0. * 通貨変換エラー(品目コード= &1) MESSAGE S130 WITH IST_INFORECORD-ZMATNR INTO OW_TEXT. OW_RESULT_TYPE = CNS_E. EXIT. ENDIF. PERFORM CONV_CURR_EXTERNAL USING LW_PRICE2 TH_MBEW-WAERS CHANGING LST_VALDAT-PLNDPRICE1. ENDIF. *----- 通貨: 小数点以下桁数 CALL FUNCTION 'BAPI_CURRENCY_GETDECIMALS' EXPORTING CURRENCY = TH_MBEW-WAERS IMPORTING CURRENCY_DECIMALS = LST_CURRENCY_DECIMALS. *----- 通貨: 小数点以下桁数まで四捨五入 CALL FUNCTION 'ROUND' EXPORTING DECIMALS = LST_CURRENCY_DECIMALS-CURDECIMALS INPUT = LST_VALDAT-PLNDPRICE1 SIGN = 'X ' IMPORTING OUTPUT = LST_VALDAT-PLNDPRICE1 EXCEPTIONS INPUT_INVALID = 1 OVERFLOW = 2 TYPE_INVALID = 3 OTHERS = 4. IF SY-SUBRC <> 0. * 汎用モジュールエラーが発生しました(汎用モジュール = &1) MESSAGE S190 WITH 'ROUND' INTO OW_TEXT. OW_RESULT_TYPE = CNS_E. EXIT. ENDIF. *----- 有効開始日(予定計画原価1) LST_VALDAT-PLNDPRDATE1 = IST_INFORECORD-ZDATE_AVAIL_F. *----- 予定計画原価2 *----- 金額書式変換(内部→外部) PERFORM CONV_CURR_EXTERNAL USING TH_MBEW-ZPLP1 TH_MBEW-WAERS CHANGING LST_VALDAT-PLNDPRICE2. "@2/7 *----- 有効開始日(予定計画原価2) LST_VALDAT-PLNDPRDATE2 = TH_MBEW-ZPLD1. *----- 更新フラグ LST_VALDATX-VAL_AREA = TH_MBEW-BWKEY. LST_VALDATX-VAL_TYPE = TH_MBEW-BWTAR. LST_VALDATX-PLNDPRICE1 = CNS_X. LST_VALDATX-PLNDPRDATE1 = CNS_X. LST_VALDATX-PLNDPRICE2 = CNS_X. LST_VALDATX-PLNDPRDATE2 = CNS_X. *----- 品目データ変更 CALL FUNCTION 'BAPI_MATERIAL_SAVEDATA' EXPORTING HEADDATA = LST_HEADER VALUATIONDATA = LST_VALDAT VALUATIONDATAX = LST_VALDATX IMPORTING RETURN = LST_RETURN TABLES RETURNMESSAGES = LTD_RETURNT. IF LST_RETURN-TYPE = CNS_E. CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. OW_RESULT_TYPE = CNS_E. ELSE. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'. OW_RESULT_TYPE = CNS_N. ENDIF. OW_TEXT = LST_RETURN-MESSAGE. ENDFORM. " BAPI_UPDATE_MM *&---------------------------------------------------------------------* *& FORM BDC_CONDITION *&---------------------------------------------------------------------* * 条件タイプのBDC *----------------------------------------------------------------------* * -->IST_INFORECORD INFORECORD *----------------------------------------------------------------------* FORM BDC_CONDITION USING IST_INFORECORD TYPE TYP_INFORECORD. IF IST_INFORECORD-ZOA1 <> 0. PERFORM BDC_DYNPRO USING 'SAPMV13A' '0201'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'KONP-KSCHL(02)', 'BDC_OKCODE' '=EINF'. PERFORM BDC_DYNPRO USING 'SAPMV13A' '0201'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'KONP-KSCHL(02)', 'BDC_OKCODE' '/00', 'KONP-KSCHL(02)' 'ZOA1', 'KONP-KONWA(02)' IST_INFORECORD-WAERS, 'KONP-KPEIN(02)' IST_INFORECORD-ZEPEIN, 'KONP-KMEIN(02)' IST_INFORECORD-ZBBPRM, 'KONP-KBETR(02)' IST_INFORECORD-ZOA1. PERFORM BDC_DYNPRO USING 'SAPMV13A' '0201'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'KONP-KSCHL(02)', 'BDC_OKCODE' '=PDAT'. PERFORM BDC_DYNPRO USING 'SAPMV13A' '0300'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'KONP-LIFNR', 'BDC_OKCODE' '/00', 'KONP-LIFNR' W_LIFNR_ZOA1. PERFORM BDC_DYNPRO USING 'SAPMV13A' '0300'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'KONP-KBETR', 'BDC_OKCODE' '=KPOS'. ENDIF. IF IST_INFORECORD-ZOB1 <> 0. PERFORM BDC_DYNPRO USING 'SAPMV13A' '0201'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'KONP-KSCHL(02)', 'BDC_OKCODE' '=EINF'. PERFORM BDC_DYNPRO USING 'SAPMV13A' '0201'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'KONP-KSCHL(02)', 'BDC_OKCODE' '/00', 'KONP-KSCHL(02)' 'ZOB1', 'KONP-KONWA(02)' IST_INFORECORD-WAERS, 'KONP-KPEIN(02)' IST_INFORECORD-ZEPEIN, 'KONP-KMEIN(02)' IST_INFORECORD-ZBBPRM, 'KONP-KBETR(02)' IST_INFORECORD-ZOB1. PERFORM BDC_DYNPRO USING 'SAPMV13A' '0201'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'KONP-KSCHL(02)', 'BDC_OKCODE' '=PDAT'. PERFORM BDC_DYNPRO USING 'SAPMV13A' '0300'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'KONP-LIFNR', 'BDC_OKCODE' '/00', 'KONP-LIFNR' W_LIFNR_ZOB1. PERFORM BDC_DYNPRO USING 'SAPMV13A' '0300'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'KONP-KBETR', 'BDC_OKCODE' '=KPOS'. ENDIF. IF IST_INFORECORD-ZOD1 <> 0. PERFORM BDC_DYNPRO USING 'SAPMV13A' '0201'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'KONP-KSCHL(02)', 'BDC_OKCODE' '=EINF'. PERFORM BDC_DYNPRO USING 'SAPMV13A' '0201'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'KONP-KSCHL(02)', 'BDC_OKCODE' '/00', 'KONP-KSCHL(02)' 'ZOD1', 'KONP-KONWA(02)' IST_INFORECORD-WAERS, 'KONP-KPEIN(02)' IST_INFORECORD-ZEPEIN, 'KONP-KMEIN(02)' IST_INFORECORD-ZBBPRM, 'KONP-KBETR(02)' IST_INFORECORD-ZOD1. PERFORM BDC_DYNPRO USING 'SAPMV13A' '0201'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'KONP-KSCHL(02)', 'BDC_OKCODE' '=PDAT'. PERFORM BDC_DYNPRO USING 'SAPMV13A' '0300'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'KONP-LIFNR', 'BDC_OKCODE' '/00', 'KONP-LIFNR' W_LIFNR_ZOD1. PERFORM BDC_DYNPRO USING 'SAPMV13A' '0300'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'KONP-KBETR', 'BDC_OKCODE' '=KPOS'. ENDIF. IF IST_INFORECORD-ZA01 <> 0. PERFORM BDC_DYNPRO USING 'SAPMV13A' '0201'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'KONP-KSCHL(02)', 'BDC_OKCODE' '=EINF'. PERFORM BDC_DYNPRO USING 'SAPMV13A' '0201'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'KONP-KSCHL(02)', 'BDC_OKCODE' '/00', 'KONP-KSCHL(02)' 'ZA01', 'KONP-KONWA(02)' IST_INFORECORD-WAERS, 'KONP-KPEIN(02)' IST_INFORECORD-ZEPEIN, 'KONP-KMEIN(02)' IST_INFORECORD-ZBBPRM, 'KONP-KBETR(02)' IST_INFORECORD-ZA01. ENDIF. IF IST_INFORECORD-ZA02 <> 0. PERFORM BDC_DYNPRO USING 'SAPMV13A' '0201'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'KONP-KSCHL(02)', 'BDC_OKCODE' '=EINF'. PERFORM BDC_DYNPRO USING 'SAPMV13A' '0201'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'KONP-KSCHL(02)', 'BDC_OKCODE' '/00', 'KONP-KSCHL(02)' 'ZA02', 'KONP-KONWA(02)' IST_INFORECORD-WAERS, 'KONP-KPEIN(02)' IST_INFORECORD-ZEPEIN, 'KONP-KMEIN(02)' IST_INFORECORD-ZBBPRM, 'KONP-KBETR(02)' IST_INFORECORD-ZA02. ENDIF. IF IST_INFORECORD-ZA03 <> 0. PERFORM BDC_DYNPRO USING 'SAPMV13A' '0201'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'KONP-KSCHL(02)', 'BDC_OKCODE' '=EINF'. PERFORM BDC_DYNPRO USING 'SAPMV13A' '0201'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'KONP-KSCHL(02)', 'BDC_OKCODE' '/00', 'KONP-KSCHL(02)' 'ZA03', 'KONP-KONWA(02)' IST_INFORECORD-WAERS, 'KONP-KPEIN(02)' IST_INFORECORD-ZEPEIN, 'KONP-KMEIN(02)' IST_INFORECORD-ZBBPRM, 'KONP-KBETR(02)' IST_INFORECORD-ZA03. ENDIF. IF IST_INFORECORD-ZA04 <> 0. PERFORM BDC_DYNPRO USING 'SAPMV13A' '0201'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'KONP-KSCHL(02)', 'BDC_OKCODE' '=EINF'. PERFORM BDC_DYNPRO USING 'SAPMV13A' '0201'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'KONP-KSCHL(02)', 'BDC_OKCODE' '/00', 'KONP-KSCHL(02)' 'ZA04', 'KONP-KONWA(02)' IST_INFORECORD-WAERS, 'KONP-KPEIN(02)' IST_INFORECORD-ZEPEIN, 'KONP-KMEIN(02)' IST_INFORECORD-ZBBPRM, 'KONP-KBETR(02)' IST_INFORECORD-ZA04. ENDIF. IF IST_INFORECORD-ZA05 <> 0. PERFORM BDC_DYNPRO USING 'SAPMV13A' '0201'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'KONP-KSCHL(02)', 'BDC_OKCODE' '=EINF'. PERFORM BDC_DYNPRO USING 'SAPMV13A' '0201'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'KONP-KSCHL(02)', 'BDC_OKCODE' '/00', 'KONP-KSCHL(02)' 'ZA05', 'KONP-KONWA(02)' IST_INFORECORD-WAERS, 'KONP-KPEIN(02)' IST_INFORECORD-ZEPEIN, 'KONP-KMEIN(02)' IST_INFORECORD-ZBBPRM, 'KONP-KBETR(02)' IST_INFORECORD-ZA05. ENDIF. IF IST_INFORECORD-ZA06 <> 0. PERFORM BDC_DYNPRO USING 'SAPMV13A' '0201'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'KONP-KSCHL(02)', 'BDC_OKCODE' '=EINF'. PERFORM BDC_DYNPRO USING 'SAPMV13A' '0201'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'KONP-KSCHL(02)', 'BDC_OKCODE' '/00', 'KONP-KSCHL(02)' 'ZA06', 'KONP-KONWA(02)' IST_INFORECORD-WAERS, 'KONP-KPEIN(02)' IST_INFORECORD-ZEPEIN, 'KONP-KMEIN(02)' IST_INFORECORD-ZBBPRM, 'KONP-KBETR(02)' IST_INFORECORD-ZA06. ENDIF. IF IST_INFORECORD-ZA07 <> 0. PERFORM BDC_DYNPRO USING 'SAPMV13A' '0201'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'KONP-KSCHL(02)', 'BDC_OKCODE' '=EINF'. PERFORM BDC_DYNPRO USING 'SAPMV13A' '0201'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'KONP-KSCHL(02)', 'BDC_OKCODE' '/00', 'KONP-KSCHL(02)' 'ZA07', 'KONP-KONWA(02)' IST_INFORECORD-WAERS, 'KONP-KPEIN(02)' IST_INFORECORD-ZEPEIN, 'KONP-KMEIN(02)' IST_INFORECORD-ZBBPRM, 'KONP-KBETR(02)' IST_INFORECORD-ZA07. ENDIF. IF IST_INFORECORD-ZA08 <> 0. PERFORM BDC_DYNPRO USING 'SAPMV13A' '0201'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'KONP-KSCHL(02)', 'BDC_OKCODE' '=EINF'. PERFORM BDC_DYNPRO USING 'SAPMV13A' '0201'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'KONP-KSCHL(02)', 'BDC_OKCODE' '/00', 'KONP-KSCHL(02)' 'ZA08', 'KONP-KONWA(02)' IST_INFORECORD-WAERS, 'KONP-KPEIN(02)' IST_INFORECORD-ZEPEIN, 'KONP-KMEIN(02)' IST_INFORECORD-ZBBPRM, 'KONP-KBETR(02)' IST_INFORECORD-ZA08. ENDIF. IF IST_INFORECORD-ZA09 <> 0. PERFORM BDC_DYNPRO USING 'SAPMV13A' '0201'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'KONP-KSCHL(02)', 'BDC_OKCODE' '=EINF'. PERFORM BDC_DYNPRO USING 'SAPMV13A' '0201'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'KONP-KSCHL(02)', 'BDC_OKCODE' '/00', 'KONP-KSCHL(02)' 'ZA09', 'KONP-KONWA(02)' IST_INFORECORD-WAERS, 'KONP-KPEIN(02)' IST_INFORECORD-ZEPEIN, 'KONP-KMEIN(02)' IST_INFORECORD-ZBBPRM, 'KONP-KBETR(02)' IST_INFORECORD-ZA09. ENDIF. IF IST_INFORECORD-ZOC1 <> 0. PERFORM BDC_DYNPRO USING 'SAPMV13A' '0201'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'KONP-KSCHL(02)', 'BDC_OKCODE' '=EINF'. PERFORM BDC_DYNPRO USING 'SAPMV13A' '0201'. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'KONP-KSCHL(02)', 'BDC_OKCODE' '/00', 'KONP-KSCHL(02)' 'ZOC1', 'KONP-KONWA(02)' IST_INFORECORD-WAERS, 'KONP-KPEIN(02)' IST_INFORECORD-ZEPEIN, 'KONP-KMEIN(02)' IST_INFORECORD-ZBBPRM, 'KONP-KBETR(02)' IST_INFORECORD-ZOC1. ENDIF. PERFORM BDC_FIELD USING : 'BDC_CURSOR' 'RV13A-DATAB', 'BDC_OKCODE' '=SICH'. ENDFORM. " BDC_CONDITION *&---------------------------------------------------------------------* *& Form CONV_CURR *&---------------------------------------------------------------------* * 通貨換算 *----------------------------------------------------------------------* * -->IW_DATE text * -->IW_PRICE1 text * -->IW_WAERS1 text * -->IW_WAERS2 text * <--OW_PRICE2 text * <--OW_SUBRC text *----------------------------------------------------------------------* FORM CONV_CURR USING IW_DATE TYPE ANY IW_PRICE1 TYPE ANY IW_WAERS1 TYPE ANY IW_WAERS2 TYPE ANY CHANGING OW_PRICE2 TYPE ANY OW_SUBRC TYPE ANY. DATA: LW_DATE TYPE SY-DATUM, * LW_PRICE1 TYPE BSIK-DMBTR, LW_PRICE1 TYPE BAPICURR-BAPICURR, LW_WAERS1 TYPE BSIK-WAERS, LW_WAERS2 TYPE BSIK-WAERS, * LW_PRICE2 TYPE BSIK-DMBTR. LW_PRICE2 TYPE BAPICURR-BAPICURR. LW_DATE = IW_DATE. LW_PRICE1 = IW_PRICE1. LW_WAERS1 = IW_WAERS1. LW_WAERS2 = IW_WAERS2. *----- 通貨換算 CALL FUNCTION 'CONVERT_TO_LOCAL_CURRENCY' EXPORTING DATE = LW_DATE FOREIGN_AMOUNT = LW_PRICE1 FOREIGN_CURRENCY = LW_WAERS1 LOCAL_CURRENCY = LW_WAERS2 TYPE_OF_RATE = 'P' "原価計画用標準標準換算レート IMPORTING LOCAL_AMOUNT = LW_PRICE2 EXCEPTIONS NO_RATE_FOUND = 1 "テーブル TCURR の換算レート未入力 OVERFLOW = 2 "LOCAL_AMOUNT 項目が小さすぎます NO_FACTORS_FOUND = 3 "TCURF に換算係数がありません NO_SPREAD_FOUND = 4 "テーブル TCURS に入力済のスプレッドなし DERIVED_2_TIMES = 5 "2 回以上派生する換算レートタイプ OTHERS = 6. "その他のエラー OW_SUBRC = SY-SUBRC. IF SY-SUBRC = 0. OW_PRICE2 = LW_PRICE2. ENDIF. ENDFORM. " CONV_CURR *&---------------------------------------------------------------------* *& Form GET_ZDATE_AVAIL_E *&---------------------------------------------------------------------* * 有効終了日取得 *----------------------------------------------------------------------* * -->P_TH_INFORECORD_ZDATE_AVAIL_F text * <--P_TH_INFORECORD_ZDATE_AVAIL_E text *----------------------------------------------------------------------* FORM GET_ZDATE_AVAIL_E USING IST_ZGMMT0003 TYPE ZGMMT0003 CHANGING OW_ZDATE_AVAIL_E TYPE ANY. DATA:LW_BUKRS TYPE BUKRS. DATA:LW_PERIV TYPE T001-PERIV. DATA: LW_DATE TYPE SY-DATUM. DATA:LW_COUNT TYPE I. *----- 会社コード取得(プラントから) SELECT SINGLE T001K~BUKRS INTO LW_BUKRS FROM T001K INNER JOIN T001W ON T001K~BWKEY = T001W~BWKEY WHERE T001W~WERKS = P_WERKS. *----- 会計年度バリアントを取得 SELECT SINGLE PERIV INTO LW_PERIV FROM T001 WHERE BUKRS = LW_BUKRS. *----- 会計年度の最終日を取得 CALL FUNCTION 'LAST_DAY_IN_YEAR_GET' EXPORTING I_DATE = IST_ZGMMT0003-ZDATE_AVAIL_F I_PERIV = LW_PERIV "日本は'V3' IMPORTING E_DATE = LW_DATE. *----- 有効終了日 SELECT COUNT( * ) INTO LW_COUNT FROM ZGMMT0003 WHERE ZMATNR = IST_ZGMMT0003-ZMATNR AND LIFNR = IST_ZGMMT0003-LIFNR AND EKORG = IST_ZGMMT0003-EKORG AND ZDATE_AVAIL_F > LW_DATE "年度最終日以降 AND XSIDEL <> CNS_X. IF LW_COUNT > 0 . OW_ZDATE_AVAIL_E = LW_DATE. ELSE. OW_ZDATE_AVAIL_E = CNS_99991231. ENDIF. ENDFORM. " GET_ZDATE_AVAIL_E *&---------------------------------------------------------------------* *& Form GET_TRANS_LIFNR *&---------------------------------------------------------------------* * 予定配送費用仕入先取得(汎用テーブル) *----------------------------------------------------------------------* FORM GET_TRANS_LIFNR . SELECT TEXT02 INTO W_LIFNR_ZOA1 UP TO 1 ROWS FROM ZGCMT0001 WHERE KEYNUM = CNS_KEYNUM_00083 AND XSIDEL <> CNS_X AND TEXT01 = 'ZOA1'. ENDSELECT. SELECT TEXT02 INTO W_LIFNR_ZOB1 UP TO 1 ROWS FROM ZGCMT0001 WHERE KEYNUM = CNS_KEYNUM_00083 AND XSIDEL <> CNS_X AND TEXT01 = 'ZOB1'. ENDSELECT. SELECT TEXT02 INTO W_LIFNR_ZOD1 UP TO 1 ROWS FROM ZGCMT0001 WHERE KEYNUM = CNS_KEYNUM_00083 AND XSIDEL <> CNS_X AND TEXT01 = 'ZOD1'. ENDSELECT. ENDFORM. " GET_TRANS_LIFNR *&---------------------------------------------------------------------* *& Form GET_SPECIAL_BKLAS *&---------------------------------------------------------------------* * 特殊評価クラス取得(汎用テーブルデータ取得) *----------------------------------------------------------------------* FORM GET_SPECIAL_BKLAS . SELECT TEXT01 TEXT02 INTO TABLE TD_ZGCMT0001[] FROM ZGCMT0001 WHERE KEYNUM = CNS_KEYNUM_00102. ENDFORM. " GET_SPECIAL_BKLAS *&---------------------------------------------------------------------* *& Form GET_MWSKZ *&---------------------------------------------------------------------* * 税コード取得 *----------------------------------------------------------------------* * -->IW_LIFNR 仕入先 * <--OW_MWSKZ 税コード * <--OW_SUBRC リターンコード *----------------------------------------------------------------------* FORM GET_MWSKZ USING IW_LIFNR TYPE ANY CHANGING OW_MWSKZ TYPE ANY OW_SUBRC TYPE ANY. DATA: LW_KVERM TYPE LFB1-KVERM, CTR_CNT TYPE I. CLEAR OW_MWSKZ . CLEAR OW_SUBRC. SELECT SINGLE KVERM INTO LW_KVERM FROM LFB1 WHERE LIFNR = IW_LIFNR AND BUKRS = W_BUKRS. IF LW_KVERM IS INITIAL OR LW_KVERM = SPACE. *** MOD 20091217 0003 ST * OW_MWSKZ = CNS_MWSKZ_V1. IF TH_ZGMMT0003-EKORG = ST_CHGLOGIC-EKORG. OW_MWSKZ = ST_CHGLOGIC-MWSKZ. ELSE. OW_MWSKZ = CNS_MWSKZ_V1. ENDIF. *** MOD 20091217 0003 END OW_SUBRC = 0. ELSE. OW_MWSKZ = LW_KVERM+0(2). SELECT COUNT( * ) INTO CTR_CNT FROM T007A WHERE MWSKZ = OW_MWSKZ . IF CTR_CNT > 0. OW_SUBRC = 0. ELSE. OW_SUBRC = 1. OW_MWSKZ = SPACE. ENDIF. ENDIF. ENDFORM. " GET_MWSKZ *&---------------------------------------------------------------------* *& Form CONVERT_MATERIAL_UNIT *&---------------------------------------------------------------------* * 基本数量単位による換算(品目コードがあり) *----------------------------------------------------------------------* * -->IW_MATNR 品目コード * -->IW_MEINS_BEF 数量単位(前) * -->IW_MEINS_AFT 数量単位(後) * <--OW_UP 単位変換用分子 * <--OW_DOWN 単位変換用分母 * <--OW_SUBRC リターンコード *----------------------------------------------------------------------* FORM CONVERT_MATERIAL_UNIT USING IW_MATNR TYPE ANY IW_MEINS_BEF TYPE ANY IW_MEINS_AFT TYPE ANY CHANGING OW_UP TYPE ANY OW_DOWN TYPE ANY OW_SUBRC TYPE ANY. DATA: LW_NUM_IN TYPE I VALUE '10', LW_NUM_OUT TYPE I. DATA: LW_MENGE_BEF TYPE BSEG-MENGE, LW_MENGE_AFT TYPE BSEG-MENGE. DATA: LW_UMREN TYPE SMEINH-UMREN, "分母 LW_UMREZ TYPE SMEINH-UMREZ, "分子 LW_UMREN2 TYPE SMEINH-UMREN, "分母2 LW_UMREZ2 TYPE SMEINH-UMREZ. "分子2 IF ( IW_MEINS_BEF = CNS_KG OR IW_MEINS_BEF = CNS_G ) AND ( IW_MEINS_AFT = CNS_KG OR IW_MEINS_AFT = CNS_G ). LW_MENGE_BEF = 1. CALL FUNCTION 'UNIT_CONVERSION_SIMPLE' EXPORTING INPUT = LW_MENGE_BEF "数量 ROUND_SIGN = 'X' "丸め[四捨五入] UNIT_IN = IW_MEINS_BEF "数量単位(前) UNIT_OUT = IW_MEINS_AFT "数量単位(後) IMPORTING OUTPUT = LW_MENGE_AFT "変換後数量 EXCEPTIONS CONVERSION_NOT_FOUND = 1 DIVISION_BY_ZERO = 2 INPUT_INVALID = 3 OUTPUT_INVALID = 4 OVERFLOW = 5 TYPE_INVALID = 6 UNITS_MISSING = 7 UNIT_IN_NOT_FOUND = 8 UNIT_OUT_NOT_FOUND = 9 OTHERS = 10. IF SY-SUBRC <> 0. OW_SUBRC = 1. RETURN. ENDIF. IF LW_MENGE_AFT >= 1. OW_UP = LW_MENGE_AFT. OW_DOWN = 1. ELSEIF LW_MENGE_AFT <> 0. OW_UP = 1. OW_DOWN = 1 / LW_MENGE_AFT. ELSE. OW_SUBRC = 1. RETURN. ENDIF. ELSE. CALL FUNCTION 'MATERIAL_UNIT_CONVERSION' EXPORTING INPUT = LW_NUM_IN MATNR = IW_MATNR "品目コード MEINH = IW_MEINS_BEF "数量単位(前) IMPORTING OUTPUT = LW_NUM_OUT UMREN = LW_UMREN UMREZ = LW_UMREZ EXCEPTIONS CONVERSION_NOT_FOUND = 1 INPUT_INVALID = 2 MATERIAL_NOT_FOUND = 3 MEINH_NOT_FOUND = 4 MEINS_MISSING = 5 NO_MEINH = 6 OUTPUT_INVALID = 7 OVERFLOW = 8 OTHERS = 9. IF SY-SUBRC <> 0. OW_SUBRC = 1. RETURN. ENDIF. CALL FUNCTION 'MATERIAL_UNIT_CONVERSION' EXPORTING INPUT = LW_NUM_IN MATNR = IW_MATNR "品目コード MEINH = IW_MEINS_AFT "数量単位(後) IMPORTING OUTPUT = LW_NUM_OUT UMREN = LW_UMREN2 UMREZ = LW_UMREZ2 EXCEPTIONS CONVERSION_NOT_FOUND = 1 INPUT_INVALID = 2 MATERIAL_NOT_FOUND = 3 MEINH_NOT_FOUND = 4 MEINS_MISSING = 5 NO_MEINH = 6 OUTPUT_INVALID = 7 OVERFLOW = 8 OTHERS = 9. IF SY-SUBRC <> 0. OW_SUBRC = 1. RETURN. ENDIF. *** UPD 20100416 0005 ST * OW_UP = LW_UMREZ * LW_UMREN2. * OW_DOWN = LW_UMREN * LW_UMREZ2. OW_UP = LW_UMREN * LW_UMREZ2. OW_DOWN = LW_UMREZ * LW_UMREN2. *** UPD 20100416 0005 END ENDIF. OW_SUBRC = SY-SUBRC. IF OW_DOWN = 0. OW_SUBRC = 1. ENDIF. ENDFORM. " CONVERT_MATERIAL_UNIT *&---------------------------------------------------------------------* *& Form CALC_MULTI_VALUE *&---------------------------------------------------------------------* * 乗算値計算 *----------------------------------------------------------------------* * <--OW_MVAL 乗算値 *----------------------------------------------------------------------* FORM CALC_MULTI_VALUE CHANGING OW_MVAL TYPE I. DATA: LW_BKLAS TYPE MBEW-BKLAS. "評価クラス DATA: LFLG_SPECIAL_BKLAS(1) TYPE C. "特殊評価クラスフラグ(X:特殊) DATA: LFLG_DECIMALS(1) TYPE C. "小数点以下桁数フラグ(X:小数点あり) SELECT SINGLE BKLAS INTO LW_BKLAS FROM MBEW WHERE MATNR = TH_ZGMMT0003-ZMATNR AND BWKEY = P_WERKS AND BWTAR = SPACE. CLEAR OW_MVAL. *----- 特殊評価クラスチェック PERFORM CHECK_SPECIAL_BKLAS USING LW_BKLAS CHANGING LFLG_SPECIAL_BKLAS. IF LFLG_SPECIAL_BKLAS = CNS_X. *----- 小数点以下桁数チェック PERFORM CHECK_DECIMALS: USING TH_ZGMMT0003-ZWERTB0 CHANGING LFLG_DECIMALS, USING TH_ZGMMT0003-ZA01 CHANGING LFLG_DECIMALS, USING TH_ZGMMT0003-ZA02 CHANGING LFLG_DECIMALS, USING TH_ZGMMT0003-ZA03 CHANGING LFLG_DECIMALS, USING TH_ZGMMT0003-ZA04 CHANGING LFLG_DECIMALS, USING TH_ZGMMT0003-ZA05 CHANGING LFLG_DECIMALS, USING TH_ZGMMT0003-ZA06 CHANGING LFLG_DECIMALS, USING TH_ZGMMT0003-ZA07 CHANGING LFLG_DECIMALS, USING TH_ZGMMT0003-ZA08 CHANGING LFLG_DECIMALS, USING TH_ZGMMT0003-ZA09 CHANGING LFLG_DECIMALS, USING TH_ZGMMT0003-ZOA1 CHANGING LFLG_DECIMALS, USING TH_ZGMMT0003-ZOB1 CHANGING LFLG_DECIMALS, USING TH_ZGMMT0003-ZOC1 CHANGING LFLG_DECIMALS, USING TH_ZGMMT0003-ZOD1 CHANGING LFLG_DECIMALS, USING TH_ZGMMT0003-ZPB00 CHANGING LFLG_DECIMALS, USING TH_ZGMMT0003-ZEPEIN CHANGING LFLG_DECIMALS. IF LFLG_DECIMALS = CNS_X. OW_MVAL = CNS_100. ELSE. OW_MVAL = 1. ENDIF. ELSE. OW_MVAL = CNS_100. ENDIF. ENDFORM. " CALC_MULTI_VALUE *&---------------------------------------------------------------------* *& Form CHECK_DECIMALS *&---------------------------------------------------------------------* * 小数点以下桁数チェック *----------------------------------------------------------------------* * -->IW_VALUE チェック対象値 * <--OW_DECIMALS 小数点以下桁数フラグ *----------------------------------------------------------------------* FORM CHECK_DECIMALS USING IW_VALUE TYPE ANY CHANGING OW_DECIMALS TYPE ANY. DATA: LW_VALUE_INT(8) TYPE P. IF OW_DECIMALS = CNS_X. "既に他の項目で小数点がある場合は、 RETURN. "後続チェック不要 ELSE. LW_VALUE_INT = IW_VALUE. "チェック対象値の整数部分を取得 IF LW_VALUE_INT <> IW_VALUE. "小数点以下桁数がある場合、 OW_DECIMALS = CNS_X. "整数部分との比較で差異が出る ENDIF. ENDIF. ENDFORM. " CHECK_DECIMALS *&---------------------------------------------------------------------* *& Form CHECK_SPECIAL_BKLAS *&---------------------------------------------------------------------* * 特殊評価クラスチェック *----------------------------------------------------------------------* * -->IW_BKLAS チェック対象評価クラス * <--OW_FLG フラグ *----------------------------------------------------------------------* FORM CHECK_SPECIAL_BKLAS USING IW_BKLAS TYPE ANY CHANGING OW_FLG TYPE ANY. DATA:LST_ZGCMT0001 TYPE TYP_ZGCMT0001. CLEAR OW_FLG. LOOP AT TD_ZGCMT0001 INTO LST_ZGCMT0001 WHERE TEXT01 = IW_BKLAS. OW_FLG = CNS_X. ENDLOOP. ENDFORM. " CHECK_SPECIAL_BKLAS *** ADD 20091217 0003 ST *&---------------------------------------------------------------------* *& Form GET_CHGLOGIC_INFO *&---------------------------------------------------------------------* * ロジック変更情報取得 *----------------------------------------------------------------------* FORM GET_CHGLOGIC_INFO . CLEAR ST_CHGLOGIC. SELECT TEXT01 TEXT02 TEXT03 TEXT04 INTO ST_CHGLOGIC FROM ZGCMT0001 UP TO 1 ROWS WHERE KEYNUM = CNS_KEYNUM_00128 AND XSIDEL = SPACE AND TEXT01 = P_EKORG. ENDSELECT. ENDFORM. " GET_CHGLOGIC_INFO *** ADD 20091217 0003 END *** ADD 20100210 0004 ST *&---------------------------------------------------------------------* *& Form CONV_CURR_INTERNAL *&---------------------------------------------------------------------* * 金額書式変換(外部→内部) *----------------------------------------------------------------------* * -->IW_AMOUNT 金額(外部) * -->IW_WAERS 通貨コード * -->IW_DIGITS 内部ドメイン長 * <--OW_AMOUNT 金額(内部) *----------------------------------------------------------------------* FORM CONV_CURR_INTERNAL USING IW_AMOUNT TYPE ANY IW_WAERS TYPE ANY IW_DIGITS TYPE I CHANGING OW_AMOUNT TYPE ANY. DATA: LW_WAERS TYPE TCURC-WAERS. LW_WAERS = IW_WAERS. CALL FUNCTION 'BAPI_CURRENCY_CONV_TO_INTERNAL' EXPORTING CURRENCY = LW_WAERS AMOUNT_EXTERNAL = IW_AMOUNT MAX_NUMBER_OF_DIGITS = IW_DIGITS IMPORTING AMOUNT_INTERNAL = OW_AMOUNT. ENDFORM. " CONV_CURR_INTERNAL *** ADD 20100210 0004 END