Ms access 访问VBA-从SQL查询打印最后一条记录
我正在执行以下SQL查询,并试图找出为什么在运行查询时返回错误“overflow” 现在我想打印它在溢出之前计算的最后一条记录,是否可以使用MS Access VBAMs access 访问VBA-从SQL查询打印最后一条记录,ms-access,debugging,vba,Ms Access,Debugging,Vba,我正在执行以下SQL查询,并试图找出为什么在运行查询时返回错误“overflow” 现在我想打印它在溢出之前计算的最后一条记录,是否可以使用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_Ar
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
我猜这个表达是:
Sum([TotaalPrijs]/([tbl_ArtikelsPerOrder]![Aantal]*[Totaal])*[tbl_ArtikelVerwijderdUitZaaglijst]![Aantal])
为某些记录生成数字溢出。由于不知道列使用的是什么数据类型,我只能建议在计算过程中尝试将它们转换为“更大”的数据类型。(编辑:重新排列以关注可能的罪魁祸首)
不,你不可能轻易得到最后一张唱片。您可以尝试选择前5000名代码>等,如果有效,则提高值,如果无效,则降低值,然后以这种方式归零。但是,不太可能是某个特定的is记录造成了问题。我不认为有什么坏数据。这就是问题所在
关注select查询中的总和。去掉它,您很可能会进行查询工作。很可能是总和超过了sql用于添加值的数字类型。事实上,我越想它,这可能就是它。是 啊如果是,则需要将其强制为可以处理较大数字的类型,如下所示:
选择无稽之谈,求和(将([TotaalPrijs]/([tbl_artikelsperder]![Aantal]*[Totaal])*[tbl_ArtikelVerwijderdUitZaaglijst]![Aantal]作为小数)作为GezaagdeOmzet
MSAccess的语法可能稍有不同,但会是这样的。作为访问,默认值可能是int,在这种情况下,您可以指定Long。否则,请指定Decimal。如果可以的话,尽量避免真实的数字(单身等),如果你不小心,他们会把你搞得一团糟
虽然可能性较小,但以下是一些其他可能的罪魁祸首:
- 您确定此查询在逻辑上是正确的吗
对的此查询可能由以下原因引起:
生成的结果集太大
返回。使用
选择前1000名
等等
语法,并分析结果
以确保联接正常工作
如你所愿,你不会错的
导致结果,例如
例如
- 如果您的查询返回的是合法的
结果,那么可能是
合法的结果太大了?
如果你真的应该得到
10亿个结果,这也是
太多了,那你就得换衣服了
整体策略,或减少列数
被归还等
查询部分是否可能
([tbl_ArtikelsPerOrder]![Aantal]*[Totaal])*[tbl_ArtikelVerwijderdUitZaaglijst]![Aantal])
返回0吗?如果这样会导致错误,那么可能不是大数据出错,而是太小或不存在的数据我是否可以使用此sql查询遍历所有记录以找出溢出的位置?只需将表达式转换为下一个更大的数据类型即可。不管怎样,你最终还是得做。当然,您可以单独选择所有数字,并在VBA中计算数字,而不是rs.EOF…Wend
循环,但这并不能解决您的查询问题。;-)顺便问一下:对于一个小数位数的数字,需要什么样的数据类型。这些数据类型中的大多数都是长Intsso如何将表达式转换为下一个最大的数据类型?因为它没有在任何地方指定数据类型?(即在表达式中)数值表达式的结果类型始终是其中涉及的最大数据类型。因此,如果一个是长的,那么整个事情就是长的。更大的将是双倍的,或者选择你自己:。使用CDbl()
等转换函数来转换类型。查询工作到几天前,然后添加了一些新数据,它停止工作…明白了。我的猜测(和我想象中的托马拉克的)是,新数据导致总和太大,而不是数据本身不好。当然,如果您的新记录中错误地包含大量值,这也会导致这种情况。是的,其中一些可能是0。我们如何解决这个问题而不必做任何极端的事情呢?您可以尝试用一个iif语句来包装它,例如iif([My_value]=0,“如果找到0,则放入您想要显示的内容”,“您在这里实际求和吗”)