如何在 LibreOffice 宏中设置焦点(用于基本窗体)?或者设置一个不过滤的"Position-To"字段?



在LibreOffice Base表单中,我有一个名为.uno: researchsearch的按钮集,以便调出记录搜索对话框。

这样做的问题是,如果表单中没有字段有焦点,记录搜索对话框会以表单中七个日期字段中的第三个字段作为搜索目标(这几乎毫无用处),而不是期望的"名称";字段。(更令人费解的是,用于选择要搜索的字段的列表框似乎以或多或少随机的顺序排列字段)

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

可以做到吗?如果可以,如何做到?

我从来没有找到这样做的方法(尽管我发现宏看到的字段序列与记录或屏幕上字段的标称序列没有相似之处,这本身就是一个难题),但我发现了一些东西,对于我的目的来说,更好:如何实现"Position to "字段(与过滤器形成对比,这正是我不想要的!),附带一个宏,附加到"Changed"事件"Position "字段添加到表单中。

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")出现在当前记录的键值(" name .text")之前,忽略大小写。

如果在Position To值之后,则向后遍历记录,直到找到在Position To"之前的记录。值,或者我们在文件的顶部,然后向前走一条记录。

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

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

当然,我欢迎任何可行的、实际的改进建议。如果有一个已经存在的位置我不知道的功能,那会有帮助的。

相关内容

最新更新