网站建设如何推广业务,新手怎么做电商在哪个网站,进口商品代理平台,网站建设168系列文章目录 文章目录 系列文章目录前言一、概述二、程序间调用三、外部会话和内部会话四、SAP内存与ABAP内存五、实例总结 前言 一、概述
内存是程序之间为了传递数据而使用的共享存储空间#xff0c;在每个程序里使用的内存有SAP内存和ABAP内存
SAP内存分类 SAP内存 主会…系列文章目录 文章目录 系列文章目录前言一、概述二、程序间调用三、外部会话和内部会话四、SAP内存与ABAP内存五、实例总结 前言 一、概述
内存是程序之间为了传递数据而使用的共享存储空间在每个程序里使用的内存有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 VAL1SELECT-OPTIONS----- WITH S_1 IN R_1RADIO 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 OBJECTSM30-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,BUKRSFROM EKPOINTO TABLE DATA(LT_EKPO)WHERE BUKRS P_BUKRS.BUKRS是公司代码IF SY-SUBRC 0.CL_DEMO_OUTPUTDISPLAY( 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,BUKRSFROM EKPOINTO TABLE DATA(LT_EKPO)WHERE BUKRS P_BUKRS.BUKRS是公司代码IF SY-SUBRC 0.CL_DEMO_OUTPUTDISPLAY( LT_EKPO ).ENDIF.tips鼠标点关键字 点F1会弹出语法帮助 总结