首页 > 系统相关 >ABAP开发-内存管理

ABAP开发-内存管理

时间:2024-11-08 08:48:50浏览次数:3  
标签:GET 程序 会话 ABAP 开发 内存 BUKRS

系列文章目录


文章目录


前言


一、概述

内存是程序之间为了传递数据而使用的共享存储空间,在每个程序里使用的内存有SAP内存和ABAP内存

  • SAP内存分类
    • SAP内存
      • 主会话之间的数据共享
      • 通过SET/GET PARAMETER语句共享不同ABAP内存领域之间的内存
    • ABAP内存
      • 内部会话之间的数据共享
      • 只有在同一个窗口执行的程序才能共享内存

二、程序间调用

接口:使用SUBMIT语句调用TYPE1程序,调用选择界面

  • SUBMIT program
    WITH P_1 = VAL1
    WITH S_1 IN R_1
    VIA SELECTION SCREEN
    AND RETURN
  • 不同参数的传值方法
    • PARAMETERS-----WITH P_1 = VAL1
    • SELECT-OPTIONS----- WITH S_1 IN R_1
    • RADIO BUTTON -----WITH R_1 = ‘X’ WITH R_2 = ‘’
    • CHECKBOX----- WITH C_1 = ‘X’ WITH C_2 = ‘X’ WITH C_3 = ‘’
      直接调用事务代码
      CALL TRANSACTION ‘TCODE’ AND SKIP FIRST SCREEN

三、外部会话和内部会话

  • 外部会话
    一般,一个外部会话是一个R/3系统的窗口
    当用户成功登陆SAP系统时,就开始了一个和应用服务器之间的外部会话,可以通过如下几种方式同时打开最多六个外部会话:

    • 通过点SAP GUI系统工具条上的按钮”新建GUI窗口“
    • 选择系统主菜单“SYSTEM CREATE SESSION”
    • 在Command Field中输入“/O< tcode >”回车,或“/N< TCODE >”
  • SAP缓冲器

    • 可以利用SAP内存在WORK PROCESS之间共享内存
    • SAP应用程序系统各自拥有自己的缓冲器(CLIENT CASHE)
    • 缓冲器在Client级别上互相共享,因此SAP缓冲器在所有主会话中共享数据
  • 内部会话

    • 外部会话被分成了多个内部会话,这些内部会话被放在一个堆栈(后进先出的线性结构)里面
    • 每个ABAP程序在运行时都占用一个内部会话,每个外部会话可以包含最多九个内部会话
    • 在内部会话中使用CALL TRANSACTION等命令调用其他程序,则内部会话之间共享ABAP内存

四、SAP内存与ABAP内存

SAP内存

  • SAP内存使用SAP/GPA技术传递程序间数据
    • 传递内存参数来给其他程序输入字段复制的操作称为“SPA/GPA技术”
    • SPA/GPA参数指的是利用SAP内存的参数,表TPARA中进行确认
    • 只限相同的用户共享内存,又叫User Specific参数
  • SPA/GPA参数信息可以在创建SAP内存参数
    • SE80->WORKBENCH->EDIT OBJECT
    • SM30->TPARA表,维护条目
  • 在TYPE1报表程序的选择画面上的参数或者select-option变量,使用的是MEMORY ID来连接字段与参数
  • 在ONLINE界面中,在PARAMETER ID字段设置内存ID,及SET/GET变量
  • 使用HIDE语句,将字段值保存到HIDE内存领域
  • DEBUG界面查询GOTO->SYSTEM AREA->SAP MEMORY

ABAP内存

  • 使用ABAP内存时可以在程序级别上任意指定内存ID名,不需要参数ID
  • 利用ABAP内存使用语句
    • EXPORT…TO…向MEMORY ID传出数据
    • IMPORT…TO…向MENORY ID传入数据
    • RREE MEMORY ID,删除ABAP内存
  • 使用CALL TRANSACTION/SUBMIT/CALL DIALOG等命令调用其他程序时,会生成内部会话并共享ABAP内存中数据

SAP内存与ABAP内存的不同

  • SAP内存
    • 全局内存,用户终端会话内的所有外部会话都可以访问
    • SAP内存在外部会话中的所有内部会话中可以共享
    • 基本语句-----SET PARAMETER/GET PARAMETER
  • ABAP内存
    • 同一个会话中执行的所有程序共享的内存
    • 外部会话中只存在一个ABAP内存
    • 基本语句-----EXPORT OBJ1…OBJN TO MEMORY ID KEY.
      ------IMPORT OBJ1…OBJN FROM MEMORY ID KEY.

五、实例

ABAP内存
创建一个程序,该程序作用是往不同的内存里面放数据
在这里插入图片描述
在这里插入图片描述

*& Report ZYT36_DAY8_MEMORY01_SET_36130
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZYT36_DAY8_MEMORY01_SET_36130.
DATA: LV_STR TYPE C LENGTH 20.

