SAP系统的一大功能是其内置的灵活性,可为客户添加或更改交付的功能。这允许SAP提供客户可以自行实现的支持包和增强功能,但也允许客户在SAP系统内创建自己的数据对象和程序。
SAP系统规定了允许客户定义自定义数据对象的流程。这些工具、对象和过程的集合通常称为ABAP数据字典(Data Dictionary)。数据科学家和其他程序员可能对创建数据类型和表的常用SQL命令很熟悉。SAP提供的功能在概念上是一样的,但实际上对功能进行了增强。数据定义的改变会立即影响系统的原始应用功能。例如,通过更改SAP表中字段的定义,可以使屏幕立即为用户提供一个友好的下拉列表,显示出特定输入字段的数值。
在这里,我们将介绍ABAP数据词典的一些主要内容,因为它们在探测系统中哪些数据是可以访问的方面非常有用。
权力越大,责任也就越大!第一次浏览SAP的数据科学家应该避免编辑SAP数据字典对象。如果管理员授予你开发人员访问权限,你可能会发现你有执行此操作的权限。千万不要这样做!
更改数据字典对象会导致系统许多领域不稳定。作者曾经见过,一个不明智的数据字典更改,需要从备份中恢复整个SAP实例。还应该告诉你,经验最丰富的SAP老手最愿意去接触数据字典对象。
在大多数SAP系统中,应用程序在传统的RDBMS(如Microsoft SQL Server、Oracle或IBM DB2)上运行。SAP为用户提供了几个可以查看和更改系统数据库的t-code,而不是直接编辑这些数据库系统来对其进行更改。在过去几年中,SAP发布了自己的RDBMS,名为HANA。它在全球的SAP环境中逐渐站稳了脚跟,但截至本书撰写时,它还不是SAP数据库市场的主导者。在本章的后面,我们将展示一个为HANA系统创建数据服务的例子
。
让我们深入研究几个SAP表。转到事务代码SE11,在数据库表字段中输入VBAK。单击“Display”(显示)按钮,表的定义如图3-4所示。
图3-4:事务SE11中VBAK表的定义
VBAK是一个透明表,这意味着屏幕上显示的字段和其他信息,与底层RDBMS中的表是一对一匹配的。这比在SQL中盯着一些DDL语句要好得多。SAP还允许另外两种表:池化表和集群表。就本书而言,我们不需要赘述太多细节,但要明白SAP的池化表和集群表与底层RDBMS中的表不是一对一的,所以屏幕上并不能完美地表示数据在数据库中的物理存储方式。对于SAP中的大多数编程任务来说,这种区别并不重要
。
VBAK是销售订单头表。VBAP是销售订单项目表。当你在SAP表中搜索时,请记住:SAP是德国软件。Ks通常代表“Kopf”或者头,Ps通常代表“Position”或项目。
在SAP GUI界面的下部,列出了属于该表的字段(Field),以及它们的数据类型和长度。字段列提供了数据库中字段的名称,本例中字段列的第一行为MANDT。勾选了Key(键)复选框的行强制在一起是唯一的,因此在我们的示例中,MANDT和VBELN必须是键表唯一的组合,然后才能将记录写入此表。数据元素列(Data Element)标识了引用数据对象的类型,由数据类型(Data Type)、长度(Length)和小数位(Decimals)等列进一步指定。对于想识别字段用途的数据科学家,简短描述(Short Description)列就能为你提供这些。如果滚动到字段列表的底部,你会看到一个或多个字段的名称带有Y或Z前缀。这表明公司已将该字段添加到交付的数据库表中,因为数据科学家可能需要在SAP系统内收集其他独特的数据
。SAP使用Y或Z来命名这些字段,对这些字段进行细分。但是那些添加的新字段,确实会成为基础数据库表的一部分。
在搜索SAP数据时,t-code SE11为你提供了另一个有价值的功能。在屏幕顶部有一个Indexes...(索引)按钮。这让你知道哪些字段针对搜索此表进行了优化,当处理那些较大的SAP表时,这一点非常重要。索引是SAP灵活性的另一个关键证明,SAP应用程序允许你在基础系统表中添加自己的索引,以提高搜索性能。不过,索引并不完美。它们会产生性能代价,因此,在SAP表中添加自己的索引时要谨慎且务实。
如果我们无畏的数据科学家Greg和Paul需要检查一组特定的销售订单,看看系统中存在什么样的数据,他们可以使用t-code SE16(通用表显示)或较新的代码SE16N,如图3-5所示。他们通过SAP同事的提示得知VBAK是订单标题表,他们可以在下方输入搜索条件,并查看结果。请注意,他们可以限制返回的记录数量,如果他们的搜索需要在屏幕返回3000万行记录,限制搜索记录就省去了漫长的等待。SE16/SE16N更适合查看表中的数据,而SE11则更适合检查表格的设置细节。
SE11还用于定义SAP结构。结构是在字典中定义的字段组,提供了在SAP ABAP代码中引用数据的常用方法。在3.3节中,我们使用字典定义的结构来保存SAP工厂的物理数据。如果在字典中定义结构,如图3-6所示,SAP系统的所有程序都可以使用该结构创建内部变量。结构本身并不能永久地保存数据,它们只是把数据标记出来的模型。
结构视图与表的视图非常相似。你可以查看字段名称、数据类型和一些基本描述。作为数据科学家,你可能不会经常定义新结构,但好在定义自己的结构比重新定义基础应用表的风险要小得多。例如,在第5章,你会学习到异常检测,那里我们会定义自己的结构,用于从SAP中提取数据。
图3-5:SE16N事务中用于查询的VBAK表
图3-6:t-code SE11的结构视图
SAP应用层使用数据元素作为结构和表定义(除了整数和字符串等基本类型之外)的最底层单元。它们可用于整个系统的结构、表和程序,使其成为自定义字典定义中可用灵活性的关键部分。
数据元素也通过SE11事务代码定义,如图3-7所示。
图3-7:SE11定义的数据元素
这里,你可以通过预定义的基本类型或域进行数据元素定义。在图3-8中,SAP提供的数据元素LOGSYS与域LOGSYS同名,这是在基础系统中安装的。在可能的情况下尽量使用域,这可以给你的数据元素增加一些额外的功能。
图3-8:LOGSYS的域定义(本例中,LOGSYS是数据元素LOGSYS的域)
域可以作为数据元素之上的一种感性层。最强大的是,你可以为域定义一个可接受的值列表,通过硬编码列表(如图3-9中的VBTYP域)或指定SAP表作为该域可能值的定义(如图3-10中的LOGSYS域)。
图3-9:VBTYP域的可接受值的硬编码列表
当你在SAP中寻找数据信息时,用域定义数据元素对于查找可能的值非常有帮助。了解可能的值及其含义,会立即提升你对手中数据的洞察力。例如,如果Greg和Paul想从VBTYP字段中提取信息(见图3-9),则数据从SAP中提取的数据就是A、B、C...这样的快捷值。Greg和Paul可以通过引用VBTYP的域定义来快速转换这些值。
图3-10:表TBDLS定义的LOGSYS域及可能的取值
我们已经讨论了表、结构、数据元素和域,它们是SAP系统中定义数据的关键。当你探索事物并寻找正确的信息来科学地整理数据时,最强大的工具之一是where-used列表,所有这些元素都可以使用。如图3-11所示的奇怪的箭头框意味着你可以四处寻找相关信息。
图3-11:where-used按钮,用来查找ABAP对象的引用
例如,Greg和Paul知道表VBAK是销售订单头表。他们怀疑其他系统表包含有价值的相关信息,但不知道从哪里可以找到这些信息。他们阅读了字段的简短描述,决定进一步钻研VBELN。
要查看他们将如何执行此操作,请单击并高亮显示字段VBELN,然后双击数据元素VBELN_VA,如图3-12所示。在数据元素屏幕,单击where-used图标。从如图3-13所示的对话框中选择Table Fields(表字段)就可以了!包含VBELN字段的其他表的列表如图3-14所示。然后,通过在SE16通用表显示中进一步分析和查找相关数据,就可以从现有的表数据中组成你想要的模型。
图3-12:为where-used分析选择数据元素VBELN_VA
图3-13:限制where-used只进行表字段搜索
图3-14:在表字段中进行VBELN_VA where-used搜索的部分结果列表
对单个域和数据元素也是如此。如果调查中发现一个数据元素,你怀疑它对你的数据调查至关重要,则可以对这个数据元素执行where-used操作,找出系统还在哪里使用过这个字段。这样,你可以找到使用该数据元素的表,希望该表有你需要的数据。
除了发现SAP表的模型结构外,你还会经常发现支持搜索的程序元素。为你选择的字典对象搜索函数、类和其他程序对象,可以访问可能的函数功能和可重用代码。在后面的几章中,我们将使用SAP函数和表来展示这些关系,但教你如何编写SAP ABAP代码不是本书的主要目标
。
大多数情况下,你会从多个表中查看数据。例如,你可能想查看采购订单数据——但就像SAP中的大多数数据一样,它是按表头和项目划分的。如果你使用事务代码SE16或SE16N,则需要从EKKO和EKPO
两个表中查询数据,这并不是最有效的方法。使事情更加复杂的是每个表都有数百个字段,其中绝大多数字段是你不需要的。
有一个更好的工具可以查看多个相关表:ABAP快速查看器(Quick Viewer)。Quick Viewer允许你进行快速查询,你可以在SAP GUI中查看,或者为其他工具抽取数据。让我们来看一个简单的例子。
在命令行中输入t-code(事务代码)SQVI。你会看到如图3-15所示的Quick Viewer初始屏幕。输入查询名称Purchasing,然后单击Create按钮。
图3-15:QuickViewer初始屏幕
输入标题,将Data Source更改为Table join(表联接)。单击Enter按钮(在绿色圆圈有勾号的那个按钮)。
你将看到一块空白画布,在这里可以可视化你要处理的表。单击Insert Table(插入表)按钮,如图3-16所示。
图3-16:Insert Table按钮
在Add Table对话框(见图3-17)中输入查询的主表EKKO。单击Enter按钮。
图3-17:在QuickViewer设置中添加表
现在,你将在窗口屏幕上看到你选择的主表。再次单击Insert Table按钮,添加另一个表EKPO。再次单击Enter按钮完成新表添加。
SAP尝试检测两个表之间的正确关系,并在窗口屏幕上显示结果。然而,它并不总是完全正确。图3-18显示,EKKO和EKPO表之间有两种关系,具体来说是EKKO-EBELN与EKPO-EBELN、EKKO-LPONR与EKPO-EBELP两种关系。对我们来说,第二个关系不正确,需要删除。
图3-18:自动生成的EKKO和EKPO之间的关系
右键单击要删除的连接,然后从上下文菜单中选择Delete Link(删除连接)。
图3-19:链接的上下文菜单
现在表之间的关系正确,单击Back按钮会看到图3-20所示的屏幕,然后选择字段。右侧面板是可用字段的列表,有几百个可选字段,但是我们只需要其中的几个。选择需要的字段,然后单击Add Field(添加字段)按钮。
图3-20:QuickViewer的字段选择
所选择的字段将移动到左侧面板,如图3-21所示。
图3-21:QuickViewer中已选择的字段
单击如图3-21所示的Selection fields(选择字段)标签,选择要查询数据的字段(见图3-22)。例如,我们只想按日期筛选数据,因此我们选择Data on which the record was created,与刚才的做法相同,将其值移动到左侧面板。
图3-22:选择要显示的字段14
就是这样!查询已准备就绪!单击Save(保存)按钮以保存你的工作。接下来单击Execute(执行)按钮进行测试
。你将看到一个简单的报表,其中只有我们指定的选择条件。为采购订单输入一个日期范围,然后单击执行按钮。SAP会显示一个简单的报表(见图3-23),里面有你请求的采购订单详细信息。
图3-23:QuickViewer查询结果
SAP中会经常见到下面的工具栏,它几乎是所有标准报表的标配。
要特别注意Export导出按钮。单击导出按钮时,你会得到许多用于导出数据的选项(见图3-24)。选择Local File(本地文件)将进入如图3-25所示的本地文件选项。
图3-24:查询导出选项
图3-25:本地文件选项
作为数据科学家,你应该知道怎样将tab分隔的文件导入R、Python或Weka。ABAP快速查看器提供了一种简单的方法,来执行一些初始数据导出和关键的探索性数据分析。使用这种方法,可以快速从SAP中获取数据,无须费力即可进行一些概念验证。
现在你可以看到SAP中的数据了,可以选择工具对数据进行一些探索性数据分析和可视化。也许你打算使用R、R Studio或者Jupyter Notebook,甚至可能是Weka!让我们从SAP的GUI中导出这些表格化的数据吧。
事务代码SE16通用表显示(General Table Display),附带如图3-26所示的便捷工具栏。
图3-26:SE16通用表显示工具栏选项
数据科学家感兴趣的按钮有两个:Open in Excel(用Excel打开,左边圆圈中的按钮)和Local file(本地文件,右边圆圈中的按钮)。它们都能提供你所期望的功能。本地文件按钮还提供导出前的格式设置选项。
能够访问原始数据文件的数据科学家才是幸福的数据科学家。