SAP ABAP 自动批量开关账期程序 OB52和MMPV

文章目录

  • SAP ABAP 自动批量开关账期程序 OB52和MMPV
    • 前言
    • 会计凭证过账期间
    • 物料凭证过账期间
    • 完整代码
      • 主程序 ZTOOLSR0001
      • 自定义开物料账期函数 ZTOOLSFM04_MMPV_JOB
      • 自定义公司代码表 ZMASTERT0001

前言

在SAP系统运行中 每个月经常会忘记同时也是极其重要的工作就是开关财务、物料账期
如果能有一个程序帮我们自动完成这个工作,那得是多么美好的事情
现在我们就在做这件美好的事

会计凭证过账期间

SAP 自己也做了程序来更新账期 RFPERIOD_OPEN 和 RFPERIOD_CLOSE
我看了下这两个程序的源码 - 直接更新的 T001B 这个表
同理 OB52 其实也就是一个视图维护 T001B 这个表
于是我们就可以写一个程序来维护 T001B 达到批量或自动开账期的效果

物料凭证过账期间

开物料账期的事务码是 MMPV
查看物料账期的事务码是 MMRV
一开始我的想法是通过BDC录屏的方式实现自动开账期的效果
但是MMPV执行完会有一个消息日志,在BDC录屏时并不会显示,从而打开账期失败
直接调用MMPV对应的程序 RMMMPERI 和使用录屏是一样的效果
所以我们只有将 RMMMPERI 程序的执行放到后台去,后台回去获取到对应的日志消息,进而打开账期成功
同时我们也可以通过查看日志消息来获取此次打开账期的执行过程

完整代码

主程序 ZTOOLSR0001

这个报表同时展示该公司的财务账期和物料账期
输入公司和期间
选择查询账期、执行打开账期、执行关闭账期等功能
报表中涉及到自定义开物料账期函数 ZTOOLSFM04_MMPV_JOB
以及自定义公司代码表 ZMASTERT0001 用以配置哪些公司需要更新账期

