Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access 访问VBA-从SQL查询打印最后一条记录_Ms Access_Debugging_Vba - Fatal编程技术网

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

Ms 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

我正在执行以下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_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,则放入您想要显示的内容”,“您在这里实际求和吗”)