2017-01-28 142 views
1

我在Libreoffice Base中有一个连接到“Songs”表格(basicaly db of music)的表格,我想要做的是每次检查/取消选中CheckBox表单我希望字段“播放”每个记录具有相同的名称和作者作为我目前在表单上的那个被选中/取消选中。我已经读过这样做的唯一方法是使用宏(因为我不想使用关系,因为我现在有很多记录)。我写这样一个宏:使用宏表格中的数据更新数据库表格

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是一个复选框与托运设置为1,未选中为0),但没有任何反应执行宏时(绑定为按下鼠标按钮事件到复选框本身)
我敢肯定,如果执行SQL查询的方式与另一个宏一样正确,我也可以毫无问题地使用它,因此问题必须是设置变量dcheckbox,dauthorbox和dtitlebox,或者与strSQL。 (宏本身正在运行,因为当我更改控件名称时出现错误)。所以问题是:它有什么不对?

+0

什么是数据库引擎 - 内置的HSQL 1.8? –

+0

我不确定什么版本,但肯定HSQL。 Libre办公室版本是5.2.2 –

+0

好的,还有一个问题:表中的“玩过”字段类型是什么? –

回答

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 

一个建议:虽然它的工作原理与对照阅读,首选的方法是直接访问窗体的基础row set代替。例如:

lAuthorCol = oForm.findColumn('Author') 
sAuthor = oForm.getString(lAuthorCol) 
+0

好的,现在它可以工作,非常感谢。 –