Необъяснимая ошибка «недопустимая операция» в запросе Access с бэкэндом SQL - PullRequest
0 голосов
/ 26 апреля 2019

Я пытаюсь перенести весь бэкэнд приложения Access на SQL Server. Первая часть моего проекта включает перемещение всех таблиц с минимальными изменениями после миграции (пока нет ни SQL-запросов, ни сквозных запросов и т. Д.).

У меня есть два запроса, которые я использую здесь:

ProductionSystemUnAllocatedPurchases - который успешно выполняет и возвращает набор результатов.

ProductionSystemUnAllocatedPurchases_Screenshot Это полная формула (извините, она чрезвычайно сложна) для QtyAvailableOnPurchase:

QtyAvailableOnPurchase: Я полагаю, что это поле может быть проблемой здесь?

IIf((IIf([Outstanding Qty]>([P-ORDER-T with Qty Balance]![QTY]-[SumOfQty]), 
([P-ORDER-T with Qty Balance]![QTY]-[SumOfQty]),[Outstanding Qty]))>0, 
(IIf([Outstanding Qty]>([P-ORDER-T with Qty Balance]![QTY]-[SumOfQty]),([P- 
ORDER-T with Qty Balance]![QTY]-[SumOfQty]),[Outstanding Qty])),0)

ProductionSystemUnAllocatedPurchasesTotal - выдает сообщение об ошибке «Недопустимая операция»

ProductionSystemUnAllocatedPurchasesTotal_Screenshot

Теперь странно для меня то, что первый запрос работает отлично, но второй, который использует первый в качестве исходной таблицы, выдает мне это сообщение об ошибке при выполнении. Этот запрос прекрасно работает с бэкэндом доступа, но не работает с таблицами SQL Server. Есть идеи?

Ответы [ 3 ]

2 голосов
/ 26 апреля 2019

Может ли QtyAvailableOnPurchase быть NULL?Это объясняет, почему Sum терпит неудачу.Вместо этого используйте Nz(QtyAvailableOnPurchase,0).

1 голос
/ 02 мая 2019

Мне удалось найти решение этой ошибки. Кажется, что проблема не столько в запросе, сколько в типе данных на SQL Server. Помощник по миграции SQL Server (SSMA) автоматически сопоставляет любые числовые (двойные) поля с плавающими на SQL Server. Это отображение необходимо вручную изменить на Десятичное.

Теперь, согласно этому сообщению SO, десятичная дробь является предпочтительной по своей точности до 38 баллов (что более чем достаточно для моего приложения), в то время как float допускает более этого, данные хранятся в приблизительных значениях.

Источник: Разница между числовым, плавающим и десятичным в SQL Server

1 голос
/ 26 апреля 2019

Мой подход заключается в разложении запросов. Создайте два запроса:

  1. Первый запрос выбирает необходимые данные

  2. Во втором запросе применяются групповые операции (например, сумма)

Вы получите простой способ проверить каждый шаг.

...