*ABAP内存
*往ABAP内存里写了一个名为LV_STR的变量,LV_STR里存的值是ABAP MEMORY
LV_STR = 'ABAP MEMORY'.
EXPORT LV_STR TO MEMORY ID 'EXPORT00'."向ABAP内存写入数据,通过ID往回读内容
WRITE: / 'EXPORT 成功'.

再创建一个程序,用来读取内存数据
在这里插入图片描述
在这里插入图片描述

*& Report ZYT36_DAY8_MEMORY01_GET_36130
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZYT36_DAY8_MEMORY01_GET_36130.
*创建一个变量存读回来的数
DATA: LV_STR TYPE C LENGTH 20.

*从ABAP内存读取数据
IMPORT LV_STR FROM MEMORY ID 'EXPORT00'.
WRITE: / 'ABAP MEMORY',LV_STR.

ABAP内存只在同一个对话框内有用,所以要些执行SET程序-----往里写数据,然后点返回再去GET程序执行
验证测试1:在同一个会话框里先执行SET再执行GET程序
在这里插入图片描述
在该会话框里点返回
在这里插入图片描述
再在该会话框里输入GET程序
在这里插入图片描述
在这里插入图片描述
结果:get程序里会读到set程序里的东西

验证测试2:在不同的会话框分别打开SET程序、GET程序
在这里插入图片描述
SET程序执行完后,新开一个窗口执行GET程序
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
结果:此时,读取不到SET程序中输入的
所以,ABAP内存:在一个窗口读入的值,在另一个窗口是不会读到的,只有在同一个窗口里面的东西才能写到ABAP内存中

SAP内存与ABAP内存对比
SET程序

*& Report ZYT36_DAY8_MEMORY01_SET_36130
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZYT36_DAY8_MEMORY01_SET_36130.
DATA: LV_STR TYPE C LENGTH 20,
      lv_STR2 TYPE C LENGTH 20.

*ABAP内存
*往ABAP内存里写了一个名为LV_STR的变量,LV_STR里存的值是ABAP MEMORY
LV_STR = 'ABAP MEMORY'.
EXPORT LV_STR TO MEMORY ID 'EXPORT00'."向ABAP内存写入数据,通过ID往回读内容

*SAP内存
LV_STR2 = 'SAP MEMORY'.
SET PARAMETER ID 'SAPPAR00' FIELD LV_STR2.
WRITE: / 'EXPORT 成功'.

GET程序

*& Report ZYT36_DAY8_MEMORY01_GET_36130
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZYT36_DAY8_MEMORY01_GET_36130.
*创建一个变量存读回来的数
DATA: LV_STR TYPE C LENGTH 20.
DATA: LV_STR2 TYPE C LENGTH 20.

*从ABAP内存读取数据
IMPORT LV_STR FROM MEMORY ID 'EXPORT00'.

*从SAP内存读取数据
GET PARAMETER ID 'SAPPAR00' FIELD LV_STR2.

WRITE: / 'ABAP 内存',LV_STR.
WRITE: / 'SAP 内存',LV_STR2.

在一个窗口执行SET程序,新开另一个窗口执行GET程序,此时结果如下
在这里插入图片描述
在这里插入图片描述
可以看到SAP内存即使不在同一个会话框中依然可以读到程序,但ABAP内存在不同的会话框里读不到程序

创建一个新程序
在这里插入图片描述
在这里插入图片描述

*& Report ZYT36_DAY8_MEMORY02_GET_36130
*&---------------------------------------------------------------------*
*&让用户输入公司代码,再把公司代码取出来,然后根据公司代码把EKPO这张表取出来
*用另外一个程序让用户选择输入,调用当前写的这个get程序
*&测试程序之间的调用
*&---------------------------------------------------------------------*
REPORT ZYT36_DAY8_MEMORY02_GET_36130.

TABLES: EKPO.

PARAMETERS:
P_BUKRS TYPE EKPO-BUKRS.

INITIALIZATION.
P_BUKRS = '1000'.
*P_BUKS赋值
*需求是:从内存中取数据,取到了就用内存里面的数据作为筛选条件

START-OF-SELECTION.

SELECT EBELN,EBELP,BUKRS
  FROM EKPO
  INTO TABLE @DATA(LT_EKPO)
  WHERE BUKRS = @P_BUKRS."BUKRS是公司代码

  IF SY-SUBRC = 0.
    CL_DEMO_OUTPUT=>DISPLAY( LT_EKPO ).

  ENDIF.

再创建一个新程序
在这里插入图片描述
在这里插入图片描述

*& Report ZYT36_DAY8_MEMORY02_SET_36130
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZYT36_DAY8_MEMORY02_SET_36130.

TABLES: EKPO.

