会计凭证一旦过账了就不能再进行修改,但其也提供了类似国内财务软件同样的预制功能,预制凭证过账之前不会更新会计系统。预制凭证虽然不更新科目余额,但同样会生成凭证编号,其凭证内容可以随意更改,也可以删除。一旦过账,则会更新科目余额,但凭证编号不会改变。
预制凭证的相关后台表:
此前用户在使用事务代码“FV70”预制客户发票时发现界面中直接有“过账”按钮,点击后会立即生成正式会计凭证,无需财务部同事通过事务代码“FBV0”审批,完全不符合企业内审的要求,能否对此进行控制?
可以通过用户的参数文件设置指定参数实现,不过暂时没有尝试成功。
这里为了快速相应用户需求,本人采用了如下方式进行处理。
首先找到事务代码“FV70”涉及的程序名称“SAPMF05A”和屏幕编号“1200”,进入查看其PBO逻辑。
PROCESS BEFORE OUTPUT.
*------------ Most of the modules of Dynpro 1100 can be used ... -------
MODULE INIT_1100.
MODULE DYNPRO_MODIFICATION_1100.
MODULE TREE.
MODULE STATUS.
MODULE EXPORT_TO_APAR_DIALOG_PBO.
MODULE EXPORT_TO_TAX_DIALOG_PBO.
MODULE DETERMINE_SUBSCREEN_APAR.
CALL SUBSCREEN PAGE INCLUDING PROGNR DYNNRD.
CALL SUBSCREEN ADR INCLUDING 'SAPLFDCB' DYNNRA.
MODULE IMPORT_FROM_APAR_DIALOG_PBO.
MODULE EXPORT_TO_GL_DIALOG_PBO.
CALL SUBSCREEN ITEMS INCLUDING 'SAPLFSKB' '0100'.
MODULE FIRST_CALL_CLEAR.
PROCESS AFTER INPUT.
MODULE EXIT_1100 AT EXIT-COMMAND.
FIELD OK-CODE MODULE CHECK_STATE.
MODULE OKCODE_SEND_AT_PAI.
FIELD RF05A-BUSCS MODULE EXPORT_TO_APAR_DIALOG_PAI.
CALL SUBSCREEN PAGE.
CALL SUBSCREEN ADR.
MODULE IMPORT_FROM_APAR_DIALOG_PAI.
MODULE IMPORT_FROM_TAX_DIALOG_PAI.
MODULE EXPORT_TO_GL_DIALOG_PAI.
CALL SUBSCREEN ITEMS.
MODULE IMPORT_FROM_GL_DIALOG_PAI.
MODULE CONTROL_DISPATCH.
MODULE DOCUMENT_MERGE.
MODULE BALANCE.
MODULE ACTIVETAB_PROCESS.
MODULE SAVE_CONTEXT_1100_1200.
FIELD OK-CODE MODULE USER_COMMAND_1100.
可以根据表“T020”找到相应事务代码使用的“GUI状态”(T020-STATU)。
我们所需要做的就是想办法将功能码“BU”(过账)隐藏。
一开始为了快速实现需求,采用了直接添加ENHANCEMENT代码的方式实现,虽然效果上可以满足需求,但总觉得不够灵活。
仔细阅读PBO模块中的“SET_EXCTAB”方法,发现其中有涉及相关权限控制的逻辑:
* Check posting
CALL FUNCTION 'DOCHEADER_AUTHORITY_CHECK'
EXPORTING
I_BUKRS = BKPF-BUKRS
I_BLART = BKPF-BLART
I_BRGRU = T003-BRGRU
I_STATUS = CHAR_1
EXCEPTIONS
NO_AUTHORITY = 4.
IF SY-SUBRC NE 0.
EXCTAB-OKCOD = 'BU'.
COLLECT EXCTAB.
ENDIF.
* Check parking
CALL FUNCTION 'DOCHEADER_AUTHORITY_CHECK'
EXPORTING
I_BUKRS = BKPF-BUKRS
I_BLART = BKPF-BLART
I_BRGRU = T003-BRGRU
I_STATUS = CHAR_2
EXCEPTIONS
NO_AUTHORITY = 4.
IF SY-SUBRC NE 0.
* posting to single ledger exclude document parking
* or ( not bkpf-ldgrp is initial. "/glflex/
* and tcode = 'FB50L' ). "n961805
EXCTAB-OKCOD = 'BP'.
COLLECT EXCTAB.
EXCTAB-OKCOD = 'PBBP'.
COLLECT EXCTAB.
ENDIF.
* Note 409909: End of insertion
经测试可以通过权限对象“F_BKPF_BUK”来控制相关按钮的隐藏/显示。
经过权限控制后的“FV70”预制画面。
如有更为简便有效的方法,请留言告知