在sap开发中常常需要开发台账表,台账的统计时间是变动的, 我们通常会用临时程序来处理。我这里介绍一个简单的动态台账表(统计月份,周等在有限范围内)的实现方法。
1、申明内表
DATA: BEGIN OF gt_list OCCURS 0,
        pernr    LIKE pa0001-pernr,        "员工编号
        ename    LIKE pa0001-ename,        "员工姓名
        gjj1 TYPE p DECIMALS 2,       "计算周期一字段
        gjj2 TYPE p DECIMALS 2,       "
        gjj3 TYPE p DECIMALS 2,       "
        gjj4 TYPE p DECIMALS 2,       "
        gjj5 TYPE p DECIMALS 2,       "
        gjj6 TYPE p DECIMALS 2,       "
        gjj7 TYPE p DECIMALS 2,       "
        gjj8 TYPE p DECIMALS 2,       "
        gjj9 TYPE p DECIMALS 2,       "
        gjj10 TYPE p DECIMALS 2,       "
        gjj11 TYPE p DECIMALS 2,       "
        gjj12 TYPE p DECIMALS 2,       "计算周期12字段
        gjj TYPE p DECIMALS 2,       "计算合计字段
      END OF gt_list.
计算的周期字段由自己需求最大来定义,本例子是12个月的台账统计报表,所以只定义12个字段;

2、定义统计周期参数
PARAMETERS: p_spmons TYPE s031-spmon OBLIGATORY MEMORY ID per DEFAULT sy-datum+0(6) .
PARAMETERS: p_spmone  TYPE s031-spmon OBLIGATORY MEMORY ID per DEFAULT sy-datum+0(6) .

3、在AT SELECTION-SCREEN.事件中检查台账期间的合法性
AT SELECTION-SCREEN.
  CONCATENATE   p_spmons+0(6)  '01' INTO g_sdate.
  CONCATENATE   p_spmone+0(6)  '01' INTO g_edate.
  CALL FUNCTION 'LAST_DAY_OF_MONTHS'
    EXPORTING
      day_in            = g_edate
    IMPORTING
      last_day_of_month = g_edate.
  IF g_sdate > g_edate.
    MESSAGE '截止日期必须大于起始日期'   TYPE 'E'.
  ENDIF.
  CALL FUNCTION 'DURATION_DETERMINE'
    EXPORTING
      unit       = 'MON'
    IMPORTING
      duration   = g_count
    CHANGING
      start_date = g_sdate
      end_date   = g_edate.
  IF g_count > 12.
    MESSAGE '台帐统计不能超过12个月份'   TYPE 'E'.
  ENDIF.

4、如何定义显示Grid字段格式(参见红色部分代码)
FORM f_fieldcat_init USING im_fieldcat TYPE slis_t_fieldcat_alv
                           im_sort TYPE slis_t_sortinfo_alv.
  DATA: ls_fieldcat TYPE slis_fieldcat_alv,
        ls_sort TYPE slis_sortinfo_alv.
  DATA: s TYPE d.
  DATA: month(5).
  DATA: field(20).
  DATA: n TYPE i.
* "字段名要大写
  s = g_sdate.

REFRESH im_fieldcat.
  REFRESH im_sort.
  CLEAR ls_fieldcat.
  ls_fieldcat-fieldname = 'ENAME'.
  ls_fieldcat-seltext_l = '员工姓名'.
  ls_fieldcat-outputlen = '10'.
  APPEND ls_fieldcat TO im_fieldcat.

*根据输入确定显示统计输出的字段
  n = 1.
  WHILE s+0(6) <= g_edate+0(6).
    WRITE n TO month LEFT-JUSTIFIED.
    CONCATENATE 'GJJ' month INTO month.
    CONCATENATE s+0(6) '月' '金额'  INTO field.
    CLEAR ls_fieldcat.
    ls_fieldcat-fieldname =  month.
    ls_fieldcat-seltext_m = field.
    ls_fieldcat-outputlen = 15.
    ls_fieldcat-do_sum    = 'X'.
    ls_fieldcat-no_zero   = 'X'.
    APPEND ls_fieldcat TO im_fieldcat.
    n = n + 1.
    CALL FUNCTION 'START_TIME_DETERMINE'
      EXPORTING
        duration   = -1
        unit       = 'MON'
      IMPORTING
        start_date = s
      CHANGING
        end_date   = s.
  ENDWHILE.

CLEAR ls_fieldcat.
  ls_fieldcat-fieldname =  'GJJ'.
  ls_fieldcat-seltext_m =  '合计'.
  ls_fieldcat-outputlen = 15.
  ls_fieldcat-do_sum    = 'X'.
  ls_fieldcat-no_zero   = 'X'.
  APPEND ls_fieldcat TO im_fieldcat.
endform.

5、如何在计算时填写内表的合适字段
  data: l_monthdur type i,
        l_date type d.
      l_date = sdate."数据的日期
*计算数据的日期和起始日期的月份差
      CALL FUNCTION 'DURATION_DETERMINE'
        EXPORTING
          unit       = 'MON'
        IMPORTING
          duration   = l_monthdur
        CHANGING
          start_date = g_sdate
          end_date   = l_date.
      IF l_monthdur = 0.
        l_monthdur = 1.
      ENDIF.
