db.OpenRecordset返回不是记录集的东西;但他们会像查询一样运行

问题描述 投票:2回答:3

我试图通过路线生成账单,所以我将其分解为属于特定路线的客户,然后针对每个客户总计他们的每周费率来编制每月费率。

问题是,即使用SELECT * IN [table]打开记录集也不会返回任何内容,因此必定会有一些明显的错误。这是我的代码,如果有人能帮助我,我将非常感激。

Dim rs As DAO.Recordset
Dim rs2 As DAO.Recordset
Dim rs3 As DAO.Recordset
Dim custNo As Integer
Dim month_total_v As Integer
Dim weekTotal As Integer
Dim weekStart As Date
Dim sql As String

'sql = "SELECT cust_no FROM Roster WHERE route = Forms![routeBill]![route]"

Set rs = CurrentDb.OpenRecordset("SELECT CUST_NO FROM Roster WHERE ROUTE = 'Forms![routeBill]![route]'")

month_total_v = 0

MsgBox ("Boop.")

If Not (rs.EOF) Then
    rs.MoveFirst
    Do Until rs.EOF = True
    MsgBox ("Boop.")
        custNo = rs!CUST_NO
        Set rs2 = CurrentDb.OpenRecordset("SELECT wk_rate, wk_strt_dt FROM Roster WHERE wk_strt_dt >= Forms![routeBill]![Text53] AND wk_strt_dt <= Forms![routeBill]![Text4] AND cust_no = custNo")
        If Not (rs2.EOF And rs2.BOF) Then
            rs2.MoveFirst
            Do Until rs2.EOF = True
                MsgBox "Boop."
                weekStart = WK_STRT_DT
                month_total_v = month_total_v + rs2!WK_RATE
                Set rs3 = CurrentDb.OpenRecordset("SELECT * FROM monthTotal where cust_no = custNo and billMonth=month(weekStart) and billYear=year(weekStart)") 'specify date ranges to pick from to shorten query
                If rs3.EOF Then
                    sql = "INSERT INTO monthTotal (cust_no, month_total, billMonth, billYear) VALUES (custNo, month_total_v, month(weekStart), year(weekStart))" 'Append, record does not exist
                    DoCmd.RunSQL sql
                Else
                    sql = "UPDATE monthTotal SET month_total = month_total_v WHERE cust_no = custNo AND billMonth = month(weekStart) AND billYear = year(weekStart)" 'Update, record exists
                    DoCmd.RunSQL sql
                End If
                rs2.MoveNext
            Loop
        Else
            'pass
        End If
    rs.MoveNext
    Loop
End If
ms-access access-vba
3个回答
4
投票

当所有存储的ROUTE值都不包含文字文本“Forms![routeBill]![route]”时,此查询不会返回任何记录...

SELECT CUST_NO FROM Roster WHERE ROUTE = 'Forms![routeBill]![route]'

在其他地方你有一个WHERE条款,其中包括AND cust_no = custNo。但是,由于custNo是一个VBA变量,因此db引擎对它没有任何了解,并将其解释为您尚未提供值的参数的名称。

您可以通过在DAO.QueryDef中使用参数查询来避免这些类型的问题。然后提供参数值(从表单控件,VBA变量,等等......)并使用QueryDef.OpenRecordset方法加载记录集。

这是一个简单的例子......

Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim rs As DAO.Recordset
Dim strSelect As String

strSelect = "SELECT CUST_NO FROM Roster WHERE ROUTE = [which_route]"
Set db = CurrentDb
Set qdf = db.CreateQueryDef(vbNullString, strSelect)
qdf.Parameters("which_route").Value = Forms![routeBill]![route]
Set rs = qdf.OpenRecordset
With rs
    If .BOF And .EOF Then
        MsgBox "no matches found"
    Else
        .MoveLast
        MsgBox .RecordCount & " matches"
    End If
    .Close
End With

请注意,参数查询技术无需在文本值周围添加引号(然后还可以处理可能包含其中的引号的文本值)并格式化日期/时间值并将它们包含在#分隔符中。


2
投票

问题出在这里:

FROM Roster WHERE wk_strt_dt >= Forms![routeBill]![Text53] AND wk

你应该超出表格![routeBill]![Text53]:

FROM Roster WHERE wk_strt_dt >= " & Forms![routeBill]![Text53] & "  AND wk

0
投票

您还需要正确的日期:

WHERE wk_strt_dt >= #" & Format(Forms![routeBill]![Text53], "yyyy\/mm\/dd") & "# AND wk_strt_dt  ... etc
© www.soinside.com 2019 - 2024. All rights reserved.