SAP-SD应收账龄表


************************************************************************

REPORT ZFIR004.

TYPE-POOLS:SLIS.
TABLES:T001,KNA1,BSID,BSAD,KNB1,TCURR,KNVP,KNVV,TVKBT,PA0002,TVKO.

*定义结构类型
TYPES: BEGIN OF GTP_TAB.
        INCLUDE TYPE BSAD.
TYPES: NAME1    TYPE  KNA1-NAME1,      "客户名称描述
       ZTERMT   TYPE  T052U-ZTERM,     "结算方式
       TEXT1    TYPE  TEXT1_052,       "结算方式描述
       UKURS    TYPE  UKURS_CURR,      "汇率
       LASTMOTH TYPE  WRBTR,           "上月底应收款总额
       BYXS     TYPE  WRBTR,           "本月销售
       BYSK     TYPE  WRBTR,           "本月收款
       BYDYSK   TYPE  WRBTR,           "本月底应收款总额
       ZY1      TYPE  WRBTR,           "转月
       ZYDATE   TYPE  STRING,          "转月日期
       YQ6TN    TYPE  WRBTR,           "逾期6个月
       YQ5TN    TYPE  WRBTR,           "逾期5个月
       YQ4TN    TYPE  WRBTR,           "逾期4个月
       YQ3TN    TYPE  WRBTR,           "逾期3个月
       YQ2TN    TYPE  WRBTR,           "逾期2个月
       YQ1TN    TYPE  WRBTR,           "逾期1个月
       NOBACK   TYPE  WRBTR,           "到期未收回
       DQ1TN    TYPE  WRBTR,           "离到期还有1个月
       DQ2TN    TYPE  WRBTR,           "离到期还有2个月到期
       DQ3TN    TYPE  WRBTR,           "离到期还有3个月到期
       DQ4TN    TYPE  WRBTR,           "离到期还有4个月到期
       DQ5TN    TYPE  WRBTR,           "离到期还有5个月到期
       DQ6TN    TYPE  WRBTR,           "离到期还有6个月到期
       DQ7TN    TYPE  WRBTR,           "离到期还有7个月到期
       YQ6T     TYPE  WRBTR,           "逾期6个月以上
       YQ5T     TYPE  WRBTR,           "逾期5个月
       YQ4T     TYPE  WRBTR,           "逾期4个月
       YQ3T     TYPE  WRBTR,           "逾期3个月
       YQ2T     TYPE  WRBTR,           "逾期2个月
       YQ1T     TYPE  WRBTR,           "逾期1个月
       NOBACK1  TYPE  WRBTR,           "到期未收回
       DQ1T     TYPE  WRBTR,           "离到期还有1个月
       DQ2T     TYPE  WRBTR,           "离到期还有2个月到期
       DQ3T     TYPE  WRBTR,           "离到期还有3个月到期
       DQ4T     TYPE  WRBTR,           "离到期还有4个月到期
       DQ5T     TYPE  WRBTR,           "离到期还有5个月到期
       DQ6T     TYPE  WRBTR,           "离到期还有6个月到期
       DQ7T     TYPE  WRBTR,           "离到期还有7个月到期
       VKORG    TYPE KNVV-VKORG,       "销售组织
       VKBUR    TYPE CHAR40,           "销售部门
       BEZEI    TYPE CHAR100,          "销售部门名称
       PERNR    TYPE KNVP-PERNR,       "业务员
       NCHMC    TYPE PA0002-NCHMC,     "业务员的姓
       VNAMC    TYPE PA0002-VNAMC ,    "业务员的名
       SNAME    TYPE CHAR50,           "业务员名称
       END OF GTP_TAB.

* 定义内表
DATA: GT_TAB    TYPE STANDARD TABLE OF GTP_TAB,     "汇总
      GT_ALVTAB TYPE STANDARD TABLE OF GTP_TAB.     "alv显示表

* 定义工作区/结构
DATA: GS_TAB    TYPE GTP_TAB,
      GS_ALVTAB TYPE GTP_TAB.

"为到期逾期定义的perform的全局变量。
DATA: GF_DAYS   TYPE  T5A4A-DLYDY,   "天数
      GF_MONTHS TYPE  T5A4A-DLYMO,   "月数
      GF_SIGUM  TYPE  T5A4A-SPLIT,   "符号
      GF_YEARS  TYPE  T5A4A-DLYYR,   "年数
      GF_CLAC   TYPE  P0001-BEGDA,   "返回结果
      GF_YQ     TYPE  GTP_TAB,       "逾期
      GF_DQ     TYPE  GTP_TAB,       "到期
      DQ1N      TYPE  CHAR20,        "alv到期一个月
      DQ2N      TYPE  CHAR20,        "alv到期二个月
      DQ3N      TYPE  CHAR20,        "alv到期三个月
      DQ4N      TYPE  CHAR20,        "alv到期四个月
      DQ5N      TYPE  CHAR20,        "alv到期五个月
      DQ6N      TYPE  CHAR20,        "alv到期六个月
      DQ7N      TYPE  CHAR20,        "alv到期七个月
      YEAR1     TYPE  BSAD-GJAHR,    "过渡年份
      DATE1     TYPE  BSAD-MONAT.    "过渡月份

DATA: BYDYT       TYPE SYST_DATUM,      "本月第一天
      XYDYT       TYPE SYST_DATUM,
      P_BUDAT     TYPE SY-DATUM,
      GF_RDATE    TYPE P0001-BEGDA,
      GF_LASTDATE TYPE P0001-BEGDA,
      GF_DATE     TYPE P0001-BEGDA,     "过渡变量1
      GF_DATE1    TYPE P0001-BEGDA.     "过渡变量2

"日志表
DATA: LT_LOG TYPE STANDARD TABLE OF ZTFI29AN_LOG,
      LS_LOG TYPE ZTFI29AN_LOG
      .
DATA: GT_ZCUS TYPE TABLE OF ZCUS_MON_TRANS,
      GS_ZCUS TYPE ZCUS_MON_TRANS.

"定义指针
FIELD-SYMBOLS: <GS_TAB> LIKE  GS_TAB.
FIELD-SYMBOLS: <FS> TYPE ANY.
FIELD-SYMBOLS: <FS_WA> TYPE ANY.

"定义ALV结构
DATA: GT_FIELDCAT TYPE LVC_T_FCAT,
      GS_FIELDCAT TYPE LVC_S_FCAT,
      GS_LAYOUT   TYPE LVC_S_LAYO.

*&---------------------------------------------------------------------*
*&           创建选择屏幕
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK SK1 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS:  S_BUKRS  FOR T001-BUKRS OBLIGATORY,                    "公司代码
                 S_KUNNR  FOR KNA1-KUNNR.                               "客户编号
PARAMETERS:P_YEAR  TYPE BSAD-GJAHR DEFAULT SY-DATUM+0(4)   OBLIGATORY.    "年份
PARAMETERS:P_MONTH TYPE BSAD-MONAT DEFAULT SY-DATUM+4(2)   OBLIGATORY.    "月份
PARAMETERS:P_DK TYPE C AS CHECKBOX.

SELECTION-SCREEN END OF BLOCK SK1.