*根据月份差将数据算到相应字段
          CASE l_monthdur.
            WHEN 1.
              gt_list-gjj1 = gt_list-gjj1 + wa_rt_header-betrg / 2.
            WHEN 2.
              gt_list-gjj2 = gt_list-gjj2 + wa_rt_header-betrg / 2.
            WHEN 3.
              gt_list-gjj3 = gt_list-gjj3 + wa_rt_header-betrg / 2.
            WHEN 4.
              gt_list-gjj4 = gt_list-gjj4 + wa_rt_header-betrg / 2.
            WHEN 5.
              gt_list-gjj5 = gt_list-gjj5 + wa_rt_header-betrg / 2.
            WHEN 6.
              gt_list-gjj6 = gt_list-gjj6 + wa_rt_header-betrg / 2.
            WHEN 7.
              gt_list-gjj7 = gt_list-gjj7 + wa_rt_header-betrg / 2.
            WHEN 8.
              gt_list-gjj8 = gt_list-gjj8 + wa_rt_header-betrg / 2.
            WHEN 9.
              gt_list-gjj9 = gt_list-gjj9 + wa_rt_header-betrg / 2.
            WHEN 10.
              gt_list-gjj10 = gt_list-gjj10 + wa_rt_header-betrg / 2.
            WHEN 11.
              gt_list-gjj11 = gt_list-gjj11 + wa_rt_header-betrg / 2.
            WHEN 12.
              gt_list-gjj12 = gt_list-gjj12 + wa_rt_header-betrg / 2.
          ENDCASE.

ABAP--如何写动态台账统计表(简单代码)相关推荐

  1. python简单代码编写-新手写Python,8招让你的代码更简洁更Pythonic!

    Python是一门非常灵活的语言,很多语法是其他语言不具备的,特别是对于从C.Java等语言转向Python的人来说,很容易按照C.Java等语言的写法来写Python,对于初学者来说,如果对Pyth ...

  2. 动态数组vector的使用_简单代码示例

    简单代码示例 //动态数组vector的使用 #include <iostream> #include <vector> //用 <vector>头文件 using ...

  3. 如何写出“简单“代码?

    如何写出"简单"代码? 当你做实际开发中,你一定会发现有人跟你说,或者你在网上看:要写简单代码要写简单代码.    这句话其实就跟大家熟悉的设计模式中的简单(kiss)原则是挂钩的 ...

  4. 利用js随机数,写了一个随机点名的简单代码

    一.问题或解决方法应用场景. 利用js写了一个随机点名的代码 二.直接粘贴代码获取图片 1. 先写一个获取随机数的代码 获取min-max 的随机整数,包括min,max function getRa ...

  5. java.lang.Instrument 动态修改替换类代码

    java.lang.Instrument 动态修改替换类代码 | java.lang.Instrument包是在JDK5引入的,程序员通过修改方法的字节码实现动态修改类代码. 这通常是在类的main方 ...

  6. 如何写出优雅的 Golang 代码

    Go 语言是一门简单.易学的编程语言,对于有编程背景的工程师来说,学习 Go 语言并写出能够运行的代码并不是一件困难的事情,对于之前有过其他语言经验的开发者来说,写什么语言都像自己学过的语言其实是有问 ...

  7. 与动态执行的C# 代码进行通讯

    1.简介 能够动态执行 C# 代码是一件很酷的功能,比如,我们可以在控制台中输入一行 C# 代码,然后程序自动编译并执行这一行代码,将结果显示给我们.这差不多就是一个最简单的 C# 代码解释器了. 动 ...

  8. 简述如何书写工程化的简单代码

    在坛子里混了这么久,看了很多同学的代码,感觉到大家的代码,学校里面的书生气有点重,对于细节考虑不够,有时候,感觉和吃了颗苍蝇一样,确实很不舒服. 这里根据我个人的经验,给大家简述一下,工程化代码,以及 ...

  9. [转载] Python新手写出漂亮的爬虫代码1——从html获取信息

    参考链接: Python中从用户获取多个输入 Python新手写出漂亮的爬虫代码1 初到大数据学习圈子的同学可能对爬虫都有所耳闻,会觉得是一个高大上的东西,仿佛九阳神功和乾坤大挪移一样,和别人说&qu ...

最新文章

  1. 清华博士宅家太无聊,给猫咪讲函数
  2. pip安装kolla-ansible时报错Cannot install ‘PyYAML‘的解决方法
  3. mysql锁与程序锁_数据库加锁(转)
  4. Linux下配置Node.js环境
  5. java 画布实验报告_编辑画布图像
  6. STM32F1笔记(八)时钟
  7. 【转】WebServices:WSDL的结构分析
  8. RNN知识+LSTM知识+encoder-decoder+ctc+基于pytorch的crnn网络结构
  9. linux下进程的创建代码,Linux下进程创建分析
  10. 值对于 int32 太大或太小。_失效值处理
  11. 【学术】2020上的NLP有哪些研究风向?
  12. 刷机-升级到4.01M33-2的方法
  13. Java、JSP水费管理系统
  14. 在OpenLava中探索Fairshare调度
  15. Python数据类型——逻辑值详解
  16. Javascript构建Bingo卡片游戏
  17. Sleepy Kaguya (回归之战)
  18. 【转】如何连接两台电脑同时上网
  19. 如何在Godot中使用自发光材质
  20. 【硬核干货】Teleport Ultra扒站教程 (附汉化破解版资源下载链接)

热门文章

  1. 最新修复H5抑云熬夜打卡定制版对接微信登录+免签支付源码+
  2. JAVASCRIPT、JSP、JS有什么区别和联系
  3. Java |写一个程序,实现读入一个正整数,然后输出这个整数的位数
  4. 解决npm err windows_nt 6.1.7601问题
  5. HCIA-RS实验-STP和RSTP(1)
  6. LTSPICE使用教程:二极管钳位电路仿真
  7. TinyOs操作系统---第1章 初识RTOS及使用
  8. 使用了未经检查或不安全的操作_【最详细】瓦斯检查员安全操作技术规程
  9. WordPress 建立数据库连接时出错解决方法
  10. 我会接受长期出差而高工资的工作