*&---------------------------------------------------------------------*
*& REPORT ZTOOLSR0001
*&---------------------------------------------------------------------*
*& 自动开账期程序
*&---------------------------------------------------------------------*
* OB52 参考SAP程序 RFPERIOD_OPEN 和 RFPERIOD_CLOSE
* 直接更新  T001B 这个表
*--------------------------------------------------------------------*
REPORT ztoolsr0001.TABLES: t001b.SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE TEXT-001.SELECT-OPTIONS: s_comp FOR t001b-bukrs,s_poper FOR t001b-frpe1 MODIF ID ty1 NO INTERVALS NO-EXTENSION.SELECTION-SCREEN SKIP 1.PARAMETERS: p_select RADIOBUTTON GROUP g1 USER-COMMAND uc DEFAULT 'X',p_execut RADIOBUTTON GROUP g1,p_close  RADIOBUTTON GROUP g1.
SELECTION-SCREEN END OF BLOCK blk1.TYPES: BEGIN OF ty_result,bukrs     TYPE t001-bukrs,mkoar     TYPE t001b-mkoar,bkont     TYPE t001b-bkont,vkont     TYPE t001b-vkont,frye1     TYPE t001b-frye1,frpe1     TYPE t001b-frpe1,toye1     TYPE t001b-toye1,tope1     TYPE t001b-tope1,frye2     TYPE t001b-frye2,frpe2     TYPE t001b-frpe2,toye2     TYPE t001b-toye2,tope2     TYPE t001b-tope2,lfgja     TYPE marv-lfgja,lfmon     TYPE marv-lfmon,vmgja     TYPE marv-vmgja,vmmon     TYPE marv-vmmon,blankcell TYPE c,END OF ty_result.DATA: gt_result TYPE STANDARD TABLE OF ty_result.
DATA: gt_t001  TYPE STANDARD TABLE OF t001,gt_t001b TYPE STANDARD TABLE OF t001b,gt_marv  TYPE STANDARD TABLE OF marv.
DATA: gt_fieldcat TYPE slis_t_fieldcat_alv,gs_layout   TYPE slis_layout_alv.AT SELECTION-SCREEN OUTPUT.LOOP AT SCREEN.IF screen-group1 EQ 'TY1' AND p_execut EQ 'X'.screen-active = 1.ELSEIF screen-group1 EQ 'TY1' AND p_execut NE 'X'.screen-active = 0.ENDIF.MODIFY SCREEN.ENDLOOP.START-OF-SELECTION.PERFORM frm_select_comp_code.IF NOT gt_t001 IS INITIAL.IF NOT p_select IS INITIAL.     " 查询账期PERFORM frm_select_posting_process. " 查询财务账期PERFORM frm_select_material_periods." 查询物料账期PERFORM frm_set_result_and_alv_show.ELSEIF NOT p_execut IS INITIAL. " 打开账期IF NOT p_execut IS INITIAL AND NOT s_poper IS INITIAL.IF s_poper-low+1(2) LT sy-datum+4(2).MESSAGE '输入期间不可小于当前期间' TYPE 'S' DISPLAY LIKE 'E'.RETURN.ELSEIF s_poper-low+1(2) - sy-datum+4(2) GT 1.MESSAGE '输入期间 - 当前期间不可大于 1' TYPE 'S' DISPLAY LIKE 'E'.RETURN.ENDIF.ENDIF.PERFORM frm_select_posting_process.PERFORM frm_set_new_posting_process. " 开财务账期PERFORM frm_post_material_process.   " 开物料账期MESSAGE '执行成功,请退出后等待一会儿(约1min)再重新进入查看' TYPE 'S'.ELSEIF NOT p_close IS INITIAL. " 关闭账期 - 只针对财务账期PERFORM frm_select_posting_process.PERFORM frm_set_new_posting_process. " 关财务账期ENDIF.ELSE.MESSAGE '未查询到公司数据,请检查后重试;或联系系统管理员维护ZMASTERT0001表' TYPE 'S' DISPLAY LIKE 'E'.ENDIF.END-OF-SELECTION.FORM frm_select_comp_code.
*--------------------------------------------------------------------*
* 有一个公司代码主数据 ZMASTERT0001
* 如果这个表忘记维护怎么办
* 加一个不更新账期的字段
*--------------------------------------------------------------------*SELECT*FROMt001INNER JOIN zmastert0001 ON t001~bukrs EQ zmastert0001~bukrsWHERE t001~ktopl EQ 'MYACCOUNT'AND zmastert0001~not_up_acc_date IS INITIALAND t001~bukrs IN @s_compINTO CORRESPONDING FIELDS OF TABLE @gt_t001.
ENDFORM.FORM frm_select_posting_process.IF NOT gt_t001 IS INITIAL.SELECT*FROMt001bFOR ALL ENTRIES IN @gt_t001WHERE bukrs EQ @gt_t001-bukrsINTO CORRESPONDING FIELDS OF TABLE @gt_t001b.ENDIF.
ENDFORM.FORM frm_select_material_periods.SELECT*FROMmarvFOR ALL ENTRIES IN @gt_t001WHERE bukrs EQ @gt_t001-bukrsINTO CORRESPONDING FIELDS OF TABLE @gt_marv.
ENDFORM.FORM frm_set_new_posting_process.DATA: ls_t001b LIKE LINE OF gt_t001b.DATA: lv_from_year_1    TYPE t001b-frye1,lv_from_process_1 TYPE t001b-frpe1,lv_to_year_1      TYPE t001b-toye1,lv_to_process_1   TYPE t001b-tope1,lv_from_year_2    TYPE t001b-frye2,lv_from_process_2 TYPE t001b-frpe2,lv_to_year_2      TYPE t001b-toye2,lv_to_process_2   TYPE t001b-tope2,lv_year           TYPE t001b-frye1.FIELD-SYMBOLS: <lfs_t001b> LIKE LINE OF gt_t001b.*--------------------------------------------------------------------*
* 初始化值
*--------------------------------------------------------------------*lv_year = sy-datum+0(4).IF NOT p_close IS INITIAL. " 关闭账期lv_from_year_1 = lv_year.lv_from_process_1 = sy-datum+4(2).ENDIF.lv_to_year_1 = lv_year.IF s_poper IS INITIAL.lv_to_process_1 = sy-datum+4(2).ELSEIF s_poper-low+1(2) GE sy-datum+4(2).lv_to_process_1 = s_poper-low+1(2).ENDIF.lv_from_year_2 = lv_year.lv_from_process_2 = '13'.lv_to_year_2 = lv_year.lv_to_process_2 = '16'.LOOP AT gt_t001b ASSIGNING <lfs_t001b>.IF NOT p_close IS INITIAL.<lfs_t001b>-frye1 = lv_from_year_1.<lfs_t001b>-frpe1 = lv_from_process_1.ENDIF.<lfs_t001b>-toye1 = lv_to_year_1.<lfs_t001b>-tope1 = lv_to_process_1.<lfs_t001b>-frye2 = lv_from_year_2.<lfs_t001b>-frpe2 = lv_from_process_2.<lfs_t001b>-toye2 = lv_to_year_2.<lfs_t001b>-tope2 = lv_to_process_2.ENDLOOP.MODIFY t001b FROM TABLE gt_t001b. " 更新 T001B 表
ENDFORM.*--------------------------------------------------------------------*
* 开物料账期
*--------------------------------------------------------------------*
FORM frm_post_material_process.DATA: ls_t001 TYPE t001.DATA: lv_year    TYPE lfgja,lv_process TYPE nperi.
*--------------------------------------------------------------------*
* 初始化值
*--------------------------------------------------------------------*lv_year = sy-datum+0(4).IF s_poper IS INITIAL.lv_process = sy-datum+4(2).ELSEIF s_poper-low+1(2) GE sy-datum+4(2).lv_process = s_poper-low+1(2).ENDIF.LOOP AT gt_t001 INTO ls_t001.CALL FUNCTION 'ZTOOLSFM04_MMPV_JOB'EXPORTINGv_comp_code = ls_t001-bukrsv_year      = lv_yearv_process   = lv_process.ENDLOOP.
ENDFORM.FORM frm_set_result_and_alv_show.DATA: ls_result TYPE ty_result,ls_t001b  TYPE t001b,ls_marv   TYPE marv.SORT gt_t001b BY bukrs mkoar.LOOP AT gt_t001b INTO ls_t001b.MOVE-CORRESPONDING ls_t001b TO ls_result.AT NEW bukrs.READ TABLE gt_marv INTO ls_marv WITH KEY bukrs = ls_t001b-bukrs.IF sy-subrc EQ 0.MOVE-CORRESPONDING ls_marv TO ls_result.ENDIF.ENDAT.APPEND ls_result TO gt_result.CLEAR: ls_result, ls_t001b, ls_marv.ENDLOOP.SORT gt_result BY bukrs mkoar.PERFORM frm_init_layout.PERFORM frm_set_fieldcat.CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'EXPORTINGi_callback_program       = sy-repidi_callback_pf_status_set = 'FRM_ALV_PF_STATUS'i_callback_user_command  = 'FRM_ALV_USER_COMMAND'is_layout                = gs_layoutit_fieldcat              = gt_fieldcatTABLESt_outtab                 = gt_resultEXCEPTIONSprogram_error            = 1OTHERS                   = 2.
ENDFORM.FORM frm_init_layout.gs_layout-colwidth_optimize = 'X'.gs_layout-zebra = 'X'.
ENDFORM.FORM frm_set_fieldcat.DATA: ls_fieldcat TYPE LINE OF slis_t_fieldcat_alv.PERFORM frm_init_fieldcat USING:'BUKRS' '公司代码','MKOAR' '账户类型','BKONT' '终止科目','VKONT' '起始科目','FRYE1' '年度','FRPE1' '从','TOYE1' '年度','TOPE1' '到','FRYE2' '年度','FRPE2' '从','TOYE2' '年度','TOPE2' '到','BLANKCELL' '财务账和物料账分隔列','LFGJA' '当期会计年度','LFMON' '当期过账期间','VMGJA' '上期会计年度','VMMON' '上期过账期间'.ENDFORM.FORM frm_init_fieldcat USING fieldname TYPE slis_fieldcat_alv-fieldnameseltext TYPE slis_fieldcat_alv-seltext_l.DATA: ls_fieldcat TYPE LINE OF slis_t_fieldcat_alv.ls_fieldcat-fieldname = fieldname.ls_fieldcat-seltext_s = seltext.ls_fieldcat-seltext_m = seltext.ls_fieldcat-seltext_l = seltext.ls_fieldcat-no_zero = 'X'.APPEND ls_fieldcat TO gt_fieldcat.
ENDFORM.FORM frm_alv_pf_status USING lt_extab TYPE slis_t_extab.SET PF-STATUS 'ZTOOLSR0001'.
ENDFORM.FORM frm_alv_user_command USING lv_ucomm LIKE sy-ucommls_selfield TYPE slis_selfield.DATA: lr_grid   TYPE REF TO cl_gui_alv_grid.DATA: ls_layout TYPE lvc_s_layo.CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'IMPORTINGe_grid = lr_grid.CALL METHOD lr_grid->check_changed_data.ls_selfield-refresh = 'X'.ls_selfield-row_stable = 'X'.ls_selfield-col_stable = 'X'.CALL METHOD lr_grid->get_frontend_layoutIMPORTINGes_layout = ls_layout.ls_layout-cwidth_opt = 'X'.CALL METHOD lr_grid->set_frontend_layoutEXPORTINGis_layout = ls_layout.IF lv_ucomm EQ 'ZUPDATE'.PERFORM frm_set_new_posting_process. " 开财务账期PERFORM frm_post_material_process.   " 开物料账期MESSAGE '执行成功,请退出后等待一会儿(约1min)再重新进入查看' TYPE 'S'.ENDIF.CALL METHOD lr_grid->refresh_table_display.
ENDFORM.

