2010-01-11 80 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就把想要顯示的東西放進去」,「你真的在這裏結算」) –