Доступ к VBA - распечатать последнюю запись из SQL-запроса - PullRequest
2 голосов
/ 11 января 2010

У меня есть следующий 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 ]

1 голос
/ 11 января 2010

( Редактировать: переставлен, чтобы сосредоточиться на вероятном виновнике)

Нет, вы не можете легко получить последнюю запись. Вы можете попробовать 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. и анализируйте результаты чтобы убедиться, что ваши объединения работают как пожелаешь, и не по ошибке вызывая декартовых результатов, для Пример.
  • Если ваш запрос возвращается законным результаты, то может быть, что законный результат слишком масштабный? Если вы действительно должны получить миллиард результатов, и это тоже много, тогда вам придется изменить свой Вся стратегия или уменьшить столбцы возвращается и т. д.
1 голос
/ 11 января 2010

Я предполагаю, что это выражение:

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

производит числовое переполнение для некоторых записей. Не зная, какие типы данных используют ваши столбцы, я могу рекомендовать только пытаться преобразовать их в «больший» тип данных во время расчета.

0 голосов
/ 12 января 2010

Возможно ли, что часть запроса

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

возвращает 0?Если это так, это может вызвать ошибку, поэтому это могут быть не большие данные, которые являются ошибочными, а данные, которые слишком малы или отсутствуют

...