納品書DNを作成する

BAPI_DELIVERYPROCESSING_EXEC

SAはこのBAPIのみを使用できます

複数の発注を参照して納品書を作成します:BBP_INB_DELIVERY_CREATE(書き込むことができない品目には拡張が必要です)

1.バッチを書き込むことができません変更するには、BAPI_OUTB_DELIVERY_CHANGEを呼び出す必要があります数量単位を1回渡す必要がある場合があります。そうしないと、エラーVLBAPI 004 "ドキュメント&1アイテム&2(数量整合性チェック)のエラー"; WS_DELIVERY_UPDATEも報告されます。で書くことはできません

lt_request-extdelv_no = uv_dnを使用します。外部納品書番号を書き込むことはできません。WS_DELIVERY_UPDATEが変更されたときに書き込みます。

添付:

データ:ls_item TYPEbapiibdlvitemchg。

単一を選択lfimglgmng lfimg_flo lgmng_flo umvkz umvkn umrev

     唇から

     INTO(ls_item-dlv_qty、ls_item-dlv_qty_imunit、ls_item-del_qty_flo、ls_item-dlv_qty_st_flo、

           ls_item-fact_unit_nom、ls_item-fact_unit_denom、ls_item-conv_fact)

     WHERE vbeln = '0180001234'

       AND posnr = '000010'。

共有する

2.「配信タイプが渡されません」というエラーが報告されます

その理由は、関数ME_EKPV_ARRAY_READがekpvのデータを返さず、ekpvが空であるかどうかを判別するためです。空の場合、実行されない一連の割り当てコード(配信タイプLFARTを含む)があります。

これはbapi自体のバグであり、メモはありません。

さらに、存在しない注文明細が入力された場合、このエラーも報告されます。

ここでEbelnが割り当てられます。後の再帰ループでは、読み取りテーブルがebeln ebelpを使用するため、ekpvの最終的な戻り値が空になります。

 

この関数にはオブジェクトlo_dbがあり、lo_dbにはカウンターとして属性mv_iterがあり、属性mt_dataはテーブルekpvからフェッチされたデータを格納します。そして、このオブジェクトはシングルトンです

 

したがって、bapiを繰り返し呼び出すときにmv_iterとmt_dataは自動的にクリアされないため、このbapiを2回呼び出すと、この時点でmv_iter = 2は再帰になりません(lt_intpuへの割り当ての影響を受けません)。この時点で実行は成功する可能性があります納品書を作成します

3.可用性チェックが構成されている場合、使用可能な在庫はI VL 150に報告され、Eがあります。

4.アイテムを指定できません。アイテムは10から累積されます。

 

実際の発送日(投稿日)

Bapiには、実際の納期を書き込むためのパラメータがありません。実際の納期を書き込まない場合は、投稿時に作成日使用されます。

WS_DELIVERY_UPDATEまたはWS_DELIVERY_UPDATE_2を使用して投稿する場合、vbkok-wadat_istを使用して投稿日を書き込むことができます。

テーブルを直接変更する

 

デモ

関数zflg_dn_create。

* "------------------------------------------------ ----------------------

* "*"ローカルインターフェース:

* "インポート

* "VALUE(VBTYP)TYPE VBTYP

* "VALUE(VBELV)TYPE VBELN_VON

* "VALUE(LIFEX)TYPE ZDN_PLAN OPTIONAL

* "エクスポート

* "VALUE(RTYPE)TYPE BAPI_MTYPE

* "VALUE(RTMSG)TYPE BAPI_MSG

* "VALUE(VBELN)TYPE VBELN_VL

* "テーブル

* "IT_ITEM STRUCTURE ZDN_METHOD_S1

* "RETURN STRUCTURE BAPIRET2OPTIONAL

* "------------------------------------------------ ----------------------

  zfmdatasave1'ZFLG_DN_CREATE '。

  zfmdatasave2'B '。

 

