首页 > 解决方案 > 如何使用 SAPFEWSELib 在 SAP 中控制 GuiScrollbar?

问题描述

我曾经使用 VBA 来自动化 SAP,现在我使用 C# 和 SAPFEWSELib 来控制 SAP。我可以控制按钮或文本字段,但我在滚动条上做错了,不知道问题出在哪里。

我的目标是滚动条,但不在 Table 或 GridView 中,在这种情况下,我可以避免滚动,但规则当然是一样的。我尝试使用 SAPFEWSELib GuiScrollbar 类。我可以使用 GuiButton、GuiStatusbar、GuiSession 等等。我的应用程序工作正常,用户在他们的机器上运行它,所以我想我以正确的方式使用 SAPFEWSELib,但我在 SAP 和编码方面并不先进,所以这个错误可能是非常基本的。
我得到的错误:

System.InvalidCastException:“无法将“System.__ComObject”类型的 COM 对象转换为接口类型“SAPFEWSELib.GuiScrollbar”。此操作失败,因为 IID 为“{99CD4189-6B59-4596-B1DF-0C1121BB5240}”的接口的 COM 组件上的 QueryInterface 调用因以下错误而失败:不支持此类接口(HRESULT 异常:0x80004002 (E_NOINTERFACE)) 。

我使用 SAP 记录器并从 VBS 获取 ID,然后在我的脚本中使用它。对于 SAP 中的对象类型,我创建了自己的类,一个按钮的示例:

public class SAPElementButton
    {
        GuiSession _session;
        public string _Id;

        public SAPElementButton(GuiSession session, string Id)
        {
            _session = session;
            _Id = Id;
        }

        public void pressbutton()
        {        
            {
                GuiButton _SapButton = (GuiButton)_session.FindById(_session.Id.ToString() + _Id);
                _SapButton.SetFocus();
                _SapButton.Press();         
            }
        }
    }

多亏了这一点,我可以创建我的类的一个对象,在该对象中我给出了类方法中 FindByID 方法使用的路径。在上面的示例中,我将会话和按钮 ID 作为构造函数的参数。在我使用方法“pressbutton”的逻辑部分,我可以避免长 ID,这会使我的代码无法运行。这可能看起来有点复杂和浪费时间,但让我来管理复杂的逻辑。上面的代码工作正常,例如,我附上了它。

问题是当我尝试控制 Scrollbar 时,我收到类似上面的错误:

 public class SAPElementVerticalScrollbar
    {
        GuiSession _session;
        public string _Id;

        public SAPElementVerticalScrollbar(GuiSession session, string Id)
        {
            _session = session;
            _Id = Id;
        }

        public void setScrollbar(int possition)
        {
            {           
                GuiScrollbar sAPElementVerticalScroll = (GuiScrollbar)_session.FindById(_session.Id.ToString() + _Id);
                sAPElementVerticalScroll.Position=possition;
            }
        }
    }

如果错误是此类 Id 不可用,则很明显,但语法似乎很好并且 SAP 中的对象可用。

也许我使用了 SAPFEWSELib 中的错误类,或者我不知道使用另一个不错的 .dll 库来代替那个库?也许有一种方法可以像按钮一样单击 ScrollBar 中的“箭头”?我希望有一个人可以帮助我。如果需要,我会得到详细信息。在此处输入图像描述

标签: c#sap

解决方案


您可能只是收到了错误的查找对象。

您可以通过以下方式检查收到的对象类型:

object comObject = _session.FindById(_session.Id.ToString() + _Id);
string comType = Microsoft.VisualBasic.Information.TypeName(comObject);
// comType will now contain something like "GuiButton" or "GuiScrollbar"

此代码需要对 Microsoft.VisualBasic 程序集的引用。

如果您真的收到 GuiScrollbar 它应该可以工作,我已经看到类似实施的成功案例。


如果您得到一些不可用的东西,请尝试将对象转换为SAPFEWSELib.GuiVComponent,然后使用属性LeftTop获取滚动条的位置。这些应该是以像素为单位的屏幕相对坐标。

然后,理论上,您可以通过其他方式模拟鼠标点击,例如类似于以下内容:How do you simulation Mouse Click in C#?


在使用 GUI 脚本编写期间,我没有看到任何其他花哨的库,因此您可能会被 SAPFEWSELib 卡住。我们在工作场所处理这个问题的方式是使用一个包装库来解决脚本 API 中的一些问题。(不幸的是,我不能分享它,因为它不公开)


推荐阅读