START-OF-SELECTION."程序处理事件

  CONCATENATE P_YEAR P_MONTH '01' INTO BYDYT.
  CALL FUNCTION 'FIMA_DATE_CREATE'
    EXPORTING
      I_DATE   = BYDYT
      I_MONTHS = 1
    IMPORTING
      E_DATE   = XYDYT.
  P_BUDAT = XYDYT.

  PERFORM GET_DATA.        "取数
  IF GT_TAB IS INITIAL.
    MESSAGE '未查询到数据!' TYPE 'S' DISPLAY LIKE 'E'.
    RETURN.
  ENDIF.

  PERFORM EDT_DATA.        "取逾期到期的数据
  IF GT_ALVTAB[] IS INITIAL.
    MESSAGE '未查询到数据!' TYPE 'S' DISPLAY LIKE 'E'.
    RETURN.
  ENDIF.

  PERFORM GET_DETAILS.     "填错数据

  PERFORM SHOW_TIME.       "取动态的到期日期

  PERFORM SET_FIELDCAT USING:'BUKRS' '公司代码' '' 'T001' 'BUKRS',
                             'KUNNR' '客户编号' 'X'  'KNA1' 'KUNNR',
                             'NAME1' '客户名称' '' '' '',
                             'TEXT1' '结算方式' '' '' '',
                             'WAERS' '凭证货币' '' '' '',
                             'UKURS' '本期汇率' '' '' '',
                             'LASTMOTH' '上月底应收款总额' '' '' '',
                             'BYXS'  '本月销售' '' '' '',
                             'BYSK'  '本月收款' '' '' '',
                             'BYDYSK' '本月底应收款总额' '' '' '',
                             'ZYDATE' '转月日期' '' '' '',
                             'ZY1'  '本月转月' '' '' '',
                             'YQ6T' '逾期6个月以上' '' '' '',
                             'YQ5T' '逾期5个月' '' '' '',
                             'YQ4T' '逾期4个月' '' '' '',
                             'YQ3T' '逾期3个月' '' '' '',
                             'YQ2T' '逾期2个月' '' '' '',
                             'YQ1T' '逾期1个月' '' '' '',
                             'NOBACK1' '到期未收回' '' '' '',
                             'DQ1T' DQ1N '' '' '',
                             'DQ2T' DQ2N '' '' '',
                             'DQ3T' DQ3N '' '' '',
                             'DQ4T' DQ4N '' '' '',
                             'DQ5T' DQ5N '' '' '',
                             'DQ6T' DQ6N '' '' '',
                             'DQ7T' DQ7N '' '' '',
                             'SNAME' '业务员名称' '' '' '',
*                             'VKORG' '销售组织' '' '' '',
                             'VKBUR' '部门编号' '' '' '',
                             'BEZEI' '销售部门描述' '' '' ''.

  PERFORM SET_LAYOUT. "格式设置

  PERFORM SHOW_ALV.   "alv显示

*&---------------------------------------------------------------------*
*&      Form  GET_DATA
*&---------------------------------------------------------------------*
*       text  取数
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM GET_DATA .
  CLEAR:GT_TAB.
*  GT_TAB_K,GT_TAB_T,GT_KNA1,GT_T052U,GT_NEWTAB.
  CLEAR:GS_TAB.
  CLEAR:GF_RDATE,GF_LASTDATE.
  CONCATENATE P_YEAR P_MONTH '01' INTO GF_RDATE.
  SELECT BSID~BUKRS       "公司代码
         BSID~KUNNR       "客户名称
         BSID~BLART       "凭证类型
         BSID~WAERS       "货币码
         KNB1~ZTERM AS ZTERMT  "将要考虑的支付方法的清单
         BSID~ZTERM
         BSID~WRBTR       "货币金额
         BSID~DMBTR       "货币金额
         BSID~BUDAT       "凭证中的过帐日期
         BSID~ZFBDT       "用于到期日计算的基准日期
         BSID~SHKZG       "借方/贷方标识
         BSID~UMSKZ       "特别总账标识
         INTO  CORRESPONDING FIELDS OF TABLE GT_TAB
         FROM BSID
         LEFT JOIN KNB1 ON KNB1~KUNNR = BSID~KUNNR AND KNB1~BUKRS = BSID~BUKRS
         WHERE BSID~BUKRS IN S_BUKRS         " 公司代码
         AND   BSID~KUNNR IN S_KUNNR         " 客户编号
*         AND   BSID~SAKNR = '0000115100'         " 客户编号
*         AND  ( bsid~gjahr < p_year OR ( bsid~gjahr = p_year AND bsid~monat <= P_MONTH ) ).         " 年度
         AND BSID~BUDAT  <  XYDYT.
  " 期间

  SELECT BSAD~BUKRS       "公司代码
         BSAD~KUNNR       "客户名称
         BSAD~BLART       "凭证类型
         BSAD~WAERS       "货币码
         KNB1~ZTERM AS ZTERMT       "将要考虑的支付方法的清单
         BSAD~ZTERM
         BSAD~WRBTR       "货币金额
         BSAD~DMBTR       "货币金额
         BSAD~BUDAT       "凭证中的过帐日期
         BSAD~ZFBDT       "用于到期日计算的基准日期
         BSAD~SHKZG       "借方/贷方标识
         BSAD~UMSKZ       "特别总账标识
         APPENDING CORRESPONDING FIELDS OF TABLE GT_TAB
         FROM BSAD
         LEFT JOIN KNB1 ON KNB1~KUNNR = BSAD~KUNNR AND KNB1~BUKRS = BSAD~BUKRS
         WHERE BSAD~BUKRS IN S_BUKRS         " 公司代码
         AND   BSAD~KUNNR IN S_KUNNR         " 客户编号
*       AND   BSAD~SAKNR = '0000115100'
*  AND   ( bsad~gjahr < p_year OR ( bsad~gjahr = p_year AND bsad~monat <= P_MONTH ) ).   " 年度
         AND BSAD~BUDAT  <  XYDYT.

  " 期间

ENDFORM.



