查看原文
其他

关于SE16H,你需要知道的事

SAP油瓶哥 小哈公社 2019-06-12


文 | SAP油瓶哥


前言

最近看了一些文章介绍SE16H这个新的表查询工具,也想自己来测试下SE16H能做什么,跟传统的SE16, SE16N比起来有什么优势。


适用版本

有文章里提到SE16H是在S/4 HANA中才有的,事实上并非如此,即使没有使用S/4 HANA,在ECC6环境下,这个事务码也是可以用的,在TADIR表中可以看到SE16H于2011年就已经包含在组件SAP_APPL中了 (Release 606)。


新功能

1

数据库连接 | Database connection


这个是SE16H的新字段,通过该字段,可以在ERP系统中查看SAH HANA数据库的表内容而无需使用SAP HANA Studio。


看了下 SAP NOTE 1636416 对这个字段的解释:

  1. 在“数据库连接”字段,可以通过搜索帮助(F4)选择可用的的数据库连接

  2. 系统使用选中的数据库连接进行访问

  3. 当一个数据库连接被选中时,“Table”字段的搜索帮助会显示SAP HANA中可用的表和视图

  4. SE16H仅能检查到数据库的物理连接,SAP HANA中创建的表的定义必须与SAP ERP数据字典定义一致,如果有不一致(比如字段名),SE16H会DUMP。 使用SE16H访问SAP HANA仅适用于1:1复制的表。所有其他的表(比如仅在SAP HANA中新创)必须使用SAP HANA studio进行访问。

  5. 如果不填写"数据库连接",SE16H将访问ERP系统的常规数据库,这种情况下,运行时间可能会较长。


也就是说要发挥出SE16H的全部威力,还是要运行在HANA数据库上的。


这个字段的功能,我在现有环境下没有测试成功。


按下F4我可以看到一个数据库连接 HANA_DEV。


但选中后会提示:


应该是说备选的数据库连接这里是不能使用的。因为没有其他合适的数据库连接可以使用,关于这个字段的用法和效果,只有以后再探索了。


2

组查询 | GROUP

和SE16N比起来,SE16H多了一个可以按组去查询的功能。


比如我们可以按会计科目组,成本中心组,内部订单组来查询表数据。


组(或者说集)可以在GS01中进行定义。


比如我定义了一个公司代码的组ZBUKRS。


当我输入ZBUKRS在查询栏里时,就相当于输入了我在组里定义的3个公司代码。


Note 1666911 提供了一个程序RKSE16H_CREATE_SET,这个程序可以方便的将成本中心组,订单组转换成对象编号组,这将大大方便CO模块的一些表查询,比如COEP,我们甚至可以把不同控制范围下的成本中心组,订单组创建在一个对象编号组里。


3

快速计数 | GROUP

SE16H在选择界面一共有两个列叫Group, 这个Group是可以用来按所选字段计数的。


比如我们点击"Number of Entries"得知BSEG表中一共有695,124条数据,但如果我们想知道各个公司代码下分别有多少条数据,就只要勾选上Company code这行的Group, 然后执行:


就可以直观的看到每个公司代码的凭证行项目数:(有没有联想到TAANA?)


再进一步,如果想知道每个公司代码每年的凭证行项目数怎么做呢? 只要再勾上Fiscal这行的Group就搞定了:


是不是非常方便呢? 


4

合计 | TOTAL

TOTAL这一列最好配合着GROUP(计数)来使用,当勾上相应的合计字段后,系统就会额外返回对应的合计值。


比如我想知道5010这个公司代码下2016,2017年的会计凭证行项目本币金额和记账货币金额的合计分别是多少:


公司代码填上5010,为Company code和Fiscal year勾上Group。


再为Amount in LC 和 Amount 勾上 Total。


我们就会得到:


假如我们没有勾选Group,效果就是这样:


注意:如果数据量过大,TOTAL后值可能会溢出。


5

排序 | SORT

回到GROUP(计数)的例子,我们看到系统返回的清单是默认升序的:


