二维码

[sldb] 逻辑数据库的数据库程序

Twilight发表于 2014-10-02 15:51Twilight 最后回复于 2014-10-02 15:51 [复制链接] 3585 0

    要编辑逻辑数据库访问程序,请在初始屏幕上选择“数据库程序”和“更改”。 进入程序SAPDB<dba> 的编辑器。<dba>是逻辑数据库的名称。
如果程序不存在,统根据结构和选择包含程序中的信息自动建议生成的程序。 如果要用建议的程序覆盖现有程序,请选择“编辑 -> 生成 -> 程序”。然 后必须在对话框中确认该操作。
不能更改预定义的 TABLES 语句和自动生成子程序的预定义名称。但是, 可以为数据库访问定义其它子程序或更改 ABAP/4 语句。
自动生成的 SELECT 语句的 WHERE 从句包含有 关表格中的 所有关键字 字段。对于 比较字段, 有下列选项 :
如果选择包含程序为字段定义选择标准,则将字段和相关选择表格与IN 相比较。
示例:
如果选择包含程序包括
  1. SELECT-OPTIONS SLIFNR FOR LFA1-LIFNR.
复制代码
那么下列子程序自动出现在数据库程序中:
  1. FORM PUT_LFA1.      
  2. SELECT * FROM LFA1    WHERE LIFNR IN SLIFNR.   
  3. PUT LFA1.      
  4. ENDSELECT.      
  5. ENDFORM.
复制代码
  如果选择包含程序不包含字段的选择标准, 但该字段的上级表格的关键字字段是外来关键字,则对那些由外来关键字相关性链接的字段进行比较。
示例:
在逻辑数据 库结构中, LFB1 是 LFA1 的下级节点 并且 LFA1 中的关键字 字段 LIFNR 是 LFB1 的外来关键 字。
如果选择包 含程序包括
  1. SELECT-OPTIONS SBUKRS FOR LFB1-BUKRS.
复制代码
在数据库程 序中自动出 现下列子程序:
  1. FORM PUT_LFB1.  
  2. SELECT * FROM LFB1             WHERE LIFNR =  LFA1-LIFNR.             AND   BUKRS IN SBUKRS.   
  3. PUT LFB1.         
  4. ENDSELECT.      
  5. ENDFORM.
复制代码
此处,为LFB1中的字段BUKRS定义选择标准SBUKRS。WHERE条件BUKRS IN SBUKRS 如上述显示 。不定义字段 LIFNR 的选择标准,但是LIFNR在LFA1 中也是关键字字段。因此,通过使用AND的条件LIFNR = LFA1-LIFNR扩展WHERE从句。
示例:
让包含程序 DBHKSSEL 包括下列编 码选择:
  1.   SELECT-OPTIONS: SLIFNR   FOR LFA1-LIFNR.
  2.   SELECT-OPTIONS: SBUKRS   FOR LFB1-BUKRS.
  3.   SELECT-OPTIONS: SGJAHR   FOR LFC1-GJAHR.
  4.   SELECT-OPTIONS: SBELNR   FOR BKPF-BELNR.