PARAMETERS:
P_BUKRS TYPE EKPO-BUKRS.

START-OF-SELECTION.
*直接让程序调用ZYT36_DAY8_MEMORY02_GET_36130
*程序之间调用
SUBMIT ZYT36_DAY8_MEMORY02_GET_36130
WITH P_BUKRS = P_BUKRS
VIA SELECTION-SCREEN"显示被调用程序的选择画面
AND RETURN."调用其他人的程序,在其他人程序执行之后,返回继续执行自己的程序

WRITE: '测试程序之间的调用,主程序结束'.

点击处理后,进入写入变量调用程序,SET,然后点击执行
在这里插入图片描述
此时执行后,实际调用了GET,然后再点击执行
在这里插入图片描述
即可获取到公司代码为1000的采购订单数据
在这里插入图片描述
此时点击返回,则会回到如下界面,更说明了调用了get程序,现在才是返回到了SET程序
在这里插入图片描述
在这里插入图片描述

另外,若set程序中没有VIA SELECTION-SCREEN语句,则不显示被调用程序的选择画面,而是直接通过筛选条件输出符合条件的报表内容
即代码如下

*& Report ZYT36_DAY8_MEMORY02_SET_36130
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZYT36_DAY8_MEMORY02_SET_36130.

TABLES: EKPO.

PARAMETERS:
P_BUKRS TYPE EKPO-BUKRS.

START-OF-SELECTION.
*直接让程序调用ZYT36_DAY8_MEMORY02_GET_36130
*程序之间调用
SUBMIT ZYT36_DAY8_MEMORY02_GET_36130
WITH P_BUKRS = P_BUKRS
*VIA SELECTION-SCREEN"显示被调用程序的选择画面
AND RETURN."调用其他人的程序,在其他人程序执行之后,返回继续执行自己的程序

WRITE: '测试程序之间的调用,主程序结束'.

执行结果如下:
在这里插入图片描述
在这里插入图片描述
点返回
在这里插入图片描述
点返回
在这里插入图片描述
另外,若注释掉 AND RETURN 语句,执行结果及返回情况如下:
在这里插入图片描述
在这里插入图片描述
点返回
直接跳到编辑程序界面

若用ABAP内存,如果读到数了,得出的报表内容就是输入的公司代码(eg:1100)的采购内容报表,若没读到数,得出的报表就是初始赋值的公司代码(eg:1000)的采购内容报表
SET程序修改为如下:

*& Report ZYT36_DAY8_MEMORY02_SET_36130
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZYT36_DAY8_MEMORY02_SET_36130.

TABLES: EKPO.

PARAMETERS:
P_BUKRS TYPE EKPO-BUKRS.

START-OF-SELECTION.

**直接让程序调用ZYT36_DAY8_MEMORY02_GET_36130
**程序之间调用
*SUBMIT ZYT36_DAY8_MEMORY02_GET_36130
*WITH P_BUKRS = P_BUKRS.
**VIA SELECTION-SCREEN"显示被调用程序的选择画面,若没有这句话,则不会显示被调用程序的选择画面,而是直接走到被调用程序的START OF SELECTION,直接输出通过筛选条件筛选出来的报表
**AND RETURN."调用其他人的程序,在其他人程序执行之后,返回继续执行自己的程序
*
*WRITE: '测试程序之间的调用,主程序结束'.

*ABAP内存
EXPORT P1 = P_BUKRS TO MEMORY ID 'ZBUKRS'."把数据放到ABAP内存里面
SUBMIT ZYT36_DAY8_MEMORY02_GET_36130.

GET程序修改为如下:

*& Report ZYT36_DAY8_MEMORY02_GET_36130
*&---------------------------------------------------------------------*
*&让用户输入公司代码,再把公司代码取出来,然后根据公司代码把EKPO这张表取出来
*用另外一个程序让用户选择输入,调用当前写的这个get程序
*&测试程序之间的调用
*&---------------------------------------------------------------------*
REPORT ZYT36_DAY8_MEMORY02_GET_36130.

TABLES: EKPO.

PARAMETERS:
P_BUKRS TYPE EKPO-BUKRS.

INITIALIZATION.
P_BUKRS = '1000'.
*P_BUKS赋值
*需求是:从内存中取数据,取到了就用内存里面的数据作为筛选条件
*读取ABAP内存
DATA: LV_BUKRS TYPE EKPO-BUKRS."在进行import之前,对import的数据进行检查,如果能得回来最好,如果得不回来,就还用自己的,所以定义一个变量LV_BUKRS
IMPORT P1 = LV_BUKRS FROM MEMORY ID 'ZBUKRS'.
IF LV_BUKRS IS NOT INITIAL.
  P_BUKRS = LV_BUKRS."如果读回来了,就用当前的值给控件的值赋一个值,若没读回来,默认的就是初始赋的1000