*作成

  データ:

    bapideliciousrequestのようなlt_requestは、ヘッダー行で0になります。

    bapideliciouscreateditemsのようなlt_createditemsは、ヘッダー行で0になります。

 

*変更

  データ:

    it_header_partner like bapidlvpartnerchg、 "配信:パートナーの変更

    bapidlvdeadlnのテーブルのようなit_header_deadlines、 "配信期限

    it_item_data like bapiobdlvitemchg、 "出荷ピッキングデータアイテムレベルの変更

    it_item_control like bapiobdlvitemctrlchg、 "出荷品目レベルの管理データ

    et_returnは、ヘッダー行のあるbapiret2のテーブルのようなものです。

    it_item_data_splは、/ spe / bapiobdlvitemchgのテーブルのように、 "出荷ピッキングデータアイテムレベル(SPE)を変更します。

    is_header_data like bapiobdlvhdrchg、 "出荷ピッキングデータヘッダーレベルを変更します

    is_header_control like bapiobdlvhdrctrlchg、 "出荷ヘッダーレベルの制御データ

    bapiobdlvhdrchg-deliv_numbのようなiv_delivery。「交货

  データ:

    lw_header_partner like bapidlvpartnerchg、 "配信:パートナーの変更

    bapidlvdeadlnのようなlw_header_deadlines、 "配信期限

    bapiobdlvitemchgのようなlw_item_data、 "出荷ピッキングデータアイテムレベルの変更

    lw_item_control like bapiobdlvitemctrlchg、 "出荷品目レベルの管理データ

    lw_return likebapiret2。 "パラメータを返す

  データ:l_techn_controlタイプbapidlvcontrol。

  データ:

    ls_itemタイプbapiobdlvitemchg、

    ls_item_tタイプbapiobdlvitemchg、

    ls_item_controlタイプbapiobdlvitemctrlchg、

    ls_deadlinesタイプbapidlvdeadln。

 

  関数 'CONVERSION_EXIT_ALPHA_INPUT'を呼び出す

    エクスポート

      入力= vbelv

    インポート

      出力= vbelv。

 

  lifexを変更するalpha_inputを実行します。

 

  it_itemでループします。

    lt_request-document_type = vbtyp。 "Bは注文書、Aは販売注文書を意味します

    lt_request-document_numb = vbelv。 "参照注文番号

    lt_request-document_item = it_item-posnv。 "参照注文アイテム番号

    lt_request-plant = it_item-werks。

    lt_request-stge_loc = it_item-lgort。

    lt_request-quantity_sales_uom = it_item-lfimg。 "配送数量(利用可能な在庫数量が不足している場合、数量を書き留めることはできません)

    lt_request-delivery_date = sy-datum。

    lt_request-extdelv_no = lifex。 "複合請求書のためにリリースされたwangnl20170518の納品書(保管計画番号)chenylの外部識別_20170602

    lt_request-date = sy-datum。

    lt_request-time = sy-uzeit。

    lt_requestを追加します。

  エンドループ。

 

  関数 'RV_DELIVERY_INIT'を呼び出します。

 

  関数 'BAPI_DELIVERYPROCESSING_EXEC'を呼び出します

    テーブル

      リクエスト= lt_request

      createditems = lt_createditems

      return = return。

 

* 1.このBAPIにはバグがあり、一部のエラーはRETURNにならないため、RETURNが空になり、配送注文が正常に作成されない場合があります(販売注文が見つからない、販売注文が作成され、配送注文が作成されたなど)。作成済み)、または作成されていない可能性があります

  テーブルlt_createditemsインデックス1を読み取ります。

  vbeln = lt_createditems-document_numb。 "納品書番号

  キータイプ= 'E'でテーブルリターンを読み取ります。

  vbelnが初期でsy-subrcne 0でない場合。「バグがあります。保管場所が間違っていると、returnはエラーを返しますが、配送注文番号は生成されます。

    関数 'BAPI_TRANSACTION_COMMIT'を呼び出す

      エクスポート

        待機= 'X'。

    rtype = 'S'。

    rtmsg = '納品書は正常に作成されました'。

 

