当前位置: 首页 > news >正文

最好的网站建设公司网站制作北京海淀

最好的网站建设公司,网站制作北京海淀,企业网站建设选题的依据及意义,网站建设的公司服务总体来说,SAP Scripting 与 BDC 类似,因为是屏幕录制,就可能碰到不同的情况,比如每个录入的数据不同,可能出现一个对话框,或者出现一个状态栏消息。这种任何有变化的情况,在 Scripting 中没有考…

总体来说,SAP Scripting 与 BDC 类似,因为是屏幕录制,就可能碰到不同的情况,比如每个录入的数据不同,可能出现一个对话框,或者出现一个状态栏消息。这种任何有变化的情况,在 Scripting 中没有考虑到,就会导致操作失败。本文以导入 MR21 物料价格为例,演示如何处理组件/控件不存在的情况。

基于连续性,如何使用 SAP SAP Scripting 的要点,请参考本人之前的博文:

SAP Scripting Tracker基本使用技巧-CSDN博客
SAP Scripting Tracker基本使用技巧(续)_sap tracker-CSDN博客
SAP Scripting Tracker基本使用技巧 - VBA 示例-CSDN博客

首先使用 SAP Scripting Tracker 基于 Basic 录制 MR21 修改物料价格,得到下面的代码:

session.findById("wnd[0]").resizeWorkingPane(116, 39, vbFalse)
session.findById("wnd[0]/tbar[0]/okcd").text = "MR21"
session.findById("wnd[0]").sendVKey(0)session.findById("wnd[0]/usr/ctxtMR21HEAD-BUDAT").text = "2024.12.31"
session.findById("wnd[0]/usr/ctxtMR21HEAD-BUKRS").text = "3600"
session.findById("wnd[0]/usr/ctxtMR21HEAD-WERKS").text = "3601"
session.findById("wnd[0]/usr/txtMR21HEAD-XBLNR").setFocus
session.findById("wnd[0]/usr/txtMR21HEAD-XBLNR").caretPosition = 0
session.findById("wnd[0]").sendVKey(0)session.findById("wnd[0]/usr/tabsMR21_TABSTRIP/tabpTAB1/ssubMR21_SUB:SAPRCKM_MR21:0250/tblSAPRCKM_MR21MR21_TABCONTROL/ctxtCKI_MR21_0250-MATNR[0,0]").text = "20000239"
session.findById("wnd[0]/usr/tabsMR21_TABSTRIP/tabpTAB1/ssubMR21_SUB:SAPRCKM_MR21:0250/tblSAPRCKM_MR21MR21_TABCONTROL/ctxtCKI_MR21_0250-MATNR[0,0]").caretPosition = 8
session.findById("wnd[0]").sendVKey(0)session.findById("wnd[0]/usr/tabsMR21_TABSTRIP/tabpTAB1/ssubMR21_SUB:SAPRCKM_MR21:0250/tblSAPRCKM_MR21MR21_TABCONTROL/txtCKI_MR21_0250-NEWVALPR[4,0]").text = "100"
session.findById("wnd[0]/usr/tabsMR21_TABSTRIP/tabpTAB1/ssubMR21_SUB:SAPRCKM_MR21:0250/tblSAPRCKM_MR21MR21_TABCONTROL/txtCKI_MR21_0250-NEWVALPR[4,0]").setFocus
session.findById("wnd[0]/usr/tabsMR21_TABSTRIP/tabpTAB1/ssubMR21_SUB:SAPRCKM_MR21:0250/tblSAPRCKM_MR21MR21_TABCONTROL/txtCKI_MR21_0250-NEWVALPR[4,0]").caretPosition = 3
session.findById("wnd[0]").sendVKey(0)session.findById("wnd[0]/usr/tabsMR21_TABSTRIP/tabpTAB1/ssubMR21_SUB:SAPRCKM_MR21:0250/tblSAPRCKM_MR21MR21_TABCONTROL/txtCKI_MR21_0250-NEWVALPR[4,0]").setFocus
session.findById("wnd[0]/usr/tabsMR21_TABSTRIP/tabpTAB1/ssubMR21_SUB:SAPRCKM_MR21:0250/tblSAPRCKM_MR21MR21_TABCONTROL/txtCKI_MR21_0250-NEWVALPR[4,0]").caretPosition = 4
session.findById("wnd[0]/tbar[0]/btn[11]").press

