tatashishimeiyibu

来个人讲懂 SAP ABAP 销售订单Billing Plan创建

 

 

 新增一个需求,需要SO 创建完后直接生成billing plan,但是标准的BAPI 不可以实现,就上网找到一些信息,

需要创建完SO,之后调用新的Function,生成billing plan ,但是网上找到的SO创建后VBKD-fplnr字段会有值,

我的没有,就找到了以下解决办法:

 

销售订单创建出具发票计划

客户有这样一个需求反馈,通过接口创建的销售订单,其中某一种类型的订单需要同时创建出具发票计划。

为此查看了销售订单创建BAPI:“SD_SALESDOCUMENT_CREATE”,没有找到相应的参数传入,网上也找了一通,愣是没有收获。

通过F1查看了出具发票计划画面涉及的相关Table,主要涉及的透明表有:FPLA和FPLT。

再通过关联找到了几个相关的函数,顿时有了一点思路,是不是可以通过函数去更新/创建Billing Plan呢?

 

DEMO 代码如下:

 *&---------------------------------------------------------------------*

*& Report ZTEST_BILLPLAN

*&---------------------------------------------------------------------*

*&

*&---------------------------------------------------------------------*

REPORT ZTEST_BILLPLAN.

 

 

DATA : LV_VBELN LIKE VBAK-VBELN.

DATA : LV_FPLNR LIKE FPLA-FPLNR.

DATA : LV_FPLTR TYPE FPLTR.

 

DATA :

  LT_ZFPLA LIKE  TABLE OF FPLAVB WITH HEADER LINE,

  LT_ZFPLT LIKE  TABLE OF FPLTVB WITH HEADER LINE.

DATA :

  LT_ZFPLA_N LIKE  TABLE OF FPLAVB WITH HEADER LINE,

  LT_ZFPLT_N LIKE  TABLE OF FPLTVB WITH HEADER LINE.

 

LV_VBELN = '1100000242'.

 

SELECT SINGLE FPLNR

  FROM FPLA

  INTO LV_FPLNR

  WHERE VBELN = LV_VBELN.

 

CALL FUNCTION 'BILLING_SCHEDULE_READ'

  EXPORTING

    FPLNR = LV_FPLNR

*   I_VFKDAT       =

*   I_BFKDAT       =

  TABLES

    ZFPLA = LT_ZFPLA

    ZFPLT = LT_ZFPLT.

 

LOOP AT LT_ZFPLA.

  MOVE-CORRESPONDING LT_ZFPLA TO LT_ZFPLA_N.

  LT_ZFPLA_N-UPDKZ = 'U'.

  APPEND LT_ZFPLA_N.

  CLEAR : LT_ZFPLA_N , LT_ZFPLA.

ENDLOOP.

 

*** 填充计划明细

CLEAR LT_ZFPLT_N.

LV_FPLTR = LV_FPLTR + 1.

LT_ZFPLT_N-FPLNR = LV_FPLNR.

LT_ZFPLT_N-FPLTR = LV_FPLTR.

LT_ZFPLT_N-FPTTP = '02'.

LT_ZFPLT_N-TETXT = '0008'.

LT_ZFPLT_N-FKDAT = '20210801'.

LT_ZFPLT_N-FAREG = '2'.

LT_ZFPLT_N-WAERS = 'CNY'.

LT_ZFPLT_N-FAKWR = '7272.73'.

LT_ZFPLT_N-FAKSP = '02'.

LT_ZFPLT_N-FKSAF = 'A'.

LT_ZFPLT_N-AFDAT = '20210801'.

LT_ZFPLT_N-UPDKZ = 'I'.

APPEND LT_ZFPLT_N.

 

CLEAR LT_ZFPLT_N.

LV_FPLTR = LV_FPLTR + 1.

LT_ZFPLT_N-FPLNR = LV_FPLNR.

LT_ZFPLT_N-FPLTR = LV_FPLTR.

LT_ZFPLT_N-FPTTP = '02'.

LT_ZFPLT_N-TETXT = '0008'.

LT_ZFPLT_N-FKDAT = '20210805'.

LT_ZFPLT_N-FAREG = '2'.

LT_ZFPLT_N-WAERS = 'CNY'.

LT_ZFPLT_N-FAKWR = '20000'.

LT_ZFPLT_N-FAKSP = '02'.

LT_ZFPLT_N-FKSAF = 'A'.

LT_ZFPLT_N-AFDAT = '20210805'.

LT_ZFPLT_N-UPDKZ = 'I'.

APPEND LT_ZFPLT_N.

 

 

CALL FUNCTION 'BILLING_SCHEDULE_SAVE'

  TABLES

    FPLA_NEW = LT_ZFPLA_N

    FPLA_OLD = LT_ZFPLA

    FPLT_NEW = LT_ZFPLT_N

    FPLT_OLD = LT_ZFPLT.

IF SY-SUBRC = 0 .

  WRITE : 'OK'.

  COMMIT WORK.

ELSE.

  WRITE : 'Failure'.

  ROLLBACK WORK.

ENDIF.

后续通过BAPI生成销售订单之后,再调用上面的方法完成创建Billing Plan的功能。

 

【参考代码】

 

*&---------------------------------------------------------------------*

*&      Form  UPDATE_BILLING_PLAN

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

*      -->P_E_VBELN  text

*      -->P_IT_BILL  text

*----------------------------------------------------------------------*

FORM UPDATE_BILLING_PLAN  TABLES PT_BILL STRUCTURE ZVS_GBILL

                           USING P_VBELN TYPE VBELN_VA

                          .

  DATA :

    LT_ZFPLA LIKE  TABLE OF FPLAVB WITH HEADER LINE,

    LT_ZFPLT LIKE  TABLE OF FPLTVB WITH HEADER LINE.

  DATA :

    LT_ZFPLA_N LIKE  TABLE OF FPLAVB WITH HEADER LINE,

    LT_ZFPLT_N LIKE  TABLE OF FPLTVB WITH HEADER LINE.

 

  DATA : LT_VBKD LIKE TABLE OF VBKD WITH HEADER LINE.

  DATA : LV_FPLTR TYPE FPLTR.

  DATA : LV_WAERK LIKE VBAK-WAERK.

 

*** 销售合同货币

  SELECT SINGLE WAERK FROM VBAK

    INTO LV_WAERK

    WHERE VBELN = P_VBELN.

 