ENDIF.
START-OF-SELECTION.

SELECT EBELN,EBELP,BUKRS
  FROM EKPO
  INTO TABLE @DATA(LT_EKPO)
  WHERE BUKRS = @P_BUKRS."BUKRS是公司代码

  IF SY-SUBRC = 0.
    CL_DEMO_OUTPUT=>DISPLAY( LT_EKPO ).

  ENDIF.

在这里插入图片描述

tips:鼠标点关键字 点F1会弹出语法帮助

总结

标签:GET,程序,会话,ABAP,开发,内存,BUKRS
From: https://blog.csdn.net/weixin_52203666/article/details/143556401

相关文章

  • 移动Web前端高效开发实战:HTML 5 + CSS 3 + JavaScript + Webpack + React Native + Vu
    书:pan.baidu.com/s/1tIHXj9HmIYojAHqje09DTA?pwd=jqsoHTML5新特性与应用:介绍HTML5的新特性,包括语义化标签、本地存储、设备兼容、连接特性等,并讲解如何在移动Web前端开发中充分利用这些特性提升用户体验。CSS3样式与动画设计:详细讲解CSS3的样式设计和动画效果,包括选择器、盒......
  • 轻松掌握如何使用 Ventoy 创建多启动 USB 驱动器,并有效管理操作系统镜像文件。深入理
    Ventoy初级使用教程的大纲。Ventoy是一个非常实用的开源工具,能够让用户轻松地在USB驱动器上创建多启动(multi-boot)系统,支持多种操作系统镜像(ISO文件)的直接启动,而无需重新格式化或安装启动加载器。Ventoy初级使用教程大纲1.Ventoy简介什么是Ventoy?开源的多启动工......
  • 书接上回说一说 JVM 中的方法区和直接内存
    方法区:在《Java虚拟机规范》中明确说明:尽管所有的方法区在逻辑上是堆内存的一部分,但一些简单的实现可能不会选择对方法区进行垃圾回收或者进行压缩。但对于HotSpot虚拟机来说,方法区还有一个名字叫Non-Heap(非堆)目的就是要和方法区分开。所以,这样来看,方法区是一块独立于......
  • Next.js 实战开发入门教程敏捷开发框架
    在上一篇文章中,我们已经成功实现了网站的导航栏。接下来,我们将继续开发网页的主体部分,用于展示我们的网站业务情况。主页内容展示首先,我们需要创建一个名为 /app/components/Main.tsx 的文件,作为主页内容的入口。然后在根目录的 /app/page.tsx 中引入这个组件,这样在访问主页......
  • 鸿蒙开发案例:水平仪
     【1】引言(完整代码在最后面)高仿纯血鸿蒙Next的水平仪效果。主要功能包括:1.倾斜角度检测:通过注册加速度传感器事件监听器,实时获取设备的前后倾斜角度(pitch)和左右倾斜角度(roll)。2.角度计算与更新:根据传感器数据计算新的倾斜角度,如果新角度与旧角度的变化超过设定的阈值,则更......
  • 鸿蒙开发案例:七巧板
     【1】引言(完整代码在最后面)本文介绍的拖动七巧板游戏是一个简单的益智游戏,用户可以通过拖动和旋转不同形状的七巧板块来完成拼图任务。整个游戏使用鸿蒙Next框架开发,利用其强大的UI构建能力和数据响应机制,实现了流畅的用户体验。【2】环境准备电脑系统:windows10开发工具:D......
  • SpringBoot校园二手书籍信息平台w5mzh--(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、研究目的与意义随着高校教育的普及,书籍成为大学生日常学习不可或缺的资源。然而,书籍的高消耗量和频繁更新导致了资源的浪费。因此,构建一个校园......
  • APP开发者如何选择合适的聚合平台?
    选择合适的App聚合平台对于开发者而言,无疑是一项具有深远影响的重要决策,其意义之重大,直接关乎着App的收益、用户体验以及市场覆盖的广度与深度。就拿收益这一方面来说,App的收益直接决定了开发者的投入产出比以及后续的发展动力。而聚合平台的选择在其中起着举足轻重的......
  • 时代峰峻讲课费进口量法撒旦记录卡;个发电量开发建设
    #include<bits/stdc++.h>#defineintlonglong#definefifirst#definesesecond#definepiistd::pair<int,int>#defineebemplace_back#definepbpush_backtypedeflonglongll;typedefunsignedlonglongull;std::mt19937myrand(std::chrono:......
  • VUE模块化开发思路
    构建工具:vite需求:在多个项目下,低层框架可复用,样式可复用,模块可复用。一、项目示例例如当前有两个项目:aaAdmin项目atwtighten项目b项目a和项目b中都有共同的低层逻辑,比如登录,权限验证,前端框架样式等等。在这个两个项目中我们独立出一个公用项目adminCommon,a和b都引用......