访问VBA - 从SQL查询打印最后一条记录

时间:2010-01-11 14:11:06

标签: ms-access vba debugging access-vba

我正在执行以下SQL查询,并且我正在尝试查找运行查询时返回错误“溢出”的原因。

现在我想在进入溢出之前打印它计算的最后一条记录,这是否可以使用MS Access VBA?

Private Sub Command0_Click()
Dim sql As String
Dim rs As DAO.Recordset
Dim db As DAO.Database

    Set db = CurrentDb()

    sql = "SELECT DatumNaarWeeknummer([tbl_ArtikelVerwijderdUitZaaglijst]![RegistratieDatum]) AS WeeknummerGezaagdeOmzet, " _
    & "Sum([TotaalPrijs]/([tbl_ArtikelsPerOrder]![Aantal]*[Totaal])*[tbl_ArtikelVerwijderdUitZaaglijst]![Aantal]) AS GezaagdeOmzet " _
    & "FROM (((tbl_ArtikelsPerOrder LEFT JOIN qry_Actieve_Orders ON tbl_ArtikelsPerOrder.OrderID = qry_Actieve_Orders.OrderID) LEFT JOIN qry_ArtikelPerOrderID_EenheidsPrijsBijFranco ON tbl_ArtikelsPerOrder.ArtikelsPerOrderID = qry_ArtikelPerOrderID_EenheidsPrijsBijFranco.ArtikelsPerOrderID) " _
    & "LEFT JOIN qry_AantalArtikelTypesPerArtikelPerOrder ON tbl_ArtikelsPerOrder.ArtikelsPerOrderID = qry_AantalArtikelTypesPerArtikelPerOrder.ArtikelsPerOrderID) " _
    & "RIGHT JOIN tbl_ArtikelVerwijderdUitZaaglijst ON tbl_ArtikelsPerOrder.ArtikelsPerOrderID = tbl_ArtikelVerwijderdUitZaaglijst.ArtikelsPerOrderID " _
    & "GROUP BY DatumNaarWeeknummer([tbl_ArtikelVerwijderdUitZaaglijst]![RegistratieDatum]);"

    Set rs = db.OpenRecordset(sql, dbOpenDynaset)
    End Sub

3 个答案:

答案 0 :(得分:1)

我猜是这个表达式:

Sum([TotaalPrijs]/([tbl_ArtikelsPerOrder]![Aantal]*[Totaal])*[tbl_ArtikelVerwijderdUitZaaglijst]![Aantal])

为某些记录生成数字溢出。不知道列使用的数据类型,我只建议在计算过程中尝试将它们转换为“更大”的数据类型。

答案 1 :(得分:1)

编辑:重新排列,专注于可能的罪魁祸首)

不,你不能轻易获得最后一条记录。您可以尝试Select Top 5000 . . .等,如果它有效则提高值,如果不有则降低值,并以此方式为零。但是,特定记录不太可能导致问题。我不认为某处有坏数据。这是查询。

关注选择查询中的Sum。拿出来,你可能会有查询工作。很可能总和超过了sql用来添加值的数字类型。实际上,我越是想到它,这可能就是它。是啊。如果是,您需要将其强制转换为可以处理更大数字的类型,如下所示:

SELECT blah blah, SUM(CAST([TotaalPrijs]/([tbl_ArtikelsPerOrder]![Aantal]*[Totaal])*[tbl_ArtikelVerwijderdUitZaaglijst]![Aantal] AS DECIMAL)) AS GezaagdeOmzet

MSAccess的语法可能略有不同,但它会是这样的。作为Access,默认值可能是int,在这种情况下,您可以指定Long。否则,请指定Decimal。如果可以的话,尽量避免使用真实数字(单身等),如果你不小心,他们会把你搞砸。

虽然不太可能,但这里还有一些其他可能的罪魁祸首:

  • 您确定此查询是逻辑上的 正确?此查询可能由以下原因引起 结果集太大了 回。使用Select Top 1000 etc.语法,并分析结果 确保你的联接工作正常 如你所愿,并没有错误 导致cartesian结果 示例
  • 如果您的查询返回合法 结果,然后可能是那个 合法的结果太大了? 如果你真的应该得到一个 十亿结果,这也是 很多,那么你将不得不改变你的 整个策略,或减少列 被退回等等。

答案 2 :(得分:0)

是否可能是查询的一部分

([tbl_ArtikelsPerOrder]![Aantal]*[Totaal])*[tbl_ArtikelVerwijderdUitZaaglijst]![Aantal])

回归0?如果这样会导致错误,那么可能不是大数据有故障但数据太小或不存在