动态报表 DQuery 自定义选择屏幕调用

作者:ABAP技巧与实战 约 9 分钟阅读 更新日期:2025-03-02 1 年前更新 标签:ABAP, 开发

原创 无峰 [ 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,特殊日期

动态报表 DQuery 自定义选择屏幕调用 - 封面图
动态报表 DQuery 自定义选择屏幕调用 - 封面图

_**02** _

**搜索帮助**

设置方式较复杂且容易出错. 所以提供了一个动态搜索帮助功能, 可以辅助设置默认选择内容

动态报表 DQuery 自定义选择屏幕调用 - 封面图
动态报表 DQuery 自定义选择屏幕调用 - 封面图

_**03** _

**回写**

搜索帮助的结果回写到默认选择内容中

动态报表 DQuery 自定义选择屏幕调用 - 封面图
动态报表 DQuery 自定义选择屏幕调用 - 封面图

实现

通过报表程序自定义选择屏幕.

此时可以添加一些简单的选择条件相关的逻辑. 然后通过MEMORY ID 传递选择条件到特定的查询ID中,最后在自定义程序中通过Z0模式调用动态报表程序即可.

代码如下图所示.

动态报表 DQuery 自定义选择屏幕调用 - 封面图
动态报表 DQuery 自定义选择屏幕调用 - 封面图

*&---------------------------------------------------------------------**& 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 中.

自定义选择程序可以同时向这两个关联的查询传递各自的选择条件.

关于查询关联详见链接

动态报表 DQuery 自定义选择屏幕调用 - 封面图
动态报表 DQuery 自定义选择屏幕调用 - 封面图

为两个查询限制不同的销售组织

动态报表 DQuery 自定义选择屏幕调用 - 封面图
动态报表 DQuery 自定义选择屏幕调用 - 封面图

可以看出订单的统计的销售组织不同于交货单统计的销售组织.

因为采用了全连接. 所以两个销售组织的数据都呈现了.

动态报表 DQuery 自定义选择屏幕调用 - 封面图
动态报表 DQuery 自定义选择屏幕调用 - 封面图

业务实战

上述示例没有实际业务用途. 但通过对多个查询使用相关的关键字,限定不同的查询日期,关联后则可以获取下图的财务报表

• 本月金额: A查询的金额,限制特定月份.

• 累计金额: B查询的金额,限制<=特定月份.

• 去年同期金额: C查询的金额,限定=去年特定月

• 去年同期累计金额: D查询的金额,限定<=去年特定月

• 同期差异/同期累计差异则可以通过新增字段计算出来.

动态报表 DQuery 自定义选择屏幕调用 - 封面图
动态报表 DQuery 自定义选择屏幕调用 - 封面图

用动态报表生成的上述报表的过程

_**01** _

自定义表,配置科目与多级业务分类的关系

动态报表 DQuery 自定义选择屏幕调用 - 封面图
动态报表 DQuery 自定义选择屏幕调用 - 封面图

_**02** _

用视图关联财务凭证与自定义表(该关联可以用CDS视图实现, 也可以直接在动态报表中关联),因为配置表中支持成本中心为空,

所以需要通过CDS视图的union功能把两个查询连接起来(动态报表暂不支持union功能)

动态报表 DQuery 自定义选择屏幕调用 - 封面图
动态报表 DQuery 自定义选择屏幕调用 - 封面图
动态报表 DQuery 自定义选择屏幕调用 - 封面图
动态报表 DQuery 自定义选择屏幕调用 - 封面图

_**03** _

用ZDQ创建四个相同的查询, 设置公司代码,期间作为选择条件

1100000110售后利润报表-当期

1100000111售后利润报表-当期累计

1100000112售后利润报表-去年同期

1100000113售后利润报表-去年同期累计

动态报表 DQuery 自定义选择屏幕调用 - 封面图
动态报表 DQuery 自定义选择屏幕调用 - 封面图
动态报表 DQuery 自定义选择屏幕调用 - 封面图
动态报表 DQuery 自定义选择屏幕调用 - 封面图

_**04** _

关联这些查询

动态报表 DQuery 自定义选择屏幕调用 - 封面图
动态报表 DQuery 自定义选择屏幕调用 - 封面图

_**05** _

创建一个自定义程序调用该查询,可以通过示例程序ZTS_ZDQ_CALL复制后,调整相关查询的传递条件.

动态报表 DQuery 自定义选择屏幕调用 - 封面图
动态报表 DQuery 自定义选择屏幕调用 - 封面图

_**06** _

实现效果

动态报表 DQuery 自定义选择屏幕调用 - 封面图
动态报表 DQuery 自定义选择屏幕调用 - 封面图
动态报表 DQuery 自定义选择屏幕调用 - 封面图
动态报表 DQuery 自定义选择屏幕调用 - 封面图

_**07** _

在呈现效果上, 几个金额字段的描述没有区分.

需要为每个查询设置特定的字段描述及字段颜色

动态报表 DQuery 自定义选择屏幕调用 - 封面图
动态报表 DQuery 自定义选择屏幕调用 - 封面图

**_08_ **

改善后的呈现效果

动态报表 DQuery 自定义选择屏幕调用 - 封面图
动态报表 DQuery 自定义选择屏幕调用 - 封面图

_**09** _

添加计算字段

动态报表 DQuery 自定义选择屏幕调用 - 封面图
动态报表 DQuery 自定义选择屏幕调用 - 封面图

_**10** _

最终呈现的效果

动态报表 DQuery 自定义选择屏幕调用 - 封面图
动态报表 DQuery 自定义选择屏幕调用 - 封面图

_**11** _

选中行,点击明细可以跳转到明细内容

动态报表 DQuery 自定义选择屏幕调用 - 封面图
动态报表 DQuery 自定义选择屏幕调用 - 封面图

总结

在使用动态报表配置财务报表时发现. 财务报表往往需要多个期间的数据同时呈现并比较. 动态报表可以关联多个查询.

> 详见链接 无峰,公众号: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

申请进入公众号讨论群提问或者参与话题讨论

ABAP技巧与实战

关于作者:ABAP技巧与实战

企业信息化与 SAP 技术顾问,长期专注 SAP ABAP、FI/CO、MM、SD 等模块的技术分享与实战经验总结。查看更多介绍

来源说明:本文内容由「动态报表DQuery自定义选择屏幕调用.md」整理生成,仅用于内部技术分享与学习交流。