重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
前言:
网站建设哪家好,找成都创新互联!专注于网页设计、网站建设、微信开发、微信小程序、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了建水免费建站欢迎大家使用!
报表程序是什么?
是一个带有选择屏幕,通过用户的输入限定查询条件,按固定的逻辑获取数据并展示出来的程序.
不知道大家认可这个定义么?
从某种角度来讲: SQL编辑器就是一个超级报表程序. 通过编辑界面输入SQL语句(选择条件及查询逻辑),输出一个查询结果. 只是这个超级报表程序需要使用者能够理解表逻辑关系,并且能够熟练的写出SQL语句.
ABAP环境中常用的SQL编辑器:
ZSQL (一个老版本的ABAP程序开发的SQL编辑器,只支持老版的OPEN SQL语句,来自网络)
ZTOAD (一个新版的ABAP程序开发的SQL编辑器,支持新版的OPEN SQL语句,同时附带了历史SQL语句功能,及查询表的字段清单功能,来自网络)
DB02 (SAP自带的hana SQL编辑器,支持HANA SQL语句,附带历史SQL功能,来自SAP)
但是我们今天的主题不是讲SQL编辑器的功能. 我们的主题是:
怎么把DB02中SQL编辑器的查询一键生成一个报表程序.
执行过程
在DB02的SQL编辑器中写入一个查询语句 (可以是一个复杂的查询语句,示例给了一个简单查询) ,并且附带相关注释
注释内容
--产生报表程序:00009:测试DB02生成报表程序
--使用字段描述:ALL
--MATNR:商品编码A:2
--MTART:类型:1
3. 注释说明 :
第一句是指定该查询生成一个报表程序(程序名 ZBC123_00009,程序描述: 测试DB02生成报表程序)
第二句是指所有的字段描述来自表中的字段描述
第三句是指针对特定的字段指定描述,后面的数字是标记该字段作为选择条件的顺序
第四句同上
4. 这样,点击执行后,系统就产生了一个ZBC123_00009的程序.
该程序有注释中指定的选择条件/顺序及描述,执行后给出查询的结果
接下来的本来应该是福利时间, 但是这次我改变一下福利策略(为了关注,我也是拼了) .
如果你对这篇文章感兴趣,请帮忙转发分享, 并且勾选微信 看一看.文章右上角的按钮点击后,点击在看(或者文章末尾的右下角在看),即可.
当文章 阅读人数达到2000,或者在看达到500.或者公众号关注达到500. 我会考虑在以后的文章中分享实现过程, 希望你能早日看到.
如果有渠道能推进SAP也实现该功能. 那将是造福广大开发(也可能是造祸,谁知道呢.)的举止.
(如果你真的喜欢这篇文章,请记得回来打个赏,作为支持我继续下去的动力,这是一个正反馈过程. 越多的人打赏,作者越有动力分享,读者就能享受更多的福利. 毕竟打赏的金额富不了我,穷不了你,却能支持这个公众号长久发文.)
提到进销存报表,SAP提供了一个标准报表MB5B。这个报表能显示指定的日期范围内,期初库存(数量与金额),期末库存(数量与金额),总入库数(数量与金额),总出库数(数量与金额)等重要数据,如下图:
既然有了这个报表,既可以查实时库存,又可以查询历史期间的期初期末库存,还可以查询指定时间段内的收发货数量与金额,为什么很多企业里尤其是民营企业里还要开发自己的进销存报表呢?
首先是因为各个企业里有企业特殊需求。
笔者在SY项目里,一个重要任务就是要救活客户早已存在却不堪使用的进销存报表。优化后的进销存报表也是要显示期初余额,期初库存数量,入库数量与金额,出库数量与金额,期末数量与金额等栏位;同时对入库与出库,根据业务部门关注的重点做了几个细分,比如入库再细分采购入库,工单入库和其它入库;出库则再细分为销售出库,工单发料和其它出库。这些都是企业特定的需求,使用报表的业务部门有其特定关注点,所以报表需要支持这些关注点。MB5B报表对于这些需求的支持显然不太给力。
其次还因为企业还有特定行业要求。
SY项目的客户生产出来的成品与半成品,由于产品所在行业的特殊性,业务部门除了关心出入库数量与金额以外,还关心出入库的面积与重量以及期初期末面积与重量。并且由于客户使用了可配置物料,这些物料的单个面积不固定,而是根据不同销售订单里相关长宽特性值的不同而不同。类似这种需求,标准的MB5B报表当然更是无法支持。
第三,更重要的原因是,MB5B报表里对于收发货数量与金额栏位的统计口径并不科学,不能满足企业常规的需求。比如其总收发货数量栏位值的计算逻辑,除了包括常规收发货数量以外,还包括收货的取消,采购订单退货的数量等。
比如如下MB5B的截图里,
报表将105移动类型的收货以及冲销操作(106移动类型)的数量各自1000 KG分别计入了总收货的数量与总发货数量里。这显然是不符合企业常规逻辑的,比如采购订单收货,我收了1000KG,又退了1000KG,那么该订单的收货数量应该是0。你在总收/发货数量里都计入了这1000KG,在很多企业的进销存逻辑里是不能接受的。
再者SAP系统的报表MB5B,会把普通的转移过账的数量也分别计入总发货数量与总收货数量栏位里,比如MB5B如下结果截图里,
该物料有一笔移动类型413+E的货物移动,数量是9500 PC, 这张货物移动的业务背景是把9500 PC的自有库存转为销售订单库存。
这是一笔普通的转移过账,并不是真正的出库或者入库,但是MB5B报表结果里会把这笔数量分别计入发货数量与收货数量栏位里,这样不符合很多企业进销存报表中进与销的理解与逻辑。
包括但是不限于上述诸多原因,使得项目实践中,进销存报表的开发比较常见。
2018-06-28 写于上海市
背景:
实现sap系统自动化前,需要先开启自动录制脚本功能和启用脚本功能。大部分机器默认是关闭这两个功能的,如果没开启这两个功能,后续也无法进行自动化。因此,我们需要先开启这两个功能。
问题现象:
1、如下图,在SAP界面的定制本地布局菜单中,脚本录制和回放功能为灰色,无法进行点击操作,因此也无法进行本地脚本录制。

