1

我在 Libreoffice Base 中有一个表单,它连接到“歌曲”表(基本上是音乐数据库),我想要做的是每次我选中/取消选中该表单上的复选框时,我想要每条记录的“播放”字段与我目前在要检查/未检查的表格上的姓名和作者相同。我已经读过这样做的唯一方法是使用宏(因为我不想使用关系,因为我现在有很多记录)。我写了这样一个宏:

    Sub UpdatePlayed()
        Context = CreateUnoService("com.sun.star.sdb.DatabaseContext")
        databaseURLOrRegisteredName = "file:///C:/Users/grzes/Desktop/Muzyka.odb"
        Db = Context.getByName(databaseURLOrRegisteredName )
        Conn = Db.getConnection("","") 'username & password pair - HSQL default blank

        dCheckBox = Forms("Formularz").Controls("CheckBox").Value
        dAuthorBox = Forms("Formularz").Controls("AuthorBox").Value
        dTitleBox = Forms("Formularz").Controls("TitleBox").Value  

        Stmt = Conn.createStatement()       
        strSQL = "UPDATE ""Songs"" SET ""Played"" = " + dCheckBox + " WHERE ""Title"" = '" + dTitle + "' AND ""Author"" = '" + dAuthor + "'"

        Stmt.executeUpdate(strSQL)

        Conn.close()

    End Sub

(AuthorBox 和 TitleBox 是文本框,而 CheckBox 是 CheckBox,选中设置为 1,未选中为 0)但是执行宏时没有任何反应(绑定为 Mouse Button Pressed 事件到复选框本身)
我确定执行的方式SQL 查询是正确的,因为在另一个宏中我也使用它没有任何问题,所以问题必须是设置变量 dcheckbox、dauthorbox 和 dtitlebox 或 strSQL。(宏本身正在运行,因为当我更改控件名称时出现错误)。所以问题是:它有什么问题?...

在此先感谢您的帮助。

4

1 回答 1

0

什么都没有发生的原因是因为变量dTitledAuthor是空的。注意变量名不匹配。因此,更新标题和作者为空的位置会影响 0 行。

这是工作代码:

Sub UpdatePlayed(oEvent As Object)
    Context = CreateUnoService("com.sun.star.sdb.DatabaseContext")
    databaseURLOrRegisteredName = "file:///C:/Users/grzes/Desktop/Muzyka.odb"
    Db = Context.getByName(databaseURLOrRegisteredName )
    Conn = Db.getConnection("","") 'username & password pair - HSQL default blank

    oForm = oEvent.Source.Model.Parent
    dCheckBox = oForm.getByName("CheckBox").getCurrentValue()
    sAuthor = oForm.getByName("AuthorBox").getCurrentValue()
    sTitle = oForm.getByName("TitleBox").getCurrentValue()

    Stmt = Conn.createStatement()       
    strSQL = "UPDATE ""Songs"" SET ""Played"" = " + dCheckBox + " WHERE ""Title"" = '" _
        + sTitle + "' AND ""Author"" = '" + sAuthor + "'"
    Stmt.executeUpdate(strSQL)
    Conn.close()
End Sub

还有一个建议:虽然它可以从控件中读取,但首选方法是直接访问表单的底层行集。例如:

lAuthorCol = oForm.findColumn('Author')
sAuthor = oForm.getString(lAuthorCol)
于 2017-01-28T19:12:36.807 回答