VA02 修改、新增、删除出具发票计划行BAPI-BILLING_SCHEDULE_SAVE

这是一个关于SAP系统中处理销售订单开票计划的函数。函数通过读取和计算订单、开票计划行等信息,判断是否可以新增开票行,并进行相应的更新操作。涉及的步骤包括获取订单行数据、计算已开票金额、创建新的开票行和保存开票计划。最后,更新订单状态并进行事务处理。
摘要由CSDN通过智能技术生成
FUNCTION zzcrm_xiaoshou_change.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(LS_INPUT) TYPE  ZZS_ZCRM007
*"  EXPORTING
*"     REFERENCE(LS_OUT) TYPE  ZZS_ZCRMCX04
*"----------------------------------------------------------------------
  DATA:lv_n TYPE i.
  DATA:lv_u TYPE i.
  DATA: gt_zfpla  TYPE TABLE OF fplavb.
  DATA: gt_fpla_new  TYPE TABLE OF fplavb.
  DATA: gt_fpla_old  TYPE TABLE OF fplavb.
  DATA: gt_zfplt  TYPE TABLE OF fpltvb.       "OLD
  DATA: gt_fplt_old  TYPE TABLE OF fpltvb.       "OLD
  DATA: gt_zfplt1 TYPE TABLE OF fpltvb,      "NEEW
        gw_zfplt1 TYPE fpltvb.
  DATA: lv_fakwr TYPE fpltvb-fakwr.
  DATA: lv_ketwr TYPE netwr_ak.
  DATA:lv_posnr TYPE vbap-posnr,
       lv_netwr TYPE vbap-netwr.
  SELECT SINGLE posnr netwr""""
    FROM vbap
    INTO  ( lv_posnr,lv_netwr )
    WHERE vbeln = ls_input-vbeln."""""""获取SO行号,一个SO只有一行
  SELECT  SINGLE netwr,
                 waerk,
                 knumv
    FROM vbak
    INTO @DATA(lv_netpr)
    WHERE vbeln = @ls_input-vbeln.
  IF lv_netpr IS NOT INITIAL."""""获取mwsi对应净价值
    SELECT SINGLE kbetr
     FROM prcd_elements
      INTO @DATA(lv_kbetr)
      WHERE knumv = @lv_netpr-knumv
      AND   kschl = 'MWSI'.
  ENDIF.
  SELECT SINGLE fplnr""""""""""""""获取开票计划号
    FROM vbkd
    INTO @DATA(lv_fplnr)
    WHERE vbeln = @ls_input-vbeln
    AND   posnr = @lv_posnr.

  SELECT MAX( fpltr )"""""""""""""""""""""获取开票计划行号
    FROM fplt
    INTO @DATA(max_fpltr)
    WHERE fplnr = @lv_fplnr.

  CALL FUNCTION 'BILLING_SCHEDULE_READ' """""获取开票计划行数据
    EXPORTING
      fplnr = lv_fplnr
    TABLES
      zfpla = gt_zfpla
      zfplt = gt_zfplt.

  gt_zfplt1 = gt_zfplt.
  CLEAR:lv_ketwr,lv_fakwr.
  LOOP AT gt_zfplt INTO DATA(gs_zfplt) WHERE  fplnr = lv_fplnr AND fksaf = 'C' ."""获取所有已经开票行的金额汇总值
    lv_fakwr = lv_fakwr + gs_zfplt-fakwr."获取所有已经开票行的金额汇总值
  ENDLOOP.
  IF lv_fakwr + ls_input-kbetr / ( 1 + lv_kbetr / 100 ) <= lv_netwr.
    LOOP AT gt_zfplt  INTO DATA(gw_zfplt) WHERE   fksaf = 'A'.""""""删除原有A行数据
      gw_zfplt1-updkz = 'D'.
      MODIFY  gt_zfplt  FROM gw_zfplt .
      CLEAR:gw_zfplt .
    ENDLOOP.
    gw_zfplt1-updkz = 'I'.
    gw_zfplt1-fplnr = lv_fplnr.
    gw_zfplt1-fareg = '1' .
    gw_zfplt1-fpltr = max_fpltr + 1.
    gw_zfplt1-waers = lv_netpr-waerk.
    gw_zfplt1-fksaf = 'A' .
    gw_zfplt1-tetxt = '0003' .
    gw_zfplt1-fpttp = '01' .
    gw_zfplt1-fpfix = '0' .
    gw_zfplt1-afdat = sy-datum.
    gw_zfplt1-fkdat = sy-datum.
    gw_zfplt1-fakwr = ls_input-kbetr / ( 1 + lv_kbetr / 100 )."""""出具发票/发票计划中指定日期的待出具发票/计算数值
    lv_ketwr = gw_zfplt1-fakwr.
    gw_zfplt1-fproz = gw_zfplt1-fakwr  / lv_netwr * 100."bili
    CLEAR:gw_zfplt1-faksp.
    APPEND gw_zfplt1 TO gt_zfplt1.
    lv_ketwr  =  lv_netwr - lv_fakwr - lv_ketwr.
    IF  lv_ketwr  GT 0.
      gw_zfplt1-updkz = 'I'.
      gw_zfplt1-fplnr = lv_fplnr.
      gw_zfplt1-fareg = '1' .
      gw_zfplt1-fpltr = max_fpltr + 2.
      gw_zfplt1-waers = lv_netpr-waerk.
      gw_zfplt1-fksaf = 'A' .
      gw_zfplt1-tetxt = '0003' .
      gw_zfplt1-fpttp = '01' .
      gw_zfplt1-fpfix = '0' .
      gw_zfplt1-faksp = '02' .
      gw_zfplt1-afdat = sy-datum.
      gw_zfplt1-fkdat = sy-datum.
      gw_zfplt1-fakwr = lv_ketwr."""""出具发票/发票计划中指定日期的待出具发票/计算数值
      gw_zfplt1-fproz = gw_zfplt1-fakwr  / lv_netwr * 100."bili
      APPEND gw_zfplt1 TO gt_zfplt1.
    ENDIF.

    APPEND LINES OF gt_zfplt TO  gt_fplt_old.
    APPEND LINES OF gt_zfpla TO  gt_fpla_new.
    APPEND LINES OF gt_zfpla TO  gt_fpla_old.

    CALL FUNCTION 'BILLING_SCHEDULE_SAVE'
      TABLES
        fpla_new = gt_fpla_new
        fpla_old = gt_fpla_old
        fplt_new = gt_zfplt1
        fplt_old = gt_fplt_old.
    COMMIT WORK AND WAIT.
    IF sy-subrc = 0.
      UPDATE vbap SET fksaa = 'B'
      WHERE  vbeln = ls_input-vbeln
        AND  posnr = lv_posnr.
      IF sy-subrc = 0.
        COMMIT WORK AND WAIT.
      ENDIF.
      CALL FUNCTION 'SD_SALES_DOCUMENT_READ'
        EXPORTING
          document_number = ls_input-vbeln
        EXCEPTIONS
          error_message   = 01.
      DATA:i_fpla  LIKE  fpla.
      CLEAR:i_fpla.
      READ TABLE  gt_fpla_new  INTO  DATA(gw_fpla_new) INDEX 1.
      i_fpla = CORRESPONDING #( gw_fpla_new ).
      CALL FUNCTION 'SD_SALES_BILLINGPLAN_CHANGE'
        EXPORTING
          i_vbeln        = ls_input-vbeln
          i_posnr        = lv_posnr
          i_fpla         = i_fpla
          i_create_dates = 'X'.
      IF  sy-subrc EQ 0.
        CALL FUNCTION 'SD_SALES_DOCUMENT_SAVE'.

        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            wait = 'X'.
        DO 10 TIMES.
          SELECT SINGLE
           fakwr
           FROM fplt
            INTO @DATA(lw_fakwr)
           WHERE fplnr = @lv_fplnr
            AND fksaf = 'A'
            AND fakwr = @lv_ketwr.
          IF lw_fakwr IS NOT INITIAL.
            EXIT .
          ELSE.
            WAIT UP TO '0.3' SECONDS.
          ENDIF.
        ENDDO.
        ls_out-e_msgtx = 'S'.
      ENDIF.
    ELSE.
      ls_out-e_msgtx = 'E'.
    ENDIF.
  ELSE.
    ls_out-e_msgtx = 'E'.
    ls_out-e_msgty = '当前的累计开票金额大于订单总金额,请检查输入或者变更合同!'.
  ENDIF.
ENDFUNCTION.

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值