SAP的确认OB28案例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SAP的确认OB28案例
2010-06-21 23:08:31| 分类:sap学习笔记阅读115 评论0字号:大中小订阅
公司有需求,现金、银行存款、其它货币资金需要设置赤字预警,不允许出现负数,这个需求可以使用OB28的确认来完成。
DATA: l_hkont LIKE bseg-hkont.
DATA: l_dmbtr LIKE bseg-dmbtr.
DATA: l_monat LIKE bkpf-monat.
CHECK bseg-hkont(2) = '10'. "10开头的科目为现金类科目。
DATA: lt_faglflext TYPE TABLE OF faglflext WITH HEADER LINE.
SELECT * FROM faglflext INTO TABLE lt_faglflext
WHERE racct = bseg-hkont
AND ryear = bkpf-gjahr
AND rbukrs = bkpf-bukrs
AND rldnr = 'OL'.
LOOP AT lt_faglflext.
l_dmbtr = l_dmbtr + lt_faglflext-hslvt.
IF bkpf-monat >= 1. l_dmbtr = l_dmbtr + lt_faglflext-hsl01 . ENDIF.
IF bkpf-monat >= 2. l_dmbtr = l_dmbtr + lt_faglflext-hsl02 . ENDIF.
IF bkpf-monat >= 3. l_dmbtr = l_dmbtr + lt_faglflext-hsl03 . ENDIF.
IF bkpf-monat >= 4. l_dmbtr = l_dmbtr + lt_faglflext-hsl04 . ENDIF.
IF bkpf-monat >= 5. l_dmbtr = l_dmbtr + lt_faglflext-hsl05 . ENDIF.
IF bkpf-monat >= 6. l_dmbtr = l_dmbtr + lt_faglflext-hsl06 . ENDIF.
IF bkpf-monat >= 7. l_dmbtr = l_dmbtr + lt_faglflext-hsl07 . ENDIF.
IF bkpf-monat >= 8. l_dmbtr = l_dmbtr + lt_faglflext-hsl08 . ENDIF.
IF bkpf-monat >= 9. l_dmbtr = l_dmbtr + lt_faglflext-hsl09 . ENDIF.
IF bkpf-monat >= 10. l_dmbtr = l_dmbtr + lt_faglflext-hsl10 . ENDIF.
IF bkpf-monat >= 11. l_dmbtr = l_dmbtr + lt_faglflext-hsl11 . ENDIF.
IF bkpf-monat >= 12. l_dmbtr = l_dmbtr + lt_faglflext-hsl12 . ENDIF.
IF bkpf-monat >= 13. l_dmbtr = l_dmbtr + lt_faglflext-hsl13 . ENDIF.
IF bkpf-monat >= 14. l_dmbtr = l_dmbtr + lt_faglflext-hsl14 . ENDIF.
IF bkpf-monat >= 15. l_dmbtr = l_dmbtr + lt_faglflext-hsl15 . ENDIF.
IF bkpf-monat >= 16. l_dmbtr = l_dmbtr + lt_faglflext-hsl16 . ENDIF.
ENDLOOP.
IF bseg-dmbtr >= l_dmbtr AND bseg-shkzg = 'H'.
MESSAGE '余额不能为负数,或者不能透支,自己看着办!' TYPE 'E'.
ENDIF.
好像发现有点问题。
1。
“完全凭证”好像只能确认最后一个行项目。
α:如果将贷方作为第一个行项目则无法控制,因为最后一个行项目为借方,无法控制。
β:如果一借多贷,且贷方金额大于科目余额,仍然无法控制,因为最后一个行项目的金额很有可能小于科目余额从而跳过检查确认。
2。
如果使用“行项目”确认,则不能控制一借多贷的情况。
初步解决方案:将确认放在行项目上,并且使用内存统计小计。
此方法仍有弊端,如果行项目被删除则无法更新小计值。
因为行项目删除不会走进Validation.
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&
FORM us002 USING b_result.
DATA: l_hkont LIKE bseg-hkont.
DATA: l_hkont1 LIKE bseg-hkont.
DATA: l_dmbtr LIKE bseg-dmbtr.
DATA: l_monat LIKE bkpf-monat.
CHECK bseg-hkont(2) = '10'.
l_hkont = bseg-hkont.
l_hkont1 = bseg-hkont.
IF bseg-hkont(4) = '1002' .
IF bseg-hkont+9(1) = '0'.
l_hkont1 = bseg-hkont + 1.
ELSE.
l_hkont1 = bseg-hkont - 1.
ENDIF.
ENDIF.
DATA: lt_faglflext TYPE TABLE OF faglflext WITH HEADER LINE.
SELECT * FROM faglflext INTO TABLE lt_faglflext
WHERE racct IN (l_hkont , l_hkont1 )
AND ryear = bkpf-gjahr
AND rbukrs = bkpf-bukrs
AND rldnr = 'OL'.
LOOP AT lt_faglflext.
l_dmbtr = l_dmbtr + lt_faglflext-hslvt.
IF bkpf-monat >= 1. l_dmbtr = l_dmbtr + lt_faglflext-hsl01 . ENDIF. IF bkpf-monat >= 2. l_dmbtr = l_dmbtr + lt_faglflext-hsl02 . ENDIF. IF bkpf-monat >= 3. l_dmbtr = l_dmbtr + lt_faglflext-hsl03 . ENDIF. IF bkpf-monat >= 4. l_dmbtr = l_dmbtr + lt_faglflext-hsl04 . ENDIF. IF bkpf-monat >= 5. l_dmbtr = l_dmbtr + lt_faglflext-hsl05 . ENDIF. IF bkpf-monat >= 6. l_dmbtr = l_dmbtr + lt_faglflext-hsl06 . ENDIF. IF bkpf-monat >= 7. l_dmbtr = l_dmbtr + lt_faglflext-hsl07 . ENDIF. IF bkpf-monat >= 8. l_dmbtr = l_dmbtr + lt_faglflext-hsl08 . ENDIF. IF bkpf-monat >= 9. l_dmbtr = l_dmbtr + lt_faglflext-hsl09 . ENDIF. IF bkpf-monat >= 10. l_dmbtr = l_dmbtr + lt_faglflext-hsl10 . ENDIF. IF bkpf-monat >= 11. l_dmbtr = l_dmbtr + lt_faglflext-hsl11 . ENDIF. IF bkpf-monat >= 12. l_dmbtr = l_dmbtr + lt_faglflext-hsl12 . ENDIF. IF bkpf-monat >= 13. l_dmbtr = l_dmbtr + lt_faglflext-hsl13 . ENDIF. IF bkpf-monat >= 14. l_dmbtr = l_dmbtr + lt_faglflext-hsl14 . ENDIF. IF bkpf-monat >= 15. l_dmbtr = l_dmbtr + lt_faglflext-hsl15 . ENDIF. IF bkpf-monat >= 16. l_dmbtr = l_dmbtr + lt_faglflext-hsl16 . ENDIF. ENDLOOP.
DATA: v_tabix TYPE sy-tabix.
DATA: memory_id TYPE c LENGTH 30 VALUE 'F-02CHECKMONAT'. DATA: v_total TYPE p DECIMALS 2.
DATA: v_dmbtr TYPE p DECIMALS 2.
DATA: BEGIN OF it_data OCCURS 0,
hkont TYPE hkont,
dmbtr TYPE c LENGTH 16,
END OF it_data.
CLEAR: v_dmbtr, v_total, it_data. REFRESH: it_data.
IMPORT it_data[] FROM MEMORY ID memory_id.
FREE MEMORY ID memory_id.
v_total = bseg-dmbtr.
READ TABLE it_data WITH KEY hkont = bseg-hkont.
IF sy-subrc = 0.
v_dmbtr = it_data-dmbtr.
v_total = v_total + v_dmbtr.
ENDIF.
IF v_total >= l_dmbtr AND bseg-shkzg = 'H'.
MESSAGE '余额不能为负数,请检查!' TYPE 'E'.
ENDIF.
READ TABLE it_data WITH KEY hkont = bseg-hkont. IF sy-subrc = 0.
v_tabix = sy-tabix.
it_data-dmbtr = v_total.
MODIFY it_data INDEX v_tabix.
ELSE.
it_data-dmbtr = v_total.
it_data-hkont = bseg-hkont.
APPEND it_data.
ENDIF.
EXPORT it_data TO MEMORY ID memory_id. ENDFORM.。