我将如何在 LibreOffice 宏中设置焦点用于基本表单?或者设置一个不过滤的“Position-To”字段?

问题描述

在 LibreOffice Base 表单中,我设置了一个按钮来调用 .uno:RecSearch,以便打开记录搜索对话框。

这样做的问题是,如果表单中没有任何字段具有焦点,则记录搜索对话框会将表单中七个日期字段中的第三个作为搜索目标(这几乎没用),而不是所需的“名称”字段。 (更令人费解的是,用于选择要搜索的字段的列表框似乎具有或多或少随机顺序的字段)。

我想为 LibreOffice Base 表单创建一个宏,首先将焦点设置到“名称”字段,然后调用 .uno:RecSearch。

可以做到吗,如果可以,怎么做?

解决方法

我从来没有找到一种方法来做到这一点(尽管我发现宏所看到的字段序列与记录或屏幕上的字段的名义序列没有相似之处,这本身就是一个难题) ,但我发现了一些更好的东西,就我的目的而言:如何使用附加到“已更改" 添加到表单的“定位到”字段的事件。

option explicit

sub PositionTo (e as object)
dim c as object
dim oDoc,oDrawpage,oForm,oName,oConnection as object

oDoc = thisComponent
oDrawpage = oDoc.drawpage
oForm = oDrawPage.forms.getByName("MainForm")
oName = oForm.getByName("txtName")


   if ucase(e.source.text) < ucase(oName.text) then
     do until (ucase(e.source.text) > ucase(oName.text)) or (oForm.isBeforeFirst)
       oForm.previous
     loop
     oForm.next

   else
     do until (ucase(e.source.text) <= ucase(oName.text)) or (oForm.isAfterLast)
       oForm.next
     loop
     if oForm.isAfterLast then oform.previous
   endif
end sub

当然,这是一种蛮力方法,在具有超过几千条记录的数据库中会出现严重的性能问题,但是话又说回来,具有超过几千条记录的数据库将需要更多的东西比 LibreOffice Base 更复杂,因为它有自己的内置(而且已经过时)HSQLDB。

情况是一张表,其中唯一主键是一个不区分大小写的文本字段。

首先,我们定义我们的变量,并掌握表单和键域在表单上的存在。然后,我们检查“Position To”字段的值(“e.source.text”)是否在当前记录的键值(“oName.text”)之前,忽略大小写。

如果我们在 Position To 值之后,则我们向后遍历记录,直到到达“Position To”值之前的记录,或者我们位于文件的顶部,然后向前移动一条记录.

如果我们在 Position To 值之前,那么我们向前直到我们到达至少匹配的第一个记录,或者我们击中 EOF;如果是后者,我们将备份到最后一条记录。

当然可以通过分两个阶段进行长时间扫描来提高性能,第一阶段的步骤更长,但考虑到数据库的大小,这会带来更多的麻烦。

当然,我欢迎任何可行的、实用的改进建议。如果有一个我不知道的现有“定位到”功能,那会有所帮助。