自定义开物料账期函数 ZTOOLSFM04_MMPV_JOB

关于后台JOB的定义和执行可以参考博文SAP ABAP 定义后台作业

FUNCTION ztoolsfm04_mmpv_job .
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(V_COMP_CODE) TYPE  BUKRS
*"     VALUE(V_YEAR) TYPE  LFGJA
*"     VALUE(V_PROCESS) TYPE  NPERI
*"----------------------------------------------------------------------
*  DATA: v_mode         TYPE rfpdo-allgazmd.
*  DATA: wa_bdcdata TYPE bdcdata,
*        it_bdcdata TYPE STANDARD TABLE OF bdcdata.
*
*  v_mode = 'N'.
*
*  CLEAR wa_bdcdata.
*  wa_bdcdata-program  = 'RMMMPERI'.
*  wa_bdcdata-dynpro   = '1000'.
*  wa_bdcdata-dynbegin = 'X'.
*  APPEND wa_bdcdata TO it_bdcdata.
*
*  CLEAR wa_bdcdata.
*  wa_bdcdata-fnam = 'BDC_CURSOR'.
*  wa_bdcdata-fval = 'I_XCOMP'.
*  APPEND wa_bdcdata TO it_bdcdata.
*
*  CLEAR wa_bdcdata.
*  wa_bdcdata-fnam = 'BDC_OKCODE'.
*  wa_bdcdata-fval = '=ONLI'.
*  APPEND wa_bdcdata TO it_bdcdata.
*
*  CLEAR wa_bdcdata.
*  wa_bdcdata-fnam = 'I_VBUKR'.
*  wa_bdcdata-fval = v_comp_code.
*  APPEND wa_bdcdata TO it_bdcdata.
*
*  CLEAR wa_bdcdata.
*  wa_bdcdata-fnam = 'I_LFMON'.
*  wa_bdcdata-fval = v_process.
*  APPEND wa_bdcdata TO it_bdcdata.
*
*  CLEAR wa_bdcdata.
*  wa_bdcdata-fnam = 'I_LFGJA'.
*  wa_bdcdata-fval = v_year.
*  APPEND wa_bdcdata TO it_bdcdata.
*
*  CLEAR wa_bdcdata.
*  wa_bdcdata-fnam = 'I_XCOMP'.
*  wa_bdcdata-fval = 'X'.
*  APPEND wa_bdcdata TO it_bdcdata.
*
*  CLEAR wa_bdcdata.
*  wa_bdcdata-fnam = 'I_XMOVE'.
*  wa_bdcdata-fval = ''.
*  APPEND wa_bdcdata TO it_bdcdata.
*
*  CALL TRANSACTION 'MMPV' USING it_bdcdata MODE v_mode.
*
*  COMMIT WORK AND WAIT.
*--------------------------------------------------------------------*
* 使用 BDC 录屏并不能实现
* 只能直接调用程序 RMMMPERI
* 直接调用程序 RMMPERI 会返回日志屏幕
* 所以还得去后台调用
*--------------------------------------------------------------------*
* JobDATA: v_start_time LIKE sy-uzeit,v_report     TYPE sy-repid,v_jobcount   TYPE tbtcjob-jobcount,v_jobname    TYPE tbtcjob-jobname.v_jobname = 'ZMMPVJOB' && sy-datum.v_report = 'ZREPORTXXX'.v_start_time = sy-uzeit + 7. " 系统当期时间后21s* 定义后台作业CALL FUNCTION 'JOB_OPEN'EXPORTINGjobname  = v_jobnamejobclass = 'A'IMPORTINGjobcount = v_jobcount.SUBMIT rmmmperiWITH i_vbukr = v_comp_codeWITH i_bbukr = v_comp_codeWITH i_lfmon = v_processWITH i_lfgja = v_yearWITH i_xcomp = 'X'WITH i_xinco = ''WITH i_xmove = ''USER sy-unameVIA JOB v_jobnameNUMBER v_jobcountAND RETURN.CALL FUNCTION 'JOB_CLOSE'EXPORTINGjobcount  = v_jobcountjobname   = v_jobnamesdlstrtdt = sy-datumsdlstrttm = v_start_time
*     strtimmed = 'X'.
ENDFUNCTION.