*** 销售业务数据

  SELECT * FROM VBKD

    INTO TABLE LT_VBKD

    WHERE VBELN = P_VBELN.

  DELETE LT_VBKD WHERE POSNR = '000000'.

 

  LOOP AT LT_VBKD.

 

    REFRESH : LT_ZFPLA[],LT_ZFPLT[],

              LT_ZFPLA_N[],LT_ZFPLT_N[].

 

    CALL FUNCTION 'BILLING_SCHEDULE_READ'

      EXPORTING

        FPLNR = LT_VBKD-FPLNR

*       I_VFKDAT       =

*       I_BFKDAT       =

      TABLES

        ZFPLA = LT_ZFPLA

        ZFPLT = LT_ZFPLT.

 

    LOOP AT LT_ZFPLA.

      MOVE-CORRESPONDING LT_ZFPLA TO LT_ZFPLA_N.

      LT_ZFPLA_N-UPDKZ = 'U'.

      APPEND LT_ZFPLA_N.

      CLEAR : LT_ZFPLA_N , LT_ZFPLA.

    ENDLOOP.

 

    LOOP AT PT_BILL WHERE POSNR = LT_VBKD-POSNR.

      CLEAR LT_ZFPLT_N.

      LV_FPLTR = LV_FPLTR + 1.

      LT_ZFPLT_N-FPLNR = LT_VBKD-FPLNR.

      LT_ZFPLT_N-FPLTR = LV_FPLTR.

      LT_ZFPLT_N-FPTTP = '02'.

      LT_ZFPLT_N-TETXT = '0008'.

      LT_ZFPLT_N-FKDAT = PT_BILL-AFDAT.

      LT_ZFPLT_N-FAREG = '2'.

      IF PT_BILL-WAERS <> ''.

        LT_ZFPLT_N-WAERS = PT_BILL-WAERS.

      ELSE.

        LT_ZFPLT_N-WAERS = LV_WAERK.

      ENDIF.

      LT_ZFPLT_N-FAKWR = PT_BILL-FAKWR.

      LT_ZFPLT_N-FAKSP = '02'.

      LT_ZFPLT_N-FKSAF = 'A'.

      LT_ZFPLT_N-AFDAT = PT_BILL-AFDAT.

      LT_ZFPLT_N-UPDKZ = 'I'.

      APPEND LT_ZFPLT_N.

    ENDLOOP.

 

    CALL FUNCTION 'BILLING_SCHEDULE_SAVE'

      TABLES

        FPLA_NEW = LT_ZFPLA_N

        FPLA_OLD = LT_ZFPLA

        FPLT_NEW = LT_ZFPLT_N

        FPLT_OLD = LT_ZFPLT.

 

  ENDLOOP.

 

ENDFORM.

同时需要注意的是,同一个订单不同的行项目会生成不同的出具(发票)计划编号,需要通过表VBKD来关联订单项目。

 

参考链接:【ABAP】销售订单Billing Plan创建_sap billing plan-CSDN博客

                  销售订单发票计划导入_fplnr-CSDN博客

 

 

以上是VBKD-fplnr字段有值的处理办法,对于没有值的情况使用以下办法:

 

  1 *&---------------------------------------------------------------------*
  2 *& Report Z_CREATE_BILLINGPLAN
  3 *&---------------------------------------------------------------------*
  4 *&
  5 *&---------------------------------------------------------------------*
  6 REPORT z_create_billingplan.
  7 TYPES:
  8 ty_vbapf      TYPE STANDARD TABLE OF vbapf.
  9 
 10 DATA: lw_sales_header_in      LIKE bapisdhd1,
 11       lw_sales_header_inx     LIKE bapisdhd1x,
 12       uv_vbeln                LIKE bapivbeln-vbeln,
 13       lt_sales_items_in       LIKE TABLE OF bapisditm  WITH HEADER LINE,
 14       lt_sales_items_inx      LIKE TABLE OF bapisditmx WITH HEADER LINE,
 15       lt_sales_schedules_in   LIKE TABLE OF bapischdl  WITH HEADER LINE,
 16       lt_sales_schedules_inx  LIKE TABLE OF bapischdlx WITH HEADER LINE,
 17       lt_sales_conditions_in  LIKE TABLE OF bapicond   WITH HEADER LINE,
 18       lt_sales_conditions_inx LIKE TABLE OF bapicondx  WITH HEADER LINE,
 19       lt_sales_text           LIKE TABLE OF bapisdtext WITH HEADER LINE,
 20       lt_sales_partners_in    LIKE TABLE OF bapiparnr  WITH HEADER LINE,
 21       lt_return               LIKE TABLE OF bapiret2   WITH HEADER LINE,
 22       lt_bapisditm            LIKE bapisditm  OCCURS 0 WITH HEADER LINE,
 23       lt_bapisditmx           LIKE bapisditmx  OCCURS 0 WITH HEADER LINE,
 24       ls_bapisditm            TYPE bapisditm,
 25       ls_bapisditmx           TYPE bapisditmx,
 26       ls_ord_header_inx       TYPE bapisdh1x OCCURS 0 WITH HEADER LINE,
 27       lv_error_flag           TYPE abap_bool.
 28 
 29 DATA: l_answer TYPE c.
 30 
 31 DATA:ls_fxfpla TYPE LINE OF va_fplavb_t,
 32      ls_fxfplt TYPE LINE OF va_fpltvb_t.
 33 DATA:lt_fxfpla  TYPE va_fplavb_t,
 34      lt_fyfpla  TYPE va_fplavb_t,
 35      lt_fxfplt  TYPE va_fpltvb_t,
 36      lt_fyfplt  TYPE va_fpltvb_t,
 37      ls_fplatmp TYPE fpla.
 38 
 39 DATA: lt_hfpla    TYPE TABLE OF fplavb,
 40       lt_hfpla2   TYPE TABLE OF fplavb,
 41       lt_hfplt    TYPE TABLE OF fpltvb,
 42       lt_hfplt2   TYPE TABLE OF fpltvb,
 43       ls_veda     TYPE vedavb,
 44       lv_fpart    TYPE tfpla-fpart,
 45       ls_zfplttmp TYPE fpltvb.
 46 
 47 CLEAR: lt_sales_items_in,     lt_sales_items_inx,
 48        lt_sales_schedules_in, lt_sales_schedules_inx,
 49        lt_sales_conditions_in,lt_sales_conditions_inx,
 50        lt_sales_partners_in,
 51        lt_return.
 52 
 53 **=> sales order header
 54 IF lw_sales_header_in IS INITIAL.
 55   lw_sales_header_in-doc_type    = 'YCGA'.      " 销售凭证类型
 56   lw_sales_header_in-sales_org   = 'ETSD'.      " 销售组织
 57   lw_sales_header_in-distr_chan  = 'O2'.        " 分销渠道
 58   lw_sales_header_in-sales_grp   = '111'.       " 销售组
 59   lw_sales_header_in-division    =  'J9'.     " 产品组
 60   lw_sales_header_in-sales_off   = 'SD03'.      " 销售部门
 61   lw_sales_header_in-doc_date    = '20250107'.  " 凭证日期
 62 
 63 
 64   lw_sales_header_inx-doc_type   = abap_true.
 65   lw_sales_header_inx-sales_org  = abap_true.
 66   lw_sales_header_inx-distr_chan = abap_true.
 67   lw_sales_header_inx-sales_grp  = abap_true.
 68   lw_sales_header_inx-division   = abap_true.
 69   lw_sales_header_inx-sales_off  = abap_true.
 70   lw_sales_header_inx-doc_date   = abap_true.
 71   lw_sales_header_inx-s_proc_ind = abap_true.
 72   lw_sales_header_inx-ship_type  = abap_true.
 73 ENDIF.
 74 
 75 
 76 IF lt_sales_partners_in[] IS INITIAL.
 77   CLEAR : lt_sales_partners_in.
 78   lt_sales_partners_in-partn_role = 'SP'.         "
 79   lt_sales_partners_in-partn_numb = '3002290906'.
 80   APPEND lt_sales_partners_in.
 81 
 82   CLEAR : lt_sales_partners_in.
 83   lt_sales_partners_in-partn_role = 'SH'.         "
 84   lt_sales_partners_in-partn_numb = '3002290906'.
 85   APPEND lt_sales_partners_in.
 86 
 87 ENDIF.
 88 
 89 **=> sales order item
 90 lt_sales_items_in-itm_number = '10'.
 91 lt_sales_items_in-material   = '000000001000000020'.     " 物料
 92 lt_sales_items_in-target_qty     = 1.                   "
 93 lt_sales_items_in-target_qu      = 'ST'.                   "
 94 lt_sales_items_in-profit_ctr   = 'PSD999999'.            " 利润中心
 95 
 96 lt_sales_items_inx-itm_number  = '10'.
 97 lt_sales_items_inx-material    = abap_true.
 98 lt_sales_items_inx-sales_unit  = abap_true.
 99 lt_sales_items_inx-plant       = abap_true.
