第2部分将讨论数据库表和表单之间的关系。 特别是,如何定义两个表之间的关系以及如何使用“参考表”作为下拉列表的数据源。
此消息与之相关的OpenOffice和LibreOffice的版本从3.0到6.2(LibreOffice的当前版本)。 从3.0版开始,OpenOffice Base现在可以将脚本保存在数据库文件中(具有.odb扩展名),这使得分发OO Basic宏代码很方便。
OpenOffice Base中的表单有些混乱。 事实是,在从办公套件到数据库环境的软件演进过程中,事实证明,表单,表单,表单和表单不是一回事。 形式不仅是形式。 我将更详细地解释。
在编辑模式下打开OpenOffice Base数据库时,您会在屏幕左侧看到四个书签。 在俄语版本中,听起来像
从这个意义上讲,表单是在单独的窗口中运行的单独的应用程序。 我还注意到,实际上这是启动OpenOffice Writer实例的窗口。
注意事项 由于该表单实际上是OpenOffice Writer的实例-您可以直接在OpenOffice Writer中创建应用程序而无需加载OpenOffice Base组件。每个Form都有Forms of Form对象的集合。 最初,此集合为空。 尽管如此,您仍可以打开和关闭表格。 甚至在其中显示文本信息。 并且只有当您添加新控件(例如Button)时,如果您那时还没有创建这样的对象,系统将创建一个默认名称为Form的Form对象。
从“表单导航器”(在调色板中显示为指南针)创建新表单最方便,也可以从“视图” |“工具栏” |“表单导航”菜单中调用它。 表单对象可以在Forms集合的顶层创建,也可以从属于另一个Form对象。 这不会影响窗体的外观,但是在定义表之间的关系时很有用。
在这里,我们应该注意Form对象的一种异常。 该对象主要是与数据库表或SQL查询关联的对象。 您可以将Form视为ResultSet对象(实际上是这样)。 另一方面,表单是控件的容器,例如HTML文档中的FORM(这也是事实)。
在编辑模式下打开新创建的表单(鼠标右键|编辑)。 在其中创建一个新的Form对象,其名称为Form或您喜欢的其他名称。 在此Form元素中,创建一个子Form元素。
每个表单都需要与现有的数据库表,查询或SQL查询相关联。 在从属表单中,您可以设置规则,以使通过主表单中相关字段的值过滤的数据显示为“主/从”。 为此,在下级窗体的属性编辑器中,填写链接主字段和链接从属字段属性。
现在,我们将在Form Navigator>中选择适当的Form,向每个Form添加一个Table Control元素。 表控件元素不在可用元素面板中。 要显示元素的扩展列表,您需要激活元素面板中的“更多控件”按钮。 添加表格控件元素后,有必要进入该元素的编辑模式并添加显示表格所需的列(鼠标右键->插入/替换/删除列)
第二种类型是在实践中经常遇到的表之间关系的类型(在Master / Slave之后),我们将考虑-目录类型的关系。 我们将GUID对象的键(自动递增)存储在数据表中,并在显示的表中显示其全名,该全名取自关联的引用表。 为此有一个方便的机制。 在可视表设计器中,添加“列表框”类型的列。 如果已经创建了数字/文本类型的列,其中显示了键(而不是名称),则可以将其类型更改为列表框(右键单击|替换为|列表框)。 接下来,编辑列属性列表。 在“数据”选项卡上,将“列表内容的类型”属性设置为SQL。 “列表内容”属性中的查询应在第一列中包含显示的值,并且“绑定字段”属性将是具有键字段的列的索引(假设第一列的索引为0)。 也就是说,在绝大多数查询中,对于类型为的查询,该值为1
SELECT USERNAME, USERID FROM USERS ORDER BY USERNAME
到目前为止,已经在配置器模式下描述了工作,而无需编程。 使用OO Basic宏添加功能。
通过在文本框中输入的值为数据库表创建过滤器。 为此,我们用OO Basic语言编写了一个处理键盘事件的过程。
Sub TextBox_onKeyUp(oEvent) oDocument = ThisComponent oDocument.LockControllers sText = oEvent.Source.text if Len(sText) > 3 Then oForm = ThisComponent.Drawpage.Forms.getByName("MyForm") oForm.Filter = "USERNAME LIKE '" + sText + "%'" oForm.reload() End If oDocument.UnlockControllers End Sub
我们将此过程与文本字段的“键释放”事件关联(在元素属性列表的事件选项卡上)。 请注意,此文本字段必须位于另一窗体中(而不是与过滤器叠加的窗体中),以便重新加载oForm.reload()不会“无效化”从键盘输入的当前值。
待续。