我维护一个管理预测、库存和采购的MS Access数据库。
有时我需要更新所有项目的预测或库存,有时我只需要更新单个仓库,有时我需要更新单个项目。
这些过程由表单控制,通常从删除现有表开始,所以我将重点关注这三个查询。
要删除所有,用户按下所有按钮,运行如下:
DELETE Forecast_Days.*
FROM Forecast_Days;
要删除特定仓库的所有记录,用户按下该仓库行上的按钮:
DELETE Forecast_Days.*
FROM Forecast_Days
WHERE [Forecast_Days]![Whse]=[Forms]![frm_Forecast_Update]![Whse_t];
要删除单个项目的单个记录,用户以另一种形式按下该特定项目的按钮:
DELETE Forecast_Days.*
FROM Forecast_Days
WHERE [Forecast_Days]![Whse]=[Forms]![frm_Forecast_Item_Edit]![Whse_t] AND
[Forecast_Days].[Item]=[Forms]![frm_Forecast_Item_Edit]![Item_t];
这只是一系列过程中的第一步。对于每个流程,我需要创建一个_all、_whse和_item查询;唯一的区别是WHERE语句。
为了减少混乱和简化维护:是否有一种方法可以设置这个,以便我从按钮注入WHERE语句到基本查询。
或者是否有一种方法来编写一个查询,查看所有潜在的参数?我与这种方法的斗争是,如果我从表单A中按下按钮,我不希望查询提示用户输入通常来自表单b的值。
@HansUp为我提供了所需的大致方向。我想我应该发表一个答案并关闭这个线程。
假设下面是一个名为"Delete_Forecast_Days"的保存查询
DELETE Forecast_Days.*
FROM Forecast_Days
在VBA中,我可以做以下操作:
Dim whereStr as String
Dim sqlStr as String
whereStr = " WHERE Whse='" & [Forms]![frm_Forecast_Update]![Whse_t] & "';"
sqlStr = CurrentDb.QueryDefs("Delete_Forecast_Days").SQL
sqlStr = left(sqlStr, Len(sqlStr) - 3) & whereStr
CurrentDb.Execute sqlStr, dbFailOnError
这将从保存的查询中抓取SQL,删除";
最终,我决定反对这种方法,因为我不想发现自己在6个月内改变查询并得到意外的错误,因为我在VBA中编写的WHERE语句不再与该查询一起工作。