ABAP--如何写动态台账统计表(简单代码)
在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--如何写动态台账统计表(简单代码)相关推荐
- python简单代码编写-新手写Python,8招让你的代码更简洁更Pythonic!
Python是一门非常灵活的语言,很多语法是其他语言不具备的,特别是对于从C.Java等语言转向Python的人来说,很容易按照C.Java等语言的写法来写Python,对于初学者来说,如果对Pyth ...
- 动态数组vector的使用_简单代码示例
简单代码示例 //动态数组vector的使用 #include <iostream> #include <vector> //用 <vector>头文件 using ...
- 如何写出“简单“代码?
如何写出"简单"代码? 当你做实际开发中,你一定会发现有人跟你说,或者你在网上看:要写简单代码要写简单代码. 这句话其实就跟大家熟悉的设计模式中的简单(kiss)原则是挂钩的 ...
- 利用js随机数,写了一个随机点名的简单代码
一.问题或解决方法应用场景. 利用js写了一个随机点名的代码 二.直接粘贴代码获取图片 1. 先写一个获取随机数的代码 获取min-max 的随机整数,包括min,max function getRa ...
- java.lang.Instrument 动态修改替换类代码
java.lang.Instrument 动态修改替换类代码 | java.lang.Instrument包是在JDK5引入的,程序员通过修改方法的字节码实现动态修改类代码. 这通常是在类的main方 ...
- 如何写出优雅的 Golang 代码
Go 语言是一门简单.易学的编程语言,对于有编程背景的工程师来说,学习 Go 语言并写出能够运行的代码并不是一件困难的事情,对于之前有过其他语言经验的开发者来说,写什么语言都像自己学过的语言其实是有问 ...
- 与动态执行的C# 代码进行通讯
1.简介 能够动态执行 C# 代码是一件很酷的功能,比如,我们可以在控制台中输入一行 C# 代码,然后程序自动编译并执行这一行代码,将结果显示给我们.这差不多就是一个最简单的 C# 代码解释器了. 动 ...
- 简述如何书写工程化的简单代码
在坛子里混了这么久,看了很多同学的代码,感觉到大家的代码,学校里面的书生气有点重,对于细节考虑不够,有时候,感觉和吃了颗苍蝇一样,确实很不舒服. 这里根据我个人的经验,给大家简述一下,工程化代码,以及 ...
- [转载] Python新手写出漂亮的爬虫代码1——从html获取信息
参考链接: Python中从用户获取多个输入 Python新手写出漂亮的爬虫代码1 初到大数据学习圈子的同学可能对爬虫都有所耳闻,会觉得是一个高大上的东西,仿佛九阳神功和乾坤大挪移一样,和别人说&qu ...
最新文章
- 清华博士宅家太无聊,给猫咪讲函数
- pip安装kolla-ansible时报错Cannot install ‘PyYAML‘的解决方法
- mysql锁与程序锁_数据库加锁(转)
- Linux下配置Node.js环境
- java 画布实验报告_编辑画布图像
- STM32F1笔记(八)时钟
- 【转】WebServices:WSDL的结构分析
- RNN知识+LSTM知识+encoder-decoder+ctc+基于pytorch的crnn网络结构
- linux下进程的创建代码,Linux下进程创建分析
- 值对于 int32 太大或太小。_失效值处理
- 【学术】2020上的NLP有哪些研究风向?
- 刷机-升级到4.01M33-2的方法
- Java、JSP水费管理系统
- 在OpenLava中探索Fairshare调度
- Python数据类型——逻辑值详解
- Javascript构建Bingo卡片游戏
- Sleepy Kaguya (回归之战)
- 【转】如何连接两台电脑同时上网
- 如何在Godot中使用自发光材质
- 【硬核干货】Teleport Ultra扒站教程 (附汉化破解版资源下载链接)
热门文章
- 最新修复H5抑云熬夜打卡定制版对接微信登录+免签支付源码+
- JAVASCRIPT、JSP、JS有什么区别和联系
- Java |写一个程序,实现读入一个正整数,然后输出这个整数的位数
- 解决npm err windows_nt 6.1.7601问题
- HCIA-RS实验-STP和RSTP(1)
- LTSPICE使用教程:二极管钳位电路仿真
- TinyOs操作系统---第1章 初识RTOS及使用
- 使用了未经检查或不安全的操作_【最详细】瓦斯检查员安全操作技术规程
- WordPress 建立数据库连接时出错解决方法
- 我会接受长期出差而高工资的工作