仅当从另一个查询中选择时,SQL Select 语句才突然检索错误值

Posted

技术标签:

【中文标题】仅当从另一个查询中选择时,SQL Select 语句才突然检索错误值【英文标题】:SQL Select statement suddenly retrieving wrong value only when selecting form another query 【发布时间】:2017-09-20 23:06:22 【问题描述】:

我在 Access 数据库中有一个订单创建表单,用户在其中选择产品并使用 SQL 选择语句触发 VBA 代码以检索该产品的当前可用性。这是它的设置方式:

    我有一个 Packages 表,其中将产品批次添加到库存中。 我有一个 OrderDetail 表,其中将产品批次中的项目分配给订单。 我有一个 InventoryPrep 查询,其中包含每批包装的总数和字段,该字段汇总了 OrderDetail 表中每批分配的产品数量。 然后我有一个库存查询,它有一个计算字段,该字段从 InventoryPrep 查询中获取 TotalPackaged 字段,并从 InventoryPrep 查询中减去 TotalAllocated 字段。

这是我表单中的 VBA 代码,由 [Batch] 组合框的更新触发:

Dim VBatch As String
VBatch = Me.Batch.Value
Dim VAvail As Double
Dim mysql As String
Dim conn1 As ADODB.Connection
Set conn1 = CurrentProject.Connection
Dim rs1 As New ADODB.Recordset
rs1.ActiveConnection = conn1

mySQL = "SELECT Available FROM Inventory WHERE BatchID = " & "'" & VBatch & "'"
        rs1.Open mySQL
        rs1.MoveFirst
        VAvail = rs1.Fields("Available").Value
        Forms!ChangeOrders.ChangeOrderSubform.Form.Availability.Value = VAvail
        rs1.Close
        conn1.Close
        Set rs1 = Nothing
        Set conn1 = Nothing

这几周来一直运行良好,在将打包商品添加到 Packages 表中并在 OrderDetail 表中添加订单时检索正确的可用数量。昨天它开始从 InventoryPrep 查询返回 Packaged 字段。

我尝试了很多方法,然后从查询中创建了一个表,并使用 SELECT 语句在表中查找它。那行得通。我的查询设置有一些问题导致它停止识别我的计算字段。我需要帮助!

这是我第一次发帖,我希望这是足够的信息。我对 Access 和 VBA 还很陌生,但我从这个论坛的阅读中学到了很多东西。我希望有人可以提供帮助或让我知道还有哪些其他信息可以阐明这个问题。

【问题讨论】:

我应该提供什么信息?这是我的第一篇文章。我通常可以通过故障排除或阅读其他人的问题来解决问题。我迷路了。 我重写了这个问题。希望更清楚。 VBatch的值是多少?如果您设置断点并复制生成的确切 sql 查询,您是说它返回的不是 Inventory 表吗? 另外我对VBA不太了解,但这很容易发生sql注入。如果 VBatch 正在接受用户输入,他们可以轻松地对您的数据库做他们想做的事情 我很好奇为什么您在mySQL 中选择字段Available,但能够从字段FlowerAvailable 中获取值。这就是你所有的代码吗?另外,查询会返回多于 1 行吗? 【参考方案1】:

要从表或查询中读取单个值,您的代码有点过头了。

对于这种情况,Access 具有 DLookup function。

VAvail = DLookup("Available", "Inventory", "BatchID = '" & VBatch & "'")
Forms!ChangeOrders.ChangeOrderSubform.Form.Availability.Value = VAvail

这就是我们所需要的。

【讨论】:

哇,我没有意识到我能做到这一点。非常感谢!

以上是关于仅当从另一个查询中选择时,SQL Select 语句才突然检索错误值的主要内容,如果未能解决你的问题,请参考以下文章

SQL 编译错误:无法评估不受支持的子查询类型 - SELECT 子句中的函数调用

仅当字段为空时才更新来自 select 语句的查询

仅当从警报调用时,如何向第二个向下钻取View Controller添加按钮?

SQL结构化查询语——之DQL语言

甲骨文:SQL;当且仅当一列更改时选择不同的记录

Oracle SQL:从一个表中选择一个计数,从另一个表中使用子查询缩小选择范围