更新条件与插入

时间:2017-08-20 16:11:16

标签: sql ms-access ms-access-2013 ms-access-2016

我有一个表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

1 个答案:

答案 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就会起作用,否则验证将失败,用户将不得不重新输入成本。

可能有代码在输入上一个值之前不会使每个控件都可用。

月份和年份是保留字,不应使用保留字作为任何名称。

为了排序目的,最好保存月份数而不是月份名称。

为什么要更新一个真正应该是计算的交易记录聚合的值?