Инструкция для исправления SQL ошибки «Column unknown PRICE» при построении отчётов в формате FastReport

В связи с разработкой механизма учёта цен и остатков в разрезе предприятия в версии Frontol W32 4.9.3 изменился способ хранения цен товаров в базе данных. Данные изменения могут привести к получению вышеуказанной ошибки, если в пользовательских отчётах в SQL запросе присутствует обращение к полю PRICE таблицы товаров. Если обращение идёт с псевдонимом таблицы товаров, то в ошибке будет присутствовать этот псевдоним, например «Column unknown S.PRICE», в противном случае псевдоним в ошибке будет отсутствовать «Column unknown PRICE».

Рассмотрим процесс устранения ошибки на примере отчёта «Продажи и остатки по товарам».При попытке снятия данного отчёта возвращается следующая ошибка:

Обращаем внимание, что обращение к полю PRICE идёт через псевдоним таблицы товаров S.
Для исправления SQL запроса необходимо зайти в справочник отчётов и открыть отчёт на редактирование:

SQL запросы для получения данных используются в объектах TfrxIBXQuery, которые отображаются в редакторе FastReport в выделенной красным области.
Для редактирования SQL запроса необходимо двойным щелчком по иконке
открыть окно редактирования объекта TfrxIBXQuery:

В SQL запросе нужно найти поле с псевдонимом, который возвращался в ошибке, в нашем случае это S.PRICE. Если данное поле отсутствует в открытом объекте TfrxIBXQuery, то необходимо просмотреть оставшиеся. Если поле найдено, то его следует заменить на подзапрос:

(SELECT R.PRICE
FROM REMAIN R
WHERE R.WAREID = S.ID
AND R.ASPECTVALUE1ID = 0
AND R.ASPECTVALUE2ID = 0
AND R.ASPECTVALUE3ID = 0
AND R.ASPECTVALUE4ID = 0
AND R.ASPECTVALUE5ID = 0
AND R.ENTERPRISEID = (SELECT FIRST 1 VAL
FROM SETTINGS
WHERE NAME = 'EnterpriseID')
) AS PRICE

Причём, если используется псевдоним, то его надо указать в строке WHERE R.WAREID = S.ID, в нашем примере псевдоним был S. Если псевдоним отсутствует, то строка должна выглядеть так WHERE R.WAREID = SPRT.ID.

После замены поля S.PRICE на подзапрос запрос из объекта TfrxIBXQuery будет выглядеть так:


SELECT
S.CODE,
S.NAME,
(SELECT R.PRICE
FROM REMAIN R
WHERE R.WAREID = S.ID
AND R.ASPECTVALUE1ID = 0
AND R.ASPECTVALUE2ID = 0
AND R.ASPECTVALUE3ID = 0
AND R.ASPECTVALUE4ID = 0
AND R.ASPECTVALUE5ID = 0
AND R.ENTERPRISEID = (SELECT FIRST 1 VAL
FROM SETTINGS
WHERE NAME = 'EnterpriseID')
) AS PRICE,
REM.REMAIN,
SAL.SALESCOUNT
FROM
(SELECT R.WAREID, SUM(RD.DELTA) AS SALESCOUNT FROM REMAIND RD
JOIN DOCUMENT D ON D.ID = RD.DOCUMENTID
JOIN REMAIN R ON R.ID = RD.REMAINID
WHERE D.CLOSEDATE BETWEEN :DATEBEG AND :DATEEND
GROUP BY R.WAREID) SAL
JOIN SPRT S ON SAL.WAREID = S.ID
JOIN
(SELECT R.WAREID, -SUM(RD.DELTA) AS REMAIN FROM REMAIND RD
LEFT JOIN DOCUMENT D ON D.ID = RD.DOCUMENTID
JOIN REMAIN R ON R.ID = RD.REMAINID
WHERE (D.CLOSEDATE <= :DATEREM OR D.CLOSEDATE IS NULL)
GROUP BY R.WAREID) REM
ON REM.WAREID = SAL.WAREID
ORDER BY SAL.SALESCOUNT DESCENDING

Изменённый запрос необходимо сохранить при помощи кнопки
Затем закрыть окно редактирования отчёта и карточку отчёта кнопкой ОК.

Рубрики Мастер класс · Таги

Speak Your Mind

Tell us what you're thinking...
and oh, if you want a pic to show with your comment, go get a gravatar!

You must be logged in to post a comment.