录制过程中,为方便后续对代码的理解,可以在关键点插入空行,或插入空行并加上注释。因为最终需要从 Excel 的单元格导入数据,所以接下来对代码进行微调,将写死的部分替换为单元格。我一般先定义一个起始的单元格,然后其他单元格都替换为基于起始单元格的 offset:

Dim leftCell As Range
Set leftCell = Sheet1.Range("A" & i)session.findById("wnd[0]").resizeWorkingPane(116, 39, vbFalse)
session.findById("wnd[0]/tbar[0]/okcd").text = "MR21"
session.findById("wnd[0]").sendVKey(0)session.findById("wnd[0]/usr/ctxtMR21HEAD-BUDAT").text = leftCell.Offset(0, 2).Value ' 过账日期
session.findById("wnd[0]/usr/ctxtMR21HEAD-BUKRS").text = leftCell.Value              ' 公司代码
session.findById("wnd[0]/usr/ctxtMR21HEAD-WERKS").text = leftCell.Offset(0, 1).Value ' 工厂
session.findById("wnd[0]/usr/txtMR21HEAD-XBLNR").setFocus
session.findById("wnd[0]/usr/txtMR21HEAD-XBLNR").caretPosition = 0
session.findById("wnd[0]").sendVKey(0)session.findById("wnd[0]/usr/tabsMR21_TABSTRIP/tabpTAB1/ssubMR21_SUB:SAPRCKM_MR21:0250/tblSAPRCKM_MR21MR21_TABCONTROL/ctxtCKI_MR21_0250-MATNR[0,0]").text = leftCell.Offset(0, 3).Value  ' 物料编码
session.findById("wnd[0]/usr/tabsMR21_TABSTRIP/tabpTAB1/ssubMR21_SUB:SAPRCKM_MR21:0250/tblSAPRCKM_MR21MR21_TABCONTROL/ctxtCKI_MR21_0250-MATNR[0,0]").caretPosition = 8
session.findById("wnd[0]").sendVKey(0)session.findById("wnd[0]/usr/tabsMR21_TABSTRIP/tabpTAB1/ssubMR21_SUB:SAPRCKM_MR21:0250/tblSAPRCKM_MR21MR21_TABCONTROL/txtCKI_MR21_0250-NEWVALPR[4,0]").text = leftCell.Offset(0, 4).Value  '新价格
session.findById("wnd[0]/usr/tabsMR21_TABSTRIP/tabpTAB1/ssubMR21_SUB:SAPRCKM_MR21:0250/tblSAPRCKM_MR21MR21_TABCONTROL/txtCKI_MR21_0250-NEWVALPR[4,0]").setFocus
session.findById("wnd[0]/usr/tabsMR21_TABSTRIP/tabpTAB1/ssubMR21_SUB:SAPRCKM_MR21:0250/tblSAPRCKM_MR21MR21_TABCONTROL/txtCKI_MR21_0250-NEWVALPR[4,0]").caretPosition = 3
session.findById("wnd[0]").sendVKey(0)session.findById("wnd[0]/usr/tabsMR21_TABSTRIP/tabpTAB1/ssubMR21_SUB:SAPRCKM_MR21:0250/tblSAPRCKM_MR21MR21_TABCONTROL/txtCKI_MR21_0250-NEWVALPR[4,0]").setFocus
session.findById("wnd[0]/usr/tabsMR21_TABSTRIP/tabpTAB1/ssubMR21_SUB:SAPRCKM_MR21:0250/tblSAPRCKM_MR21MR21_TABCONTROL/txtCKI_MR21_0250-NEWVALPR[4,0]").caretPosition = 4
session.findById("wnd[0]/tbar[0]/btn[11]").press

正常情况下,这个脚本就可以用了。本来 MR21 是一个表格式界面,可以处理多条记录,但 Scripting 是通过位置索引来表达某个单元格,因为项目物料不是很多,所以采取简单的方式,每一条记录保存之后再录入下一个物料,就解决了这个问题。

但物料本身的数据存在差异,录入的时候会碰到不同的情况,比如有些物料本身已经有将来或当前的价格,有些物料在修改的时候,如果新价格等于老价格,SAP就会在状态栏有一个提示:对于XXX物料,价格没有变化。对这种的情况,如果不处理,VBA 会抛出异常,所以需要处理。

我们先来讲怎样通过 Scripting Tracker 查看这个控件。在查看之前,需要制造出抛出异常的情景。

然后刷新 Scripting Tracker,显示控件的 ID:


有了这个 ID 之后,我们可以通过两个方法来处理,推荐的是第二个方法。

方法1