100 lt_sales_items_inx-store_loc   = abap_true.
101 lt_sales_items_inx-ship_type   = abap_true.
102 lt_sales_items_inx-profit_ctr         = abap_true .      " 利润中心
103 
104 APPEND: lt_sales_items_in,      lt_sales_items_inx.
105 CLEAR:  lt_sales_items_in,      lt_sales_items_inx.
106 
107 
108 DATA:lv_string     TYPE string,
109      lv_char(960)  TYPE c,
110      ls_bape_vbap  TYPE bape_vbap,
111      ls_bape_vbapx TYPE bape_vbapx,
112      ls_bape_vbak  TYPE bape_vbak,
113      ls_bape_vbakx TYPE bape_vbakx.
114 
115 DATA: lt_extensionin TYPE TABLE OF bapiparex  WITH HEADER LINE.
116 
117 
118 *添加扩展字段
119 CLEAR: ls_bape_vbap,lt_extensionin.
120 ls_bape_vbap-posnr =  '000010'.
121 ls_bape_vbap-/tkag/gt_sl_equnr =  '10000006' .      " Equipment
122 
123 lt_extensionin-structure = 'BAPE_VBAP'.
124 
125 CALL METHOD cl_abap_container_utilities=>fill_container_c
126   EXPORTING
127     im_value               = ls_bape_vbap
128   IMPORTING
129     ex_container           = lt_extensionin+30
130   EXCEPTIONS
131     illegal_parameter_type = 1
132     OTHERS                 = 2.
133 APPEND lt_extensionin.
134 
135 
136 CALL FUNCTION 'SD_SALESDOCUMENT_CREATE'
137   EXPORTING
138     sales_header_in     = lw_sales_header_in
139     sales_header_inx    = lw_sales_header_inx
140     convert_parvw_auart = 'X'
141   IMPORTING
142     salesdocument_ex    = uv_vbeln
143   TABLES
144     return              = lt_return
145     sales_items_in      = lt_sales_items_in
146     sales_items_inx     = lt_sales_items_inx
147     sales_partners      = lt_sales_partners_in
148     extensionex         = lt_extensionin.
149 IF uv_vbeln IS NOT INITIAL.
150   COMMIT WORK.
151   PERFORM frm_create_bill_plan.
152 ELSE.
153   MESSAGE 'The billing plan creation failed!' TYPE 'S' DISPLAY LIKE 'E'.
154 ENDIF.
155 
156 *&---------------------------------------------------------------------*
157 *&      Form  FRM_CREATE_BILL_PLAN
158 *&---------------------------------------------------------------------*
159 *       text
160 *----------------------------------------------------------------------*
161 *  -->  p1        text
162 *  <--  p2        text
163 *----------------------------------------------------------------------*
164 FORM frm_create_bill_plan .
165 
166 *update billing plan
167   TYPES ty_vbapf  TYPE STANDARD TABLE OF vbapf.
168   DATA:ls_xvbak   TYPE vbak,
169        lt_xvbap   TYPE shp_vl10_vbap_t,
170        lt_xvbep   TYPE shp_vl10_vbep_t,
171        lt_xvbpa   TYPE vbpavb_tab,
172        ls_xvbkd   TYPE vbkdvb,
173        lt_xvbkd   TYPE shp_vl10_vbkd_t,
174        lt_yvbkd   TYPE shp_vl10_vbkd_t,
175        ls_yvbkd   TYPE LINE OF shp_vl10_vbkd_t,
176        lt_xvbapf  TYPE ty_vbapf,
177        lt_xvbfa   TYPE shp_vl10_vbfa_t,
178        ls_xvbuk   TYPE vbukvb,
179        lt_xvbup   TYPE shp_vl10_vbup_t,
180        lt_xvbuv   TYPE shp_vl10_vbuv_t,
181        ls_yvbak   TYPE vbak,
182        lt_yvbap   TYPE shp_vl10_vbap_t,
183        lt_yvbep   TYPE shp_vl10_vbep_t,
184        lt_yvbfa   TYPE shp_vl10_vbfa_t,
185        ls_yvbuk   TYPE vbukvb,
186        lt_yvbup   TYPE shp_vl10_vbup_t,
187        lt_yvbuv   TYPE shp_vl10_vbuv_t,
188        ls_tvak    TYPE tvak,
189        ls_komk    TYPE komk,
190        ls_komp    TYPE komp,
191        lt_komv    TYPE STANDARD TABLE OF komv,
192        lt_komvtmp TYPE STANDARD TABLE OF komv,
193        ls_komv    TYPE komv.
194   DATA:it_redeliver TYPE  vbapdelv_t,
195        ls_redeliver TYPE vbapdelv,
196        xt_msg       TYPE  bal_t_msg,
197        lv_tabix     TYPE sy-tabix,
198        lv_error(1)  TYPE c.
199 
200   DATA : lv_fplnr   LIKE fpla-fplnr,
201          lv_fpltr   TYPE fpltr,
202          lt_zfpla   TYPE STANDARD TABLE OF fplavb,
203          lt_zfplt   TYPE STANDARD TABLE OF fpltvb,
204          lt_zfpla_n LIKE  TABLE OF fplavb WITH HEADER LINE,
205          lt_zfplt_n LIKE  TABLE OF fpltvb WITH HEADER LINE,
206          ls_zfplt_n TYPE fpltvb.
207 
208   SELECT vbeln, posnr, prctr
209   FROM vbap
210   INTO TABLE @DATA(lt_vbap)
211   WHERE vbeln = @uv_vbeln.
212 
213   LOOP AT lt_vbap INTO DATA(ls_vbap) .
214     CLEAR: ls_bapisditm , ls_bapisditmx.
215 
216     ls_bapisditmx-itm_number = ls_vbap-posnr.
217     ls_bapisditmx-updateflag = 'U'.
218     APPEND ls_bapisditmx TO lt_bapisditmx.
219 
220     CLEAR ls_vbap.
221   ENDLOOP.
222   ls_ord_header_inx-updateflag = 'U'.
223 
224   CALL FUNCTION 'BAPI_SALESORDER_CHANGE'
225     EXPORTING
226       salesdocument    = uv_vbeln
227 *     ORDER_HEADER_IN  =
228       order_header_inx = ls_ord_header_inx
229 *     SIMULATION       =
230 *     BEHAVE_WHEN_ERROR           = ' '
231 *     INT_NUMBER_ASSIGNMENT       = ' '
232 *     LOGIC_SWITCH     =
233 *     NO_STATUS_BUF_INIT          = ' '
234     TABLES
235       return           = lt_return
236       order_item_in    = lt_bapisditm
237       order_item_inx   = lt_bapisditmx
238 *     PARTNERS         =
239 *     PARTNERCHANGES   =
240 *     PARTNERADDRESSES =
241 *     ORDER_CFGS_REF   =
242 *     ORDER_CFGS_INST  =
243 *     ORDER_CFGS_PART_OF          =
244 *     ORDER_CFGS_VALUE =
245 *     ORDER_CFGS_BLOB  =
246 *     ORDER_CFGS_VK    =
247 *     ORDER_CFGS_REFINST          =
248 *     SCHEDULE_LINES   =
249 *     SCHEDULE_LINESX  =
250 *     ORDER_TEXT       =
251 *     ORDER_KEYS       =
252 *     CONDITIONS_IN    =
253 *     CONDITIONS_INX   =
254 *     EXTENSIONIN      =
255 *     EXTENSIONEX      =
256     .
257   LOOP AT lt_return INTO DATA(ls_return_check) WHERE type = 'E' OR type = 'W'.
258     lv_error_flag = abap_true.
259     CLEAR ls_return_check.
260   ENDLOOP.
261 
262 
263   IF lv_error_flag = abap_false.
264     REFRESH:lt_hfpla,lt_hfpla2,lt_hfplt,lt_hfplt2.
265     PERFORM prm_sales_order_read        USING uv_vbeln
266                                               it_redeliver
267                                      CHANGING lv_error
268                                               ls_xvbak
269                                               lt_xvbap
270                                               lt_xvbep
271                                               lt_xvbpa
272                                               lt_xvbkd
273                                               lt_xvbapf
274                                               lt_xvbfa
275                                               ls_xvbuk
276                                               lt_xvbup
277                                               lt_xvbuv
278                                               ls_yvbak
279                                               lt_yvbap
280                                               lt_yvbep
281                                               lt_yvbfa
282                                               ls_yvbuk
283                                               lt_yvbup
284                                               lt_yvbuv
285                                               xt_msg
286                                               lt_zfpla
287                                               lt_zfplt.
288 
289 
290     LOOP AT lt_xvbkd INTO DATA(ls_xvbkd2) .
291       REFRESH:lt_hfpla,lt_hfpla2,lt_hfplt,lt_hfplt2.
292       IF ls_xvbkd2-fplnr IS INITIAL.
293         ls_veda-vbeln = uv_vbeln.
294         lv_fpart = 'Y1'.
295         CALL FUNCTION 'BILLING_SCHEDULE_GENERATE'
296           EXPORTING
297             i_fpart     = lv_fpart
298             i_veda      = ls_veda
299             i_fkdat     = sy-datum
300             i_upd_fpla  = 'U'
301             i_upd_fplt  = 'U'
302             i_fpla_only = 'X'
303           IMPORTING
304             e_fplnr     = lv_fplnr
305           TABLES
306             fpla_new    = lt_hfpla
307             fpla_old    = lt_hfpla2
308             fplt_new    = lt_hfplt
309             fplt_old    = lt_hfplt2.
310 
311         CALL FUNCTION 'BILLING_SCHEDULE_GET_NUMBER'
312           EXPORTING
313             i_fplnr  = lv_fplnr
314             i_vbeln  = uv_vbeln
315           IMPORTING
316             e_fplnr  = lv_fplnr
317           TABLES
318             fpla_new = lt_hfpla
319             fplt_new = lt_hfplt.
320 
321 
322         ls_xvbkd2-fplnr = lv_fplnr.
323         ls_xvbkd2-updkz = 'U'.
324 
325         MODIFY lt_xvbkd FROM ls_xvbkd2 TRANSPORTING fplnr updkz  WHERE  posnr = ls_xvbkd2-posnr.
326 
327         IF lines( lt_hfpla[] ) NE 0.
328           IF  ls_xvbkd2-posnr <> '000000'.
329 
330             LOOP AT lt_hfpla INTO DATA(ls_hfpla_tmp).
331               READ TABLE lt_xvbkd INTO DATA(ls_xvbkd_tmp) WITH  KEY posnr = '000000'.
332               IF sy-subrc = 0.
333 *使header billing plan 值与item billing plan值相同
334                 ls_hfpla_tmp-rfpln =  ls_xvbkd_tmp-fplnr.
335                 MODIFY lt_hfpla FROM ls_hfpla_tmp TRANSPORTING rfpln  WHERE  fplnr = ls_hfpla_tmp-fplnr.
336                 CLEAR ls_xvbkd_tmp.
337               ENDIF.
338               CLEAR ls_hfpla_tmp.
339             ENDLOOP.
340 
341           ENDIF.
342           APPEND LINES OF lt_hfpla TO lt_zfpla_n.
343         ENDIF.
344 
345       ELSE.
346 *          lv_fplnr = ls_xvbkd2-fplnr.
347       ENDIF.
348 
349       CLEAR :ls_xvbkd2,lv_fplnr.
350     ENDLOOP.
351 
352     "update data
353     LOOP AT lt_zfpla_n INTO DATA(ls_zfpla).
354       CLEAR : ls_fxfpla.
355       MOVE-CORRESPONDING ls_zfpla TO ls_fxfpla.
356       APPEND ls_fxfpla TO lt_fxfpla.
357     ENDLOOP.
358 
359 *If there is only one line of billing plan, it’s closing invoice
360     SORT lt_xvbkd BY posnr.
361     CLEAR: lv_fpltr, lt_zfplt_n,lt_zfplt_n[].
362     LOOP AT  lt_xvbkd INTO DATA(ls_xvbkd_zfplt) .
363 *put billing plan data
364         CLEAR ls_zfplt_n.
365         lv_fpltr = lv_fpltr + 1.
366         ls_zfplt_n-mandt = sy-mandt.
367         ls_zfplt_n-fplnr = ls_xvbkd_zfplt-fplnr.
368         ls_zfplt_n-fpltr = lv_fpltr.
369         ls_zfplt_n-afdat = SY-DATUM.
370         ls_zfplt_n-tetxt = '0008'.
371 *        ls_zfplt_n-fproz = ls_bill_plan-percentage.
372         ls_zfplt_n-fakwr = 100.
373         ls_zfplt_n-fareg = '3'.
374         ls_zfplt_n-fpttp = '02'.
375         ls_zfplt_n-fkarv = 'YYMA'.
376         ls_zfplt_n-updkz = 'I'.
377         APPEND ls_zfplt_n TO lt_zfplt_n.
378       AT NEW posnr.
379         CLEAR  lv_fpltr.
380       ENDAT.
381       CLEAR ls_xvbkd_zfplt.
382     ENDLOOP.
383     LOOP AT lt_zfplt_n INTO DATA(ls_zfplt2).
384       CLEAR : ls_fxfplt.
385       MOVE-CORRESPONDING ls_zfplt2 TO ls_fxfplt.
386       APPEND ls_fxfplt TO lt_fxfplt.
387     ENDLOOP.
388 
389     PERFORM prm_document_update CHANGING ls_xvbak
390                                       lt_xvbap
391                                       lt_xvbep
392                                       lt_xvbpa
393                                       lt_xvbkd
394                                       lt_xvbfa
395                                       ls_xvbuk
396                                       lt_xvbup
397                                       lt_xvbuv
398                                       lt_xvbapf
399                                       ls_yvbak
400                                       lt_yvbap
401                                       lt_yvbep
402                                       lt_yvbfa
403                                       ls_yvbuk
404                                       lt_yvbup
405                                       lt_yvbuv
406                                       lt_fxfpla
407                                       lt_fxfplt
408                                       lt_fyfpla
409                                       lt_fyfplt.
410     SELECT SINGLE vbeln, posnr ,fplnr
411     FROM vbkd
412     INTO @DATA(lv_vbkd_check)
413     WHERE vbeln = @uv_vbeln
414     AND fplnr = ''.
415     IF sy-subrc <> 0 .
416 *Give a response message to show if the billing plan has been created successfully .
417       MESSAGE 'The billing plan has been created successfully!' TYPE 'S'.
418     ELSE.
419 *Give a response message to show if the billing plan creation failed!
420       MESSAGE 'The billing plan creation failed!' TYPE 'S' DISPLAY LIKE 'E'.
421     ENDIF.
422 
423   ELSE.
424     MESSAGE 'The billing plan creation failed!' TYPE 'S' DISPLAY LIKE 'E'.
425   ENDIF.
426 
427 ENDFORM.
428 *&---------------------------------------------------------------------*
429 *&      Form  PRM_SALES_ORDER_READ
430 *&---------------------------------------------------------------------*
431 *       text
432 *----------------------------------------------------------------------*
433 *      -->P_UV_VBELN  text
434 *      -->P_IT_REDELIVER  text
435 *      <--P_LV_ERROR  text
436 *      <--P_LS_XVBAK  text
437 *      <--P_LT_XVBAP  text
438 *      <--P_LT_XVBEP  text
439 *      <--P_LT_XVBPA  text
440 *      <--P_LT_XVBKD  text
441 *      <--P_LT_XVBAPF  text
442 *      <--P_LT_XVBFA  text
443 *      <--P_LS_XVBUK  text
444 *      <--P_LT_XVBUP  text
445 *      <--P_LT_XVBUV  text
446 *      <--P_LS_YVBAK  text
447 *      <--P_LT_YVBAP  text
448 *      <--P_LT_YVBEP  text
449 *      <--P_LT_YVBFA  text
450 *      <--P_LS_YVBUK  text
451 *      <--P_LT_YVBUP  text
452 *      <--P_LT_YVBUV  text
453 *      <--P_XT_MSG  text
454 *      <--P_LT_ZFPLA  text
455 *      <--P_LT_ZFPLT  text
456 *----------------------------------------------------------------------*
457 FORM prm_sales_order_read  USING    i_vbeln     TYPE vbeln_va
458                                it_vbapdelv TYPE vbapdelv_t
459                       CHANGING e_error     TYPE xfeld
460                                es_xvbak    TYPE vbak
461                                et_xvbap    TYPE shp_vl10_vbap_t
462                                et_xvbep    TYPE shp_vl10_vbep_t
463                                et_xvbpa    TYPE vbpavb_tab
464                                et_xvbkd    TYPE shp_vl10_vbkd_t
465                                et_xvbapf   TYPE ty_vbapf
466                                et_xvbfa    TYPE shp_vl10_vbfa_t
467                                es_xvbuk    TYPE vbukvb
468                                et_xvbup    TYPE shp_vl10_vbup_t
469                                et_xvbuv    TYPE shp_vl10_vbuv_t
470                                es_yvbak    TYPE vbak
471                                et_yvbap    TYPE shp_vl10_vbap_t
472                                et_yvbep    TYPE shp_vl10_vbep_t
473                                et_yvbfa    TYPE shp_vl10_vbfa_t
474                                es_yvbuk    TYPE vbukvb
475                                et_yvbup    TYPE shp_vl10_vbup_t
476                                et_yvbuv    TYPE shp_vl10_vbuv_t
477                                xt_msg      TYPE bal_t_msg
478                                et_fxfpla   TYPE va_fplavb_t
479                                et_fxfplt   TYPE va_fpltvb_t.
480 
481   DATA:
482     l_ownls     TYPE xfeld,
483     ls_vbapdelv TYPE vbapdelv,
484     ls_vbap     TYPE vbapvb,
485     lt_vbep     TYPE shp_vl10_vbep_t.
486 
487   CALL FUNCTION 'SD_SALES_DOCUMENT_INIT'
488     EXPORTING
489       status_buffer_refresh = 'X'
490       keep_lock_entries     = ' '
491       simulation_mode_bapi  = ' '.
492 
493   CALL FUNCTION 'SD_SALES_DOCUMENT_READ'
494     EXPORTING
495       document_number = i_vbeln
496     EXCEPTIONS
497       error_message   = 1.
498   IF sy-subrc <> 0.
499     e_error = 'X'.
500   ENDIF.
501 * read header data
502   CALL FUNCTION 'SD_VBAK_SINGLE_READ'
503     EXPORTING
504       i_vbeln          = i_vbeln
505     IMPORTING
506       e_vbak           = es_xvbak
507     EXCEPTIONS
508       record_not_found = 1
509       OTHERS           = 2.
510   IF sy-subrc <> 0.
511     e_error = 'X'.
512   ENDIF.
513 
514   LOOP AT it_vbapdelv INTO ls_vbapdelv.
515 *   read item data
516     CALL FUNCTION 'SD_VBAP_SINGLE_READ'
517       EXPORTING
518         i_vbeln          = i_vbeln
519         i_posnr          = ls_vbapdelv-posnr
520         i_refresh_buffer = 'X'
521       IMPORTING
522         e_vbapvb         = ls_vbap
523       EXCEPTIONS
524         record_not_found = 1
525         OTHERS           = 2.
526     IF sy-subrc = 0.
527       IF ls_vbap-werks IS INITIAL.
528         CLEAR ls_vbap-logsys.
529       ELSE.
530         CALL FUNCTION 'AIP01_PLANT_DETERMINE'
531           EXPORTING
532             i_werks                   = ls_vbap-werks
533           IMPORTING
534             e_ownls                   = l_ownls
535             e_logsys                  = ls_vbap-logsys
536           EXCEPTIONS
537             invalid_import_parameters = 1
538             plant_not_found           = 2
539             vendor_not_found          = 3
540             logsys_not_found          = 4
541             rfcdest_not_found         = 5
542             OTHERS                    = 6.
543         IF sy-subrc <> 0 OR NOT l_ownls IS INITIAL.
544           CLEAR ls_vbap-logsys.
545         ENDIF.
546       ENDIF.
547       ls_vbap-deliver = ls_vbapdelv-redeliver.
548       APPEND ls_vbap TO et_xvbap.
549     ELSE.
550       e_error = 'X'.
551     ENDIF.
552 *   read schedule line data
553     CLEAR lt_vbep.
554     CALL FUNCTION 'SD_VBEP_READ_WITH_POSNR'
555       EXPORTING
556         i_vbeln          = i_vbeln
557         i_posnr          = ls_vbapdelv-posnr
558         i_refresh_buffer = 'X'
559       TABLES
560         et_vbepvb        = lt_vbep
561       EXCEPTIONS
562         record_not_found = 1
563         OTHERS           = 2.
564 
565     IF sy-subrc <> 0.
566 * Implement suitable error handling here
567     ENDIF.
568     APPEND LINES OF lt_vbep TO et_xvbep.
569   ENDLOOP.
570 
571 * read header status
572   CALL FUNCTION 'SD_VBUK_SINGLE_READ'
573     EXPORTING
574       i_vbeln          = i_vbeln
575     IMPORTING
576       e_vbukvb         = es_xvbuk
577     EXCEPTIONS
578       record_not_found = 1
579       OTHERS           = 2.
580   IF sy-subrc <> 0.
581 * Implement suitable error handling here
582   ENDIF.
583   es_xvbuk-updkz = ''."""ADD
584 * read all position status
585   CALL FUNCTION 'SD_VBUP_READ_WITH_VBELN'
586     EXPORTING
587       i_vbeln          = i_vbeln
588     TABLES
589       et_vbupvb        = et_xvbup
590     EXCEPTIONS
591       record_not_found = 1
592       OTHERS           = 2.
593   IF sy-subrc <> 0.
594 * Implement suitable error handling here
595   ENDIF.
596 * read partner data
597   CALL FUNCTION 'SD_VBPA_READ_WITH_VBELN'
598     EXPORTING
599       i_vbeln          = i_vbeln
600     TABLES
601       et_vbpavb        = et_xvbpa
602     EXCEPTIONS
603       record_not_found = 1
604       OTHERS           = 2.
605 
606   IF sy-subrc <> 0.
607 * Implement suitable error handling here
608   ENDIF.
609 
610 * read business data
611   CALL FUNCTION 'SD_VBKD_READ_WITH_VBELN'
612     EXPORTING
613       i_vbeln          = i_vbeln
614     TABLES
615       et_vbkdvb        = et_xvbkd
616     EXCEPTIONS
617       record_not_found = 1
618       OTHERS           = 2.
619 
620   IF sy-subrc <> 0.
621     e_error = 'X'.
622   ENDIF.
623 
624 * read incompletion protocol
625   CALL FUNCTION 'SD_VBUV_READ_WITH_VBELN'
626     EXPORTING
627       i_vbeln          = i_vbeln
628     TABLES
629       et_vbuvvb        = et_xvbuv
630     EXCEPTIONS
631       record_not_found = 1
632       OTHERS           = 2.
633   IF sy-subrc <> 0.
634 * Implement suitable error handling here
635   ENDIF.
636 * read document flow
637   CALL FUNCTION 'SD_VBFA_READ_WITH_VBELV'
638     EXPORTING
639       i_vbelv          = i_vbeln
640     TABLES
641       et_vbfavb        = et_xvbfa
642     EXCEPTIONS
643       record_not_found = 1
644       OTHERS           = 2.
645 
646   IF sy-subrc <> 0.
647 * Implement suitable error handling here
648   ENDIF.
649 
650 
651   DATA:ls_xvbuv LIKE vbuvvb."et_xvbuv.
652   DATA:ls_xvbfa LIKE vbfavb."et_xvbfa.
653   DATA:ls_xvbup LIKE vbupvb."et_xvbup.
654   DATA:ls_xvbkd LIKE vbkdvb."et_xvbkd.
655   DATA:ls_xvbpa LIKE vbpavb."et_xvbpa.
656   DATA:ls_xvbep LIKE vbepvb."VBEPVB
657   DATA:ls_xvbap LIKE vbapvb."VBEPVB
658   LOOP AT et_xvbuv INTO ls_xvbuv.
659     ls_xvbuv-updkz = ''.
660     MODIFY et_xvbuv FROM ls_xvbuv.
661   ENDLOOP.
662 
663   LOOP AT et_xvbfa INTO ls_xvbfa.
664     ls_xvbfa-updkz = ''.
665     MODIFY et_xvbfa FROM ls_xvbfa.
666   ENDLOOP.
667 
668   LOOP AT et_xvbup INTO ls_xvbup.
669     ls_xvbup-updkz = ''.
670     MODIFY et_xvbup FROM ls_xvbup.
671   ENDLOOP.
672 
673   LOOP AT et_xvbkd INTO ls_xvbkd.
674     ls_xvbkd-updkz = ''.
675     MODIFY et_xvbkd FROM ls_xvbkd.
676   ENDLOOP.
677 
678   LOOP AT et_xvbpa INTO ls_xvbpa.
679     ls_xvbpa-updkz = ''.
680     MODIFY et_xvbpa FROM ls_xvbpa.
681   ENDLOOP.
682   LOOP AT et_xvbep INTO ls_xvbep.
683     ls_xvbep-updkz = 'U'.
684     MODIFY et_xvbep FROM ls_xvbep.
685   ENDLOOP.
686   LOOP AT et_xvbap INTO ls_xvbap.
687     ls_xvbap-updkz = 'U'.
688     MODIFY et_xvbap FROM ls_xvbap.
689   ENDLOOP.
690 * build cumulated document flow
691   CALL FUNCTION 'RV_XVBAPF_CREATE'
692     EXPORTING
693       vbeln   = i_vbeln
694     TABLES
695       fxvbfa  = et_xvbfa
696       fxvbapf = et_xvbapf.
697 
698   REFRESH: et_fxfpla,et_fxfplt.
699   IF et_xvbkd[] IS NOT INITIAL.
700     SELECT * INTO CORRESPONDING FIELDS OF TABLE et_fxfpla FROM fpla FOR ALL ENTRIES IN et_xvbkd WHERE fplnr = et_xvbkd-fplnr AND vbeln = i_vbeln.
701   ENDIF.
702   IF et_fxfpla[] IS NOT INITIAL.
703     SELECT * INTO CORRESPONDING FIELDS OF TABLE et_fxfplt FROM fplt FOR ALL ENTRIES IN  et_fxfpla WHERE fplnr = et_fxfpla-fplnr.
704   ENDIF.
705 
706 * keep original data
707   es_yvbak = es_xvbak.
708   et_yvbap = et_xvbap.
709   et_yvbep = et_xvbep.
710   et_yvbfa = et_xvbfa.
711   es_yvbuk = es_xvbuk.
712   et_yvbup = et_xvbup.
713   et_yvbuv = et_xvbuv.
714 
715 ENDFORM.                               " prm_sales_order_read
716 *&---------------------------------------------------------------------*
717 *&      Form  PRM_DOCUMENT_UPDATE
718 *&---------------------------------------------------------------------*
719 *       text
720 *----------------------------------------------------------------------*
721 *      <--P_LS_XVBAK  text
722 *      <--P_LT_XVBAP  text
723 *      <--P_LT_XVBEP  text
724 *      <--P_LT_XVBPA  text
725 *      <--P_LT_XVBKD  text
726 *      <--P_LT_XVBFA  text
727 *      <--P_LS_XVBUK  text
728 *      <--P_LT_XVBUP  text
729 *      <--P_LT_XVBUV  text
730 *      <--P_LT_XVBAPF  text
731 *      <--P_LS_YVBAK  text
732 *      <--P_LT_YVBAP  text
733 *      <--P_LT_YVBEP  text
734 *      <--P_LT_YVBFA  text
735 *      <--P_LS_YVBUK  text
736 *      <--P_LT_YVBUP  text
737 *      <--P_LT_YVBUV  text
738 *      <--P_LT_FXFPLA  text
739 *      <--P_LT_FXFPLT  text
740 *      <--P_LT_FYFPLA  text
741 *      <--P_LT_FYFPLT  text
742 *----------------------------------------------------------------------*
743 FORM prm_document_update  CHANGING is_xvbak  TYPE vbak
744                               it_xvbap  TYPE shp_vl10_vbap_t
745                               it_xvbep  TYPE shp_vl10_vbep_t
746                               it_xvbpa  TYPE vbpavb_tab
747                               it_xvbkd  TYPE shp_vl10_vbkd_t
748                               it_xvbfa  TYPE shp_vl10_vbfa_t
749                               is_xvbuk  TYPE vbukvb
750                               it_xvbup  TYPE shp_vl10_vbup_t
751                               it_xvbuv  TYPE shp_vl10_vbuv_t
752                               it_xvbapf TYPE ty_vbapf
753                               is_yvbak  TYPE vbak
754                               it_yvbap  TYPE shp_vl10_vbap_t
755                               it_yvbep  TYPE shp_vl10_vbep_t
756                               it_yvbfa  TYPE shp_vl10_vbfa_t
757                               is_yvbuk  TYPE vbukvb
758                               it_yvbup  TYPE shp_vl10_vbup_t
759                               it_yvbuv  TYPE shp_vl10_vbuv_t
760                                it_fxfpla   TYPE va_fplavb_t
761                                it_fxfplt   TYPE va_fpltvb_t
762                                it_fyfpla   TYPE va_fplavb_t
763                                it_fyfplt   TYPE va_fpltvb_t.
764   " it_yvbkd  TYPE shp_vl10_vbkd_t.
765 
766   DATA:
767     lt_xvbuk TYPE shp_vl10_vbuk_t,
768     lt_yvbuk TYPE shp_vl10_vbuk_t.
769   DATA:it_yvbpa  TYPE vbpavb_tab.
770   DATA:
771     lt_komv  TYPE STANDARD TABLE OF komv,
772     lt_sadr  TYPE STANDARD TABLE OF sadrvb,
773     lt_vbbe  TYPE STANDARD TABLE OF vbbed,
774     lt_vbbs  TYPE STANDARD TABLE OF vbbsd,
775     lt_vbeh  TYPE STANDARD TABLE OF vbeh,
776     lt_vbsn  TYPE STANDARD TABLE OF vbsnvb,
777     lt_qtch  TYPE STANDARD TABLE OF qtchd,
778     lt_qtvb  TYPE STANDARD TABLE OF qtvbd,
779     lt_apoi  TYPE STANDARD TABLE OF atpfield,
780     lt_vblb  TYPE STANDARD TABLE OF vblbvb,
781     lt_vbkey TYPE STANDARD TABLE OF vbkey.
782 
783   DATA:
784     ls_csfg_info TYPE csfgt_info_dyn.
785 
786 * Set CSFG Flag to Process SD_SALESDOCUMENT_LES_PROCESS
787   ls_csfg_info-x_logsys_flag = 'X'.
788 
789 
790 * update sales document
791   APPEND is_xvbuk TO lt_xvbuk.
792   APPEND is_yvbuk TO lt_yvbuk.
793 
794   CALL FUNCTION 'RV_SALES_DOCUMENT_UPDATE' "IN UPDATE TASK
795     EXPORTING
796       fkonv_geaendert = space
797       fvbak           = is_xvbak
798       fyvbak          = is_yvbak
799       fyvbak_updkz    = 'X'
800       falekz          = space
801       fmm_flag        = space
802       is_csfg_info    = ls_csfg_info
803     TABLES
804       fxkomv          = lt_komv
805       fxsadr          = lt_sadr
806       fxvbap          = it_xvbap
807       fxvbapf         = it_xvbapf
808       fxvbbe          = lt_vbbe
809       fxvbbs          = lt_vbbs
810       fxvbeh          = lt_vbeh
811       fxvbep          = it_xvbep
812       fxvbfa          = it_xvbfa
813       fxvbkd          = it_xvbkd
814       fyvbkd          = it_xvbkd
815       fxvbpa          = it_xvbpa
816       fxvbsn          = lt_vbsn
817       fxvbuk          = lt_xvbuk
818       fxvbup          = it_xvbup
819       fxqtch          = lt_qtch
820       fxqtvb          = lt_qtvb
821       fxapoi          = lt_apoi
822       fysadr          = lt_sadr
823       fyvbap          = it_yvbap
824       fyvbbe          = lt_vbbe
825       fyvbbs          = lt_vbbs
826       fyvbep          = it_yvbep
827       fyvbfa          = it_yvbfa
828       fyvbpa          = it_yvbpa
829       fyvbsn          = lt_vbsn
830       fyvbuk          = lt_yvbuk
831       fyvbup          = it_yvbup
832       fxvbuv          = it_xvbuv
833       fyvbuv          = it_yvbuv
834       fyqtvb          = lt_qtvb
835       fvbkey          = lt_vbkey
836       fxvblb          = lt_vblb
837       fyvblb          = lt_vblb
838       fxfpla          = it_fxfpla
839       fyfpla          = it_fyfpla
840       fxfplt          = it_fxfplt
841       fyfplt          = it_fyfplt
842     EXCEPTIONS
843       OTHERS          = 1.
844 *
845 ENDFORM.                               " prm_document_update

 

RANGES: i_a FOR vbak-vbeln OCCURS 10,
i_l FOR likp-vbeln OCCURS 10,
i_f FOR vbrk-vbeln OCCURS 10.


i_a-option = 'EQ'.
i_a-low = gt_c_vbeln-vbeln.
i_a-sign = 'I'.
APPEND i_a.


IF i_a[] IS NOT INITIAL.
SUBMIT rvv05ivb " VIA SELECTION-SCREEN
WITH i_a IN i_a
WITH i_l IN i_l
WITH i_f IN i_f
WITH vakgu = ''
WITH vakpa = ''
WITH vapma = ''
WITH vepvg = ''
WITH vkdfs = 'X'
WITH vlpkm = ''
" WITH oifpbl = ''
WITH vlkpa = ''
WITH vlpma = ''
WITH vkdfs_l = ''
WITH vtrdi = ''
WITH vrsli = ''
WITH vrkpa = ''
WITH vrpma = ''
WITH vkdfs_f = ''"WITH oirpbl = ''
AND RETURN EXPORTING LIST TO MEMORY.
ENDIF.

 

posted on 2025-01-07 15:13  人间观察家  阅读(273)  评论(0)    收藏  举报

导航