*&---------------------------------------------------------------------*
*&      Form  EDT_DATA
*&---------------------------------------------------------------------*
*       text 取到期逾期的相应数据
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM EDT_DATA .
  DATA: LV_ZSKJE TYPE WRBTR.
  DATA: LV_ZWKJE TYPE WRBTR.
  CLEAR: GT_ALVTAB[].
  CLEAR: GF_DATE.

  PERFORM GET_TIME.

  "客户转月日期底表
  SELECT * INTO TABLE @GT_ZCUS FROM ZCUS_MON_TRANS WHERE BUKRS IN @S_BUKRS.
  SORT GT_ZCUS BY KUNNR.

  SORT GT_TAB BY BUKRS KUNNR BUDAT.
  LOOP AT GT_TAB INTO DATA(GS_TAB) GROUP BY ( BUKRS = GS_TAB-BUKRS
                                      KUNNR = GS_TAB-KUNNR
                                      INDEX = GROUP INDEX   "生成分组索引行
                                      SIZE  = GROUP SIZE )  "生成分组成员数
                 DESCENDING ASSIGNING FIELD-SYMBOL(<TAB1>). "将分组按照降序排列

    "将分组的数据进行处理(添加到表便于展示)
    LV_ZSKJE = 0.
    LV_ZWKJE = 0.
    GS_ALVTAB-LASTMOTH = 0.
    GS_ALVTAB-BYDYSK = 0.
    GS_ALVTAB-BYXS = 0.
    GS_ALVTAB-BYSK = 0.
    GS_ALVTAB-YQ6T = 0.
    GS_ALVTAB-YQ5T = 0.
    GS_ALVTAB-YQ4T = 0.
    GS_ALVTAB-YQ3T = 0.
    GS_ALVTAB-YQ2T = 0.
    GS_ALVTAB-YQ1T = 0.
    GS_ALVTAB-NOBACK1 = 0.
    GS_ALVTAB-DQ1T = 0.
    GS_ALVTAB-DQ2T = 0.
    GS_ALVTAB-DQ3T = 0.
    GS_ALVTAB-DQ4T = 0.
    GS_ALVTAB-DQ5T = 0.
    GS_ALVTAB-DQ6T = 0.
    GS_ALVTAB-DQ7T = 0.
    GS_ALVTAB-BUKRS = <TAB1>-BUKRS.
    GS_ALVTAB-KUNNR = <TAB1>-KUNNR.
    P_BUDAT = XYDYT.
    "转月日期
    READ TABLE GT_ZCUS INTO GS_ZCUS WITH KEY KUNNR = GS_ALVTAB-KUNNR BINARY SEARCH.
    IF SY-SUBRC = 0.
      P_BUDAT+0(4) = P_YEAR.
      P_BUDAT+4(2) = P_MONTH.
      P_BUDAT+6(2) = GS_ZCUS-CUSTRANDATE.
      GS_ALVTAB-ZYDATE = GS_ZCUS-CUSTRANDATE.
    ELSE.
      "取最后一天
      P_BUDAT = P_BUDAT - 1.
      GS_ALVTAB-ZYDATE = P_BUDAT+6(2).
    ENDIF.
    LOOP AT GROUP <TAB1> ASSIGNING FIELD-SYMBOL(<WA1>).
      GS_ALVTAB-WAERS = <WA1>-WAERS.

      "截至上月底应收款额
      IF <WA1>-BUDAT < BYDYT AND <WA1>-UMSKZ = ''.
        IF <WA1>-SHKZG = 'H'.
          GS_ALVTAB-LASTMOTH = GS_ALVTAB-LASTMOTH - <WA1>-DMBTR.
        ELSE.
          GS_ALVTAB-LASTMOTH = GS_ALVTAB-LASTMOTH + <WA1>-DMBTR.
        ENDIF.
      ENDIF.

      "本月底应收款总额
      IF <WA1>-BUDAT < XYDYT AND <WA1>-UMSKZ = ''.
        IF <WA1>-SHKZG = 'H'.
          GS_ALVTAB-BYDYSK = GS_ALVTAB-BYDYSK - <WA1>-DMBTR.
        ELSE.
          GS_ALVTAB-BYDYSK = GS_ALVTAB-BYDYSK + <WA1>-DMBTR.
        ENDIF.
      ENDIF.

      "本月销售
      IF ( <WA1>-BUDAT >= BYDYT AND <WA1>-BUDAT < XYDYT ) AND ( <WA1>-BLART = 'RV' OR <WA1>-BLART = 'DR' )
       AND <WA1>-UMSKZ = ''.
        IF <WA1>-SHKZG = 'H'.
          GS_ALVTAB-BYXS  = GS_ALVTAB-BYXS - <WA1>-DMBTR.
        ELSE.
          GS_ALVTAB-BYXS  = GS_ALVTAB-BYXS + <WA1>-DMBTR.
        ENDIF.
      ENDIF.

      "本月收款
      IF ( <WA1>-BUDAT >= BYDYT AND <WA1>-BUDAT < XYDYT ) AND ( <WA1>-BLART = 'DZ' OR <WA1>-BLART = 'ZD' OR <WA1>-BLART = 'SA' )
       AND <WA1>-UMSKZ = ''.
        IF <WA1>-SHKZG = 'S'.
          GS_ALVTAB-BYSK  = GS_ALVTAB-BYSK - <WA1>-DMBTR.
        ELSE.
          GS_ALVTAB-BYSK  = GS_ALVTAB-BYSK + <WA1>-DMBTR.
        ENDIF.
      ENDIF.

      "收款金额
      IF ( <WA1>-BUDAT < XYDYT ) AND ( <WA1>-BLART = 'DZ' OR <WA1>-BLART = 'ZD' OR <WA1>-BLART = 'SA' )
       AND <WA1>-UMSKZ = ''.
        IF <WA1>-SHKZG = 'S'.
          LV_ZSKJE  = LV_ZSKJE - <WA1>-DMBTR.
        ELSE.
          LV_ZSKJE  = LV_ZSKJE + <WA1>-DMBTR.
        ENDIF.
      ENDIF.

      "应收款
      IF ( <WA1>-BLART = 'RV' OR <WA1>-BLART = 'DR' OR <WA1>-BLART = 'QC' ) AND <WA1>-UMSKZ = ''.
        IF <WA1>-BUDAT+6(2) > P_BUDAT+6(2).
          <WA1>-ZFBDT+6(2) = '01'.
          CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL'
            EXPORTING
              DATE      = <WA1>-ZFBDT
              DAYS      = 0
              MONTHS    = 2
