逻辑数据库 <dba> 的数据库程序的名称符合命名规则 SAPDB<dba>。 重要的是, 它包括系统在运行 ABAP/4 报表时调用的子程序集合。
报表中带事件关键字的子程序之间的相互作用,在逻辑数据库和 ABAP/4 报表 中进行了描述。逻辑数据库的结构决定 PUT 语句的行为 ,该语句在子程序 PUT_<table> 中很重要。
逻辑数据库程序通常包含定义子程序. 中描述的下列子程序,并且都使用 FORM 语句定义。
FORM INIT 在显示选择屏幕之前调用一次。
FORM PBO 每次刷新选择屏幕之前调用。
FORM PAI 用户每次在选择屏幕上按ENTER时调用。
系统将参数FNAME 和 MARK 传递给子程序,这些参数自动定义和填充。
- FNAME 包含选择屏幕上选择标准或参数的名称。
- MARK 说明用户所做的选择:
MARK = SPACE 意味着用户已经输入简单的单值或范围选择。
MARK = '*' 意味着用户已经在“多重选择”屏幕上制作条目。
FORM PUT_<table>
以逻辑数据库结构决定的顺序调用子程序。使用SELECT语句读取节点 <table> 的数据,并且PUT语句将程序流定向到报表中合适的GET语句中。
PUT 语句是该子程序的主语句:
语法
PUT < table >.
只能在逻辑数据库子程序中使用 PUT <table> 语句,该逻辑数据库包含以 PUT_< table > 开头的名称的节点 <table>。
1. 在显示选择屏幕之前初始化(例如,关键数据的默认值)PBO。
子程序 :
FORM INIT 在第一次显 示选择屏幕 之前调用一次该子程序 。
FORM PBO. 每次刷新选择屏幕时调用该子程序(在用户按 ENTER 之后)。
事件:
INITIALIZATION.
在第一次显示选择屏幕之前发生该事件。
AT SELECTION-SCREEN OUTPUT.
该事件在每次刷新选择屏幕时发生。
2. 系统显示选择屏幕,用户在输入字段中输入数据。
3. 当用户在选择屏幕上按 F4 或 F1 时,显示可能的条目和帮助。
子程序 :
FORM <par>_VAL. FORM <selop>_VAL. FORM <selop>-LOW_VAL. FORM <selop>-HIGH_VAL. 如果用户请求特定数据库参数 <par> 的可能条目 (F4) 列表或者选择标准 <selop> ,则根据需要调用子程 序。
如果用户请求这些参数的帮助 (F1) ,则调用以_HLP 而不是_VAL 结尾的子程 序。
事件:
AT SELECTION-SCREEN ON VALUE-REQUEST FOR <par>. AT SELECTION-SCREEN ON VALUE-REQUEST FOR <selop>-LOW. AT SELECTION-SCREEN ON VALUE-REQUEST FOR <selop>-HIGH. 如果用户请求特定数据库参数 <par> 的可能条目 (F4) 列表或者选择标准 <selop>, 则事件发生。
如果用户请求这些参数的帮助 (F1),则带附加 ON HELP-REQUEST 的事件发生 而不是 ON VALUE-REQUEST。
4. PAI,系统检查用户输入是否正确、完整和可行,还检查用户授权。如果检测到错误,则导出个与用户间的对话并要求再次输入某些条目,以便矫正错误。
子程序 :
FORM PAI USING FNAME MARK.
系统决定并 填充字段 FNAME 和 MARK。
FNAME 包含选择屏 幕上的选择 标准或参数 的名称。
如果 MARK = SPACE, 则用户已经 输入简单单 值或范围选 择。
如果 MARK = '*',则 用户已经在 “多重选择 ”屏幕上输 入选择。
联合使用 FNAME = '*' 和 MARK = 'ANY', 则可以在用 户选择“确 定”后立即 检查所有条目。
事件:
AT SELECTION-SCREEN ON <fname>.
在处理特定输入字段之 后的事件。必须在报表中指定字段 <fname>。
AT SELECTION-SCREEN ON END OF <fname>.
在处理多重选择之后的事件。必须在报表中指定字段 <fname>。
AT SELECTION-SCREEN.
用户通过选择“确定”显示整个选择屏幕之后的事件。
SELECT-OPTIONS: SLIFNR FOR LFA1-LIFNR, SBUKRS FOR LFB1-BUKRS, SGJAHR FOR LFC1-GJAHR, SBELNR FOR BKPF-BELNR.
复制代码
*-------------------------------------------------------* * DATABASE PROGRAM OF THE LOGICAL DATABASE HKS *-------------------------------------------------------* PROGRAM SAPDBHKS DEFINING DATABASE HKS. TABLES: LFA1, LFB1, LFC1, BKPF.
*-------------------------------------------------------* * Initialize selection screen (process before PBO) *-------------------------------------------------------* FORM INIT. .... ENDFORM. "INIT
*-------------------------------------------------------* * PBO of selection screen (process always after ENTER) *-------------------------------------------------------* FORM PBO. .... ENDFORM. "PBO
*-------------------------------------------------------* * PAI of selection screen (process always after ENTER) *-------------------------------------------------------* FORM PAI USING FNAME MARK. CASE FNAME. WHEN 'SLIFNR'. .... WHEN 'SBUKRS'. .... WHEN 'SGJAHR'. .... WHEN 'SBELNR'. .... ENDCASE. ENDFORM. "PAI
*-------------------------------------------------------* * Call event GET LFA1 *-------------------------------------------------------* FORM PUT_LFA1. SELECT * FROM LFA1 WHERE LIFNR IN SLIFNR. PUT LFA1. ENDSELECT. ENDFORM. "PUT_LFA1
*-------------------------------------------------------* * Call event GET LFB1 *-------------------------------------------------------* FORM PUT_LFB1. SELECT * FROM LFB1 WHERE LIFNR = LFA1-LIFNR AND BUKRS IN SBULRS. PUT LFB1. ENDSELECT. ENDFORM. "PUT_LFB1
*-------------------------------------------------------* * Call event GET LFC1 *-------------------------------------------------------* FORM PUT_LFC1. SELECT * FROM LFC1 WHERE LIFNR = LFA1-LIFNR AND BUKRS = LFB1-BUKRS AND GJAHR IN SGJAHR. PUT LFC1. ENDSELECT. ENDFORM. "PUT_LFC1
*-------------------------------------------------------* * Call event GET BKPF *-------------------------------------------------------* FORM PUT_BKPF. SELECT * FROM BKPF WHERE BUKRS = LFB1-BUKRS AND BELNR IN SBELNR AND GJAHR IN SGJAHR. PUT BKPF. ENDSELECT. ENDFORM. "PUT_BKPF
如果程序不存在,统根据结构和选择包含程序中的信息自动建议生成的程序。 如果要用建议的程序覆盖现有程序,请选择“编辑 -> 生成 -> 程序”。然 后必须在对话框中确认该操作。
不能更改预定义的 TABLES 语句和自动生成子程序的预定义名称。但是, 可以为数据库访问定义其它子程序或更改 ABAP/4 语句。
自动生成的 SELECT 语句的 WHERE 从句包含有 关表格中的 所有关键字 字段。对于 比较字段, 有下列选项 :
如果选择包含程序为字段定义选择标准,则将字段和相关选择表格与IN 相比较。
示例:
如果选择包含程序包括
示例:
在逻辑数据 库结构中, LFB1 是 LFA1 的下级节点 并且 LFA1 中的关键字 字段 LIFNR 是 LFB1 的外来关键 字。
如果选择包 含程序包括
示例:
让包含程序 DBHKSSEL 包括下列编 码选择:
DBHKSFXXX程序内容:
报表中带事件关键字的子程序之间的相互作用,在逻辑数据库和 ABAP/4 报表 中进行了描述。逻辑数据库的结构决定 PUT 语句的行为 ,该语句在子程序 PUT_<table> 中很重要。
逻辑数据库程序通常包含定义子程序. 中描述的下列子程序,并且都使用 FORM 语句定义。
FORM INIT 在显示选择屏幕之前调用一次。
FORM PBO 每次刷新选择屏幕之前调用。
FORM PAI 用户每次在选择屏幕上按ENTER时调用。
系统将参数FNAME 和 MARK 传递给子程序,这些参数自动定义和填充。
- FNAME 包含选择屏幕上选择标准或参数的名称。
- MARK 说明用户所做的选择:
MARK = SPACE 意味着用户已经输入简单的单值或范围选择。
MARK = '*' 意味着用户已经在“多重选择”屏幕上制作条目。
FORM PUT_<table>
以逻辑数据库结构决定的顺序调用子程序。使用SELECT语句读取节点 <table> 的数据,并且PUT语句将程序流定向到报表中合适的GET语句中。
PUT 语句是该子程序的主语句:
语法
PUT < table >.
只能在逻辑数据库子程序中使用 PUT <table> 语句,该逻辑数据库包含以 PUT_< table > 开头的名称的节点 <table>。
注意: PUT 语句根据逻辑数据库的结构定向程序流。读取深度由有关报表中的 GET 语句决定。
首先,为根节点执行子程序PUT_<root>。PUT语句然后如下定向程序流:
1. 如果数据库程序包含子程序 AUTHORITY_CHECK_< table >,则首先执行该子程序。
2. PUT语句试图触发报表中的GET事件,即如果存在相关GET<table>语句,则执行合适的代码块。
3. PUT语句将程序流定向到
下一节点的子程序上,前提是节点的GET语句在报表中相关分支的较低级别上。
相同级别节点的子程序上,前提是先前节点分支到此节点并且在报表中存在该节点的 GET 语句。
步骤1时子程序中的PUT再次起动。 如果它到达有GET语句的报表中分支的最 低层节点的子程序,则不再分支,但继续处理当前子程序。当处理完整个 PUT_<table> 子程序时,程序流返回将其分支到子程序PUT_<table> 处的 PUT 语句。
4. 从下级子程序 PUT_< table > 返回后,如果存在的话 ,PUT 语句分支到报表的 GET <table> LATE 语句。
示例:
在逻辑数据库结构中,LFB1是LFA1的分支。
假定在选择包含程序中定义如下选择标准:
下列图象显示程序流:
用如下方式 给字段 EVENT 赋值:
EVENT = 'START-OF-SELECTION'.
然后可以在 BEFORE_EVENT 和 AFTER_EVENT 子程序的列 表中使用它 。
编辑选择文本
选择文本,即在选择屏幕上带输入字段显示的文本,通常是选择标准的名称。
要用每种登录语言编辑选择文本,请在初始屏幕上选择“选择文本” 和“更改”。如果登录语言与初始语言(即生成逻辑数据库的登录语言)不同,则出现对话框提示是否想更改初始语言中的文本摘要或者是否要更改初始语言。通过更改初始语言,可以用任何语言维护选择文本。
编辑文档
要显示或编辑逻辑数据库的文档,请选择初始屏幕上的“文档”和“显示”或者 “更改”。
逻辑数据库和 ABAP/4 报表
每个 ABAP/4 报表都链接到报表属性中指定的逻辑数据库上 。该逻辑数据库将影响报表的生成 :
生成的选择屏幕包含逻辑数据库选择和报表。
在选择屏幕上,只显示报表中与数据评估相关的特定数据库选择。
链接到逻辑数据库的报表的运行行为
当执行链接到逻辑数据库的报表时 ,系统以特定顺序调用一系列处理块某些处 理在报表中编码而某些则在逻辑数据库程序中编码。
在数据库程序 SAPDB<dba> 中执行特定数据库子程序。
在 ABAP/4 报表中执行事件的处理块。
下列列表包含系统为链接到逻辑数据库 <dba> 的 ABAP/4 报表而执行的处理步骤 。在每种情况下,ABAP/4 程序代码行指定属于这些步骤的处理块。
1. 在显示选择屏幕之前初始化(例如,关键数据的默认值)PBO。
子程序 :
FORM INIT 在第一次显 示选择屏幕 之前调用一次该子程序 。
FORM PBO. 每次刷新选择屏幕时调用该子程序(在用户按 ENTER 之后)。
事件:
INITIALIZATION.
在第一次显示选择屏幕之前发生该事件。
AT SELECTION-SCREEN OUTPUT.
该事件在每次刷新选择屏幕时发生。
2. 系统显示选择屏幕,用户在输入字段中输入数据。
3. 当用户在选择屏幕上按 F4 或 F1 时,显示可能的条目和帮助。
子程序 :
FORM <par>_VAL. FORM <selop>_VAL. FORM <selop>-LOW_VAL. FORM <selop>-HIGH_VAL. 如果用户请求特定数据库参数 <par> 的可能条目 (F4) 列表或者选择标准 <selop> ,则根据需要调用子程 序。
如果用户请求这些参数的帮助 (F1) ,则调用以_HLP 而不是_VAL 结尾的子程 序。
事件:
AT SELECTION-SCREEN ON VALUE-REQUEST FOR <par>. AT SELECTION-SCREEN ON VALUE-REQUEST FOR <selop>-LOW. AT SELECTION-SCREEN ON VALUE-REQUEST FOR <selop>-HIGH. 如果用户请求特定数据库参数 <par> 的可能条目 (F4) 列表或者选择标准 <selop>, 则事件发生。
如果用户请求这些参数的帮助 (F1),则带附加 ON HELP-REQUEST 的事件发生 而不是 ON VALUE-REQUEST。
4. PAI,系统检查用户输入是否正确、完整和可行,还检查用户授权。如果检测到错误,则导出个与用户间的对话并要求再次输入某些条目,以便矫正错误。
子程序 :
FORM PAI USING FNAME MARK.
系统决定并 填充字段 FNAME 和 MARK。
FNAME 包含选择屏 幕上的选择 标准或参数 的名称。
如果 MARK = SPACE, 则用户已经 输入简单单 值或范围选 择。
如果 MARK = '*',则 用户已经在 “多重选择 ”屏幕上输 入选择。
联合使用 FNAME = '*' 和 MARK = 'ANY', 则可以在用 户选择“确 定”后立即 检查所有条目。
事件:
AT SELECTION-SCREEN ON <fname>.
在处理特定输入字段之 后的事件。必须在报表中指定字段 <fname>。
AT SELECTION-SCREEN ON END OF <fname>.
在处理多重选择之后的事件。必须在报表中指定字段 <fname>。
AT SELECTION-SCREEN.
用户通过选择“确定”显示整个选择屏幕之后的事件。
5. 逻辑数据库中的数据选择和 ABAP/4 报表中的处理
子程序 :
FORM PUT_<table>.
逻辑数据库读取节点 <table> 的选择。
事件:
START-OF-SELECTION.
在该事件中,ABAP/4 报表执行准备工作(例如从文件输入数据)。
GET <table> [LATE].
报表处理以逻辑数据库结构决定的顺序读自 <table> 的数据
END-OF-SELECTION.
在该事件中 ,ABAP/4 报表执行结束操作(例 如,计算总计,向文件 输出数据) 。
假定 TABLE1 是根节点并且 TABLE2 是其在逻辑数据库中仅有的子程序 。这种情况下,数据选择的处理步骤嵌套和处理如下:
1. START-OF-SELECTION.
报表中的准备步骤。
2. FORM PUT_TABLE1.
在数据库程序中循环读取 TABLE1
3. GET TABLE1.
报表中TABLE1的数据处理
4. FORM PUT_TABLE2.
在数据库程序中循环读取 TABLE2
5. GET TABLE2.
报表中 TABLE2 的数据处理
6. GET TABLE1 LATE.
结束 TABLE1 循环,报表中的数据处 理
7. END-OF-SELECTION.
结束报表中的步骤。
子程序
PUT_<dba>_MATCHCODE
BEFORE_EVENT
AFTER_EVENT
在程序流中由系统在合适点处调用 。
根据要作的授权检查,可以将子程序 AUTHORITY_CHECK_<table> 放置在报表中。
逻辑数据库示例:
下面是完整的数据库程序:
假定在选择 包含程序中 定义下列选 择标准:
子程序 INIT 和 PBO 初始化选择 屏幕。
子程序 PAI 对选择屏幕 上的用户输 入进行授权 检查。也可 能进行可行 性和值范围 检查。如果 检查产生负 输出,则出 现适当的错 误对话框并 且相关字段 再次准备接 收输入。
根据由用户 输入的选择 标准 PUT_<table> 子程序读取 数据库表格 并且在报表 中调用相关 处理块。调 用子程序的 顺序由逻辑 数据库的结 构决定。
下图显示数 据库结构决 定的程序流 :