*書き込み分割

    関数 'RV_DELIVERY_INIT'を呼び出します。

*ヘッダー情報

    is_header_data-deliv_numb = vbeln。 "納品書番号

    is_header_control-deliv_numb = vbeln。

 

*元の10行のアイテム数を変更します

    chargが初期ではないit_itemでループします。

      lw_item_dataをクリアします。

      lw_item_data-deliv_numb = vbeln。

      lw_item_data-deliv_item = sy-tabix * 10. "元のラインアイテム

      lw_item_data-dlv_qty = it_item-lfimg。

      lw_item_data-dlv_qty_imunit = it_item-lfimg。

* lw_item_data-base_uom = 'TO'。 "基本単位

* lw_item_data-sales_unit = 'TO'。 "販売単位

      lw_item_data-fact_unit_nom = 1. "SKUに変換された販売数量の分子(係数)

      lw_item_data-fact_unit_denom = 1. "販売数量はSKU(除数)の値に変換されます

      lw_item_data-batch = it_item-charg。「批次

      lw_item_dataをit_item_dataに追加します。

 

      lw_item_controlをクリアします。

      lw_item_control-deliv_numb = vbeln。

      lw_item_control-deliv_item = sy-tabix * 10. "元のラインアイテム

      lw_item_control-chg_delqty = 'X'。 "数量変更フラグ

      lw_item_controlをit_item_controlに追加します。

    エンドループ。

 

    it_item_data []が初期値でない場合。

      関数 'BAPI_OUTB_DELIVERY_CHANGE'を呼び出します

        エクスポート

          header_data = is_header_data

          header_control = is_header_control

          配信= vbeln

        テーブル

          header_partner = it_header_partner

          header_deadlines = it_header_deadlines

          item_data = it_item_data

          item_control = it_item_control

          return = et_return

* ITEM_DATA_SPL = IT_ITEM_DATA_SPL

        。

      et_return []が初期の場合。

        関数 'BAPI_TRANSACTION_COMMIT'を呼び出す

          エクスポート

            待機= 'X'。

      endif。

 

      タイプ= 'E'であるet_returnでループします。

        メッセージIDet_return-id

        タイプ「E」

        番号et_return-番号

        et_return-message_v1を使用

        et_return-message_v2

        et_return-message_v3

        et_return-message_v4

        rtmsgに。

      エンドループ。

    endif。

 

*SMS

    lifexが初期でない場合。

      it_itemでループします。

        zsd001_itemを更新します

        set dn = vbeln zt = '進行中'

        ここで、dn_plan = lifexおよびdn_posnr = it_item-dn_posnrです。

      エンドループ。

      作業をコミットして待ちます。

    endif。

    vbelnを変更するalpha_outputを実行します。

  そうしないと。

    クリアvbeln。

    関数 'BAPI_TRANSACTION_ROLLBACK'を呼び出します。

    rtype = 'E'。

    rtmsg = '納品書の作成に失敗しました:'。

    戻り時にループします。

      rtmsg = rtmsg && return-message。

    エンドループ。

  endif。

 

 

  zfmdatasave2'R '。

 

エンドファンクション。

 

BAPI_OUTB_DELIVERY_CREATE_STO参照PO

BAPI_OUTB_DELIVERY_CREATE_SLS参照SO

発注書を参照して納品書を作成します。数量を転送する必要はありません。作成された納品書の数量は、ラインアイテムの数量ではなく、注文の約束された数量を指します。注文の約束された数量は、注文が作成されたときの在庫数量である場合があります。

全体として作成できます

 

コード

po create dn "add by cyl 2016/9/13

