1、作业需求编写FI模块应收应付的报表作业需求:编写FI模块应收应付的报表 目录:1. 作业目的和安排本作业的目的是:1. 为了进一步熟悉ABAP的编程技巧;2. 更主要的目标的:熟悉sap fi模块的应收和应付业务场景;3. 熟悉相关的表;2. 作业简单需求开发一个FI模块的报表:输入的条件是:供应商 (但是可以多选),公司代码 (必输)账龄计算日:报表输出字段包括: 公司代码、供应商(客户),年度销售总额、应付(收)账款总额、0天金额 1-30天,31-60天,61-90天,91-150天,150天以上数据结果需要和这个表进行比对。3. 作业要求时间要求:1 郭裕的要求2天左右开发完成报表;2
2、 一般的项目要求给予4天左右。3 最低要求4. 作业过程1 充分分析需求;2 对于复杂程序在编写之前要画流程图;为了方便和加深对要编写程序的理解,我们一般:步骤一:编写字段来源输入的条件是:公司代码(必输),供应商(但是可以多选),账龄计算日(默认今天)报表输出字段包括:公司代码、供应商,年度采购总额、应付账款总额、=0天金额,1-30天,31-60天,61-90天,91-150天,150天以上需要的表字段:(具体见步骤2)BSIK(会计核算:供应商的第二次索引(未结算项目):公司代码(bukrs),供应商(lifnr),清帐日期(AUGDT) 用于到期日计算的基准日期(ZFBDT)BSAK(
3、会计核算:供应商的第二个索引(已结算项目):公司代码(bukrs),供应商(lifnr),清帐日期(AUGDT) 用于到期日计算的基准日期(ZFBDT)要知道年度采购总额,必须知道年度已付账款总额+年度应付账款总额,采购成立与否,是由收到发票与否来判断的。每张发票都对应一个会计凭证,此凭证分别在bsik和bsak中都可找到。经se16n检查,bsik中清算单据的单据号码(AUGBL)全部为空,bsak中清算单据的单据号码(AUGBL)全部不为空。这个字段表示对会计凭证编号(BELNR)的清算单据号,blart代表凭证类型。例子:用f-53实验了2笔清帐凭证,2笔都是完全清帐了1个会计凭证,部分
4、清帐了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笔清帐凭证部分完成的清帐:
5、年度采购总额可以通过发票金额总额来判断,也就是bsik和bsak中凭证类型为RE的。应付账款总额,即bsik中所有凭证金额之和(正负冲销,原因见下面)。上图其实是已清的,为何在未清中呢?这很令人混淆,其实答案很简单,它是正值!写到那里就是为了冲销用的,所有应付的实质是欠款,因此显示都是负值,因此,它们还是显示原来的值(负值),不管冲销多少,只要没冲销完,就显示原来的,比如下图:已经被冲销了很多次了,可是没有完,所以值不变。正负冲销的判断是借方或贷方科目,在字段借贷标识(SHKZG)中。步骤二:画数据来源表的逻辑关系本次表关系比较简单,难在1. 业务的理解和数据的寻找 2. 程序的统计功能上。还
6、在艰难摸索中。步骤三:具体完整程序流程在bsik中累加得到发票总金额selectbukrslifnrsum(dmbtr)intotablegit_bsik_sumfrombsikwherebukrs=s_bukrsandlifnrins_lifnrandblart=REgroupbybukrslifnr.在bsak中累加得到发票总金额selectbukrslifnrsum(dmbtr)intotablegit_bsak_sumfrombsakwherebukrs=s_bukrsandlifnrins_lifnrandblart=REgroupbybukrslifnr.合并未结算发票总额表git
7、_bsik_sum与已结算发票总额表git_bsak_sum,结果得到销售总额表git_sumgit_sum=git_bsak_sum.sortgit_sumbylifnr.loopatgit_bsik_sum.loopatgit_bsak_sum.first_index=SY-TABIX.check=0.ifgit_bsik_sum-lifnr=git_bsak_sum-lifnr.clearwa_sum.wa_sum-bukrs=git_bsak_sum-bukrs.wa_sum-lifnr=git_bsak_sum-lifnr.wa_sum-dmbtr_sum=git_bsik_sum-
8、dmbtr_sum+git_bsak_sum-dmbtr_sum.modifygit_sumfromwa_sumindexfirst_index.check=1.exit.endif.endloop.ifcheck=0.clearwa_sum.wa_sum-bukrs=git_bsik_sum-bukrs.wa_sum-lifnr=git_bsik_sum-lifnr.wa_sum-dmbtr_sum=git_bsik_sum-dmbtr_sum.appendwa_sumtogit_sum.endif.endloop.对销售总额表按公司与供应商进行排序sortgit_sumbybukrslif
9、nr.程序设计中的检查功能*write:/销售总额表git_sum.*write:/#.*loopatgit_sum.*write:/git_sum-bukrs,git_sum-lifnr,git_sum-dmbtr_sum.*endloop.在bsik中以公司供应商与借贷标识累加得到应付账款总额的分别借贷方得到处理前的应付账款总额表selectbukrslifnrSHKZGsum(dmbtr)intotablegit_bsik_yfzefrombsikwherebukrs=s_bukrsandlifnrins_lifnrgroupbybukrslifnrshkzg.(难点)计算应付账款总额:
10、思路:设置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在后sortgit_bsik_yfzebybukrslifnrSHKZG.*loopatgit_bsik_yfze.程序设计中的检查功能*write:/git_bsik_yfze-bu
11、krs,git_bsik_yfze-lifnr,git_bsik_yfze-SHKZG,git_bsik_yfze-dmbtr_sum.*endloop.得到合并借贷方后的处理后应付账款总额表git_bsik_yfzepp代表process”已经处理过的“cleargit_bsik_yfzep.check_p=s.loopatgit_bsik_yfze.ifgit_bsik_yfze-SHKZG=H.ifcheck_p=h.appendwa_bsik_yfzeptogit_bsik_yfzep.clearwa_bsik_yfzep.wa_bsik_yfzep-bukrs=git_bsik_yf
12、ze-bukrs.wa_bsik_yfzep-lifnr=git_bsik_yfze-lifnr.wa_bsik_yfzep-dmbtr_sum=git_bsik_yfze-dmbtr_sum.check_p=h.else.clearwa_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=
13、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.ifwa_bsik_yfzep-dmbtr_sum0.appendwa_bsik_yfzeptogit_bsik_yfzep.endif.check_p=s.initial_yingfu=initial_yingfu+git_bsik_yfze-dmbtr.endif.endloop.对处理后应付账款总额表进行排序sortgit_bs
14、ik_yfzepbybukrslifnr.*write:/处理后应付账款总额表git_bsik_yfzep.*write:/#.*loopatgit_bsik_yfzep.程序设计中的检查功能*write:/git_bsik_yfzep-bukrs,git_bsik_yfzep-lifnr,git_bsik_yfzep-dmbtr_sum.*endloop.(难点)合并年度采购总额和应付账款总额表:思路:Loop年度采购总额表,在应付账款总额表中找公司号与供应商号相同记录,找到则将应付账款总额加入,否则为0。写入git。Loop 应付账款总额表,在年度采购总额表中找公司号与供应商号不同记录(因
15、为上一步已经找了相同记录),如果是则将采购总额加入,否则为0。写入git。合并销售总额表git_sum与应付账款总额表git_bsik_yfzep第一步refreshgit_sumyfzep.loopatgit_sum.readtablegit_bsik_yfzepwithkeybukrs=git_sum-bukrslifnr=git_sum-lifnrbinarysearch.ifsy-subrc=0.clearwa_sumyfzep.wa_sumyfzep-bukrs=git_sum-bukrs.wa_sumyfzep-lifnr=git_sum-lifnr.wa_sumyfzep-dmb
16、tr_gsum=git_sum-dmbtr_sum.wa_sumyfzep-dmbtr_yfzep=git_bsik_yfzep-dmbtr_sum.appendwa_sumyfzeptogit_sumyfzep.else.clearwa_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.appendwa_sumyfzeptogit_sumyfzep.endif.en
17、dloop.sortgit_sumbybukrslifnr.前面已经sort过了,且没有改动表合并销售总额表git_sum与应付账款总额表git_bsik_yfzep第二步loopatgit_bsik_yfzep.readtablegit_sumwithkeybukrs=git_bsik_yfzep-bukrslifnr=git_bsik_yfzep-lifnrbinarysearch.ifsy-subrc0.clearwa_sumyfzep.wa_sumyfzep-bukrs=git_bsik_yfzep-bukrs.wa_sumyfzep-lifnr=git_bsik_yfzep-lifn
18、r.wa_sumyfzep-dmbtr_gsum=0.wa_sumyfzep-dmbtr_yfzep=git_bsik_yfzep-dmbtr_sum.appendwa_sumyfzeptogit_sumyfzep.endif.endloop.将得到的销售总额与应付账款总额表git_sumyfzep排序sortgit_sumyfzepbybukrslifnr.程序设计中的检查功能*write:/销售总额与应付账款总额表git_sumyfzep.*write:/#.*loopatgit_sumyfzep.*write:/git_sumyfzep-bukrs,git_sumyfzep-lifnr,
19、git_sumyfzep-dmbtr_gsum,git_sumyfzep-dmbtr_yfzep.*endloop.内表无法innerjoin*select*abukrs*alifnr*admbtr_sum*bdmbtr_sum*intotablegit_sumyfzep*fromgit_sumasaleftjoingit_bsik_yfzepasb*onabukrs=bbukrs*andalifnr=blifnr.*loopatgit_bsik_yfze.程序设计中的检查功能*write:/git_bsik_yfze-bukrs,git_bsik_yfze-lifnr,git_bsik_yf
20、ze-SHKZG,git_bsik_yfze-dmbtr_sum.*endloop.(难点)统计不同时间段的应付账款总额:Loop git_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直接根据ta
21、bix_sumyfzep来modify git_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. 判断是否到达表
22、尾(此为最后一条记录),也就是最外层sy-tabix是否等于tmax_git_bsik,是则通过wa直接根据tabix_sumyfzep来modify git_sumyfzep表,最后一次清空wa,跳出。5. 由于业务理解阻碍,程序无法完美实现,因此只能做出半成品,可以知道应付账款各二阶汇总原始总额(贷方数据),而无法知道其现实总额(被借方冲销后剩余的贷方数据)按公司与供应商把所有借贷方金额与付款基准日期选出,以备二阶汇总selectbukrslifnrSHKZGdmbtrZFBDTintocorrespondingfieldsoftablegit_bsikfrombsikwherebukrs
23、=s_bukrsandlifnrins_lifnr.将二阶汇总备用表git_bsik按公司与供应商排序sortgit_bsikbybukrslifnr.将二阶汇总应付数据写入销售与应付总额表,得到最终git_sumyfzep表clearwa_sumyfzep.重要!我很容易就搞忘了loopatgit_bsik.ifgit_bsik-shkzg=S.continue.endif.ifsy-tabix=1.wa_sumyfzep-bukrs=git_bsik-bukrs.wa_sumyfzep-lifnr=git_bsik-lifnr.readme=1.check=0.else.if(git_bs
24、ik-lifnr=wa_sumyfzep-lifnrandcheck=0).continue.endif.if(git_bsik-lifnrwa_sumyfzep-lifnrandcheck=0).wa_sumyfzep-bukrs=git_bsik-bukrs.wa_sumyfzep-lifnr=git_bsik-lifnr.readme=1.endif.if(git_bsik-lifnr=wa_sumyfzep-lifnrandcheck=1).直接往下走endif.if(git_bsik-lifnrwa_sumyfzep-lifnrandcheck=1).modifygit_sumyfz
25、epfromwa_sumyfzepindextabix_sumyfzep.clearwa_sumyfzep.wa_sumyfzep-bukrs=git_bsik-bukrs.wa_sumyfzep-lifnr=git_bsik-lifnr.check=0.readme=1.endif.endif.ifreadme=0.直接往下走endif.ifreadme=1.看此公司供应商是否有应付账款,有的话肯定在git_sumyfzep中有记录readtablegit_sumyfzepwithkeylifnr=wa_sumyfzep-lifnrbinarysearch.ifsy-subrc0.continue.else.ifgit_sumyfzep-dmbtr_yfzep=0.continue.endif.endif.check=1.readme=0.tabix_sumyfzep=sy-tabix.wa_sumyfzep-dmbtr_
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1