C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Invalid floating point operation.. ??, FireBird 1.x + IBX (TIBQuery)
Stimo
Отправлено: 24.02.2005, 11:16


Ученик-кочегар

Группа: Участник
Сообщений: 12



Пишу большой select запрос, который на ходу генерится, с кучей параметров.
При открытии query выдаёт ошибку — Invalid Floating POint Operation. Этот же запрос пишу в IBExpert-e (SQL Editor), он нормально выполняется и нужные мне данные отбирает. Неужели это глюки IBX-а?
Запрос тоже напишу здесь, но вряд ли вы в нём что-то поймёте =).

SQL
select sm.item, sm.summ, kb.description, ic.setr_code,

(select sum(bop.SUMM) from bankopers bop, operations ops where bop.item = sm.item and bop.prix_uxod = 1 and ops.id = bop.opersid and ((ops.operdate LIKE :month1_1) OR (ops.operdate like :month2_1) OR (ops.operdate like :month3_1)) ) as Bank_Prix,

(select sum(bop.SUMM) from bankopers bop, operations ops
where bop.item = sm.item and bop.prix_uxod = 0 and ops.id = bop.opersid and ((cast(ops.operdate as varchar(16)) LIKE :month1_2) OR (cast(ops.operdate as varchar(16)) like :month2_2) OR (cast(ops.operdate as varchar(16)) like :month3_2)) ) as Bank_Ux,

(select sum(xo.SUMM) from xerc_opers xo, operations ops where xo.item = sm.item and ops.id = xo.opersid and ((ops.operdate LIKE :month1_3) OR (ops.operdate like :month2_3) OR (ops.operdate like :month3_3)) ) as Fact_Xerc

from SMETA sm, KASSABALANCE kb, ITEMS_CODE ic
where kb.ITEM = sm.ITEM and ic.item = kb.item and sm.quarter = 1
order by sm.item
AVC
Отправлено: 24.02.2005, 11:46


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE
Запрос тоже напишу здесь, но вряд ли вы в нём что-то поймёте

Куда уж нам сирым. biggrin.gif
Как задаются парметры month?_?
Почему иногда они like operdate, а иногда cast(operdate) — в этом не может быть причина?
Может вместо них использовать константу?

PS. По моему мнению выбрана не самая оптимальная схема построения запроса. Использование Select вместо значения поля скорее всего отсекает оптимизационные возможности сервера. (Но это может быть и не так).
Stimo
Отправлено: 24.02.2005, 15:46


Ученик-кочегар

Группа: Участник
Сообщений: 12



Параметры month?_? задаются, например, вот так (для первого квартала — первые три месяца).

CODE

qryF2->ParamByName("month1_1")->AsString = "%JAN-2004%";
qryF2->ParamByName("month1_2")->AsString = "%JAN-2004%";
qryF2->ParamByName("month1_3")->AsString = "%JAN-2004%";
qryF2->ParamByName("month2_1")->AsString = "%FEB-2004%";
qryF2->ParamByName("month2_2")->AsString = "%FEB-2004%";
qryF2->ParamByName("month2_3")->AsString = "%FEB-2004%";
qryF2->ParamByName("month3_1")->AsString = "%MAR-2004%";
qryF2->ParamByName("month3_2")->AsString = "%MAR-2004%";
qryF2->ParamByName("month3_3")->AsString = "%MAR-2004%";


Так как в FireBird'e нет функций, работающих с датами, приходится так извращаться.. Но дело не в этом, потому что это мой не первый запрос, где я это использую.

Кстати, я ещё кое-что проследил.. Ошибка возникает только в том случае, если (предпосл. строчка в запросе)
where kb.ITEM = sm.ITEM and ic.item = kb.item and sm.quarter = (1 или 3),
а если
where kb.ITEM = sm.ITEM and ic.item = kb.item and sm.quarter = (2 или 4)
никакой ошибки не возникает.. То есть только случае, если sm.quarter нечётный. При чём здесь это? Это меня ещё больше запутало... Блин.


Отредактировано Stimo — 24/02/2005, 15:58
Stimo
Отправлено: 24.02.2005, 16:11


Ученик-кочегар

Группа: Участник
Сообщений: 12



Сори.. ещё кое-что выяснил..
Я комментировал по одному строки, где задаю параметры.. и когда закоментировал строку
qryF2->ParamByName("month1_3")->AsString = "%JAN-2004%";
запрос заработал. То есть этот параметр отстался NULL.

Этот параметр, вроде, ничем от других не отличается. Почему именно он?
Ниччё не понимаю..
AVC
Отправлено: 24.02.2005, 17:41


Ветеран

Группа: Модератор
Сообщений: 1583



Кстати, а почему бы вместо month?_? не использовать between (between предпочтительние символьного сравнения) ?
Типа так
and ops.operdate betwee :kv_first_day and :kv_last_day
Ну а подсчитать на C первый и последний день квартала труда не составит.

Stimo
Отправлено: 25.02.2005, 12:47


Ученик-кочегар

Группа: Участник
Сообщений: 12



Вроде как разобрался, но..

Установил свойство грида (TDBGridEh из библиотеки EhLib) SumList->Active = false и ошибка перестала возникать... Пытался разобраться, в чём дело.. Пришёл к выводу, что TDBGrideh не справляется с очень большими суммами.. при попытке сумировать все записи какого-то поля он и выдавал эту ошибку..
а суммы, примерно, такие — 183 064 787 636 050 (это за весь квартал)

TDBGridEh хранит значение суммы в типе Currency. А он позволяет хранить значения до 922 337 203 685 477.5807.. Это, вроде, меньше чем моя сумма... В чём может быть пролема??

Вернуться в Работа с базами данных в C++Builder