今天,我们来看一下在LibreOffice Base(OpenOffice Base)中编辑数据时对话框的使用。 正如我们在以前的帖子中发现的那样,LibreOffice Base(OpenOffice Base)表单实际上是LibreOffice(OpenOffice)Writer文本编辑器的实例。 为了在窗体内部组织窗口界面,使用了对话框-可以在内置的可视界面中方便地创建对话框,但不支持与数据库表进行通信。 我们将使用OO Basic宏来组织此连接。
让我们按顺序开始。 在数据库中创建两个表:
产品展示
-ID(整数,主键)
-名称(字符串)
订单
-ID(整数,主键)
-productId(整数)
-计数(整数)
-日期(数据类型日期)
创建订单表单,将Form元素添加到带有订单名称的表单中。 以及带有订单数据源的表格控件。 在一系列消息的
第2部分中讨论了如何执行此操作。
设置日期列的属性时,请注意图中用箭头标记的属性,这些属性允许您以所需的格式显示数据,并使用下拉日历选择特定的日期。
现在,就在表格中,您可以添加和修改数据。 在某种程度上,这很方便,类似于使用表处理器的客户端的常规工作。 但是在某些时候,问题开始出现,这也是使用表处理器的特征。 数据可以随意更改,甚至无需注意。 并且已经注意到不可能回滚一切。 新扬声器的空间很小,可能会形成不愉快的水平滚动。 列标题也有大小限制(否则它们将不能水平放置),这不允许对数据进行详细描述。
作为一项措施,您可以在表旁边放置常规字段以进行数据输入(文本控件,数字控件等)。 将订单表的相应字段设置为数据源,一切正常。 导航数据集时,输入字段中的数据将更改。 在输入字段中更改数据时,数据库表中的数据将更改。 但是这种解决方案看起来不会很漂亮。
因此,我们使用对话框来实现这种功能。 对话框有一个重要的限制。 对话框输入字段与数据库表无关。 因此,将需要使用OO Basic宏来填充数据库表中的Dialog条目字段,并将输入字段保存到数据库表中。 但是,这很好,因为 使您可以考虑对OO Basic进行编程的可能性(在此之前,我描述的消息仅适用于环境,但这一切都是为今天的消息做准备)。
要启动对话框编辑器,必须从菜单中选择工具->宏->组织宏-> LibreOffice Basic->管理器->对话框->新建|编辑|删除。 我想有一个更快的方法来进入这个编辑器。 之后,对话框编辑器将打开(alas,不是最方便的),我们将在其中创建带有数据库表中字段名称的字段。 您还记得,对话框不会自动绑定到数据库表,因此我们将编写一个宏来执行此操作。 并且作为命名约定,让我们将输入字段的名称定义与数据库表的字段相同。
具有完成表格的编辑器将如下所示:
接下来,在对话框中添加两个按钮。 我们将为按钮的名称提供任意名称,但以下划线开头,以将其与数据库字段区分开。 可以为属性面板中的每个按钮分配一个动作。 让我们将按钮的操作设置为“确定”-它关闭对话框并确认操作。 第二个-取消-关闭对话框而不确认操作。
关闭对话框编辑器,然后返回到窗体编辑器。 让我们创建一个调用对话框并为其分配Order_Edit处理程序过程的按钮,在该按钮中,我们将从数据库表FromBaseToDialog(oForm,oDialog)中填充Dialog,并保存来自Dialog数据库表FromDialogToBase(oDialog,oForm)中的数据。
Sub Order_Edit(Event) Dim oDialog As Object Dim orders As Object orders = Thiscomponent.DrawPage.Forms.GetByName("orders") DialogLibraries.LoadLibrary("Standard") oDialog = CreateUnoDialog(DialogLibraries.Standard.dialogOrder) FromBaseToDialog(orders, oDialog) If oDialog.Execute() = 1 Then FromDialogToBase(oDialog, orders) orders.UpdateRow() End If End Sub Sub FromBaseToDialog(oForm, oDialog) Dim I Dim sName As String For I = 0 To Ubound(oDialog.Model.ElementNames) sName = oDialog.Model.ElementNames(I) If Mid(sName, 1, 1) <> "_" And Mid(sName, 1, 5) <> "Label" Then ODialog.GetControl(sName).SetText(oForm.Columns.GetByName(sName).String) End If Next I End Sub Sub FromDialogToBase(oDialog, oForm) Dim I Dim sName As String For I = 0 To Ubound(oDialog.Model.ElementNames) sName = oDialog.Model.ElementNames(I) If Mid(sName, 1, 1) <> "_" And Mid(sName, 1, 5) <> "Label" Then oForm.Columns.GetByName(sName).UpdateString(Trim(oDialog.GetControl(sName).GetText())) End If Next I End Sub
假定对话框已作为dialogOrder保存在标准库中。 当然,您可以选择其他名称。 以下划线开头的控件名称将被跳过且未处理。 另外,不会处理用于文本字段标题的以Label开头的名称。
调用oDialog.Execute()= 1将在“窗体”窗口内显示对话框,并暂停宏,直到单击“确定”或“取消”按钮。 当您单击确定时,返回值等于一。