原创 无峰 [ ABAP 技巧与实战 ](javascript:void\(0\);)
**点击蓝字** 关注我们
一
前言
动态报表D-Query 是一个用于取代标准QUERY的程序.使用动态报表无需写代码,非开发人员也可生成专业的报表程序.
> 详见动态报表简介 无峰,公众号:ABAP 技巧与实战 [ 动态报表D-Query简介
> ](https://mp.weixin.qq.com/s?__biz=Mzg4MjA1MjE4NQ==&mid=2247486429&idx=1&sn=8cbab08040255baa4c7495e6e106230d&chksm=cf5dd6ebf82a5ffdf6cd2cca5ef3b3a298dcb7e3aac2b4cae5073af9c6720bf57b5544c57a49&token=8944528&lang=zh_CN#rd)
**本文主要介绍通过自定义的选择屏幕调用动态报表**
二
缘由
动态报表可以简单的通过勾选设置选择条件(同时可以设置选择条件授权,默认值等),帮助中的默认内容设置方式比较齐全.
但是设置比较麻烦. 所以提供了搜索帮助,可以通过搜索帮助功能弹窗填写后获取默认条件,确认后回写到该字段.
默认选择条件采用了动态选择条件的方式设置. 无法设置单选/复选或其它通过逻辑设置的选择字段. 为了解决这个问题,引入了自定义选择屏幕调用动态报表的功能
_**01** _
**选择字段设置**
字段帮助中详细介绍了默认选择内容的设置
支持常量,变量,NULL,特殊日期
_**02** _
**搜索帮助**
设置方式较复杂且容易出错. 所以提供了一个动态搜索帮助功能, 可以辅助设置默认选择内容
_**03** _
**回写**
搜索帮助的结果回写到默认选择内容中
三
实现
通过报表程序自定义选择屏幕.
此时可以添加一些简单的选择条件相关的逻辑. 然后通过MEMORY ID 传递选择条件到特定的查询ID中,最后在自定义程序中通过Z0模式调用动态报表程序即可.
代码如下图所示.
*&---------------------------------------------------------------------**& Report ZTS_ZDQ_CALL*&---------------------------------------------------------------------**&通过自定义的选择屏幕调用动态报表,解决特殊选择屏幕的设定.*&---------------------------------------------------------------------*REPORT zts_zdq_call.
TABLES: vbak,vbap.SELECT-OPTIONS: s_vkorg FOR vbak-vkorg, s_vkorg1 FOR vbak-vkorg, s_werks FOR vbap-werks.
DATA: lt_dq TYPE zrang_dq_tab. "查询ID传递到的选择条件.DATA: lr_vkorg TYPE TABLE OF rsdsselopt.DATA: lr_vkorg1 TYPE TABLE OF rsdsselopt.DATA: lr_werks TYPE TABLE OF rsdsselopt.
START-OF-SELECTION. MOVE-CORRESPONDING s_vkorg[] TO lr_vkorg. MOVE-CORRESPONDING s_vkorg1[] TO lr_vkorg1. MOVE-CORRESPONDING s_werks[] TO lr_werks. "给第一个查询-主查询传递查询条件 和关联查询 "给第一个查询:销售订单查询和第二个查询:交货单查询 传递不同的销售组织限制条件 lt_dq = VALUE #( ( zcxid = '1100000012' trange = VALUE #( ( tablename = 'VBAK' frange_t = VALUE #( ( fieldname = 'VKORG' selopt_t = lr_vkorg ) ) ) ( tablename = 'VBAP' frange_t = VALUE #( ( fieldname = 'WERKS' selopt_t = lr_werks ) ) ) ) ) ( zcxid = '1100000013' trange = VALUE #( ( tablename = 'LIKP' frange_t = VALUE #( ( fieldname = 'VKORG' selopt_t = lr_vkorg1 ) ) ) ( tablename = 'LIPS' frange_t = VALUE #( ( fieldname = 'WERKS' selopt_t = lr_werks ) ) ) ) ) ). EXPORT lt_dq = lt_dq TO MEMORY ID 'ZDQ_CALL'. "调用主查询 DATA: lv_zcxid TYPE ztbc125_idx-zcxid, lv_zxhao TYPE ztbc125_usav-zxhao. lv_zcxid = '1100000012'. SUBMIT zbc125 WITH p_zcxid = lv_zcxid WITH p_zxhao = lv_zxhao WITH p_mode = 'Z0' "JOIN 模式 AND RETURN ."USING SELECTION-SCREEN 1000.四
示例
使用动态报表创建查询 1100000012
使用动态报表创建查询 1100000013
关联1100000013 到1100000012 中.
自定义选择程序可以同时向这两个关联的查询传递各自的选择条件.
关于查询关联详见链接
为两个查询限制不同的销售组织
可以看出订单的统计的销售组织不同于交货单统计的销售组织.
因为采用了全连接. 所以两个销售组织的数据都呈现了.
五
业务实战
上述示例没有实际业务用途. 但通过对多个查询使用相关的关键字,限定不同的查询日期,关联后则可以获取下图的财务报表
• 本月金额: A查询的金额,限制特定月份.
• 累计金额: B查询的金额,限制<=特定月份.
• 去年同期金额: C查询的金额,限定=去年特定月
• 去年同期累计金额: D查询的金额,限定<=去年特定月
• 同期差异/同期累计差异则可以通过新增字段计算出来.
用动态报表生成的上述报表的过程
_**01** _
自定义表,配置科目与多级业务分类的关系
_**02** _
用视图关联财务凭证与自定义表(该关联可以用CDS视图实现, 也可以直接在动态报表中关联),因为配置表中支持成本中心为空,
所以需要通过CDS视图的union功能把两个查询连接起来(动态报表暂不支持union功能)
_**03** _
用ZDQ创建四个相同的查询, 设置公司代码,期间作为选择条件
1100000110售后利润报表-当期
1100000111售后利润报表-当期累计
1100000112售后利润报表-去年同期
1100000113售后利润报表-去年同期累计
_**04** _
关联这些查询
_**05** _
创建一个自定义程序调用该查询,可以通过示例程序ZTS_ZDQ_CALL复制后,调整相关查询的传递条件.
_**06** _
实现效果
_**07** _
在呈现效果上, 几个金额字段的描述没有区分.
需要为每个查询设置特定的字段描述及字段颜色
**_08_ **
改善后的呈现效果
_**09** _
添加计算字段
_**10** _
最终呈现的效果
_**11** _
选中行,点击明细可以跳转到明细内容
六
总结
在使用动态报表配置财务报表时发现. 财务报表往往需要多个期间的数据同时呈现并比较. 动态报表可以关联多个查询.
> 详见链接 无峰,公众号:ABAP 技巧与实战 [ 动态报表D-Query 关联多个查询
> ](https://mp.weixin.qq.com/s?__biz=Mzg4MjA1MjE4NQ==&mid=2247485934&idx=1&sn=a7cdf4910ca237bbdac4ae2eec8d69a6&chksm=cf5dd4d8f82a5dce1a0a33646ab8b0a82b54f3b761cf21b76b7fe737372a8ad0a67410f252cc&token=8944528&lang=zh_CN#rd)
> 详见链接 无峰,公众号:ABAP 技巧与实战 [ 动态报表D-Query 关联多个查询-补充
> ](https://mp.weixin.qq.com/s?__biz=Mzg4MjA1MjE4NQ==&mid=2247486660&idx=1&sn=2e0812d86f28978be1a57aa017f7b515&chksm=cf5dd1f2f82a58e454a9cc79c9a71db934b260c98603e5c9923d0365e6ba2cf78104a552bc87&token=8944528&lang=zh_CN#rd)
但这些查询会使用同样的查询条件.
基于上述需求,对动态报表进行了如下改进
• 允许通过自定义选择屏幕的程序调用
• 允许给不同的关联查询传递不同的选择条件
• 允许基于查询ID设置字段描述(之前基于表名设置描述)
通过上述改进后,总算可以使用动态报表配置完成这个财务报表.
** THE **
** END **
**约定**
如果你对这篇文章感兴趣,请帮忙点赞,在看,分享.
( **如果你真的喜欢这篇文章,请记得回来打个赏,作为支持我继续下去的动力,这是一个正反馈过程.
越多的人打赏,作者越有动力分享,读者就能享受更多的福利.毕竟打赏的金额富不了我,穷不了你,却能支持这个公众号长久发文.** )
syjf1976
sharry_xlp
Yannick_Duan
申请进入公众号讨论群提问或者参与话题讨论