0

在 IBM Reflection 主机中,我试图运行一个 VBA 宏来遍历不同的屏幕并填写所需的信息(在屏幕的预定义模板类型中)以在系统中创建订单。

在此过程中,我试图利用“Session.MoveCursor”和“Session.CursorRow”、“Session.CursorColumn”功能将光标移动到所需位置,然后读取光标位置信息(验证之前的位置在主机屏幕上写入数据)

代码:

Dim currRowPos as Integer
Dim currColPos as Integer
Session.MoveCursor targetRowPos, targetColPos ' move cursor position
DoEvents ' custom logic to wait or inlcude delay 1 sec or more, mentioned only single code statement here 
currRowPos = Session.CursorRow 'get cursor current row position
currColPos = Session.CursorColumn 'get cursor current column position
'check current cursor position and write data onto HOST screen
If targetRowPos = currRowPos And targetColPos = currColPos Then
    Session.TransmitANSI "xyz" 'write xyz on HOST screen
End If

我正在尝试在所需的光标位置将一些信息写入主机并遍历到下一个屏幕。在正当程序中,我将来回填写多个项目的信息(一次一个)。

有时我面临执行上述逻辑(代码)并且光标仍处于旧位置(不在所需的新行、列位置)并且程序开始在旧位置而不是所需/目标写入数据的问题位置导致编程错误(即“Session.CursorRow”和“Session.CursorColumn”正在输出新的所需光标位置,而光标实时位于主机屏幕上的旧位置)。

如果有人以前遇到过这个问题和/或有任何解决方案,请您分享一下。谢谢你。

从下面的评论中粘贴代码

这是 vba 程序代码中使用的延迟函数

Public Sub DelayScript(Seconds As Integer) 
   Dim PauseTime, START 
   PauseTime = Seconds 
   START = Timer ' Set start time. 
   Do While Timer < START + PauseTime 
      DoEvents ' Yield to other processes. 
   Loop 
End Sub

IBM HOST 编程参考:http ://docs.attachmate.com/reflection/14.x/prog-ref/ibm/

4

1 回答 1

0

如果我正确理解您的问题,则底层连接的延迟会干扰您的代码时间。通常,DoEvents您应该使用Wait*方法而不是计时代码,并让反射为您处理计时。我的猜测是你需要更像这样的东西:

With Session
    .MoveCursor targetRowPos, targetColPos 
    '10 second timeout.
    .WaitForEvent rcEnterPos, "10", "", targetRowPos, targetColPos 
    'Verify that you didn't time out.
    If targetRowPos = .CursorRow And targetColPos = .CursorColumn Then
        Session.TransmitANSI "xyz" 'write xyz on HOST screen
    End If
End With

或者(假设它是一个字段)您等待rcEnterField而不是rcEnterPos. 请参阅此处的文档

于 2016-08-23T21:20:20.460 回答