2010-01-11 53 views
2

我正在执行以下SQL查询,并试图找到为什么在运行查询时返回错误“溢出”。访问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 

回答

1

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

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

专注于选择查询中的总和。拿出来,你可能会有查询工作。它可能是总和压倒sql正在使用的数值类型来添加您的值。其实,我对它的看法越多,可能就是这样。是啊。如果是,你需要强制将一个类型,它可以处理更大的数字,像这样:

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

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

虽然不太可能,这里有一些其他可能的罪犯:

  • 你确定这个查询在逻辑上是正确的 ?该查询可能由 太大导致返回的结果集为 。使用Select Top 1000 etc.语法,并分析结果 以确保您的连接正在按您的意愿工作 ,并且不会错误地导致cartesian结果为cartesian,例如 为例。
  • 如果您的查询返回合法 结果,那么可能是因为合法结果太大? 如果你真的应该得到一个 十亿的结果,这也太 了,那么你就必须改变你的整个 策略,或减少所返回的列 等
+0

查询一直工作到几天前,然后一些新的数据被添加,它停止工作... –

+0

Gotcha。我的猜测(和Tomalak的我想象的)是新数据导致总和过大,而不是数据本身不好。当然,如果你的新记录错误地在其中有巨大的价值,那也会造成这种情况。 –

1

我的猜测是,这个表达式:

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

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

+0

任何方式,我可以通过此sql查询循环所有记录,找出这个溢出可能? –

+0

只需将表达式转换为下一个更大的数据类型即可。无论如何,最终你必须这样做。当然,您可以单独选择所有数字,然后在VBA'While Not rs.EOF ... Wend'循环中计算数字,但这不能解决您的查询问题。 ;-) – Tomalak

+0

btw:对于具有小数位数位数的数字,需要哪种数据类型。大多数这些数据类型是Long Ints –

0

是否有可能查询部分

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

返回0?如果是这样会导致错误,所以它可能不是大数据有问题,但数据太小或不存在

+0

是的,它可能有一些是0.我们如何解决这个问题,而不必做任何太极端的事情? –

+0

你可以尝试使用iif语句来包装它,例如 IIf([My_value] = 0,“如果找到0就把想要显示的东西放进去”,“你真的在这里结算”) –