自定义公司代码表 ZMASTERT0001

@EndUserText.label : '公司代码账期配置表'
@AbapCatalog.enhancementCategory : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #ALLOWED
define table zmastert0001 {key mandt       : mandt not null;key bukrs       : bukrs not null;butxt           : butxt;@EndUserText.label : '不更新账期(''X'' 不更新)'not_up_acc_date : abap.char(1);}

SAP ABAP 自动批量开关账期程序 OB52和MMPV相关推荐

  1. SAP打开财务和物料的账期(OB52 MMRV MMPV)

    在MIGO中做305物料移动的时候,测试系统提示账期还在几个月前,需要自己打开到当前账期 先看看OB52里面财务账期,哦还在去年,把全部的上限年份2020改成了2021: 再看看MMRV,哦物料账期还 ...

  2. php批量生成优惠券,PHP自动批量生成会员卡号程序

    文章给大家介绍一个PHP自动批量生成会员卡号程序的例子,其实原理非常的简单我们将0-Z(0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ)分别代表数值0-35,如字母Z代表35 ...

  3. SAP系统 开关账期

    1.1.1.账期开关概述 (1)OB52打开 财务账期- (2)OB29 - 财政年度变式 (3)MMPV / MMRV –打开物料账期 MMPV 商品会计期间设置-结帐期间 [ 如果含有负库存和负数 ...

  4. 【转】SAP开关账期后台任务

    关于MMPV和OB52,MMPV用于与库存有关的交易,而OB52则用于与财务相关的事务. 以下是将OB52自动化作为后台作业的步骤. 一,创建选择变量 使用事务码: STVARV 点击 "C ...

  5. SAP 打开或关闭财务账期和物料账期等事物代码清单-OB52/MMPV/MMRV/OKP1/1KEF

    文章目录 1.FI账期 1.1 财务账期-OB52或 S_ALR_87003642 2.CO账期 2.1 控制范围账期-OKP1 2.2 利润中心账期-1KEF 3.物料账期-OMSY/MMPV/MM ...

  6. SAP License:修改物料账期

    还有一种是用程序的方法更改,作用与此类似. 参考代码(将6000工厂的期间更改为第4期,上一期为第3期): REPORT ZZZZZ. data:  wk_marv type marv. select ...

  7. SAP ABAP如何隐藏你写的程序代码

    不管是出于什么样的原因, 你偶尔会想到把自己写的程序代码隐藏, 当然, 这些代码一定不是项目中用到的, 比如你自己写的小程序 SAP提供隐藏代码功能, 但是需要注意的是, 代码一旦被隐藏, 则终生无法 ...

  8. SAP ABAP如何隐藏你写的程序代码(危险,请小心谨慎)

    不管是出于什么样的原因, 你偶尔会想到把自己写的程序代码隐藏, 当然, 这些代码一定不是项目中用到的, 比如你自己写的小程序 SAP提供隐藏代码功能, 但是需要注意的是, 代码一旦被隐藏, 则终生无法 ...

  9. SAP ABAP ZBA_R004 批量导入角色里的事务代码,解放BASIS的双手

    ****************************************** * 产生角色的菜单文件,合并用户角色,超级爽, * 十年前我就研究过角色的导入文件,今天终于实现了. * 第一次就 ...

最新文章

  1. 95 后大学生利用漏洞免费吃肯德基获刑
  2. SpringBoot中通过重写WebMvcConfigurer的addCorsMapping方法实现后台服务解决跨域问题
  3. 12 月机器学习新书:《可解释机器学习方法的局限》,免费下载!
  4. Redis缓存穿透、击穿、雪崩、预热、更新、降级
  5. java List实体排序
  6. 【渝粤教育】国家开放大学2018年春季 8625-21T老年心理健康 参考试题
  7. 用C语言实现:判断1000-2000年之间的闰年。
  8. our happy ending(状压dp)
  9. jQuery源码解析(2)—— Callback、Deferred异步编程
  10. git命令行删除远程文件
  11. 三句话捋清楚java垃圾收集器
  12. Reactor | Epoll 模型理解
  13. 已知圆的半径radius= 1.5,求其面积
  14. uniapp 登录页跳转到首页
  15. my.cnf文件的内容详细解释
  16. 华为开发者大会2022,发布鸿蒙开发套件
  17. 用浏览器的油猴子脚本调用IDM下载百度云盘中的资料
  18. (实测可用)STM32CubeMX教程-STM32L431RCT6开发板研究串口通信(串口发送函数)
  19. HDMI差分对走线是否需要走等长
  20. 一个啥也不是的鬼畜视频创作示例

热门文章

  1. 技术期刊 · 路尘终见泰山平 | 微前端及插件化架构在 Wix 的实践;编辑器架构的第二路径;业务中的前端组件化体系……
  2. Spring的核心是什么?
  3. 鸿蒙麒麟食华为的什么系统,你好,鸿蒙!华为自研系统真的来了,还有麒麟、朱雀.........
  4. 8421码到5421码的转换_余三码8421bcd码转换电路设计的接线方法
  5. 内盘外盘新手看热闹,老手在内盘外盘看门道
  6. android u盘 uuid,Android4.4KitKat支持u盘功能
  7. 计算机竞赛一等奖学校名单,信息竞赛获奖名单出炉!这些学校榜上有名
  8. 中层管理者应该做什么?
  9. EJB:First component in name xxx not found - Java / Java EE
  10. Java程序员:快来像我这样做,3天辞退不是梦