*             SIGNUM    = '+'
              YEARS     = 0
            IMPORTING
              CALC_DATE = <WA1>-ZFBDT.
          <WA1>-ZFBDT = <WA1>-ZFBDT - 1.
        ENDIF.

        "本月转月
        IF <WA1>-BUDAT > P_BUDAT AND <WA1>-BUDAT+0(6) = P_BUDAT+0(6).
          IF <WA1>-SHKZG = 'S'.
            GS_ALVTAB-ZY1  = GS_ALVTAB-ZY1 + <WA1>-DMBTR.
          ELSE.
            GS_ALVTAB-ZY1  = GS_ALVTAB-ZY1 - <WA1>-DMBTR.
          ENDIF.
        ENDIF.

        "逾期6个月及以上
        CLEAR: GF_DATE.
        PERFORM SET_DATEFIELDCAT USING: GF_RDATE '0' '6' '-' '0'
                              CHANGING  GF_DATE.
        GF_DATE1 = GF_DATE - 1.
        GF_DATE1+6(2) = '01'.
        IF <WA1>-ZFBDT < GF_DATE.
          IF <WA1>-SHKZG = 'S'.
            GS_ALVTAB-YQ6T  = GS_ALVTAB-YQ6T + <WA1>-DMBTR.
          ELSE.
            GS_ALVTAB-YQ6T  = GS_ALVTAB-YQ6T - <WA1>-DMBTR.
          ENDIF.
        ENDIF.

        "逾期5个月
        CLEAR: GF_DATE.
        PERFORM SET_DATEFIELDCAT USING: GF_RDATE '0' '5' '-' '0'
                              CHANGING  GF_DATE.
        GF_DATE1 = GF_DATE - 1.
        GF_DATE1+6(2) = '01'.
        IF <WA1>-ZFBDT < GF_DATE AND <WA1>-ZFBDT >= GF_DATE1.
          IF <WA1>-SHKZG = 'S'.
            GS_ALVTAB-YQ5T  = GS_ALVTAB-YQ5T + <WA1>-DMBTR.
          ELSE.
            GS_ALVTAB-YQ5T  = GS_ALVTAB-YQ5T - <WA1>-DMBTR.
          ENDIF.
        ENDIF.

        "逾期4个月
        CLEAR: GF_DATE.
        PERFORM SET_DATEFIELDCAT USING: GF_RDATE '0' '4' '-' '0'
                              CHANGING  GF_DATE.
        GF_DATE1 = GF_DATE - 1.
        GF_DATE1+6(2) = '01'.
        IF <WA1>-ZFBDT < GF_DATE AND <WA1>-ZFBDT >= GF_DATE1.
          IF <WA1>-SHKZG = 'S'.
            GS_ALVTAB-YQ4T  = GS_ALVTAB-YQ4T + <WA1>-DMBTR.
          ELSE.
            GS_ALVTAB-YQ4T  = GS_ALVTAB-YQ4T - <WA1>-DMBTR.
          ENDIF.
        ENDIF.

        "逾期3个月
        CLEAR: GF_DATE.
        PERFORM SET_DATEFIELDCAT USING: GF_RDATE '0' '3' '-' '0'
                              CHANGING  GF_DATE.
        GF_DATE1 = GF_DATE - 1.
        GF_DATE1+6(2) = '01'.
        IF <WA1>-ZFBDT < GF_DATE AND <WA1>-ZFBDT >= GF_DATE1.
          IF <WA1>-SHKZG = 'S'.
            GS_ALVTAB-YQ3T  = GS_ALVTAB-YQ3T + <WA1>-DMBTR.
          ELSE.
            GS_ALVTAB-YQ3T  = GS_ALVTAB-YQ3T - <WA1>-DMBTR.
          ENDIF.
        ENDIF.

        "逾期2个月
        CLEAR: GF_DATE.
        PERFORM SET_DATEFIELDCAT USING: GF_RDATE '0' '2' '-' '0'
                              CHANGING  GF_DATE.
        GF_DATE1 = GF_DATE - 1.
        GF_DATE1+6(2) = '01'.
        IF <WA1>-ZFBDT < GF_DATE AND <WA1>-ZFBDT >= GF_DATE1.
          IF <WA1>-SHKZG = 'S'.
            GS_ALVTAB-YQ2T  = GS_ALVTAB-YQ2T + <WA1>-DMBTR.
          ELSE.
            GS_ALVTAB-YQ2T  = GS_ALVTAB-YQ2T - <WA1>-DMBTR.
          ENDIF.
        ENDIF.

        "逾期1个月
        CLEAR: GF_DATE.
        PERFORM SET_DATEFIELDCAT USING: GF_RDATE '0' '1' '-' '0'
                              CHANGING  GF_DATE.
        GF_DATE1 = GF_DATE - 1.
        GF_DATE1+6(2) = '01'.
        IF <WA1>-ZFBDT < GF_DATE AND <WA1>-ZFBDT >= GF_DATE1.
          IF <WA1>-SHKZG = 'S'.
            GS_ALVTAB-YQ1T  = GS_ALVTAB-YQ1T + <WA1>-DMBTR.
          ELSE.
            GS_ALVTAB-YQ1T  = GS_ALVTAB-YQ1T - <WA1>-DMBTR.
          ENDIF.
        ENDIF.

        "到期未回收
        CLEAR: GF_DATE.
        GF_DATE = GF_RDATE.
        GF_DATE1 = GF_DATE - 1.
        GF_DATE1+6(2) = '01'.
        IF <WA1>-ZFBDT < GF_DATE AND <WA1>-ZFBDT >= GF_DATE1.
          IF <WA1>-SHKZG = 'S'.
            GS_ALVTAB-NOBACK1  = GS_ALVTAB-NOBACK1 + <WA1>-DMBTR.
          ELSE.
            GS_ALVTAB-NOBACK1  = GS_ALVTAB-NOBACK1 - <WA1>-DMBTR.
          ENDIF.
        ENDIF.

        "到期1个月
        CLEAR: GF_DATE.
        PERFORM SET_DATEFIELDCAT USING: GF_RDATE '0' '1' '+' '0'
                              CHANGING  GF_DATE.
        GF_DATE1 = GF_DATE - 1.
        GF_DATE1+6(2) = '01'.
        IF <WA1>-ZFBDT < GF_DATE AND <WA1>-ZFBDT >= GF_DATE1.
          IF <WA1>-SHKZG = 'S'.
            GS_ALVTAB-DQ1T  = GS_ALVTAB-DQ1T + <WA1>-DMBTR.
          ELSE.
            GS_ALVTAB-DQ1T  = GS_ALVTAB-DQ1T - <WA1>-DMBTR.
          ENDIF.
        ENDIF.

        "到期2个月
        CLEAR: GF_DATE.
        PERFORM SET_DATEFIELDCAT USING: GF_RDATE '0' '2' '+' '0'
                              CHANGING  GF_DATE.
        GF_DATE1 = GF_DATE - 1.
        GF_DATE1+6(2) = '01'.
        IF <WA1>-ZFBDT < GF_DATE AND <WA1>-ZFBDT >= GF_DATE1.
          IF <WA1>-SHKZG = 'S'.
            GS_ALVTAB-DQ2T  = GS_ALVTAB-DQ2T + <WA1>-DMBTR.
          ELSE.
            GS_ALVTAB-DQ2T  = GS_ALVTAB-DQ2T - <WA1>-DMBTR.
          ENDIF.
        ENDIF.

        "到期3个月
        CLEAR: GF_DATE.
        PERFORM SET_DATEFIELDCAT USING: GF_RDATE '0' '3' '+' '0'
                              CHANGING  GF_DATE.
        GF_DATE1 = GF_DATE - 1.
        GF_DATE1+6(2) = '01'.
        IF <WA1>-ZFBDT < GF_DATE AND <WA1>-ZFBDT >= GF_DATE1.
          IF <WA1>-SHKZG = 'S'.
            GS_ALVTAB-DQ3T  = GS_ALVTAB-DQ3T + <WA1>-DMBTR.
          ELSE.
            GS_ALVTAB-DQ3T  = GS_ALVTAB-DQ3T - <WA1>-DMBTR.
          ENDIF.
        ENDIF.

        "到期4个月
        CLEAR: GF_DATE.
        PERFORM SET_DATEFIELDCAT USING: GF_RDATE '0' '4' '+' '0'
                              CHANGING  GF_DATE.
        GF_DATE1 = GF_DATE - 1.
        GF_DATE1+6(2) = '01'.
        IF <WA1>-ZFBDT < GF_DATE AND <WA1>-ZFBDT >= GF_DATE1.
          IF <WA1>-SHKZG = 'S'.
            GS_ALVTAB-DQ4T  = GS_ALVTAB-DQ4T + <WA1>-DMBTR.
          ELSE.
            GS_ALVTAB-DQ4T  = GS_ALVTAB-DQ4T - <WA1>-DMBTR.
          ENDIF.
        ENDIF.

        "到期5个月
        CLEAR: GF_DATE.
        PERFORM SET_DATEFIELDCAT USING: GF_RDATE '0' '5' '+' '0'
                              CHANGING  GF_DATE.
        GF_DATE1 = GF_DATE - 1.
        GF_DATE1+6(2) = '01'.
        IF <WA1>-ZFBDT < GF_DATE AND <WA1>-ZFBDT >= GF_DATE1.
          IF <WA1>-SHKZG = 'S'.
            GS_ALVTAB-DQ5T  = GS_ALVTAB-DQ5T + <WA1>-DMBTR.
          ELSE.
            GS_ALVTAB-DQ5T  = GS_ALVTAB-DQ5T - <WA1>-DMBTR.
          ENDIF.
        ENDIF.

        "到期6个月
        CLEAR: GF_DATE.
        PERFORM SET_DATEFIELDCAT USING: GF_RDATE '0' '6' '+' '0'
                              CHANGING  GF_DATE.
        GF_DATE1 = GF_DATE - 1.
        GF_DATE1+6(2) = '01'.
        IF <WA1>-ZFBDT < GF_DATE AND <WA1>-ZFBDT >= GF_DATE1.
          IF <WA1>-SHKZG = 'S'.
            GS_ALVTAB-DQ6T  = GS_ALVTAB-DQ6T + <WA1>-DMBTR.
          ELSE.
            GS_ALVTAB-DQ6T  = GS_ALVTAB-DQ6T - <WA1>-DMBTR.
          ENDIF.
        ENDIF.

        "到期7个月
        IF <WA1>-ZFBDT >= GF_DATE.
          IF <WA1>-SHKZG = 'S'.
            GS_ALVTAB-DQ7T  = GS_ALVTAB-DQ7T + <WA1>-DMBTR.
          ELSE.
            GS_ALVTAB-DQ7T  = GS_ALVTAB-DQ7T - <WA1>-DMBTR.
          ENDIF.
        ENDIF.
      ENDIF.
    ENDLOOP.
