【问题标题】:Sql Select Statment in Access VB returning the incorrect valuesAccess VBA中的Sql Select语句返回不正确的值
【发布时间】:2016-12-06 18:55:39
【问题描述】:

我在 Access VB 中编写了以下代码:

strSqlPay = "select * from T_Payment " & _
             "where StudentID = " & Me.ID.value & _
             "  And SchoolYear = """ & Year.value & """"
Set recSetPay = CurrentDb.OpenRecordset(strSqlPay)
countpay = recSetPay.RecordCount

T_Payment 表包含以下信息:

ID  StudentID  SchoolYear  Semester  PaymentType  CheckNumber  AmountDue  AmountPaid  DatePaid

4   468        13          Fall      Check        100          $130.00    $130.00     29-Jul-16
5   468        13          Spring    Check        101           $60.00      $60.00      29-Jul-16
9   468        14          Fall      Check                     $190.00     $190.00      29-Jul-16
11    1        12          Fall      Cash           0            $1.00       $1.00      07-Mar-16

表单触发代码并给出 StudentID = 468 和 SchoolYear = 14。计数返回 3 条记录。不是我要找的。如果我采用相同的语句并在查询中运行它,我会得到我要查找的内容,即 1 条记录。

我还需要弄清楚如何扩展我的 select 语句以包含 Semester = "Fall" 但我不知道如何添加它并使其工作。

我希望我已经提供了足够的信息来帮助我。

谁能帮帮我,谢谢!

【问题讨论】:

  • 该表正确吗?第三行数据比其他行少一个字段。
  • 是的,它没有填写支票号码

标签: sql ms-access select vba


【解决方案1】:
strSqlPay = "SELECT Count(*) AS RecCnt " & _
            "  FROM T_Payment " & _
            " WHERE StudentID = " & Me.ID.Value & _
            "   AND Val(SchoolYear) = " & Me.Year.Value & _
            "   AND UCase(Semester) = ""FALL"""
Set recSetPay = CurrentDb.OpenRecordset(strSqlPay)
countpay = recSetPay.Fields("RecCnt").Value

这假设 SchoolYear 是 alpha 并且 Me.Semester 包含“Fall”或“Spring”。另外,我还没有真正运行过这段代码,所以它可能有错别字。

【讨论】:

  • 我试图让它工作,但我遇到了问题。 SchoolYear 是一个字符串值,Semester 只是文本,而不是表单中的值。本节仅针对秋季学期运行,我将对其进行硬编码,然后让它查找单词“Fall”
  • 我将其修改为仅查找“Fall”
  • 那行得通。太感谢了。我仍然很困惑为什么我会在 vb 代码和在查询中运行时得到不同的值。有什么想法吗?
  • 不确定。我不太相信 DAO RecordSet 的 RecordCount 属性。我怀疑这就是问题所在。您不应该通过将AND 添加到 SQL WHERE 子句来获得更多行。
  • 非常感谢您的帮助
【解决方案2】:

您使用Me.ID.value 获取ID 值,但使用Year.Value 而不是Me.Year.Value 获取年份值。不是 100% 确定,但这可能会返回不正确的记录 - 它可能只是查看 ID = 468 并忽略年份?

正如@StoneGiant 所说 - 是Year 一个文本字段或数字字段,因为您将其视为文本。不过,使用 ' 而不是 " 来换行会更容易。
例如SchoolYear = '" & Year.value & "'

【讨论】:

  • 谢谢,我也试过了,它仍然返回 3 条记录。
  • 如果我只有这个 strSqlPay = "select * from T_Payment where SchoolYear = '" & Me.Year.value & "' 我只得到一条记录
  • 但是当我添加 strSqlPay = "select * from T_Payment where SchoolYear = '" & Me.Year.value & "'" & " And StudentID = " & me.ID.value 我得到 3 条记录再次
【解决方案3】:

您的 select 语句不只过滤最后一条记录。这就是您获得 3 条记录的原因。您必须有一些方法来跟踪这些记录的输入顺序,然后只删除该记录。所以像:

SELECT TOP 1 * 
FROM T_Payment 
WHERE StudentID = Me.ID.value
    AND SchoolYear = Year.value
    AND Semester = 'Fall'
ORDER BY ID DESC 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    相关资源
    最近更新 更多