如果我们给Company code和Fiscal year勾上Sort, 为Company code选择Sort type DES(降序),Fiscal year的Sort type留空。


清单就变成了这样:


需要说明的是SORT需要配合GROUP(计数)来使用。如果仅勾选了SORT,系统也是会帮你把GROUP勾选上的。


6

顺序 | Sequence

还是继续上面的例子,我们看到清单显示的次序是先公司代码,再会计年度,如果我们为Company code和Fiscal year维护上次序号。


我们就会得到这样的清单:


可以看到列顺序变为了先会计年度,再公司代码。


Sequence可以用来控制输出清单中列的次序,比如你一共要输出6个字段,你可以给这6个字段分别填写Sequence值(范围1-99),系统就会按照Sequence值从小到大依次输出。


Sequence不需要配合Group(计数)来使用。


7

最大值,最小值,平均值 | Aggregate

Aggregate仅对数字型字段有效,可用来返回最大/最小/平均值,建议最好配合Group(分组统计)来使用。


注意:Aggregate,Total还有Group(分组统计)这三者对每一个字段来说只能选用一项,如果勾选了任意两者或以上,系统会提示:


8

结果清单钻取 | Drilldown options in the results list

下钻功能的菜单只有在勾选了Group(分组统计)执行后才会出现,比如COEP表,我们按Controlling area和 Year分组统计,右击任一行会看到Drilldown的选项。


说下这几个的区别:

  1. Drilldown/List: 钻取整个清单,不新开窗口

  2. Drilldown/Row: 钻取选中的行,不新开窗口

  3. Dridown/List/New Mode/Value Entry: 钻取整个清单,新开窗口,返回至选择界面

  4. Drilldown/Row/New Mode: 钻取选中的行,新开窗口显示结果清单

  5. Drilldown/Row/New Mode/Value Entry: 钻取选中行数据,新开窗口,返回至选择界面


比如我们选择Drilldown/List把Cost element加到钻取清单中:


清单会变成这样:


这几个的区别自己试一下就会明白。


另外通过菜单Extras > Change settings,可以把结果清单界面的双击功能修改为上面5种钻取效果中的一种。


9

跨表查询 | Outer Join definition

这个是SE16H最吸引我的新功能,也是我花费时间最多去测试的功能。本来想着按照 Abdellah Khebbar 和 Mohamed Talaat 的博文,应该很快就能把功能测通,可我花了3个多小时,反复试验每个按钮,发现不对啊,为什么我输出的行数比我期望的多?又回过头去把NOTE 1636416 看了好多遍后,我发现他们文章中的截图都是有误导性的!也是说照着他们的方法来操作,根本得不到想要的结果。


其实我早就该发现这个的啊,看他们最后的清单截图就应该能发现问题的。


先说Abdellah Khebbar的例子,这位大哥举的是BSEG和BKPF联合查询的例子,很常见,也很实用啊,这样就不用像以前一样,下载完BSEG后,再去vlookup添加BKPF会计凭证头部信息了,可是你这个截图,不对啊,你明明BSEG只需要输出6行记录,但你的图里是12行啊亲。。我相信你的本意是想达到在原来6行行项目信息的基础上添加上头部信息,哎,真是被你这个Layout给搞晕了,我竟然一开始没发现这个问题。


好,再看下Mohamed Talaat这位大哥的,嗯,用的是LFB1和LFA1跨表查询的例子,输入公司代码去把供应商的名称地址信息一起拉出来,也很常见啊,可是,你配的这个图是在搞笑的吗……第一列全是同一个Vendor? 而你匹配到的又是什么鬼?


你们两位大哥在发表博客前,真的有好好测试嘛……


吐槽完毕,下面来跟大家分享下正确的打开方式,首先介绍下Outer Join definition,NOTE中说了好多点,我稍微总结下:

  1. 这个功能可以用来实现跨表查询,(比如去读取文本表里的描述);

  2. 不建议一次去处理很多数据(会DUMP的);

  3. 对Outer Join definition的显示和定义分别有授权检查;

  4. 命名上注意不能是数字开头,字母和/开头都可以;

  5. Outer Join definition是一个workbench object, 也是可以用来传输的;

  6. 建议每次修改完Outer Join definition,保存后重新进下SE16H,达到清除之前缓存的目的,如果不退出SE16H直接执行,可能会出现奇怪的现象(例如新添加需要输出的字段显示不正确,或者干脆就DUMP)。