*    LV_ZSKJE = 0.

    " 抵逾期款
    IF LV_ZSKJE > 0.
      IF GS_ALVTAB-YQ6T > 0.
        IF LV_ZSKJE > GS_ALVTAB-YQ6T.
          LV_ZSKJE = LV_ZSKJE - GS_ALVTAB-YQ6T.
          GS_ALVTAB-YQ6T = 0.
        ELSE.
          GS_ALVTAB-YQ6T = GS_ALVTAB-YQ6T - LV_ZSKJE.
          LV_ZSKJE = 0.
        ENDIF.
      ENDIF.
    ENDIF.

    IF LV_ZSKJE > 0.
      IF GS_ALVTAB-YQ5T > 0.
        IF LV_ZSKJE > GS_ALVTAB-YQ5T.
          LV_ZSKJE = LV_ZSKJE - GS_ALVTAB-YQ5T.
          GS_ALVTAB-YQ5T = 0.
        ELSE.
          GS_ALVTAB-YQ5T = GS_ALVTAB-YQ5T - LV_ZSKJE.
          LV_ZSKJE = 0.
        ENDIF.
      ENDIF.
    ENDIF.

    IF LV_ZSKJE > 0.
      IF GS_ALVTAB-YQ4T > 0.
        IF LV_ZSKJE > GS_ALVTAB-YQ4T.
          LV_ZSKJE = LV_ZSKJE - GS_ALVTAB-YQ4T.
          GS_ALVTAB-YQ4T = 0.
        ELSE.
          GS_ALVTAB-YQ4T = GS_ALVTAB-YQ4T - LV_ZSKJE.
          LV_ZSKJE = 0.
        ENDIF.
      ENDIF.
    ENDIF.

    IF LV_ZSKJE > 0.
      IF GS_ALVTAB-YQ3T > 0.
        IF LV_ZSKJE > GS_ALVTAB-YQ3T.
          LV_ZSKJE = LV_ZSKJE - GS_ALVTAB-YQ3T.
          GS_ALVTAB-YQ3T = 0.
        ELSE.
          GS_ALVTAB-YQ3T = GS_ALVTAB-YQ3T - LV_ZSKJE.
          LV_ZSKJE = 0.
        ENDIF.
      ENDIF.
    ENDIF.

    IF LV_ZSKJE > 0.
      IF GS_ALVTAB-YQ2T > 0.
        IF LV_ZSKJE > GS_ALVTAB-YQ2T.
          LV_ZSKJE = LV_ZSKJE - GS_ALVTAB-YQ2T.
          GS_ALVTAB-YQ2T = 0.
        ELSE.
          GS_ALVTAB-YQ2T = GS_ALVTAB-YQ2T - LV_ZSKJE.
          LV_ZSKJE = 0.
        ENDIF.
      ENDIF.
    ENDIF.

    IF LV_ZSKJE > 0.
      IF GS_ALVTAB-YQ1T > 0.
        IF LV_ZSKJE > GS_ALVTAB-YQ1T.
          LV_ZSKJE = LV_ZSKJE - GS_ALVTAB-YQ1T.
          GS_ALVTAB-YQ1T = 0.
        ELSE.
          GS_ALVTAB-YQ1T = GS_ALVTAB-YQ1T - LV_ZSKJE.
          LV_ZSKJE = 0.
        ENDIF.
      ENDIF.
    ENDIF.

    IF LV_ZSKJE > 0.
      IF GS_ALVTAB-NOBACK1 > 0.
        IF LV_ZSKJE > GS_ALVTAB-NOBACK1.
          LV_ZSKJE = LV_ZSKJE - GS_ALVTAB-NOBACK1.
          GS_ALVTAB-NOBACK1 = 0.
        ELSE.
          GS_ALVTAB-NOBACK1 = GS_ALVTAB-NOBACK1 - LV_ZSKJE.
          LV_ZSKJE = 0.
        ENDIF.
      ENDIF.
    ENDIF.

    " 抵到期款
    IF LV_ZSKJE > 0.
      IF GS_ALVTAB-DQ1T > 0.
        IF LV_ZSKJE > GS_ALVTAB-DQ1T.
          LV_ZSKJE = LV_ZSKJE - GS_ALVTAB-DQ1T.
          GS_ALVTAB-DQ1T = 0.
        ELSE.
          GS_ALVTAB-DQ1T = GS_ALVTAB-DQ1T - LV_ZSKJE.
          LV_ZSKJE = 0.
        ENDIF.
      ENDIF.
    ENDIF.

    IF LV_ZSKJE > 0.
      IF GS_ALVTAB-DQ2T > 0.
        IF LV_ZSKJE > GS_ALVTAB-DQ2T.
          LV_ZSKJE = LV_ZSKJE - GS_ALVTAB-DQ2T.
          GS_ALVTAB-DQ2T = 0.
        ELSE.
          GS_ALVTAB-DQ2T = GS_ALVTAB-DQ2T - LV_ZSKJE.
          LV_ZSKJE = 0.
        ENDIF.
      ENDIF.
    ENDIF.

    IF LV_ZSKJE > 0.
      IF GS_ALVTAB-DQ3T > 0.
        IF LV_ZSKJE > GS_ALVTAB-DQ3T.
          LV_ZSKJE = LV_ZSKJE - GS_ALVTAB-DQ3T.
          GS_ALVTAB-DQ3T = 0.
        ELSE.
          GS_ALVTAB-DQ3T = GS_ALVTAB-DQ3T - LV_ZSKJE.
          LV_ZSKJE = 0.
        ENDIF.
      ENDIF.
    ENDIF.

    IF LV_ZSKJE > 0.
      IF GS_ALVTAB-DQ4T > 0.
        IF LV_ZSKJE > GS_ALVTAB-DQ4T.
          LV_ZSKJE = LV_ZSKJE - GS_ALVTAB-DQ4T.
          GS_ALVTAB-DQ4T = 0.
        ELSE.
          GS_ALVTAB-DQ4T = GS_ALVTAB-DQ4T - LV_ZSKJE.
          LV_ZSKJE = 0.
        ENDIF.
      ENDIF.
    ENDIF.

    IF LV_ZSKJE > 0.
      IF GS_ALVTAB-DQ5T > 0.
        IF LV_ZSKJE > GS_ALVTAB-DQ5T.
          LV_ZSKJE = LV_ZSKJE - GS_ALVTAB-DQ5T.
          GS_ALVTAB-DQ5T = 0.
        ELSE.
          GS_ALVTAB-DQ5T = GS_ALVTAB-DQ5T - LV_ZSKJE.
          LV_ZSKJE = 0.
        ENDIF.
      ENDIF.
    ENDIF.

    IF LV_ZSKJE > 0.
      IF GS_ALVTAB-DQ6T > 0.
        IF LV_ZSKJE > GS_ALVTAB-DQ6T.
          LV_ZSKJE = LV_ZSKJE - GS_ALVTAB-DQ6T.
          GS_ALVTAB-DQ6T = 0.
        ELSE.
          GS_ALVTAB-DQ6T = GS_ALVTAB-DQ6T - LV_ZSKJE.
          LV_ZSKJE = 0.
        ENDIF.
      ENDIF.
    ENDIF.
    IF LV_ZSKJE > 0.
      IF GS_ALVTAB-DQ7T > 0.
        IF LV_ZSKJE > GS_ALVTAB-DQ7T.
          LV_ZSKJE = LV_ZSKJE - GS_ALVTAB-DQ7T.
          GS_ALVTAB-DQ7T = 0.
        ELSE.
          GS_ALVTAB-DQ7T = GS_ALVTAB-DQ7T - LV_ZSKJE.
          LV_ZSKJE = 0.
        ENDIF.
      ENDIF.
    ENDIF.

    IF LV_ZSKJE > 0.
      LV_ZWKJE = LV_ZWKJE + LV_ZSKJE.
    ENDIF.

    "本月应收款小于等于0 逾期/到期 都等于0
    IF GS_ALVTAB-BYDYSK <= 0.
      GS_ALVTAB-YQ6TN = 0.
      GS_ALVTAB-YQ5TN = 0.
      GS_ALVTAB-YQ4TN = 0.
      GS_ALVTAB-YQ3TN = 0.
      GS_ALVTAB-YQ2TN = 0.
      GS_ALVTAB-YQ1TN = 0.
      GS_ALVTAB-NOBACK = 0.
      GS_ALVTAB-DQ1TN = 0.
      GS_ALVTAB-DQ2TN = 0.
      GS_ALVTAB-DQ3TN = 0.
      GS_ALVTAB-DQ4TN = 0.
      GS_ALVTAB-DQ5TN = 0.
      GS_ALVTAB-DQ6TN = 0.
      GS_ALVTAB-DQ7TN = 0.
      GS_ALVTAB-YQ6T = 0.
      GS_ALVTAB-YQ5T = 0.
      GS_ALVTAB-YQ4T = 0.
      GS_ALVTAB-YQ3T = 0.
      GS_ALVTAB-YQ2T = 0.
      GS_ALVTAB-YQ1T = 0.
      GS_ALVTAB-NOBACK1 = 0.
      GS_ALVTAB-DQ1T = 0.
      GS_ALVTAB-DQ2T = 0.
      GS_ALVTAB-DQ3T = 0.
      GS_ALVTAB-DQ4T = 0.
      GS_ALVTAB-DQ5T = 0.
      GS_ALVTAB-DQ6T = 0.
      GS_ALVTAB-DQ7T = 0.
    ENDIF.
    APPEND GS_ALVTAB TO GT_ALVTAB.
    CLEAR GS_ALVTAB.
  ENDLOOP.
  SORT GT_ALVTAB BY BUKRS KUNNR.
  " 逾期款/到期款 <0 按月从逾期6个月到 到期7个月 逐个抵扣
  IF P_DK = ''.
    DATA: BEGIN OF LT_NAME OCCURS 0,
            NAME(10) TYPE C,
          END OF LT_NAME.
    CLEAR LT_NAME[].
    LT_NAME-NAME = 'YQ6T'.
    APPEND LT_NAME.
    LT_NAME-NAME = 'YQ5T'.
    APPEND LT_NAME.
    LT_NAME-NAME = 'YQ4T'.
    APPEND LT_NAME.
    LT_NAME-NAME = 'YQ3T'.
    APPEND LT_NAME.
    LT_NAME-NAME = 'YQ2T'.
    APPEND LT_NAME.
    LT_NAME-NAME = 'YQ1T'.
    APPEND LT_NAME.
    LT_NAME-NAME = 'NOBACK1'.
    APPEND LT_NAME.
    LT_NAME-NAME = 'DQ1T'.
    APPEND LT_NAME.
    LT_NAME-NAME = 'DQ2T'.
    APPEND LT_NAME.
    LT_NAME-NAME = 'DQ3T'.
    APPEND LT_NAME.
    LT_NAME-NAME = 'DQ4T'.
    APPEND LT_NAME.
    LT_NAME-NAME = 'DQ5T'.
    APPEND LT_NAME.
    LT_NAME-NAME = 'DQ6T'.
    APPEND LT_NAME.
    LT_NAME-NAME = 'DQ7T'.
    APPEND LT_NAME.
    LOOP AT GT_ALVTAB ASSIGNING FIELD-SYMBOL(<FS_ALVTAB>).
      LOOP AT LT_NAME.
        ASSIGN COMPONENT LT_NAME-NAME OF STRUCTURE <FS_ALVTAB> TO <FS>.
        IF <FS> < 0.
          LV_ZSKJE = <FS> * -1.
          LOOP AT LT_NAME.
            ASSIGN COMPONENT LT_NAME-NAME OF STRUCTURE <FS_ALVTAB> TO <FS_WA>.
            IF <FS_WA> > 0.
              IF LV_ZSKJE > <FS_WA>.
                LV_ZSKJE = LV_ZSKJE - <FS_WA>.
                <FS_WA> = 0.
              ELSE.
                <FS_WA> = <FS_WA> - LV_ZSKJE.
                LV_ZSKJE = 0.
              ENDIF.
              <FS> = LV_ZSKJE * -1.
              IF LV_ZSKJE <= 0.
                EXIT.
              ENDIF.
            ENDIF.
          ENDLOOP.
        ENDIF.
      ENDLOOP.
