Skip to content

SAP 内存

一、概述

  SAP内存使用SPAIGPA技术传递程序间的数据。传递内存参数来给其他程序输入字段赋值的操作称为“SPA/GPA 技术”。另外SPA/GPA 参数指的是利用SAP内存的参数。但只限相同的用户共享内存。在这一点上SPA/GPA 又叫做User Specific 参数。
  SAP内存支持程序间能够互相传递数据。登录一个会话后,所有与此并列运行的会话都可以共享 SAP内存。SPA/GPA 参数信息可以在表TPARA中进行确认。ABAP 程序可以通过下列语句访问参数。

abap
SET PARAMETER /GET PARAMETER

二、SAP 执行原理

  [图11-3]说明利用SAP内存程序间传递数据的过程。可以在画面字段属性中设置参数,或者在代码中利用SET/GET语句分配或读取SAP内存的值。 alt text

1.创建 SAP 内存参数

  创建 SAP内存参数ID的方法大致分为下列两种 alt text

2.分配 SAP 内存

  利用下面语句将字段<f>存储到SPA/GPA参数<pid>中 。<pid>参数允许使用 20 位以内的字符长度。若<pid>已经被定义,则会覆盖原来的值。若没有此参数<pid>,则可以在 ABAP编辑器中双击生成。

abap
SET PARAMETER ID <pid> FIELD <f>.

3.读取 SAP 内存

  读取 SPA/GPA 参数时利用下列语句。存储在SAP 内存<pid>中的值保存到字段<f>中。若不存在<pid>内存id,则系统变量 SY-SUBRC返回4;若存在,则返回0。

abap
GET PARAMETER ID <pid> FIELD <f>.

4.TYPE-1程序的内存ID 管理

  在TYPE-1报表程序的选择画面上的参数,或者Select-option 变量,使用的是 Memory ID 来连接字段与参数。

abap
PARAMETERS p I TYPE c MEMORY ID 'PID'
例 11-1
abap
REPORT Z11_01.

PARAMETERS : p _a TYPE c MEMORY ID zscl.
WRITE P A.

结果 alt text   [例11-1]中,TYPE-1程序中定义PARAMETERS时追加了MEMORYID语。PARAMETERS :p_aTYPE C MEMORY ID ZSCL.语句在代码中与 SET/GET PARAMETER ID'ZSCL' FIELDp_a.语句有相同的功能。即相应代码会自动保存到MEMORYID功能中。第次运行程序时,由于内存参数没有赋值,因此不会显示任何值。参数字段中输入A后执行内存参数ZSCL会保存A值(SETPARAMETER)。然后单击新建窗口(器)图标后执行程序,会发现参数中显示 A值。
  在生成购买订单等标准程序中,将用户正在使用的值保存到SAP内存(内存参数)便于用户调用。例如,用户创建购买订单后发现输入了错误的供应商编号,而忘了记录购买订单编号,且由于购买订单编号又非常长,在这种情况下要找到刚生成的购买订单不是一件容易的事情。当然,可以查询购买订单列表找到相应订单,但是也需要执行事务码,输入查询条件等附加操作才能得出结果。因此,为了防止这种不必要的麻烦,当创建购买订单的时候,SAP在购买订单内存参数中会保存相应值。因此,当用户执行修改购买订单事务码时,画面上直接显示相应编号,减少了不必要的麻烦。
  另外,在程序中调用其他程序时,有效使用内存参数的实例在跳过选择条件画面后查询数据的情况下使用。此种情况下也如[例11-2]一样,要在内存参数中设置好被调用程序的 Parameters及Select-options。当然,使用 SUBMIT 语句时也可以跳过 Selection Screen 画面。

例 11-2

  用户执行程序后在列表中显示结果。这是用户双击显示在画面的值时,从表 SBOOK 中读取数据并给参数SPA/GPA赋值,然后调用事务码Z1103的程序。ANDSKIPFIRST SCREEN 是跳过第一个画面的语句。HIDE语句将字段值保存到HIDE内存领域,且紧跟在 WRITE, 语句后使用。当双击査询列表时,执行 AT LINE-SELECTION 领域且把值保存到参数中。创建[例11-3]程序后,执行程序测试其功能。
[例11-2]

abap
REPORT z11_02.

TABLES sbook.

START-OF-SELECTION.

WRITE: "Double click a booking List'
/'------------------------'
SKIP
SELECT * FROM sbook UP TO 5 ROWS.
    WRITE:/ sbook-carrid, sbook-connid,
        sbook-fldate,sbook-bookid.
    HIDE:sbook-carrid,sbook-connid.
        sbook-fldate.sbook-bookid.
ENDSELECT.

AT LINE-SELECTION.
    SET PARAMETER ID: 'CAR' FIELD sbook-carrid.
        'CON' FIELD sbook-connid.

CALL TRANSACTION 'Z11 03' AND SKIP FIRST SCREEN.

[例11-2]中调用的事务码Z11003跟[例11-3]一样,由设置了内存ID的两个参数构成。另外,执行程序后参数值会显示到画面上。

例 11-3
abap
REPORT Z11_03.
PARAMETERS : p_car TYPE sbook-carrid MEMORY ID car,
             p_con TYPE sbook-connid MEMORY ID con.
WRITE :P_CAR,P_CON.

  创建Z11 003程序后创建如下所示的事务码。 alt text

执行[例 11-3]后双击查询列表,调用T-Code Z1103,即显示如[结果11-2]所示的画面。
结果 11-3 alt text

5.模块池程序中的内存ID 管理

  为了在 TYPE-M 模块池程序的画面字段中连接"Memory ID,需在字段中追加参数。在画面屏幕编辑器的字段属性窗口的Parameter ID中输入内存ID名。在画面字段中设置参数值,选择GETPARAMETER的单选按钮。若修改参数值,选择SETPARAMETER单选按钮即可。字段属性中设置了From dict.,属性(继承 ABAP数据字典属性),在数据元素中设置了参数,则会自动追加参数。
  如[图11-4]所示,在程序Z1104中追加屏幕100后,给SA字段的 Parameter ID 属性指定 ZSCL。另外,追加如[例11-4]所示的代码后执行程序,画面上显示的是[例 11-1]中输入参数 ID 中的 A 值。
alt text [例11-4]

abap
REPORT Z1104
DATA s a TYPE c.
opCALL SCREEN '0100'

结果 alt text

6.确认 SAP 内存值

  若需确认保存在 SAP内存中的值,可以在调试模式下查询SAP内存。选择菜单:Goto SystemAreas→SAP Memory。在[图11-5]中可以确认内存参数值为 A。 alt text