Dim msg As String
On Error Resume Next
msg = session.FindById("/app/con[0]/ses[0]/wnd[1]/usr/txtMESSTXT1") '价格没有修改对话框
If Err.Number = 0 ThenleftCell.Offset(0, 5).Value = session.FindById("/app/con[0]/ses[0]/wnd[1]/usr/txtMESSTXT1").Text
End If

方法2

第二个参数为 False。

Public Function FindById( _ByVal Id As String, _Optional ByVal Raise As Variant _
) As GuiComponent

在对象的子对象中搜索给定的 ID。如果参数是完全限定的 ID,函数将首先检查容器对象的 ID 是否是 ID 参数的前缀。如果是这种情况,这个前缀将被截断。如果找不到具有给定 ID 的后代,除非将可选参数 raise 设置为 False,否则函数将引发异常。(Search through the object’s descendants for a given id. If the parameter is a fully qualified id, the function will first check if the container object’s id is a prefix of the id parameter. If that is the case, this prefix is truncated. If no descendant with the given id can be found the function raises an exception unless the optional parameter raise is set to False.)

API 可以参考:GuiContainer Object | SAP Help Portal

If Not session.FindById("/app/con[0]/ses[0]/wnd[1]/usr/txtMESSTXT1", False) Is Nothing Then '价格没有修改对话框leftCell.Offset(0, 5).Value = session.FindById("/app/con[0]/ses[0]/wnd[1]/usr/txtMESSTXT1").Text
Else' 读取返回值leftCell.Offset(0, 5).Value = session.FindById("wnd[0]/sbar").Text
End If

最后给出 Excel 界面和完整的代码。

SapSesion.bas

Option ExplicitPublic Function GetSession() As ObjectDim SapGuiAuto As ObjectDim app As SAPFEWSELib.GuiApplicationDim connection As SAPFEWSELib.GuiConnectionDim session As SAPFEWSELib.GuiSessionIf app Is Nothing ThenSet SapGuiAuto = GetObject("SAPGUI")Set app = SapGuiAuto.GetScriptingEngineEnd IfIf connection Is Nothing ThenSet connection = app.Children(0)End IfIf session Is Nothing ThenSet session = connection.Children(0)End IfSet GetSession = session
End FunctionPublic Sub returnEasyAccess(sess As Object)sess.FindById("wnd[0]/tbar[0]/okcd").Text = "/n"sess.FindById("wnd[0]").SendVKey (0)
End Sub'Public Sub test()
'    Dim s As Object
'    Set s = GetSession
'
'    returnEasyAccess s
'End Sub

DataImport.bas