*      INNER = 1.
*      WHILE INNER <= 7.
*        LV_DQNAME = 'DQ' && INNER && 'T'.
*        ASSIGN COMPONENT LV_DQNAME OF STRUCTURE <FS_ALVTAB> TO <FS_DQ>.
*        IF <FS_DQ> < 0.
*          LV_ZSKJE = <FS_DQ> * -1.
*          OUTER = 6.
*          WHILE OUTER >= 0.
*            IF OUTER = '0'.
*              LV_YQNAME = 'NOBACK1'.
*            ELSE.
*              LV_YQNAME = 'YQ' && OUTER && 'T'.
*            ENDIF.
*            ASSIGN COMPONENT LV_YQNAME OF STRUCTURE <FS_ALVTAB> TO <FS_wa>.
*            IF <FS_wa> > 0.
*              IF LV_ZSKJE > <FS_wa>.
*                LV_ZSKJE = LV_ZSKJE - <FS_wa>.
*                <FS_wa> = 0.
*              ELSE.
*                <FS_wa> = <FS_wa> - LV_ZSKJE.
*                LV_ZSKJE = 0.
*              ENDIF.
*              <FS_DQ> = LV_ZSKJE * -1.
*            ENDIF.
*            IF LV_ZSKJE <= 0.
*              OUTER = 0.
*            ENDIF.
*            OUTER = OUTER - 1.
*          ENDWHILE.
*        ENDIF.
*        INNER = INNER + 1.
*      ENDWHILE.
    ENDLOOP.
  ENDIF.
ENDFORM.


