************************************************************************
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.