ABAP关键字SUBMIT的简单例子和学习小记
网上有关SUBMIT实现程序调用的例子稍显复杂,而相关的参考和解释则不是很完善。本文给出一个SUBMIT的小示例程序(代码见文末),实现了最简单的程序间调用及返回值,以及SAP官方文档中相关内容的翻译、解释。
本文链接:http://www.cnblogs.com/hhelibeb/p/5802398.html
转载请注明
SUBMIT - 参考
语法
SUBMIT {rep|(name)}
[USING SELECTION-SCREEN dynnr]
[VIA SELECTION-SCREEN]
[USING SELECTION-SET variant]
[USING SELECTION-SETS OF PROGRAM prog]
[WITH SELECTION-TABLE rspar]
{ [WITH sel1 { {{EQ|NE|CP|NP|GE|LT|LE|GT} dobj [SIGN sign]}
| {[NOT] BETWEEN dobj1 AND dobj2 [SIGN sign]}
| {IN rtab} }]
[WITH sel2 { {{EQ|NE|CP|NP|GE|LT|LE|GT} dobj [SIGN sign]}
| {[NOT] BETWEEN dobj1 AND dobj2 [SIGN sign]}
| {IN rtab} }]
... }
[WITH FREE SELECTIONS texpr]
[LINE-SIZE width]
[LINE-COUNT page_lines]
{ [EXPORTING LIST TO MEMORY]
| [TO SAP-SPOOL SPOOL PARAMETERS pri_params
[ARCHIVE PARAMETERS arc_params]
WITHOUT SPOOL DYNPRO] }
[[USER user] VIA JOB job NUMBER n]
[AND RETURN].
SAP CRM 用户界面对象类型和设计对象
在CRM中的用户界面对象类型的帮助下,我们可以做这些工作:
- 进行不同的视图配置
- 创建动态导航
- 从设计层控制字段标签、值帮助
- 控制BOL对象的属性的可视性
- 从导航栏访问自定义组件
一个用户界面对象类型之下会有设计对象的集合,每个设计对象可以控制BOL对象的属性。
第一步,
创建一个回调类。前往事务SE24并且创建一个新类。这个类应该实现接口IF_BSP_DLC_OBJ_TYPE_CALLBACK.
让我们制作一个新的用户界面对象类型。进入SPRO事务中的以下路径,在下一个屏幕选择“新条目”。
按下图的内容填充条目,保存。
回调类用于提供子对象类型,子对象类型可以用于创建视图配置。类名填入在上面创建已经的类,稍后实现方法。
接下来我们将在服务订单上使用这个用户界面对象类型,填入通用组件名(BT)。
BTOrder是BT组件中的主要根对象。
BOR类型BUS2000112代表服务订单类型。保存条目。
我们已经创建了新的用户界面对象类型。在下一步,需要在这个新用户界面对象类型中创建一个设计对象。
在事务SPRO中进入以下路径: 客户关系管理->UI框架->用户界面框架定义->设计层->定义设计类型。
需要输入UI组件类型,填入已创建好的那个。
点击“新条目”,输入以下信息并保存该条目。
保存了条目之后,在当前屏幕左侧点击“设计”,将会打开一个新窗口。
点击新条目,在下一个屏幕按下图填如数据。
这里我想要控制BTAdminH的OBJECT_ID属性,因此选择了OBJECT_ID。
如果需要的话,在“链接到业务对象层”标签下,我们可以填入另一个任意的BOL对象和它的组件。
我添加了新的字段标签,如果选择HIDDEN,这个字段将不会在任何配置中可用(不会在视图的配置标签的可用部分展示出来)。
也可以把特定的字段做成下拉栏或者复选框,如果这个字段包含某些通过在ABAP字典中选择中了“值帮助”复选框而存在的值范围。(细节待会再说)。数据条目完成后,保存条目。
我们准备好了用户界面对象类型和设计对象。下一章中,将通过基本条目BTAdminH把它分配给需要的上下文节点。
ABAP单元测试最佳实践
本文包含了我在开发项目中经历过的实用的ABAP单元测试指导方针。我把它们安排成为问答的风格,欢迎任何人添加更多的Q&A's,以完成这个列表。
- 在我的项目中,只使用传统的ABAP report。所以很不幸我不能使用ABAP单元测试了,是吗?
有个好消息:无论你正在使用哪一种ABAP代码对象进行开发,都可以通过添加单元测试使得它更加稳定和更易于扩展。对于reports,模块池(module pools)和函数组(function groups),可以通过添加手写本地类的方式添加单元测试。假设一个简单的情形,在一个report中你想要测试子程序xyz的最直接调用,下面的代码骨架就可以做到,这段代码可以定义为代码模板,以便于插入到report。
class lcl_test definition for testing "#AU Duration Short inheriting from cl_aunit_assert. "#AU Risk_Level Harmless private section.
methods test_xyz_simple_call for testing.
endclass.classlcl_test implementation.
method test_xyz_simple_call.*Setup parameters for the call...*Perform the call perform xyz using ...*Check returned values assert_equals( act = ... exp =... ).
endmethod.
endclass.ABAP 7.40, SP08 中的 Open SQL 新特性
1,使用 data_source~*指定列
在7.40, SP08中,可以在SELECT语句中使用data_source~*来指定选取不同的数据库表、视图的全部列来作为结果集。它也可以和单独指定的列col_spec结合(通过聚合表达式)。
当在结果集使用了data_source~*的时候,语法检查会以严格模式运行。
2,SELECT...INTO后的内联声明
根据SELECT语句的返回结果集,现在可以使用DATA(...)以及转义前缀@来内联声明数据对象、结构、内表。比如:
SELECT * FROM sflight INTO @DATA(ls_sflight) WHERE connid = 'AA'.
ABAP设计模式——适配器
计算机科学中的大多数问题都可以通过增加一层间接性来解决。 ——David Wheeler
适配器模式(Adapter Design Pattern),是一个广泛应用于真实世界和面向对象编程语言的设计模式。基于面向对象的标准SAP程序中同样很多地使用了适配器模式。
适配器是什么?
适配器把因为不同的“接口”而不兼容的对象转换(为兼容的)。通过实现适配器,我们可以让一些原本不能共同工作的类共同工作。
有时,我们有一个客户端,它希望对象只有一个确定的接口。还有一个对象,他能满足功能上的要求,但是两个对象的接口是不同的。因此,我们不能直接通过相同的接口调用现存的对象。所以,我们需要创建一种“包装”来把对象的接口转换为可以被另一个客户端或者对象所接受的接口。
听起来有点耳熟?是的,我们在很多情况下使用这种包装——无论是真实世界还是编程。在真实世界,我们使用通过USB接口工作的Mini SD卡读取器,从而读取数据。在ABAP里面,标准的SAP程序中的大部分BAPI FM会用到它。
适配器的UML
下图是本文的适配器示例的UML图:
有个简单的输出类来实现LIF_OUTPUT。客户端使用接口LIF_OUTPUT来和输出类交互。让我们看看适配器是如何实现的:
- LIF_OUTPUT——客户端只接受使和实现了该接口的对象一起工作。因此,所有的需要和客户端交互的对象必须实现该接口。该组件叫做“Target”.
- TREE_OUTPUT——这是一个没有实现相应接口的对象。但是该对象满足了我们对于生成树的所有需求。该组件叫做“Adaptee”.
- NEW_COMPLEX_OP——这是一个新的对象,扮演实现了LIF_OUTPUT的TREE_OUTPUT的包装者的角色。所以,客户端可以通过同样的接口无缝生成复杂输出(TREE).它叫做“Adapter”.
SALV模型使用了适配器模式来通过SALV的兼容接口来将属性映射到Classical ALV或者ALV Grid的属性上。
代码
使用OO ABAP实现适配器的代码:
REPORTZNP_DP_ADAPTER.*INTERFACElif_output.METHODS: generate_output.ENDINTERFACE. "lif_output*CLASS simple_op DEFINITION.PUBLIC SECTION.INTERFACES: lif_output.ENDCLASS. "simple_op DEFINITION*CLASS simple_op IMPLEMENTATION.METHODlif_output~generate_output.WRITE: / 'Simple Output - just using WRITE'.ENDMETHOD. "lif_output~generate_output ENDCLASS. "simple_op IMPLEMENTATION*CLASS tree_output DEFINITION.PUBLIC SECTION.METHODS: generate_tree.ENDCLASS. "tree_output DEFINITION*CLASS tree_output IMPLEMENTATION.METHODgenerate_tree.WRITE: / 'Creating Tree ... using CL_GUI_ALV_TREE'.ENDMETHOD. "generate_tree ENDCLASS. "tree_output IMPLEMENTATION*CLASS new_complex_op DEFINITION.PUBLIC SECTION.INTERFACES: lif_output.ENDCLASS. "new_complex_op DEFINITION*CLASS new_complex_op IMPLEMENTATION.METHODlif_output~generate_output.DATA: o_tree_op TYPE REF TOtree_output.CREATE OBJECTo_tree_op.
o_tree_op->generate_tree( ).ENDMETHOD. "lif_output~generate_output ENDCLASS. "new_complex_op IMPLEMENTATION*START-OF-SELECTION.DATA: o_op TYPE REF TOlif_output.CREATE OBJECT o_op TYPEsimple_op.
o_op->generate_output( ).*using the same "simple" Interface to perform the "complex",*Since Client only wants to use Simple interface .. CREATE OBJECT o_op TYPEnew_complex_op.
o_op->generate_output( ).