*&---------------------------------------------------------------------*
*&      Form  SET_FIELDCAT
*&---------------------------------------------------------------------*
*       text   设置fieldcat
*----------------------------------------------------------------------*
*      -->P_FORM  text
*      -->P_GET_DATA  text
*----------------------------------------------------------------------*
FORM SET_FIELDCAT  USING    P_FIELDNAME
                            P_TEXT
                            P_NO_ZERO
                            P_REF_TABLE
                            P_REF_FIELD.
  CLEAR:GS_FIELDCAT.
  GS_FIELDCAT-FIELDNAME = P_FIELDNAME.
  GS_FIELDCAT-SCRTEXT_S = P_TEXT.
  GS_FIELDCAT-SCRTEXT_M = P_TEXT.
  GS_FIELDCAT-SCRTEXT_L = P_TEXT.
  GS_FIELDCAT-NO_ZERO   = P_NO_ZERO.
  GS_FIELDCAT-REF_FIELD = P_REF_FIELD.
  GS_FIELDCAT-REF_TABLE = P_REF_TABLE.

  APPEND GS_FIELDCAT TO GT_FIELDCAT.
  CLEAR:GS_FIELDCAT.
ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  SET_DATEFIELDCAT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->ls_date    text   "输入日期
*      -->ls_days    text   "天数
*      -->ls_months  text   "月数
*      -->ls_sigum   text   "符号
*      -->ls_years   text   "年数
*      <--P_YQ1TN  text
*----------------------------------------------------------------------*
FORM SET_DATEFIELDCAT USING    P_LASTDATE  TYPE  P0001-BEGDA
                               P_DAYS      TYPE  T5A4A-DLYDY
                               P_MONTH     TYPE  T5A4A-DLYMO
                               P_SIGUM     TYPE  T5A4A-SPLIT
                               P_YEARS     TYPE  T5A4A-DLYYR
                      CHANGING P_DATA      TYPE  P0001-BEGDA.

  CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL'
    EXPORTING
      DATE      = P_LASTDATE     "输入的日期
      DAYS      = P_DAYS         "天数
      MONTHS    = P_MONTH        "月数
      SIGNUM    = P_SIGUM        "+号:表示 N天/月/年后的日期, -号:表示过去的日期
      YEARS     = P_YEARS        "年数
    IMPORTING
      CALC_DATE = P_DATA.        "返回结果

ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  SET_LAYOUT
*&---------------------------------------------------------------------*
*       text 格式设置
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM SET_LAYOUT .
  GS_LAYOUT-CWIDTH_OPT = 'X'.
  GS_LAYOUT-ZEBRA = 'X'.
ENDFORM.


*&---------------------------------------------------------------------*
*&      Form  SHOW_ALV
*&---------------------------------------------------------------------*
*       text  alv显示
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*


FORM SHOW_ALV .
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      I_CALLBACK_PROGRAM          = SY-REPID
      I_CALLBACK_PF_STATUS_SET    = 'SET_PF_STATUS'  "状态设置
*     i_callback_user_command     = 'USER_COMMAND'   "功能代码
      I_CALLBACK_HTML_TOP_OF_PAGE = 'ALV_TOP_OF_PAGE' "自定义ALV表头
      IS_LAYOUT_LVC               = GS_LAYOUT
      IT_FIELDCAT_LVC             = GT_FIELDCAT
      I_SAVE                      = 'A'     "变式设置,A表示全部
    TABLES
      T_OUTTAB                    = GT_ALVTAB.
ENDFORM.


*&---------------------------------------------------------------------*
*&      Form  EDIT_LAYOUT
*&---------------------------------------------------------------------*
*       text ALV状态栏设置
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM SET_PF_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB.
  SET PF-STATUS 'STANDARD_FULLSCREEN'.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  GET_DETAILS
*&---------------------------------------------------------------------*
*       text 获取明细
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM GET_DETAILS .

* SELECT SINGLE ATINN INTO LS_ATINN FROM CABN WHERE ATNAM = 'ZSALES_PERSON'.

  IF GT_ALVTAB[] IS NOT INITIAL.

    "销售办公室
    SELECT * INTO TABLE @DATA(LT_VKBUR) FROM TVKBT WHERE SPRAS = @SY-LANGU.
    SORT LT_VKBUR BY VKBUR.

    "取客户名称描述
    SELECT B~KUNNR, B~ZTERM, A~NAME1 INTO TABLE @DATA(LT_KNA1)
      FROM KNA1 AS A
      INNER JOIN KNB1 AS B ON A~KUNNR = B~KUNNR
      FOR ALL ENTRIES IN @GT_ALVTAB
      WHERE B~BUKRS = @GT_ALVTAB-BUKRS
      AND B~KUNNR = @GT_ALVTAB-KUNNR.
    SORT LT_KNA1 BY KUNNR.
    IF SY-SUBRC = 0.

      "收付条件 描述
      SELECT * INTO TABLE @DATA(LT_T052U)
        FROM T052U
        FOR ALL ENTRIES IN @LT_KNA1
        WHERE ZTERM = @LT_KNA1-ZTERM
        AND SPRAS = @SY-LANGU
        AND TEXT1 <> ''.
      SORT LT_T052U BY ZTERM.

      "客户销售数据
      SELECT A~KUNNR,B~BUKRS,B~VKORG,
        VTWEG, SPART,VKBUR, A~WAERS
        INTO TABLE @DATA(LT_KNVV)
        FROM KNVV AS A
        INNER JOIN TVKO AS B ON A~VKORG = B~VKORG
        FOR ALL ENTRIES IN @LT_KNA1
        WHERE A~KUNNR = @LT_KNA1-KUNNR
        AND B~BUKRS IN @S_BUKRS.
      SORT LT_KNVV BY KUNNR VKORG .
      DELETE ADJACENT DUPLICATES FROM LT_KNVV COMPARING KUNNR VKORG.
      IF LT_KNVV[] IS NOT INITIAL.

        "取客户业务员编号
        SELECT KUNNR,VKORG,VTWEG,SPART,PARVW,PARZA,PERNR
         INTO  TABLE @DATA(LT_PERNR)
         FROM KNVP
         FOR ALL ENTRIES IN @LT_KNVV
         WHERE KUNNR = @LT_KNVV-KUNNR
         AND VKORG = @LT_KNVV-VKORG
         AND PARVW = 'VE'.
        SORT LT_PERNR BY KUNNR VKORG.
        IF LT_PERNR[] IS NOT INITIAL.

          " HR人员信息
          SELECT PERNR,NCHMC,VNAMC INTO TABLE @DATA(LT_PA0002)
            FROM PA0002
            FOR ALL ENTRIES IN @LT_PERNR
            WHERE PERNR = @LT_PERNR-PERNR.
          SORT LT_PA0002 BY PERNR.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDIF.

  UNASSIGN <GS_TAB>.
  LOOP AT GT_ALVTAB ASSIGNING <GS_TAB>.
    READ TABLE LT_KNA1 INTO DATA(LS_KNA1) WITH KEY KUNNR = <GS_TAB>-KUNNR BINARY SEARCH.
    IF SY-SUBRC = 0.
      <GS_TAB>-NAME1 = LS_KNA1-NAME1.
      READ TABLE LT_T052U INTO DATA(LS_T052U) WITH KEY ZTERM = LS_KNA1-ZTERM BINARY SEARCH.
      IF SY-SUBRC = 0.
        <GS_TAB>-TEXT1 = LS_T052U-TEXT1.
      ENDIF.
      READ TABLE LT_KNVV INTO DATA(LS_KNVV) WITH KEY KUNNR = LS_KNA1-KUNNR BINARY SEARCH.
      IF SY-SUBRC = 0.
        <GS_TAB>-WAERS = LS_KNVV-WAERS.
        <GS_TAB>-VKBUR = LS_KNVV-VKBUR.
        READ TABLE LT_VKBUR INTO DATA(LS_VKBUR) WITH KEY VKBUR = LS_KNVV-VKBUR BINARY SEARCH.
        IF SY-SUBRC = 0.
          <GS_TAB>-BEZEI = LS_VKBUR-BEZEI.
        ENDIF.
        READ TABLE LT_PERNR INTO DATA(LS_PERNR) WITH KEY KUNNR = LS_KNVV-KUNNR VKORG = LS_KNVV-VKORG BINARY SEARCH.
        IF SY-SUBRC = 0.
          READ TABLE LT_PA0002 INTO DATA(LS_PA0002) WITH KEY PERNR = LS_PERNR-PERNR BINARY SEARCH.
          IF SY-SUBRC = 0.
            CONCATENATE LS_PA0002-NCHMC LS_PA0002-VNAMC INTO <GS_TAB>-SNAME.
          ENDIF.
        ENDIF .
      ENDIF.
    ENDIF.
    CALL FUNCTION 'READ_EXCHANGE_RATE'  "本期汇率
      EXPORTING
        DATE             = GF_RDATE
        FOREIGN_CURRENCY = <GS_TAB>-WAERS  "凭证货币字段
        LOCAL_CURRENCY   = 'CNY'
        TYPE_OF_RATE     = 'M'
      IMPORTING
        EXCHANGE_RATE    = <GS_TAB>-UKURS.

    IF P_DK = 'X'.
      MOVE-CORRESPONDING <GS_TAB> TO LS_LOG.
      LS_LOG-GJAHR = P_YEAR.
      LS_LOG-MONAT = P_MONTH.
      APPEND LS_LOG TO LT_LOG.
    ENDIF.
  ENDLOOP.

