对象“ISapCTextField”的方法“Text”失败

Method 'Text' of object 'ISapCTextField' failed

提问人:Jacob Tang 提问时间:4/23/2018 最后编辑:CommunityJacob Tang 更新时间:10/11/2023 访问量:3136

问:

我必须从SAP中提取数据。此错误随机发生:

对象“ISapCTextField”的方法“Text”失败

我搜索了一下,但没有一个解决方案有效。通过多次尝试进行错误处理也不起作用。我没有尝试更多的方法,而是完全避免了这种方法。.Text

导致错误的行示例:

session.findById("wnd[0]/usr/ctxtMATNR-LOW").text = "500000000"

为了避免使用这种方法,我曾经做过同样的事情。基本上,将SAP窗口设置为活动窗口,并使用设置焦点在SAP GUI中选择所需的字段,然后使用+ via将文本从范围粘贴到字段。代码如下:.textSendKeysCtrlVsendkeys

'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)

这是蛮力的方式,但它有效。

为什么会发生错误?

有没有更好的方法来解决这个问题?

Excel VBA 文本 方法 SAP-GUI

评论


答:

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.发短信

评论

0赞 Community 10/17/2023
正如目前所写的那样,你的答案尚不清楚。请编辑以添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。您可以在帮助中心找到有关如何写出好答案的更多信息。