作业需求编写FI模块应收应付的报表.docx
《作业需求编写FI模块应收应付的报表.docx》由会员分享,可在线阅读,更多相关《作业需求编写FI模块应收应付的报表.docx(28页珍藏版)》请在冰豆网上搜索。
作业需求编写FI模块应收应付的报表
作业需求:
编写FI模块应收应付的报表
目录:
1.作业目的和安排
本作业的目的是:
1.为了进一步熟悉ABAP的编程技巧;
2.更主要的目标的:
熟悉sapfi模块的应收和应付业务场景;
3.熟悉相关的表;
2.作业简单需求
开发一个FI模块的报表:
输入的条件是:
供应商(但是可以多选),公司代码(必输)账龄计算日:
报表输出字段包括:
公司代码、供应商(客户),年度销售总额、应付(收)账款总额、<0天金额
1-30天,31-60天,61-90天,91-150天,150天以上
数据结果需要和这个表进行比对。
3.作业要求
时间要求:
1.郭裕的要求
2天左右开发完成报表;
2.一般的项目要求
给予4天左右。
3.最低要求
4.作业过程
1.充分分析需求;
2.对于复杂程序在编写之前要画流程图;
为了方便和加深对要编写程序的理解,我们一般:
步骤一:
编写字段来源
输入的条件是:
公司代码(必输),供应商(但是可以多选),账龄计算日(默认今天)
报表输出字段包括:
公司代码、供应商,年度采购总额、应付账款总额、<=0天金额,1-30天,31-60天,61-90天,91-150天,150天以上
需要的表字段:
(具体见步骤2)
BSIK(会计核算:
供应商的第二次索引(未结算项目)):
公司代码(bukrs),供应商(lifnr),清帐日期(AUGDT)用于到期日计算的基准日期(ZFBDT)
BSAK(会计核算:
供应商的第二个索引(已结算项目)):
公司代码(bukrs),供应商(lifnr),清帐日期(AUGDT)用于到期日计算的基准日期(ZFBDT)
要知道年度采购总额,必须知道年度已付账款总额+年度应付账款总额,采购成立与否,是由收到发票与否来判断的。
每张发票都对应一个会计凭证,此凭证分别在bsik和bsak中都可找到。
经se16n检查,bsik中清算单据的单据号码(AUGBL)全部为空,bsak中清算单据的单据号码(AUGBL)全部不为空。
这个字段表示对会计凭证编号(BELNR)的清算单据号,blart代表凭证类型。
例子:
用f-53实验了2笔清帐凭证,2笔都是完全清帐了1个会计凭证,部分清帐了1个会计凭证。
第1笔清帐凭证号是1500000005,我填的开始总清帐金额为1234元,完全清帐了5100000673的696元,部分清帐了1500000005的538元,一共就是1234元。
第2笔清帐凭证号为1500000006,开始清帐总金额为2345元,完全清帐了5100000004的367.72元,部分清帐了1500000006的1977.28元,共2345元。
在se11中查看bsak,可以分别看到2笔清帐凭证已经完成的清帐,注意SHKZG是借贷标记,DMBTR(按本位币计的金额)和WRBTR(凭证货币金额),
同样在se11中查看bsik,可以分别看到2笔清帐凭证部分完成的清帐:
年度采购总额可以通过发票金额总额来判断,也就是bsik和bsak中凭证类型为RE的。
应付账款总额,即bsik中所有凭证金额之和(正负冲销,原因见下面)。
上图其实是已清的,为何在未清中呢?
这很令人混淆,其实答案很简单,它是正值!
写到那里就是为了冲销用的,所有应付的实质是欠款,因此显示都是负值,因此,它们还是显示原来的值(负值),不管冲销多少,只要没冲销完,就显示原来的,比如下图:
已经被冲销了很多次了,可是没有完,所以值不变。
正负冲销的判断是借方或贷方科目,在字段借贷标识(SHKZG)中。
步骤二:
画数据来源表的逻辑关系
本次表关系比较简单,难在1.业务的理解和数据的寻找2.程序的统计功能上。
还在艰难摸索中。
步骤三:
具体完整程序流程
"在bsik中累加得到发票总金额
select bukrs lifnr sum( dmbtr )
into table git_bsik_sum
from bsik
where bukrs = s_bukrs
and lifnr in s_lifnr
and blart = 'RE'
group by bukrs lifnr.
"在bsak中累加得到发票总金额
select bukrs lifnr sum( dmbtr )
into table git_bsak_sum
from bsak
where bukrs = s_bukrs
and lifnr in s_lifnr
and blart = 'RE'
group by bukrs lifnr.
"合并未结算发票总额表git_bsik_sum与已结算发票总额表git_bsak_sum,结果
"得到销售总额表git_sum
git_sum[] = git_bsak_sum[].
"sort git_sum by lifnr.
loop at git_bsik_sum.
loop at git_bsak_sum.
first_index = SY-TABIX.
check = 0.
if git_bsik_sum-lifnr = git_bsak_sum-lifnr.
clear wa_sum.
wa_sum-bukrs = git_bsak_sum-bukrs.
wa_sum-lifnr = git_bsak_sum-lifnr.
wa_sum-dmbtr_sum = git_bsik_sum-dmbtr_sum + git_bsak_sum-dmbtr_sum.
modify git_sum from wa_sum index first_index.
check = 1.
exit.
endif.
endloop.
if check = 0.
clear wa_sum.
wa_sum-bukrs = git_bsik_sum-bukrs.
wa_sum-lifnr = git_bsik_sum-lifnr.
wa_sum-dmbtr_sum = git_bsik_sum-dmbtr_sum.
append wa_sum to git_sum.
endif.
endloop.
"对销售总额表按公司与供应商进行排序
sort git_sum by bukrs lifnr.
"程序设计中的检查功能
* write:
/ '销售总额表git_sum'.
* write:
/ '#############################################'.
* loop at git_sum.
* write:
/ git_sum-bukrs, git_sum-lifnr, git_sum-dmbtr_sum.
* endloop.
"在bsik中以公司供应商与借贷标识累加得到应付账款总额的分别借贷方
"得到处理前的应付账款总额表
select bukrs lifnr SHKZG sum( dmbtr )
into table git_bsik_yfze
from bsik
where bukrs = s_bukrs
and lifnr in s_lifnr
group by bukrs lifnr shkzg.
(难点)计算应付账款总额:
思路:
设置check为s,开始循环,done=0,检查是否H,
一.是上体是否h(由check判断),1.是则上体写入git,本体写入wa,check设为h;
2.否则本体写入wa,check设为h。
二.否本体减额写入wa,写入git,done=1,check设为s。
三.判断是否到了表尾,是则判断done是否为0,是则本体写入git,最后一次清空wa。
"对此处理前应付总额表分别借贷方进行升序排序,'S'在前,'H'在后
sort git_bsik_yfze by bukrs lifnr SHKZG.
* loop at git_bsik_yfze. "程序设计中的检查功能
* write:
/ git_bsik_yfze-bukrs, git_bsik_yfze-lifnr, git_bsik_yfze-SHKZG, git_bsik_yfze-dmbtr_sum.
* endloop.
"得到合并借贷方后的处理后应付账款总额表git_bsik_yfzep p代表process”已经处理过的“
clear git_bsik_yfzep[].
check_p = 's'.
loop at git_bsik_yfze.
if git_bsik_yfze-SHKZG = 'H'.
if check_p = 'h'.
append wa_bsik_yfzep to git_bsik_yfzep.
clear wa_bsik_yfzep.
wa_bsik_yfzep-bukrs = git_bsik_yfze-bukrs.
wa_bsik_yfzep-lifnr = git_bsik_yfze-lifnr.
wa_bsik_yfzep-dmbtr_sum = git_bsik_yfze-dmbtr_sum.
check_p = 'h'.
else.
clear wa_bsik_yfzep.
wa_bsik_yfzep-bukrs = git_bsik_yfze-bukrs.
wa_bsik_yfzep-lifnr = git_bsik_yfze-lifnr.
wa_bsik_yfzep-dmbtr_sum = git_bsik_yfze-dmbtr_sum.
check_p = 'h'.
endif.
else.
wa_bsik_yfzep-bukrs = git_bsik_yfze-bukrs.
wa_bsik_yfzep-lifnr = git_bsik_yfze-lifnr.
wa_bsik_yfzep-dmbtr_sum = wa_bsik_yfzep-dmbtr_sum - git_bsik_yfze-dmbtr_sum.
if wa_bsik_yfzep-dmbtr_sum <> 0.
append wa_bsik_yfzep to git_bsik_yfzep.
endif.
check_p = 's'.
"initial_yingfu = initial_yingfu + git_bsik_yfze-dmbtr.
endif.
endloop.
"对处理后应付账款总额表进行排序
sort git_bsik_yfzep by bukrs lifnr.
* write:
/ '处理后应付账款总额表git_bsik_yfzep'.
* write:
/ '#############################################'.
* loop at git_bsik_yfzep. "程序设计中的检查功能
* write:
/ git_bsik_yfzep-bukrs, git_bsik_yfzep-lifnr, git_bsik_yfzep-dmbtr_sum.
* endloop.
(难点)合并年度采购总额和应付账款总额表:
思路:
Loop年度采购总额表,在应付账款总额表中找公司号与供应商号相同记录,找到则将应付账款总额加入,否则为0。
写入git。
Loop应付账款总额表,在年度采购总额表中找公司号与供应商号不同记录(因为上一步已经找了相同记录),如果是则将采购总额加入,否则为0。
写入git。
"合并销售总额表git_sum与应付账款总额表git_bsik_yfzep 第一步
refresh git_sumyfzep[].
loop at git_sum.
read table git_bsik_yfzep
with key bukrs = git_sum-bukrs
lifnr = git_sum-lifnr
binary search.
if sy-subrc = 0.
clear wa_sumyfzep.
wa_sumyfzep-bukrs = git_sum-bukrs.
wa_sumyfzep-lifnr = git_sum-lifnr.
wa_sumyfzep-dmbtr_gsum = git_sum-dmbtr_sum.
wa_sumyfzep-dmbtr_yfzep = git_bsik_yfzep-dmbtr_sum.
append wa_sumyfzep to git_sumyfzep.
else.
clear wa_sumyfzep.
wa_sumyfzep-bukrs = git_sum-bukrs.
wa_sumyfzep-lifnr = git_sum-lifnr.
wa_sumyfzep-dmbtr_gsum = git_sum-dmbtr_sum.
wa_sumyfzep-dmbtr_yfzep = 0.
append wa_sumyfzep to git_sumyfzep.
endif.
endloop.
"sort git_sum by bukrs lifnr. 前面已经sort过了,且没有改动表
"合并销售总额表git_sum与应付账款总额表git_bsik_yfzep 第二步
loop at git_bsik_yfzep.
read table git_sum
with key bukrs = git_bsik_yfzep-bukrs
lifnr = git_bsik_yfzep-lifnr
binary search.
if sy-subrc <> 0.
clear wa_sumyfzep.
wa_sumyfzep-bukrs = git_bsik_yfzep-bukrs.
wa_sumyfzep-lifnr = git_bsik_yfzep-lifnr.
wa_sumyfzep-dmbtr_gsum = 0.
wa_sumyfzep-dmbtr_yfzep = git_bsik_yfzep-dmbtr_sum.
append wa_sumyfzep to git_sumyfzep.
endif.
endloop.
"将得到的销售总额与应付账款总额表git_sumyfzep排序
sort git_sumyfzep by bukrs lifnr.
"程序设计中的检查功能
* write:
/ '销售总额与应付账款总额表git_sumyfzep'.
* write:
/ '#############################################'.
* loop at git_sumyfzep.
* write:
/ git_sumyfzep-bukrs, git_sumyfzep-lifnr, git_sumyfzep-dmbtr_gsum, git_sumyfzep-dmbtr_yfzep.
* endloop.
"内表无法inner join
* select
* a~bukrs
* a~lifnr
* a~dmbtr_sum
* b~dmbtr_sum
* into table git_sumyfzep
* from git_sum as a left join git_bsik_yfzep as b
* on a~bukrs = b~bukrs
* and a~lifnr = b~lifnr.
* loop at git_bsik_yfze. "程序设计中的检查功能
* write:
/ git_bsik_yfze-bukrs, git_bsik_yfze-lifnr, git_bsik_yfze-SHKZG, git_bsik_yfze-dmbtr_sum.
* endloop.
(难点)统计不同时间段的应付账款总额:
Loopgit_bsik表,
-1.赋值tmax_git_bsik=SY-TMAXL。
0.如果为借方,则直接重新循环。
(原因见4)
1.如果SY-TABIX=1,记录此供应商号入wa,readme=1,check=0,然后进入2;
否则与上一供应商号比,相等且check=0则重新循环。
若不等且check=0则记录此供应商号入wa,readme=1,进入下一步。
若相等且check=1,进入下一步。
若不等且check=1,则通过wa直接根据tabix_sumyfzep来modifygit_sumyfzep表,清空wa,记录供应商号入wa,check=0,readme=1,进入下一步。
2.如果readme=0,直接进入3;
如果readme=1,读表git_sumyfzep看有无记录的供应商号且应付总额不为0,
无则check=0,重新循环。
有则check=1,readme=0,并记录读此表的sy-tabix(tabix_sumyfzep=sy-tabix)进入下一步。
3.判断是否为贷方(原因见4),是则按账龄计算日与付款基准日ZFBDT对比,归类于不同时间段来累加金额,重新循环。
4.判断是否到达表尾(此为最后一条记录),也就是最外层sy-tabix是否等于tmax_git_bsik,是则通过wa直接根据tabix_sumyfzep来modifygit_sumyfzep表,最后一次清空wa,跳出。
5.由于业务理解阻碍,程序无法完美实现,因此只能做出半成品,可以知道应付账款各二阶汇总原始总额(贷方数据),而无法知道其现实总额(被借方冲销后剩余的贷方数据)
"按公司与供应商把所有借贷方金额与付款基准日期选出,以备二阶汇总
select bukrs lifnr SHKZG dmbtr ZFBDT
into corresponding fields of table git_bsik
from bsik
where bukrs = s_bukrs
and lifnr in s_lifnr.
"将二阶汇总备用表git_bsik按公司与供应商排序
sort git_bsik by bukrs lifnr.
"将二阶汇总应付数据写入销售与应付总额表,得到最终git_sumyfzep表
clear wa_sumyfzep. "重要!
!
!
我很容易就搞忘了
loop at git_bsik.
if git_bsik-shkzg = 'S'.
continue.
endif.
if sy-tabix = 1.
wa_sumyfzep-bukrs = git_bsik-bukrs.
wa_sumyfzep-lifnr = git_bsik-lifnr.
readme = 1.
check = 0.
else.
if ( git_bsik-lifnr = wa_sumyfzep-lifnr and check = 0 ).
continue.
endif.
if ( git_bsik-lifnr <> wa_sumyfzep-lifnr and check = 0 ).
wa_sumyfzep-bukrs = git_bsik-bukrs.
wa_sumyfzep-lifnr = git_bsik-lifnr.
readme = 1.
endif.
if ( git_bsik-lifnr = wa_sumyfzep-lifnr and check = 1 ).
"直接往下走
endif.
if ( git_bsik-lifnr <> wa_sumyfzep-lifnr and check = 1 ).
modify git_sumyfzep from wa_sumyfzep index tabix_sumyfzep.
clear wa_sumyfzep.
wa_sumyfzep-bukrs = git_bsik-bukrs.
wa_sumyfzep-lifnr = git_bsik-lifnr.
check = 0.
readme = 1.
endif.
endif.
if readme = 0.
"直接往下走
endif.
if readme = 1.
"看此公司供应商是否有应付账款,有的话肯定在git_sumyfzep中有记录
read table git_sumyfzep
with key lifnr = wa_sumyfzep-lifnr
binary search.
if sy-subrc <> 0.
continue.
else.
if git_sumyfzep-dmbtr_yfzep = 0.
continue.
endif.
endif.
check = 1.
readme = 0.
tabix_sumyfzep = sy-tabix.
wa_sumyfzep-dmbtr_