*---------日志表记录----------------
  IF LT_LOG[] IS NOT INITIAL.
    MODIFY ZTFI29AN_LOG FROM TABLE LT_LOG.
  ENDIF.

ENDFORM.

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

*&---------------------------------------------------------------------*
*&      Form  ALV_TOP_OF_PAGE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->CL_DD      text
*      -->p2         text
*----------------------------------------------------------------------*
FORM ALV_TOP_OF_PAGE USING CL_DD TYPE REF TO CL_DD_DOCUMENT.
  DATA: M_P TYPE I.
  DATA: M_BUFF TYPE STRING.
  DATA: MSG TYPE STRING.
*  CONCATENATE p_year '年' P_MONTH '月账龄分析表' INTO msg.
  CONCATENATE P_BUDAT '账龄分析表' INTO MSG.
*表头其实完全可以是一个html文件,自己使用html语言进行格式控制
  M_BUFF = '<html>'.
  CALL METHOD CL_DD->HTML_INSERT
    EXPORTING
      CONTENTS = M_BUFF
    CHANGING
      POSITION = M_P.
  M_BUFF = MSG.
  CALL METHOD CL_DD->HTML_INSERT
    EXPORTING
      CONTENTS = M_BUFF
    CHANGING
      POSITION = M_P.

  CONCATENATE  '<table width="1000"><tr><td>日期:' SY-DATUM
  '</td><td><div align="right">操作用户:'
  SY-UNAME'</div></td></table>' INTO M_BUFF.

  CALL METHOD CL_DD->HTML_INSERT
    EXPORTING
      CONTENTS = M_BUFF
    CHANGING
      POSITION = M_P.

ENDFORM.                    "ALV_TOP_OF_PAGE
*&---------------------------------------------------------------------*
*&      Form  SHOW_TIME
*&---------------------------------------------------------------------*
*       text  取动态到期日期放入alv中
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM SHOW_TIME .
  CLEAR: DQ1N,DQ2N,DQ3N,DQ4N,DQ5N,DQ6N,DQ7N,YEAR1,DATE1.
  IF P_MONTH + 1 > 12.
    YEAR1 = P_YEAR + 1.
    DATE1 = P_MONTH - 11.
    CONCATENATE YEAR1 '年' DATE1 '月到期' INTO DQ1N.
  ELSE.
    DATE1 = P_MONTH + 1.
    CONCATENATE P_YEAR '年' DATE1 '月到期' INTO DQ1N.
  ENDIF.

  CLEAR: YEAR1,DATE1.
  IF P_MONTH + 2 > 12.
    YEAR1 = P_YEAR + 1.
    DATE1 = P_MONTH - 10.
    CONCATENATE YEAR1 '年' DATE1 '月到期' INTO DQ2N.
  ELSE.
    DATE1 = P_MONTH + 2.
    CONCATENATE P_YEAR '年' DATE1 '月到期' INTO DQ2N.
  ENDIF.

  CLEAR: YEAR1,DATE1.
  IF P_MONTH + 3 > 12.
    YEAR1 = P_YEAR + 1.
    DATE1 = P_MONTH - 9.
    CONCATENATE YEAR1 '年' DATE1 '月到期' INTO DQ3N.
  ELSE.
    DATE1 = P_MONTH + 3.
    CONCATENATE P_YEAR '年' DATE1 '月到期' INTO DQ3N.
  ENDIF.

  CLEAR: YEAR1,DATE1.
  IF P_MONTH + 4 > 12.
    YEAR1 = P_YEAR + 1.
    DATE1 = P_MONTH - 8.
    CONCATENATE YEAR1 '年' DATE1 '月到期' INTO DQ4N.
  ELSE.
    DATE1 = P_MONTH + 4.
    CONCATENATE P_YEAR '年' DATE1 '月到期' INTO DQ4N.
  ENDIF.

  CLEAR: YEAR1,DATE1.
  IF P_MONTH + 5 > 12.
    YEAR1 = P_YEAR + 1.
    DATE1 = P_MONTH - 7.
    CONCATENATE YEAR1 '年' DATE1 '月到期' INTO DQ5N.
  ELSE.
    DATE1 = P_MONTH + 5.
    CONCATENATE P_YEAR '年' DATE1 '月到期' INTO DQ5N.
  ENDIF.

  CLEAR: YEAR1,DATE1.
  IF P_MONTH + 6 > 12.
    YEAR1 = P_YEAR + 1.
    DATE1 = P_MONTH - 6.
    CONCATENATE YEAR1 '年' DATE1 '月到期' INTO DQ6N.
  ELSE.
    DATE1 = P_MONTH + 6.
    CONCATENATE P_YEAR '年' DATE1 '月到期' INTO DQ6N.
  ENDIF.

  CLEAR: YEAR1,DATE1.
  IF P_MONTH + 7 > 12.
    YEAR1 = P_YEAR + 1.
    DATE1 = P_MONTH - 5.
    CONCATENATE YEAR1 '年' DATE1 '月到期' INTO DQ7N.
  ELSE.
    DATE1 = P_MONTH + 7.
    CONCATENATE P_YEAR '年' DATE1 '月到期' INTO DQ7N.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  GET_TIME
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM GET_TIME .

  CLEAR: GF_RDATE,GF_LASTDATE.

  CONCATENATE P_YEAR P_MONTH '01' INTO GF_RDATE.                 " 年度期间的第一天

  PERFORM SET_DATEFIELDCAT USING: GF_RDATE '0' '1' '+' '0'         "屏幕会计年度下个月第一天
                          CHANGING GF_LASTDATE.

ENDFORM.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小啊曼

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值