http://help.sap.com/saphelp_nw70/helpdata/en/64/237f8cd43711d1950b0000e8
353423/content.htm
但是这里面对于自定义的选择屏幕参数和Get事件回调函数的逻辑都过于简单,以下给出一个自己写的例子,是实际的报表开发业务需求,只把最关键的部分给出来,其他的什么ALV显示或下载就略了。
1.选择屏幕
SELECT-OPTIONS:
注意,其中S_BUDAT、S_HKONT、S_BSCHL都是在后面使用到的LDB 'BRM'里面没有被预先定义的。
2.定义回调函数
INITIALIZATION.
CALLBACK_WA-LDBNODE
CALLBACK_WA-GET
CALLBACK_WA-CB_PROG
CALLBACK_WA-CB_FORM
APPEND CALLBACK_WA TO CALLBACK.
CLEAR CALLBACK_WA.
CALLBACK_WA-LDBNODE
CALLBACK_WA-GET
CALLBACK_WA-GET_LATE
CALLBACK_WA-CB_PROG
CALLBACK_WA-CB_FORM
APPEND CALLBACK_WA TO CALLBACK.
内表CALLBACK要作为LDB_Process的一个输入参数,LDBNODE和CB_FORM分别对应了LDB中的表名和要在其中写业务逻辑的Form名。
3.填充选择屏幕的参数值
FORM FILL_SELECTION.
*Company Code
SELTAB_WA-KIND = 'S'.
SELTAB_WA-SELNAME = 'BR_BUKRS'.
LOOP AT S_BUKRS.
ENDLOOP.
*Document number
SELTAB_WA-KIND = 'S'.
SELTAB_WA-SELNAME = 'BR_BELNR'.
LOOP AT S_BELNR.
ENDLOOP.
*Document type
SELTAB_WA-KIND = 'S'.
SELTAB_WA-SELNAME = 'BR_BLART'.
LOOP AT S_BLART.
ENDLOOP.
ENDFORM.
SELNAME是LDB中预定义了的选择屏幕参数名,将对应的S_×××的参数值填充进去SELTAB,也要作为LDB_Process的一个输入参数。
4.调用Function Module
CALL FUNCTION 'LDB_PROCESS'
*
注意两个Tables的参数,就是第2、3步处理的两个内表。
5.回调函数中的业务逻辑
FORM CALLBACK_BKPF USING NAME
注意,check WA-BUDAT IN S_BUDAT,是对没有在LDB中定义的选择屏幕S_BUDAT的处理,判断抽取出的物料凭证的记账日期是否在输入的范围内,在的话会把数据放入一个rpt结构中。
FORM CALLBACK_BSEG USING NAME
ENDFORM.
对 S_HKONT和S_BSCHL的check与S_BUDAT类似,前面的三个check是关联BKPF和BSEG的条件,rpt-×××的值在 CALLBACK_BKPF中已经取得,这里就相当于SELECT ... FROM BSEG WHERE BUKRS = BKPF~BUKRS ...
最后所有满足条件的记录都APPEND到rpt中之后,就可以使用ALV显示,或下载到本地等等,此处略过。
这个程序的实 现的一个重大优点在于性能,众所周知读BKPF/BSEG是数据极大的表,一般都会建议在SQL中使用for all entries来优化性能,问题是,如果最初读BKPF的时候条件就设置很宽松,从这一个单表取数也很耗时间,这时不妨采用我这里介绍的LDB的方法,性能明显更好,我自己已经有过体会了。
FUNCTION MODULE 'LDB_PROCESS' 实例讲解
一个自己写的例子,实际的报表开发业务需求中,使用Function Module “LDB_PROCESS”来实现使用LDB时自定义选择屏幕,及对性能的提高。