我如何在 LibreOffice 宏中设置焦点(用于基本表单)?或者设置一个不过滤的 "Position-To" 字段?
How would I set focus in a LibreOffice macro (for use in a Base form)? Or set up a "Position-To" field that DOESN'T filter?
在 LibreOffice Base 表单中,我设置了一个按钮来调用 .uno:RecSearch,以调出记录搜索对话框。
问题在于,如果表单中的任何字段都没有焦点,记录搜索对话框会将表单中七个日期字段中的第三个作为搜索目标(这几乎没用),而不是所需的“名称”字段。 (更令人费解的是,select 要搜索哪个字段的列表框似乎具有或多或少随机顺序的字段)。
我想为 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。
情况是table,其中唯一的主键是一个不区分大小写的文本字段。
首先,我们定义变量,并获取表单和表单上的关键字段。然后,我们检查“Position To”字段的值(“e.source.text”)是否在当前记录的键值(“oName.text”)之前,忽略大小写。
如果我们在 Position To 值之后,那么我们将向后浏览记录,直到我们到达“Position To”值之前的记录,或者我们在文件的顶部,然后向前浏览一条记录。
如果我们在 Position To 值之前,那么我们向前推进,直到我们到达至少匹配的第一条记录,或者我们到达 EOF;如果是后者,我们备份到最后一条记录。
对于长时间扫描,当然可以通过分两个阶段来提高性能,第一阶段的步骤更长,但是考虑到数据库的大小,这样做的麻烦得不偿失。
当然,我欢迎任何可行、实用的改进建议。如果有一个我不知道的现有“定位”功能,那会有所帮助。
在 LibreOffice Base 表单中,我设置了一个按钮来调用 .uno:RecSearch,以调出记录搜索对话框。
问题在于,如果表单中的任何字段都没有焦点,记录搜索对话框会将表单中七个日期字段中的第三个作为搜索目标(这几乎没用),而不是所需的“名称”字段。 (更令人费解的是,select 要搜索哪个字段的列表框似乎具有或多或少随机顺序的字段)。
我想为 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。
情况是table,其中唯一的主键是一个不区分大小写的文本字段。
首先,我们定义变量,并获取表单和表单上的关键字段。然后,我们检查“Position To”字段的值(“e.source.text”)是否在当前记录的键值(“oName.text”)之前,忽略大小写。
如果我们在 Position To 值之后,那么我们将向后浏览记录,直到我们到达“Position To”值之前的记录,或者我们在文件的顶部,然后向前浏览一条记录。
如果我们在 Position To 值之前,那么我们向前推进,直到我们到达至少匹配的第一条记录,或者我们到达 EOF;如果是后者,我们备份到最后一条记录。
对于长时间扫描,当然可以通过分两个阶段来提高性能,第一阶段的步骤更长,但是考虑到数据库的大小,这样做的麻烦得不偿失。
当然,我欢迎任何可行、实用的改进建议。如果有一个我不知道的现有“定位”功能,那会有所帮助。