复制代码
自动生成数 据库程序的最重要行列在下面。程序也包含某些用户和性能提示,如注释行,但此处不包括这些。
DBHKSFXXX程序内容:
  1. *----------------------------------------------------------------------*
  2. * BEFORE_EVENT will be called before event EVENT.
  3. * Possible value for EVENT: 'START-OF-SELECTION'.
  4. *----------------------------------------------------------------------*
  5. * FORM BEFORE_EVENT USING EVENT.
  6. *   CASE EVENT.
  7. *     WHEN 'START-OF-SELECTION'.
  8. *
  9. *   ENDCASE.
  10. * ENDFORM.                             "BEFORE_EVENT

  11. *----------------------------------------------------------------------*
  12. * AFTER_EVENT will be called after event EVENT.
  13. * Possible value for EVENT: 'END-OF-SELECTION'.
  14. *----------------------------------------------------------------------*
  15. * FORM AFTER_EVENT USING EVENT.
  16. *   CASE EVENT.
  17. *     WHEN 'END-OF-SELECTION'.
  18. *
  19. *   ENDCASE.
  20. * ENDFORM.                             "AFTER_EVENT

  21. *----------------------------------------------------------------------*
  22. * Initialize global data for multiple processing of
  23. * one logical database.
  24. * Set returncode:
  25. *      0 -> all data are initialized, multiple processing o.k.
  26. *  other -> no multiple processing allowed
  27. *----------------------------------------------------------------------*
  28. FORM  LDB_PROCESS_INIT changing subrc like sy-subrc.

  29. ENDFORM.                              "LDB_PROCESS_INIT

  30. *----------------------------------------------------------------------*
  31. * LDB_PROCESS_CHECK_SELECTIONS is called
  32. * after select-options and parameters are filled
  33. * Set return code:
  34. *     0 -> selections are accepted
  35. * other -> selections are not accepted; message in MSG
  36. *----------------------------------------------------------------------*
  37. FORM LDB_PROCESS_CHECK_SELECTIONS CHANGING SUBRC LIKE SY-SUBRC
  38.                                               msg like symsg.

  39. ENDFORM.                           "LDB_PROCESS_CHECK_SELECTIONS

  40. *----------------------------------------------------------------------*
  41. * Initialize selection screen (processed before first PBO)
  42. *----------------------------------------------------------------------*
  43. FORM INIT.

  44. ENDFORM.                               "INIT.

  45. *----------------------------------------------------------------------*
  46. * PBO of selection screen (processed always before display of screen)
  47. *----------------------------------------------------------------------*
  48. FORM PBO.

  49. ENDFORM.                               "PBO.

  50. *----------------------------------------------------------------------*
  51. * PAI of selection screen (processed always after ENTER)
  52. *----------------------------------------------------------------------*
  53. FORM PAI USING FNAME MARK.

  54. * CASE FNAME.
  55. *   WHEN 'SLIFNR  '.
  56. *   WHEN 'SBUKRS  '.
  57. *   WHEN 'SGJAHR  '.
  58. *   WHEN 'SBELNR  '.
  59. *   WHEN '*'.
  60. * ENDCASE.

  61. ENDFORM.                               "PAI
复制代码
逻辑数据库 <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>。

注意: 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的分支。
假定在选择包含程序中定义如下选择标准:
  1. SELECT-OPTIONS: SLIFNR FOR LFA1-LIFNR, SBUKRS FOR LFB1-BUKRS.
复制代码
将读取数据库程序的某节:
  1. FORM PUT_LFA1.   
  2. SELECT * FROM LFA1  WHERE LIFNR IN SLIFNR.      
  3. PUT LFA1.   
  4. ENDSELECT.  
  5. ENDFORM.   
  6. FORM PUT_LFB1.   
  7. SELECT * FROM LFB1 WHERE LIFNR =  LFA1-LIFNR.   AND   BUKRS IN SBUKRS.      
  8. PUT LFB1.   
  9. ENDSELECT.  
  10. ENDFORM.
复制代码
链接到逻辑数据库的报表将包含:
  1. GET LFA1.   WRITE LFA1-LIFNR.
  2. GET LFB1.   WRITE LFB1-BUKRS.
复制代码
在该示例中,系统在选择处理的开始时调用过程PUT_LFA1。PUT LFA1语句将程序流定向到报表中的GET LFA1语句处理块上。当执行该块时,PUT LFA1转到子程序 PUT_LFB1,该子程序将程序流定向到报表中的 GET LFB1 语句。如果 LFB1 是读取的最后节点,则用PUT_LFB1中的 SELECT 循环恢复处理。否则,程序流移到下一节点的 PUT_< table > 子程序上。 在最后节点的 SELECT 循环末尾、 下一级开始处节点的SELECT循环中恢复处理。
下列图象显示程序流:
逻辑数据库的数据库程序 1.png
  1. FORM AUTHORITY_CHECK_< table >
复制代码
由 PUT <table> 语句自动调用。在该子程序中,可以从逻辑数据库结构中为合适的节点 <table> 指定授权检查。
  1. FORM PUT_<dba>_MATCHCODE
复制代码
在带有选定匹配码记录的匹配码选择的情况下调用。<dba> 是逻辑数据库的名称。从该子程序,可以使用匹配码记录从根节点 <root> 读取相关项 。可以用 PUT <root> 调用报表中的处理。
  1. FORM BEFORE_EVENT, AFTER_EVENT
