提问人:Jacob Tang 提问时间:4/23/2018 最后编辑:CommunityJacob Tang 更新时间:10/11/2023 访问量:3136
对象“ISapCTextField”的方法“Text”失败
Method 'Text' of object 'ISapCTextField' failed
问:
我必须从SAP中提取数据。此错误随机发生:
对象“ISapCTextField”的方法“Text”失败
我搜索了一下,但没有一个解决方案有效。通过多次尝试进行错误处理也不起作用。我没有尝试更多的方法,而是完全避免了这种方法。.Text
导致错误的行示例:
session.findById("wnd[0]/usr/ctxtMATNR-LOW").text = "500000000"
为了避免使用这种方法,我曾经做过同样的事情。基本上,将SAP窗口设置为活动窗口,并使用设置焦点在SAP GUI中选择所需的字段,然后使用+ via将文本从范围粘贴到字段。代码如下:.text
SendKeys
CtrlVsendkeys
'Declaration
Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Declare Function SetForegroundWindow Lib "user32" ( _
ByVal HWnd As Long) As Long
'Finds SAP Window.
Public Sub ActivateSAPWindow()
Dim HWnd As Long
'SAP window Name can be found on the status bar of the Portal.
'Note: This only works in when you click on R/3 and it open a portal. It will not work if it open in the internet explorer
'To make it work for internet explorer , Simply change the name of the Window to find internet explorer or any window you wish.
HWnd = FindWindow(vbNullString, "R/3 - SAP NetWeaver Portal - Internet Explorer")
If HWnd Then
SetForegroundWindow HWnd
End If
End Sub
Public Sub SAPSafeText(ID As String, OriginCell As String)
'Location of the cell you wanna copy to the field.
Worksheets("SAP Mapping").Range(OriginCell).Copy
Call ActivateSAPWindow
Session.FindByID(ID).SetFocus
SendKeys "^v"
'Important to wait for completion before next line.
Wait (5)
End Sub
要调用该函数,只需使用SAP脚本记录获取字段ID名称并解析为SAPSafeText(“ID of the Field as string”, “Cell Range as string”)。
调用示例:
Call SAPSafeText("wnd[0]/usr/ctxtBWART-LOW", Low)
Call SAPSafeText("wnd[0]/usr/ctxtBWART-HIGH", High)
这是蛮力的方式,但它有效。
为什么会发生错误?
有没有更好的方法来解决这个问题?
答:
0赞
ScriptMan
4/23/2018
#1
您可以尝试以下方法而不是 sendkeys 方法:
...
Application.Wait (Now + TimeValue("0:00:01"))
session.findById("wnd[0]/usr/ctxtMATNR-LOW").text = "500000000"
...
问候 脚本人
评论
0赞
Jacob Tang
4/23/2018
你好 ScrptMan,是的,这是我尝试的第一件事,但它不起作用。我在所有行上都尝试了 Application.wait,但它不起作用。我还尝试了许多其他方法,例如早期绑定,重新安装库和Excel + SAP等,但所有方法都会遇到该错误
0赞
Jacob Tang
4/23/2018
问题是这似乎以随机间隔失败,而且我有很多 .text。所以首先它会非常混乱,其次它不会修复它。所以我用它作为错误处理程序,第一次尝试使用.text方法,但如果出错,则使用sendkey。但是,我仍然不知道是什么原因造成的.我浏览了SAP论坛,似乎没有人知道确切的原因?问候,雅各布
0赞
ScriptMan
4/23/2018
什么是 SAP 事务?是否可以完整地看到脚本/代码?
0赞
Jacob Tang
4/23/2018
好吧,这些交易是壳牌自定义交易,有些内置交易,如MB51,MB52,VL06O。至于剧本,我稍后会开始工作。问题是有很多人要求解决这个错误,而且有很多解决方案,我尝试了很多都无济于事,浪费了很多时间......
1赞
ScriptMan
4/23/2018
在执行任何进一步步骤之前,应检查以下内容: 检查客户端的 LAN 连接并确保其设置为高速。success.panaya.com/Test-Center/Testing-Setup/70591162/......
0赞
Jacob Tang
4/24/2018
#2
以下是可能导致随机错误的代码片段。大约有 7 份其他报告。以下是物料需求计划报告示例。
Public SapGuiAuto As Object
Public SAPApp As SAPFEWSELib.GuiApplication
Public SAPConnection As SAPFEWSELib.GuiConnection
Public Session As SAPFEWSELib.GuiSession
Sub InitSession()
On Error GoTo InternetAutomation
ErrorCounter = ErrorCounter + 1
Set SapGuiAuto = GetObject("SAPGUI")
If Not IsObject(SapGuiAuto) Then
Exit Sub
End If
Set SAPApp = SapGuiAuto.GetScriptingEngine()
If Not IsObject(SAPApp) Then
Exit Sub
End If
Set SAPConnection = SAPApp.Connections(0)
If Not IsObject(SAPConnection) Then
Exit Sub
End If
Set Session = SAPConnection.Sessions(0)
If Not IsObject(Session) Then
Exit Sub
End If
Exit Sub
InternetAutomation:
.........
End sub
sub MRP()
Call InitSession
Call TCodeBox("/n/DS1/APO_C_")
Call PlantCode_MRP("A11")
Call Material_MRP("E3")
Call SetPath_MRP
Call Execute
Call MRPReportProcess
End Sub
Sub PlantCode_MRP(Cell As String)
session.findById("wnd[0]/usr/ctxtS_WERKS-LOW").Text = Range(Cell)
session.findById("wnd[0]/usr/btn%_S_WERKS_%_APP_%-VALU_PUSH").press
Call SAPMultiSelect(Cell)
End Sub
Sub Material_MRP(Cell As String)
Worksheets("MB52 Total").Activate
session.findById("wnd[0]/usr/btn%_S_MATNR_%_APP_%-VALU_PUSH").press
Call SAPMultiSelect(Cell)
End Sub
Sub SetPath_MRP()
session.findById("wnd[0]/usr/ctxtP_PATH").Text = Desktop
session.findById("wnd[0]/usr/txtP_NAME").Text = MRPFileName
End Sub
Sub TCodeBox(TCode As String)
session.findById("wnd[0]/tbar[0]/okcd").Text = TCode
On Error GoTo TCodeErrorHandler
session.findById("wnd[0]").sendVKey 0
TCodeErrorHandler:
session.findById("wnd[0]/tbar[0]/btn[15]").press
session.findById("wnd[0]/tbar[0]/okcd").Text = TCode
session.findById("wnd[0]").sendVKey 0
Resume Next
Exit Sub 'Enter
End Sub
Sub Execute()
session.findById("wnd[0]/tbar[1]/btn[8]").press
End Sub
问候,雅各布。
评论
0赞
Jacob Tang
4/24/2018
我也尝试使用 .文本 = 工作表(“工作表”)。范围(RNG)也只是.文本 =“999”
0赞
ScriptMan
4/26/2018
#3
有时我可以通过重新启动事务来解决类似的错误。
例如:
Sub PlantCode_MRP(Cell As String)
on error resume next
session.findById("wnd[0]/usr/ctxtS_WERKS-LOW").Text = Range(Cell)
if err.number <> 0 then
Call TCodeBox("/n/DS1/APO_C_")
session.findById("wnd[0]/usr/ctxtS_WERKS-LOW").Text = Range(Cell)
end if
on error goto 0
'On Error GoTo InternetAutomation
session.findById("wnd[0]/usr/btn%_S_WERKS_%_APP_%-VALU_PUSH").press
Call SAPMultiSelect(Cell)
End Sub
问候 脚本人
评论
0赞
Jacob Tang
4/27/2018
Scriptman感谢您的回复,非常感谢。我基本上做过类似的事情,错误地再次调用整个子,再次退出并进入事务,并给它最多 5 次尝试,但是当错误发生时,它总是超过最多 5 次尝试......仍然令人困惑为什么它会发生:(
0赞
ScriptMan
4/27/2018
我经历过类似的情况,我最多能够循环 50 次。在那之后,总是有一个错误。我的观点:脚本不会像人类那样做任何事情。如果一个人的速度和脚本一样快,它也会进入错误状态。因此,值得考虑。这是在 SAP 中以特定处理速度发生的错误。完成!
0赞
Jacob Tang
4/30/2018
你可能是对的:)它可能是一些错误或其他东西,至少它现在可以解决。.感谢您抽出宝贵时间接受采访。
2赞
李Eatin
9/5/2018
#4
我也遇到了同样的情况。我解决了它。我认为那是你用这样的句子
session.findbyid (*****).text = cells(i,j)
你应该尝试使用
session.findbyid (*****).text = cells(i,j).value
评论
0赞
alowflyingpig
6/5/2019
我知道这很旧,但我通过搜索找到了它。我遇到了完全相同的问题,但现在使用并且它可以正常工作!.value
0赞
Dinesh Kumar
10/11/2023
#5
使用 cel.text 而不是 cel.value 解决了我面临的错误。
对于 Rng.cells 中的每个 cel session.findById(“wnd[0]/usr/ctxtMATNR-LOW”).text = cel.发短信
评论