我有一个表tblCosts,它显示在msaccess前端,使用户可以添加新条目以及更新现有条目。该表的结构如下。
ExpenseType Month Year Cost
Hardware June 2017 $500
Software July 2017 $300
Hardware Sept 2017 $150
我有一个更新并插入查询,这些查询在手动运行时工作正常。
但是,我无法区分何时在窗体上触发查询的条件。例如,如果表中存在记录,则应运行更新查询,如果记录不存在,则应运行插入查询。
例如,如果有人投入了
- 硬件2017年9月120美元左右它应该将第三个条目从150更新为120但是如果有人投入了
- 2017年9月的家具$ 350
它应该认识到家具不是数据库的一部分并运行插入查询。
我有更新和插入查询,但需要帮助确定何时运行它们的条件。
我正在使用的更新查询是:
Update tblCosts
set tblCosts.Cost=[Forms]![frmCost]![txtCost]
where tblCosts.ExpenseType = [Forms]![frmCost]![txtExpType]
and tblCosts.Month = [Forms]![frmCost]![txtMonth]
and tblCosts.Year = [Forms]![frmCost]![txtYear]
我正在使用的插入查询是:
Insert into tblCosts (ExpenseType , Month, Year, Cost)
Select [Forms]![frmCost]![txtExpType] as Exp1,
[Forms]![frmCost]![txtMonth] as Exp2,
[Forms]![frmCost]![txtYear] as Exp 3,
[Forms]![frmCost]![txtCost] as Exp 4
答案 0 :(得分:1)
需要在表单后面的代码(VBA或宏)来确定要运行的操作查询。在VBA中有类似的东西:
If DCount("*", "tablename", "ExpenseType='" & Me.cbxExpense & "' AND [Month]='" & Me.tbxMonth & "' AND [Year]=" & Me.tbxYear) = 0 Then
CurrentDb.Execute "INSERT INTO tablename (Expense, [Month], [Year], Cost) VALUES ('" & Me.cbxExpense & "', '" & Me.tbxMonth & "', " & Me.tbxYear & ", " & Me.tbxCost & ")"
Else
CurrentDb.Execute "UPDATE tablename SET Cost=" & Me.tbxCost & " WHERE Expense='" & Me.cbxExpense & "' AND [Month]='" & Me.tbxMonth & ", [Year]=" & Me.tbxYear
End If
可能还需要一些验证代码,以确保在执行查询之前所有四个控件都有数据。
真正的诀窍是确定要将代码放入哪个事件 - 只要其他字段首先输入数据,Cost AfterUpdate就会起作用,否则验证将失败,用户将不得不重新输入成本。
可能有代码在输入上一个值之前不会使每个控件都可用。
月份和年份是保留字,不应使用保留字作为任何名称。
为了排序目的,最好保存月份数而不是月份名称。
为什么要更新一个真正应该是计算的交易记录聚合的值?