*判断p17

      ztmm_po_lis2からcount(*)を選択します。ここで、ebeln = lisnumおよびbsart = 'EB'です。

      sy-subrc = 0の場合。

        シングルを選択

          ekko〜bsart ekko〜lifnr ekko〜bukrs ekko〜inco2

          ekpo〜ebelp retpo

          ls_ekpo2の対応するフィールドに

          ekkoから

          ekko〜ebeln = ekpo〜ebelnの内部結合ekpo

          ここで、ekko〜ebeln = lisnumです。

 

        '+'のls_ekpo2-inco2をlv_bukrslv_kunnrlv_typeに分割します。

        lv_kunnrを2桁左にシフトします。

 

        ls_ekpo2-bsart = 'EB'およびls_ekpo2-lifnr = '0000010142'の場合

          およびls_ekpo2-bukrs + 0(2)= '23'およびls_ekpo2-bukrsne'2300 'およびls_ekpo2-bukrsne' 2330 '

          およびlv_bukrs + 0(2)= '23'およびlv_bukrsne'2300 'およびlv_bukrsne' 2330 '

          および(lv_type = '委託販売品'またはlv_type = 'プロトタイプ')

          ls_ekpo2-retpoは初期です。

          lv_p17 = 'X'。

        endif。

      endif。

 

      lv_p17 = 'X'の場合。

      関数 'RV_DELIVERY_INIT'を呼び出します。

      ebelnebelpを選択します

        テーブルlt_ekpoの対応するフィールドに

        ekpoから

        ここで、ebeln = lisnumです。

 

      lt_ekpoでls_ekpoにループします。

        ls_bapidlvreftosto-ref_doc = ls_ekpo-ebeln。

        ls_bapidlvreftosto-ref_item = ls_ekpo-ebelp。

        ls_bapidlvreftostoをlt_bapidlvreftostoに追加します。

      エンドループ。

 

      関数 'BAPI_OUTB_DELIVERY_CREATE_STO'を呼び出します

        インポート

          配信= lv_vbeln

        テーブル

          stock_trans_items = lt_bapidlvreftosto

          return = lt_return。

 

      lv_vbelnが初期でない場合。

        関数 'BAPI_TRANSACTION_COMMIT'を呼び出す

          エクスポート

            待機= 'X'。

        備考 '発注書' lisnum '新しい配達注文番号' lv_vbelnを備考に連結します。

        'Purchase Order' lisnum'Create a new delivery note number'lv_vbelnをls_logitem-remarkに連結します。

        ls_logitem-msg_no = ls_logitem-msg_no +1。

        ls_logitemを追加します。

      そうしないと。

        関数 'BAPI_TRANSACTION_ROLLBACK'を呼び出します。

        テーブルlt_returnをキータイプ= 'E' id = 'VR'番号= '420'でls_returnに読み込みます。 "商品は配達されました

        sy-subrc = 0の場合。

          注釈「発注書」lisnum「新しい配達注文番号が作成されませんでした」を注釈に連結します。

          '発注書' lisnum '新しい配達注文番号が作成されていません'をls_logitem-remarkに連結します。

          ls_logitem-msg_no = ls_logitem-msg_no +1。

        そうしないと。

          text_code = '003'。

          注釈「発注書」lisnum「配達注文の作成に失敗しました:」を注釈に連結します。

          'Purchase Order' lisnum'Failed to create Delivery note: 'をls_logitem-remarkに連結します。

          ls_logitem-msg_no = ls_logitem-msg_no +1。

          lt_returnでls_returnにループします。ここで、type = 'E'またはtype = 'A'です。

            remarkls_return-messageをremarkに連結します。

            ls_logitem-remark = ls_return-メッセージ。

            ls_logitem-msg_no = ls_logitem-msg_no +1。

          エンドループ。

        endif。

      endif。

      endif。

*終了シリンダー

 

おすすめ

転載: blog.csdn.net/cylcylcylcylwo/article/details/114014976