SUBMIT标准程序取ALV数据
示例1:
调用J3RFLVMOBVEDH ,取物料的期初/ 期末庫存数、金额
FORM frm_call_j3rflvmobvedh.
DATA: lr_bukrs TYPE RANGE OF bukrs,
ls_bukrs LIKE LINE OF lr_bukrs,
lr_datum TYPE RANGE OF datum,
ls_datum LIKE LINE OF lr_datum. DATA: lo_data TYPE REF TO data.
DATA: lv_buper TYPE buper.
FIELD-SYMBOLS:
<fs_t_data> TYPE ANY TABLE. ls_bukrs-sign = 'I'.
ls_bukrs-option = 'EQ'.
ls_bukrs-low = p_bukrs.
APPEND ls_bukrs TO lr_bukrs. * Caculate the first & last day of the Month
lv_buper = |{ gv_gjahr }{ gv_monat }|. ls_datum-sign = 'I'.
ls_datum-option = 'BT'.
ls_datum-low = gv_start_date.
ls_datum-high = gv_end_date.
APPEND ls_datum TO lr_datum. cl_salv_bs_runtime_info=>set(
EXPORTING
display = abap_false
metadata = abap_false
data = abap_true
). SUBMIT j_3rmobvedh
WITH so_bukrs IN lr_bukrs
WITH so_werks IN s_werks
WITH so_lgort IN s_lgort
WITH so_matnr IN s_matnr
WITH so_budat IN lr_datum
WITH p_xnegp = 'X'
AND RETURN. TRY.
cl_salv_bs_runtime_info=>get_data_ref(
IMPORTING
r_data = lo_data
).
ASSIGN lo_data->* TO <fs_t_data>.
CATCH cx_salv_bs_sc_runtime_info.
* MESSAGE '无法获取ALV数据' TYPE 'E'.
MESSAGE s004 DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDTRY.
IF <fs_t_data> IS ASSIGNED.
gt_3rmobvedh_total = <fs_t_data>.
ENDIF.
cl_salv_bs_runtime_info=>clear_all( ).
ENDFORM.
示例2:
调用 MB51 ,1 取物料查询期间的物料移动数据,2取各个进耗存类别数量、金额
FORM frm_material_list .
DATA: lv_va TYPE slis_vari.
DATA: lr_mjahr TYPE RANGE OF mjahr,
ls_mjahr LIKE LINE OF lr_mjahr,
lr_datum TYPE RANGE OF datum,
ls_datum LIKE LINE OF lr_datum.
DATA: lo_data TYPE REF TO data.
FIELD-SYMBOLS:
<fs_t_data> TYPE ANY TABLE,
<ls_data> TYPE any. ls_datum-sign = 'I'.
ls_datum-option = 'BT'.
ls_datum-low = gv_start_date.
ls_datum-high = gv_end_date.
APPEND ls_datum TO lr_datum.
**通过查询条件形成range
ls_mjahr() = 'IEQ'.
ls_mjahr-low = p_buper+().
APPEND ls_mjahr TO lr_mjahr. PERFORM frm_get_variant CHANGING lv_va."获取程序变式 ***为后续获取ALV数据做设置
cl_salv_bs_runtime_info=>set(
EXPORTING
display = abap_false
metadata = abap_false
data = abap_true ). SUBMIT rm07docs " Tcode MB51
WITH matnr IN s_matnr "物料
WITH werks IN s_werks "工厂
WITH lgort IN s_lgort "库位
WITH budat IN lr_datum "过账日期
WITH rhier_l = ''
WITH rflat_l = abap_true"扁平结构
WITH database = abap_true "读取数据库
WITH alv_def = lv_va"变式
AND RETURN.
** WITH charg IN s_charg "批次
* WITH lifnr IN s_lifnr "供应商
* WITH kunnr IN s_kunnr "客户
* WITH bwart IN s_bwart "移动类型
* WITH sobkz IN s_sobkz "特殊库存
* WITH aufnr IN s_aufnr "生产订单
* WITH kostl IN s_kostl "成本中心
* WITH mat_kdau IN s_kdau "销售订单
* WITH mat_kdpo IN s_kdpo "销售订单行项目
* WITH rsnum IN s_rsnum "预留
* WITH rspos IN s_rspos "预留行
* WITH usnam IN s_usnam "用户
* WITH vgart IN s_vgart
* WITH mblnr IN s_mblnr
* WITH mjahr IN lr_mjahr
* WITH budat IN lr_datum
* WITH xblnr IN s_xblnr TRY.
cl_salv_bs_runtime_info=>get_data_ref(
IMPORTING
r_data = lo_data ).
ASSIGN lo_data->* TO <fs_t_data>.
CATCH cx_salv_bs_sc_runtime_info.
MESSAGE '无法获取ALV数据' TYPE 'E'.
ENDTRY.
cl_salv_bs_runtime_info=>clear_all( ). IF <fs_t_data> IS ASSIGNED.
LOOP AT <fs_t_data> ASSIGNING <ls_data>.
MOVE-CORRESPONDING <ls_data> TO gt_itab.
APPEND gt_itab.
ENDLOOP.
ENDIF. SORT gt_itab.
DELETE ADJACENT DUPLICATES FROM gt_itab COMPARING ALL FIELDS. ENDFORM.
遇到某些需求,顾问要的就是某张标准程序的 某些栏位,逻辑很难理清楚,特别是取期初,期末库存, 或者是某个特定日期的库存,
所以就要调用标准程序取数
以下参考博文:https://www.cnblogs.com/dy-debug/p/5791534.html
* Execute transaction IA09 to get all Functional Location Tasklists
SUBMIT riplko10
WITH SELECTION-TABLE lt_selscreen
WITH pn_iflo = abap_true "Select Func Loc Tasklists
WITH dy_tcode = 'IA09'
WITH dy_selm = 'D' "Dark mode
AND RETURN
IMPORT sel_tab FROM MEMORY ID 'RIPLKO10'.
这种方法性能比较高但是依赖源程序,需要事先将需要的数据EXPORT到内存,如果是标准程序就需要做增强。
方法2:SUBMIT前屏蔽ALV GRID的显示,使用SUBMIT,然后调用
CL_SALV_BS_RUNTIME_INFO=>GET_DATA_REF
方法获取数据,(包括显示数据,布局数据,字段数据,过滤器等),这个是SAP提供的API所以我们不关心如何存储,所以该方法不需要修改目标程序就可以直接得到ALV显示的结果,
但不能设置目标程序的中断点,需显示ALV的函数执行完毕方可获取到数据。
FIELD-SYMBOLS <lt_pay_data> TYPE ANY TABLE.
DATA lr_pay_data TYPE REF TO data.
DATA lt_selscreen TYPE TABLE OF rsparams. "初始设置
CALL METHOD cl_salv_bs_runtime_info=>set
EXPORTING
display = abap_false
metadata = abap_false
data = abap_true. * 调用目标程序
SUBMIT h99cwtr0
WITH SELECTION-TABLE lt_selscreen
AND RETURN. TRY. "获取ALV显示数据
CALL METHOD cl_salv_bs_runtime_info=>get_data_ref
IMPORTING
r_data = lr_pay_data. ASSIGN lr_pay_data->* TO <lt_pay_data>.
CATCH cx_salv_bs_sc_runtime_info. MESSAGE `无法取得ALV术` TYPE 'E'.
ENDTRY. "结束
cl_salv_bs_runtime_info=>clear_all( ).
CL_SALV_BS_RUNTIME_INFO 与读取 ALV相关的方法:
SET() - 此方法初始化类(清除内存区域),然后允许标志的设置让任何后续ALV对象如何工作。它应该在装程序调用ALV报告程序之前被调用。
参数:
- DISPLAY - 将它设为abap_false强制所有后续ALV报告在“黑暗模式”下运行,也就是说,ALV不会被输出到GUI。
- METADATA - 将它设为abap_false防止基本信息(布局,字段目录等)被取到内存中......一般我们不需要。
- DATA - 将它设为abap_true迫使数据表导出到内存而不是显示报表。
GET_DATA_REF() - 非常灵活的GET_DATA*方法,这种方法可以用来访问该数据表变量的引用(动态而且易用),所以即使不知道ALV数据表的结构也没关系。
参数:
- R_DATA - 输出ALV数据表。
- R_DATA_LINE - 如果执行的ALV有HEADER的(可选)。
GET_DATA() - 如果知道需要调用的ALV数据表的结构,可以使用这个方法。
参数:
- T_DATA - 输出参数数据表。
- T_DATA_LINE - 如果执行的ALV有HEADER(可选)。
SUBMIT标准程序取ALV数据的更多相关文章
- [Python爬虫] 之四:Selenium 抓取微博数据
抓取代码: # coding=utf-8import osimport refrom selenium import webdriverimport selenium.webdriver.suppor ...
- sql 分组取最新的数据sqlserver巧用row_number和partition by分组取top数据
SQL Server 2005后之后,引入了row_number()函数,row_number()函数的分组排序功能使这种操作变得非常简单 分组取TOP数据是T-SQL中的常用查询, 如学生信息管理系 ...
- Charles 如何抓取https数据包
Charles可以正常抓取http数据包,但是如果没有经过进一步设置的话,无法正常抓取https的数据包,通常会出现乱码.举个例子,如果没有做更多设置,Charles抓取https://www.bai ...
- row_number和partition by分组取top数据
分组取TOP数据是T-SQL中的常用查询, 如学生信息管理系统中取出每个学科前3名的学生.这种查询在SQL Server 2005之前,写起来很繁琐,需要用到临时表关联查询才能取到.SQL Serve ...
- 手把手教你用python打造网易公开课视频下载软件3-对抓取的数据进行处理
上篇讲到抓取的数据保存到rawhtml变量中,然后通过编码最终保存到html变量当中,那么html变量还会有什么问题吗?当然会有了,例如可能html变量中的保存的抓取的页面源代码可能有些标签没有关闭标 ...
- iOS开发——网络实用技术OC篇&网络爬虫-使用青花瓷抓取网络数据
网络爬虫-使用青花瓷抓取网络数据 由于最近在研究网络爬虫相关技术,刚好看到一篇的的搬了过来! 望谅解..... 写本文的契机主要是前段时间有次用青花瓷抓包有一步忘了,在网上查了半天也没找到写的完整的教 ...
- iOS开发——网络使用技术OC篇&网络爬虫-使用正则表达式抓取网络数据
网络爬虫-使用正则表达式抓取网络数据 关于网络数据抓取不仅仅在iOS开发中有,其他开发中也有,也叫网络爬虫,大致分为两种方式实现 1:正则表达 2:利用其他语言的工具包:java/Python 先来看 ...
- iOS—网络实用技术OC篇&网络爬虫-使用java语言抓取网络数据
网络爬虫-使用java语言抓取网络数据 前提:熟悉java语法(能看懂就行) 准备阶段:从网页中获取html代码 实战阶段:将对应的html代码使用java语言解析出来,最后保存到plist文件 上一 ...
- Node.js的学习--使用cheerio抓取网页数据
打算要写一个公开课网站,缺少数据,就决定去网易公开课去抓取一些数据. 前一阵子看过一段时间的Node.js,而且Node.js也比较适合做这个事情,就打算用Node.js去抓取数据. 关键是抓取到网页 ...
随机推荐
- 利用random模块做一个抢红包功能
我们都知道random模块是一个生成随机数的模块,用它来做抢红包的功能很合适. 抢红包,抢到的金额是随机的,但怎么让每个人抢到的随机金额公平合理呢 比如:我想发一个100元的红包让10个人抢,我可以把 ...
- 26.C# 文件系统
1.流的含义 流是一系列具有方向性的字节序列,比如水管中的水流,只不过现在管道中装的不是水,而是字节序列.当流是用于向外部目标比如磁盘输出数据时称为输出流,当流是用于把数据从外部目标读入程序称为输入流 ...
- h5触摸事件-判断上下滑动
// 判断上下滑动 var startX = 0, startY = 0; function touchStart(evt){ try{ var touch = evt.touches[0], //获 ...
- Win10开启FTP与配置——(亲测完整无错版)
#1.控制面板>程序>启用或关闭Windows功能>…(控制面板可在 桌面右键>个性化>主题>桌面图标设置>勾选控制面板>确定) #2.小娜搜索IIS打 ...
- OTFS Research Notes
△f = f·v·cosθ/c,f表示载波频率,5G/B5G朝着毫米波等高频段方向发展,因此多普勒拓展的影响将更显著.此外,Masssive MIMO的现有规模已达256维度,并将朝着上千的规模发展. ...
- sql server if exists和 if not exists 的关键字用法
if exists和if not exists关键字用法 1.介绍 if not exists 即如果不存在,if exists 即如果存在 2.使用 a.判断数据库不存在时 if not ...
- mongodb mongod.lock文件及oplog文件
在mongodb的启动时,在数据目录下,会生成一个mongod.lock文件.如果在正常退出时,会清除这个mongod.lock文件,若要是异常退出,在下次启动的时候,会禁止启动,从而保留一份干净的一 ...
- NOIP刷题
搜索 [NOIP2013]华容道 最短路+带剪枝的搜索,是一个思维难度比较大的题目. CF1064D Labyrinth 考虑贪心,用双向队列bfs [NOIP2017]宝藏 剪枝搜索出奇迹 题解:h ...
- linux 查看某个进程内存占用情况命令
1.先用ps查询进程号 ps -aux|grep 进程名字 2.查看更详细的内存占比 cat /proc/3664/status 返回结果:(其中VmRSS为进程所占用的内存)
- C++标准库分析总结(七)——<Hashtable、Hash_set、Hash_multiset、unordered容器设计原则>
编译器对关联容器的实现有两个版本,上一节总结了以红黑树做为基础的实现版本,这一节总结以哈希表(hash table,散列表)为底部结构的实现版本. 一.Hashtable简单介绍 Hashtable相 ...