下面我们用一个例子来一步步说明如何实现跨表查询,就用BSEG和BKPF跨表查询的例子。


首先Table处填上BSEG,然后点下面的按钮进入Outer Join definition的定义界面:


填上Outer Join definition的名字和描述,点新建按钮继续:


副表名字那里填上BKPF, 勾上Grouping(如果不勾会严重影响运行性能,甚至DUMP),点开Output:


填上期望从BKPF表里输出的字段:


双击BKPF表名,然后点击新建或插入行按钮(一个是向下插入一行,一个是向上插入):


这里就是最关键的一步了,要定义主副表间如何关联起来,正确的做法是用Reference,让公司代码,凭证编号,会计年度这些主键跟BSEG进行关联。如果不这么做,仅仅在这里进行一些常量的限制或不做限制,那就会出现你最后输出的清单条目数比你期望的多的情况!或者你最后出来的清单,每行信息根本对不上。


解释下这里几个Method的用法:

  1. REFERENCE: 参照, 用于参考其他表的字段值。

  2. CONSTANT:常量,注意要填写未转换的值。

  3. STRING:字符串,可以配合后面的Offset, length来对字符串进行截断处理。

  4. SYSTEMVAR: 系统变量,可以引用SYST结构中的字段VARIABLE: 复杂变量,可以使用SE16N_OJ_GET_OBJECT_FROM_OBJNR变量将Object number转换为成本中心号或内部订单号。



点击新建按钮保存下Outer Join definition,下面我们执行下看看效果吧。


这里以查询一张凭证号为例:


接下来我们更进一步,如果我想要在清单里加上成本中心的描述该怎么操作呢?


首先把CSKT添加为第2张副表,然后我们只需要为CSKT再定义关联方式就可以了:


如果我们为CSKT仅维护像如下的一行关联:


最后的结果:


会发现多输出了两行,原因在于CSKT表里对于成本中心的描述维护了两种语言,我们需要对此做出限制:


我们给副表关联关系增加一行语言的限制,只输出中文描述,注意这里用到了常量。


结果:


原来填写常量值时,需要填写CSKT表中未转换的值。


大功告成:


小结

SE16H确实是一个强悍的工具,从某种程度上说,可以代替我们熟悉的SE16、SE16N、SQVI、SQ01、TAANA了。


然而由于它不是真正的做DATA JOIN, 所以如果一次跨表查询大量的数据,不是非常推荐,很容易报性能瓶颈DUMP,还有就是每次修改完Outer join connection后要记得退出重进SE16H这点也比较麻烦。


SAP NOTE给出的典型应用场景是:

  1. 比较ERP数据库和HANA数据库一致性

  2. 跨控制范围的表查询 


参考文章 | SAP NOTE


https://www.linkedin.com/pulse/you-used-use-se16se16n-sqvi-try-se16h-abdellah-khebbari-/


https://blogs.sap.com/2017/12/18/sap-s4-hana-offering-se16h-versus-se11se16nsqvi/


http://sfcn.mohamedtalaat.com/index.php/8-new-sap-s4hana-se16h-forget-about-se16n-se11-sqvi


https://zhuanlan.zhihu.com/p/32260546


SAP NOTE 1636416


SAP NOTE 1666911



关于作者

Inwehub用户名:李乐平,一枚财务出身的油腻的中年SAP从业大叔,3年财务经验,8年SAP甲方经验,现任某服装行业上市公司SAP项目经理。

推荐阅读

《替代SE16N的超强悍SE16H》

《来,聊个5块钱的APO》

《3分钟判断SAP顾问水平》

《每个顾问都该有的底层逻辑,这15张图告诉你》

《在云上使用ABAP》

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存