复制代码
在事件之前或之后调用,其名称在参数 EVENT 中传递
用如下方式 给字段 EVENT 赋值:
EVENT = 'START-OF-SELECTION'.
然后可以在 BEFORE_EVENT 和 AFTER_EVENT 子程序的列 表中使用它 。
  1. FORM <par>_VAL, <selop>_VAL, <selop>-LOW_VAL, <selop>-HIGH_VAL
复制代码
当用户按 F4 以获取参数 <par> 输入字段的 可能条目列 表或者为了 获得选择屏 幕上的选择 标准 <selop> (都是特定 数据库)时 调用。
  1. FORM <par>_HLP, <selop>_HLP, <selop>-LOW_HLP, <selop>-HIGH_HLP
复制代码
当用户按 F1 以获取参数 <par> 输入字段的 可能项的帮助或者为了要获得选择屏幕上的选 择标准 <selop> (都是特定 数据库)时调用。

编辑选择文本
选择文本,即在选择屏幕上带输入字段显示的文本,通常是选择标准的名称。
要用每种登录语言编辑选择文本,请在初始屏幕上选择“选择文本” 和“更改”。如果登录语言与初始语言(即生成逻辑数据库的登录语言)不同,则出现对话框提示是否想更改初始语言中的文本摘要或者是否要更改初始语言。通过更改初始语言,可以用任何语言维护选择文本。
逻辑数据库的数据库程序 2.png
编辑文档
要显示或编辑逻辑数据库的文档,请选择初始屏幕上的“文档”和“显示”或者 “更改”。

逻辑数据库和 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> 放置在报表中。
逻辑数据库示例:
   下面是完整的数据库程序:
假定在选择 包含程序中 定义下列选 择标准:
  1.    SELECT-OPTIONS: SLIFNR   FOR LFA1-LIFNR,                     SBUKRS   FOR LFB1-BUKRS,                     SGJAHR   FOR LFC1-GJAHR,                     SBELNR   FOR BKPF-BELNR.
复制代码
  1. *-------------------------------------------------------* * DATABASE PROGRAM OF THE LOGICAL DATABASE HKS  *-------------------------------------------------------* PROGRAM SAPDBHKS DEFINING DATABASE HKS.  TABLES: LFA1,          LFB1,          LFC1,          BKPF.

  2. *-------------------------------------------------------* * Initialize selection screen (process before PBO)  *-------------------------------------------------------* FORM INIT.   .... ENDFORM.                                "INIT
  3. *-------------------------------------------------------* * PBO of selection screen (process always after ENTER)  *-------------------------------------------------------* FORM PBO.    .... ENDFORM.                                "PBO

  4. *-------------------------------------------------------* * 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
  5. *-------------------------------------------------------* * Call event GET LFA1  *-------------------------------------------------------* FORM PUT_LFA1.    SELECT * FROM LFA1             WHERE LIFNR      IN SLIFNR.      PUT LFA1.    ENDSELECT.  ENDFORM.                                "PUT_LFA1

  6. *-------------------------------------------------------* * Call event GET LFB1  *-------------------------------------------------------* FORM PUT_LFB1.    SELECT * FROM LFB1             WHERE LIFNR      =  LFA1-LIFNR               AND BUKRS      IN SBULRS.      PUT LFB1.    ENDSELECT.  ENDFORM.                                "PUT_LFB1
  7. *-------------------------------------------------------* * 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

  8. *-------------------------------------------------------* * 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 语句声明结 构的节点。 因为这些表 格工作区由 数据库程序 和相关的报 表共享,因 此它们变为 在逻辑数据 库和报表之 间数据传输 的界面。
子程序 INIT 和 PBO 初始化选择 屏幕。
子程序 PAI 对选择屏幕 上的用户输 入进行授权 检查。也可 能进行可行 性和值范围 检查。如果 检查产生负 输出,则出 现适当的错 误对话框并 且相关字段 再次准备接 收输入。

根据由用户 输入的选择 标准 PUT_<table> 子程序读取 数据库表格 并且在报表 中调用相关 处理块。调 用子程序的 顺序由逻辑 数据库的结 构决定。
下图显示数 据库结构决 定的程序流 :
逻辑数据库的数据库程序 3.png
回复

使用道具 举报

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 返回列表