2、执行sap脚本后,连接不上SAP系统,无法进行自动化操作。
解决方式:
步骤1、开启脚本录制功能
1、 进入事务RZ11。sap界面左上角输入框输入RZ11,回车即可进入对应事务(如果SAP左下角提示您无权限使用事务RZ11,那就找管理员先开事务权限吧。)
进入对应事务
2、 输入 sapgui/user_scripting,并点击显示按钮

3、 检查“当前值”是否为True。如果为False,则改为True。

步骤2、开启脚本功能
1、 如图,进入SAP界面的选项。

2、进行如下设置,点击确定按钮保存即可。(之后好像要重启SAP系统)

自动化脚本录制验证:
1、 点击脚本录制和回放功能

2、 录制脚本前,先设置脚本保存的路径,之后再点击红色按钮开始录制脚本,就可以在SAP系统上进行自动化操作了,结束操作时,点击黄色按钮结束录制。

3、之后打开录制的脚本文件,里面的代码就是自动录制的脚本了。可将其录制的脚本拷贝到Excel的宏里面执行,即可实现SAP自动化。
sap自动化录制的代码
4、补充,必看。
SAP脚本录制时,那录制窗口里面还有个绿色的回放按钮(我这边实测该按钮无效)。此外,因为我这边自动化还需要使用到excel的数据,所以将录制的脚本代码拷贝到excel的宏里面去执行。
代码拷贝到excel后,不要直接执行,我们需要先修改代码里面的application变量名(如上图绿色字体,该变量名会和excel的对象冲突),将其改为其他变量名字(自己随便起个)。
以下是我录制到sap自动化代码,供大家参考。经过和Excel的表格数据结合,生成的VB脚本,直接存放于Excel的宏脚本里面。使用时,仅需要先将Excel数据录好,再登录SAP系统,就可以执行宏脚本了,即可实现SAP的自动化。
Sub 批量创建检验批()
Set SapGuiAuto = GetObject("SAPGUI")
Set AppSAP = SapGuiAuto.GetScriptingEngine
Set Connection = AppSAP.Children(0)
Set session = Connection.Children(0)
Cells(1, 8) = "检验批次"
maxrow = Sheets(1).[A65536].End(xlUp).Row
session.findById("wnd[0]").maximize
session.findById("wnd[0]/tbar[0]/okcd").Text = "QA01"
session.findById("wnd[0]").sendVKey 0
For i = 2 To maxrow
session.findById("wnd[0]/usr/ctxtQALS-MATNR").Text = ""
session.findById("wnd[0]/usr/ctxtQALS-WERK").Text = ""
session.findById("wnd[0]/usr/ctxtQALS-MATNR").Text = Cells(i, 2)
session.findById("wnd[0]/usr/ctxtQALS-WERK").Text = Cells(i, 4)
session.findById("wnd[0]/usr/ctxtQALS-HERKUNFT").Text = "89"
session.findById("wnd[0]/usr/ctxtQALS-HERKUNFT").SetFocus
session.findById("wnd[0]/usr/ctxtQALS-HERKUNFT").caretPosition = 2
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/tabsTABSTRIP/tabpHERK/ssubSUBSCR_TABSTRIP:SAPLQPL1:0212/txtQALS-LOSMENGE").Text = Cells(i, 7)
session.findById("wnd[0]/usr/tabsTABSTRIP/tabpHERK/ssubSUBSCR_TABSTRIP:SAPLQPL1:0212/ctxtQALS-PASTRTERM").SetFocus
session.findById("wnd[0]/usr/tabsTABSTRIP/tabpHERK/ssubSUBSCR_TABSTRIP:SAPLQPL1:0212/ctxtQALS-PASTRTERM").caretPosition = 3
session.findById("wnd[0]").sendVKey 4
session.findById("wnd[1]/usr/cntlCONTAINER/shellcont/shell").selectionInterval = Cells(i, 5) + "," + Cells(i, 5)
session.findById("wnd[0]/usr/tabsTABSTRIP/tabpHERK/ssubSUBSCR_TABSTRIP:SAPLQPL1:0212/txtQALS-KTEXTLOS").Text = Cells(i, 6)
session.findById("wnd[0]/usr/tabsTABSTRIP/tabpHERK/ssubSUBSCR_TABSTRIP:SAPLQPL1:0212/txtRMQEA-NAMEKUNDE").SetFocus
session.findById("wnd[0]/usr/tabsTABSTRIP/tabpHERK/ssubSUBSCR_TABSTRIP:SAPLQPL1:0212/txtRMQEA-NAMEKUNDE").caretPosition = 15
session.findById("wnd[0]/usr/tabsTABSTRIP/tabpVORG").Select
session.findById("wnd[0]/usr/tabsTABSTRIP/tabpVORG/ssubSUBSCR_TABSTRIP:SAPLQPL1:0202/btnVORGSEL").press
session.findById("wnd[0]/usr/tabsTABSTRIP/tabpSTIP").Select
session.findById("wnd[0]/usr/tabsTABSTRIP/tabpSTIP/ssubSUBSCR_TABSTRIP:SAPLQPL1:0203/btnDYNA").press
Cells(i, 8) = session.findById("wnd[0]/usr/subLOT_HEADER:SAPLQPL1:1102/ctxtQALS-PRUEFLOS").Text
session.findById("wnd[0]/tbar[0]/btn[11]").press
Next i
session.findById("wnd[0]/tbar[0]/btn[12]").press
End Sub
引用:
艺赛旗:自己动手实现 SAP GUI 自动化