更新与插入的条件
Condition for Update vs insert
我有一个 table tblCosts,它显示在 msaccess 前端,使用户能够添加新条目以及更新现有条目。 table 的结构如下。
ExpenseType Month Year Cost
Hardware June 2017 0
Software July 2017 0
Hardware Sept 2017 0
我有一个更新和插入查询,在 运行 手动时工作正常。
但是,我无法区分何时在表单上触发查询的条件。例如,如果记录存在于table,则应该运行更新查询,如果记录不存在,则应该运行插入查询。
例如,如果有人输入
- 硬件 2017 年 9 月 120 美元
它应该将第 3 个条目从 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
需要表单后面的代码(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
可能还需要一些验证代码来确保所有四个控件在执行查询之前都有数据。
真正的诀窍是弄清楚将代码放入哪个事件 - 只要其他字段先输入数据,更新后成本就会起作用,否则验证将失败,用户将不得不重新输入成本。
可能有代码在输入先前的值之前不使每个控件可用。
月份和年份是保留字,不应使用保留字作为任何名称。
为了排序目的,最好保存月份数字而不是月份名称。
为什么要更新一个真正应该是交易记录计算聚合的值?
我有一个 table tblCosts,它显示在 msaccess 前端,使用户能够添加新条目以及更新现有条目。 table 的结构如下。
ExpenseType Month Year Cost
Hardware June 2017 0
Software July 2017 0
Hardware Sept 2017 0
我有一个更新和插入查询,在 运行 手动时工作正常。
但是,我无法区分何时在表单上触发查询的条件。例如,如果记录存在于table,则应该运行更新查询,如果记录不存在,则应该运行插入查询。
例如,如果有人输入
- 硬件 2017 年 9 月 120 美元
它应该将第 3 个条目从 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
需要表单后面的代码(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
可能还需要一些验证代码来确保所有四个控件在执行查询之前都有数据。
真正的诀窍是弄清楚将代码放入哪个事件 - 只要其他字段先输入数据,更新后成本就会起作用,否则验证将失败,用户将不得不重新输入成本。
可能有代码在输入先前的值之前不使每个控件可用。
月份和年份是保留字,不应使用保留字作为任何名称。
为了排序目的,最好保存月份数字而不是月份名称。
为什么要更新一个真正应该是交易记录计算聚合的值?