付款账期计算案例

FUNCTION ZFM_MM_016.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(I_BUKRS) TYPE  BUKRS OPTIONAL
*"     VALUE(I_LIFNR) TYPE  LIFNR OPTIONAL
*"     VALUE(I_DATUM) TYPE  DATUM DEFAULT SY-DATUM
*"  EXPORTING
*"     VALUE(E_CODE) TYPE  CHAR1
*"     VALUE(E_MSG) TYPE  STRING
*"  TABLES
*"      ET_TAB STRUCTURE  ZSMM0028 OPTIONAL
*"----------------------------------------------------------------------
  DATA:RT_BUKRS TYPE RANGE OF BUKRS WITH HEADER LINE,
       RT_LIFNR TYPE RANGE OF LIFNR WITH HEADER LINE.

  IF I_BUKRS IS NOT INITIAL.
    RT_BUKRS-SIGN  = 'I'.
    RT_BUKRS-OPTION = 'EQ'.
    RT_BUKRS-LOW   = I_BUKRS.
    APPEND RT_BUKRS.
  ENDIF.

  IF I_LIFNR IS NOT INITIAL.
    RT_LIFNR-SIGN  = 'I'.
    RT_LIFNR-OPTION = 'EQ'.
    RT_LIFNR-LOW   = I_LIFNR.
    APPEND RT_LIFNR.
  ENDIF.

  SELECT
         BUKRS,
         LIFNR,
         WAERS,
         CASE SHKZG
         WHEN 'H' THEN WRBTR
         WHEN 'S' THEN - WRBTR
           END AS WRBTR,
         ZFBDT,
         ZBD1T
    FROM BSIK_VIEW
   WHERE BUKRS IN @RT_BUKRS
     AND LIFNR IN @RT_LIFNR
   ORDER BY BUKRS,LIFNR,WAERS
    INTO TABLE @DATA(LT_TAB).
  IF SY-SUBRC NE 0.
    E_CODE = 'E'.
    E_MSG  = '未查询到数据!'.
  ENDIF.

  MOVE-CORRESPONDING LT_TAB[] TO ET_TAB[].
  DELETE ADJACENT DUPLICATES FROM ET_TAB  COMPARING BUKRS LIFNR WAERS.

  DATA:LV_OM TYPE I.
  FIELD-SYMBOLS <FS_TAB> TYPE ZSMM0028.

  LOOP AT LT_TAB INTO DATA(WA_TAB).

    READ TABLE ET_TAB ASSIGNING <FS_TAB> WITH KEY BUKRS = WA_TAB-BUKRS
                                                  LIFNR = WA_TAB-LIFNR
                                                  WAERS = WA_TAB-WAERS
                                                  BINARY SEARCH.
    CHECK SY-SUBRC EQ 0.

    WA_TAB-ZFBDT = WA_TAB-ZFBDT + WA_TAB-ZBD1T."计算付款日期

    LV_OM = ( WA_TAB-ZFBDT+0(4) - I_DATUM+0(4) ) * 12 + WA_TAB-ZFBDT+4(2) - I_DATUM+4(2).

    CASE LV_OM.
      WHEN -3."超期3个月
        <FS_TAB>-ZAMT3B = <FS_TAB>-ZAMT3B + WA_TAB-WRBTR.
        <FS_TAB>-ZOVERDATE = <FS_TAB>-ZOVERDATE + WA_TAB-WRBTR.

      WHEN -2."超期2个月
        <FS_TAB>-ZAMT2B = <FS_TAB>-ZAMT2B + WA_TAB-WRBTR.
        <FS_TAB>-ZOVERDATE = <FS_TAB>-ZOVERDATE + WA_TAB-WRBTR.

      WHEN -1."超期1个月
        <FS_TAB>-ZAMT1B = <FS_TAB>-ZAMT1B + WA_TAB-WRBTR.
        <FS_TAB>-ZOVERDATE = <FS_TAB>-ZOVERDATE + WA_TAB-WRBTR.

      WHEN 0."当前期
        <FS_TAB>-ZAMT0 = <FS_TAB>-ZAMT0 + WA_TAB-WRBTR.
        <FS_TAB>-ZOVERDATE = <FS_TAB>-ZAMOUNT + WA_TAB-WRBTR.
      WHEN 1."未来1个月
        <FS_TAB>-ZAMT1 = <FS_TAB>-ZAMT1 + WA_TAB-WRBTR.
        <FS_TAB>-ZOPENDATE = <FS_TAB>-ZOPENDATE + WA_TAB-WRBTR.

      WHEN 2."未来2个月
        <FS_TAB>-ZAMT2 = <FS_TAB>-ZAMT2 + WA_TAB-WRBTR.
        <FS_TAB>-ZOPENDATE = <FS_TAB>-ZOPENDATE + WA_TAB-WRBTR.

      WHEN 3."未来3个月
        <FS_TAB>-ZAMT3 = <FS_TAB>-ZAMT3 + WA_TAB-WRBTR.
        <FS_TAB>-ZOPENDATE = <FS_TAB>-ZOPENDATE + WA_TAB-WRBTR.

      WHEN 4 OR 5 OR 6."未来4-6个月
        <FS_TAB>-ZAMT6 = <FS_TAB>-ZAMT6 + WA_TAB-WRBTR.
        <FS_TAB>-ZOPENDATE = <FS_TAB>-ZOPENDATE + WA_TAB-WRBTR.

      WHEN 7 OR 8 OR 9 OR 10 OR 11 OR 12."未来7-12个月
        <FS_TAB>-ZAMT12 = <FS_TAB>-ZAMT12 + WA_TAB-WRBTR.
        <FS_TAB>-ZOPENDATE = <FS_TAB>-ZOPENDATE + WA_TAB-WRBTR.

      WHEN OTHERS.
        IF LV_OM GT 0."未来12个月以上
          <FS_TAB>-ZAMT99 = <FS_TAB>-ZAMT99 + WA_TAB-WRBTR.
          <FS_TAB>-ZOPENDATE = <FS_TAB>-ZOPENDATE + WA_TAB-WRBTR.
        ELSE."预期3个月以上
          <FS_TAB>-ZAMT9B = <FS_TAB>-ZAMT9B + WA_TAB-WRBTR.
          <FS_TAB>-ZOVERDATE = <FS_TAB>-ZOVERDATE + WA_TAB-WRBTR.
        ENDIF.

    ENDCASE.

    <FS_TAB>-ZAMOUNT = <FS_TAB>-ZOVERDATE + <FS_TAB>-ZOPENDATE.

    CLEAR:WA_TAB,LV_OM.
  ENDLOOP.

  E_CODE = 'S'.
  E_MSG  = '查询成功!'.

ENDFUNCTION.


关键词: ABAP MM

网友评论

发表评论