Option ExplicitPublic Sub DataImport()Dim session As ObjectSet session = GetSession' 确认If Not msgbox("脚本将对当前打开的SAP系统进行更改物料价格更改,请不要随意点击执行。是否继续?", vbYesNo + vbExclamation) = vbYes ThenExit SubEnd IfDim pwd As Stringpwd = InputBox("请输入密码")If pwd = "" ThenExit SubEnd IfIf pwd <> "stonestone" Thenmsgbox "密码不正确"Exit SubEnd IfCall returnEasyAccess(session)'==================================' 执行'==================================Dim i As LongFor i = 4 To Sheet1.UsedRange.CountIf Sheet1.Range("A" & i).Value = "EOF" Then Exit Sub' 每次先回到Easy Access 界面Call returnEasyAccess(session)Dim leftCell As RangeSet leftCell = Sheet1.Range("A" & i)session.FindById("wnd[0]").Maximize' 功能代码'=======================================================================session.FindById("wnd[0]/tbar[0]/okcd").Text = "MR21"session.FindById("wnd[0]").SendVKey (0)session.FindById("wnd[0]/usr/ctxtMR21HEAD-BUDAT").Text = leftCell.Offset(0, 2).Value ' 过账日期session.FindById("wnd[0]/usr/ctxtMR21HEAD-BUKRS").Text = "3600"                      ' 公司代码session.FindById("wnd[0]/usr/ctxtMR21HEAD-WERKS").Text = leftCell.Offset(0, 1).Value ' plantsession.FindById("wnd[0]/usr/ctxtMR21HEAD-WERKS").SetFocussession.FindById("wnd[0]/usr/ctxtMR21HEAD-WERKS").CaretPosition = 4session.FindById("wnd[0]").SendVKey (0)session.FindById("wnd[0]/usr/tabsMR21_TABSTRIP/tabpTAB1/ssubMR21_SUB:SAPRCKM_MR21:0250/tblSAPRCKM_MR21MR21_TABCONTROL/ctxtCKI_MR21_0250-MATNR[0,0]").Text = leftCell.Offset(0, 3).Value  ' 物料编码session.FindById("wnd[0]/usr/tabsMR21_TABSTRIP/tabpTAB1/ssubMR21_SUB:SAPRCKM_MR21:0250/tblSAPRCKM_MR21MR21_TABCONTROL/ctxtCKI_MR21_0250-MATNR[0,0]").CaretPosition = 8session.FindById("wnd[0]").SendVKey (0)'如果物料有将来价格则存在对话框If Not session.FindById("wnd[1]/tbar[0]/btn[0]", False) Is Nothing Thensession.FindById("wnd[1]/tbar[0]/btn[0]").PressEnd Ifsession.FindById("wnd[0]/usr/tabsMR21_TABSTRIP/tabpTAB1/ssubMR21_SUB:SAPRCKM_MR21:0250/tblSAPRCKM_MR21MR21_TABCONTROL/txtCKI_MR21_0250-NEWVALPR[4,0]").Text = leftCell.Offset(0, 4).Value  '新价格session.FindById("wnd[0]/usr/tabsMR21_TABSTRIP/tabpTAB1/ssubMR21_SUB:SAPRCKM_MR21:0250/tblSAPRCKM_MR21MR21_TABCONTROL/txtCKI_MR21_0250-NEWVALPR[4,0]").SetFocussession.FindById("wnd[0]/usr/tabsMR21_TABSTRIP/tabpTAB1/ssubMR21_SUB:SAPRCKM_MR21:0250/tblSAPRCKM_MR21MR21_TABCONTROL/txtCKI_MR21_0250-NEWVALPR[4,0]").CaretPosition = 4session.FindById("wnd[0]").SendVKey (0)' Savesession.FindById("wnd[0]/tbar[0]/btn[11]").Press' Save之后可能提示物料价格没有更改If Left(session.FindById("wnd[0]/sbar").Text, 4) = "对于物料" Thensession.FindById("wnd[0]").SendVKey (0)End If'====================================================================If Not session.FindById("/app/con[0]/ses[0]/wnd[1]/usr/txtMESSTXT1", False) Is Nothing Then '价格没有修改对话框leftCell.Offset(0, 5).Value = session.FindById("/app/con[0]/ses[0]/wnd[1]/usr/txtMESSTXT1").TextElse' 读取返回值leftCell.Offset(0, 5).Value = session.FindById("wnd[0]/sbar").TextEnd If' 保存If i Mod 5 = 0 ThenThisWorkbook.SaveEnd If' 滚动If i >= 25 ThenActiveWindow.SmallScroll down:=1End IfNext
End Sub
http://www.yayakq.cn/news/486448/

相关文章:

  • 建站网站和维护需要会什么区别网页设计平均工资
  • 做网站赚钱但又不想开公司买个网站空间
  • 网站建设图片怎么做wordpress 哪个好
  • 南陵网站建设深圳开发小程序
  • 怎么把网站开发成crx一般用什么做网站首页
  • 免费建手机网站购物网站排名女装
  • 深圳网站制作的公司排名建设电动车官网
  • 下载软件的网站wordpress内外网
  • 网站多久备案一次吗深圳50强外贸公司排名
  • 如何做好企业网站的推广网站去哪里备案
  • 网站后台的关键词HTML和PHP怎么做网站
  • 怎么修改网站图标常用wordpress搭建环境
  • 网站设计与制作报价怎样购买网站域名
  • 建设农场网站网站cms企业
  • 免费公司logo设计图昆明百度搜索排名优化
  • 网站续费公司用织梦做的网站怎么上传虚拟
  • 做色网站上海百度seo网站优化
  • 个人商城网站制作费用如何提高网站百度权重
  • wordpress全站ssllniux上安装wordpress百度云
  • 怎样免费建公司网站wordpress 年份
  • 电子商务网站建设策划书 服装 有详细数据库设计企业官网有哪些
  • 网站备案信息变更常用的seo工具推荐
  • 网站开发多线程开发大数据营销论文
  • wordpress模板 站长网站的二维码怎么做
  • 360做的网站首页山东省城乡住房和城乡建设厅网站
  • 网站建设售后服务内容上海工厂网站建设
  • 响应式网站开发的设计原则wordpress 分类列表插件
  • 北京网站建设开发公司网站页面背景
  • 网站什么内容公司网站如何做维护
  • 有没有手机可以看的网站免费的公司企业邮箱登录