Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

iif в Запросе [D7, XP]


Vopros ©   (2007-01-04 07:09:00) 

Доброго времени суток, уважаемые Мастера!
Использую таблицы fox pro, ADOQuery.
1.В таблице есть поле цены (price) за упаковку и поле количества штук в упаковке (kol) (причем если в упаковке 1 штука, то в поле количества указан 0), через запрос пытаюсь рассчитать стоимость одной штуки:
select iif(kol==0,price,price/kol) from table
При этом выходит ошибка "Invalid floating point operation". Если же price поделить на 1 (соответственно результат будет целое число), ошибок не выходит. Как можно с помощью iif получить вещественные числа?

2.Также с помощью iif не могу получить текстовый результат для поля размером большим 7 символов. (Например iif (pole==1,'Хорошо','Великолепно') , результат false будет урезанным типа 'Великол' и если использовать группировку, то возникает ошибка что-то типа "error building sort key", если же вместо "Великолепно" написать "Отлично", то все проходит нормально)
Подскажите, как можно корректно работать с iif, или может ей есть какая-либо замена. Спасибо.


Anatoly Podgoretsky   (2007-01-12 13:22:00) [1]

> ЮЮ  (12.01.2007 07:51:17)  [17]

kol может быть меньше нуля


ЮЮ   (2007-01-12 09:03:00) [2]


> ничего не понимаю - с одной таблицей проходит, с большинством
> нет, ругается типа "деление на ноль", непосредственно в
> Foxpro запрос выполняется нормально со всеми таблицами,
> а вот в делфи никак - или сам делфи, или провайдер кривой
> какой (хотя брался с сайта мелкософта) ???


Или на клиенте (в обработчике) пытаешься манипулировать данными.
ругается типа "деление на ноль" - из этого ыфыода не сделаешь.
даже "Invalid floating point operation" больше смахивает на дельфийскую ошибку, чем на ADO-шную.

Пора, наверное, отладчик использовать :)


VOPROS   (2007-01-12 08:27:00) [3]


> а более безопасное   iif(kol > 0, price/kol, price) ну никак
> не желаешь попробовать?

ну конечно, уже испробовано :) - результат тот же :(


ЮЮ   (2007-01-12 07:51:00) [4]

а более безопасное   iif(kol > 0, price/kol, price) ну никак не желаешь попробовать?


VOPROS   (2007-01-12 06:59:00) [5]


> с select cast(iif(kol==0,price,price/kol) as numeric (5,
> 2)) as price_one from table мне помог - спасибо

ничего не понимаю - с одной таблицей проходит, с большинством нет, ругается типа "деление на ноль", непосредственно в Foxpro запрос выполняется нормально со всеми таблицами, а вот в делфи никак - или сам делфи, или провайдер кривой какой (хотя брался с сайта мелкософта) ???


VOPROS   (2007-01-11 13:42:00) [6]


> CAST

с select cast(iif(kol==0,price,price/kol) as numeric (5,2)) as price_one from tableмне помог - спасибо


try   (2007-01-05 15:14:00) [7]


> попробуй вместо этого iif(pole==1,'Хорошо','Великолепно')
> это iif(pole=1,'Хорошо     ','Великолепно')


попробуй вместо этого iif(pole==1,'Хорошо','Великолепно') это iif(pole<>1,'Великолепно','Хорошо')


VOPROS   (2007-01-05 15:10:00) [8]


> попробуй вместо этого iif(pole==1,'Хорошо','Великолепно')
> это iif(pole=1,'Хорошо     ','Великолепно')

хм, а ларчик просто открывался :)


> не лучше ли группировать по оригинальному числу, а уже в
> результирующем делать замену? по числу будет гораздо быстрей.

спасибо за совет


sniknik   (2007-01-05 13:37:00) [9]

> когда пытаюсь использовать GROUP BY
блин не обратил сразу внимания...
ты чего же сначала из интежера делаешь строку а после групируешь по строке? солидности программе(/тормозов) пытаешся добиться?
не лучше ли группировать по оригинальному числу, а уже в результирующем делать замену? по числу будет гораздо быстрей.


sniknik   (2007-01-05 13:17:00) [10]

> стоит Microsoft OLE DB Provider for Visual FoxPro 9.0
аналогично и проблем подобно описанным нет.

> но как же тогда заfixed эту самую  length
легко, но не могу проверить... (не могу глюк сэмулировать)
попробуй вместо этого iif(pole==1,'Хорошо','Великолепно') это iif(pole=1,'Хорошо     ','Великолепно')


Anatoly Podgoretsky   (2007-01-05 12:55:00) [11]

> Desdechado  (05.01.2007 11:20:09)  [9]

А провайдер поддерживает?
Тогда да.


Desdechado   (2007-01-05 11:20:00) [12]

> как же тогда заfixed эту самую  length, чтоб она была более 7 симоволов
CAST
?


VOPROS   (2007-01-05 06:24:00) [13]


> нельзя, т.к. он тут не причем

ни при чем, т.к. просто price/kol сделать тоже нельзя :(, статью почитаю - спасибо

> occur, typically during GROUP BY

действительно ошибка выходит, когда пытаюсь использовать GROUP BY, но как же тогда заfixed эту самую  length, чтоб она была более 7 симоволов

> sniknik

стоит Microsoft OLE DB Provider for Visual FoxPro 9.0


sniknik   (2007-01-04 11:15:00) [14]

вообще, первым делом, прежде чем разбираться, обновил бы драйвер фокса... (как знать, может у тебя настолько древний, что еще не поддерживает varchar... а соответственно не видит разницы между ним и мемо)


sniknik   (2007-01-04 11:07:00) [15]

> и неужели с iif ничего нельзя сделать ни по 1, ни по 2 пункту?
нельзя, т.к. он тут не причем (болит голова а уколы назначили знаете куда? она то тут при чем... :). проблема в чемто другом (чтото у тебя неладно в работе с числами/данными)

возможный вариант по 1
http://www.delphikingdom.com/asp/viewitem.asp?catalogID=1217

по 2, не нашел в инете, с локального хелпа

Error building sort key (Error 2186)

This error is generated when sort key truncation is about to occur, typically during GROUP BY, ORDER BYor other sorting operations. This can happen with use of a sort key that contains an expression, such as a Memo field, whose length is not fixed.


VOPROS   (2007-01-04 10:26:00) [16]


> А как насчет
> P.S. может быть есть записи, где  kol IS NULL?  И тогда
> заменить условие
> iif(kol > 0, price/kol, price)

нет, так ему не нравится тоже, кстати значения NULL нет


> Что-то не нравится мне твой "агрегирующий" за прос :)

вообще-то да, агрегатные я, наверное, функции использовать не буду, HAVING или WHERE там видно будет, вопрос не в предикате, а в

SELECT <куча полей>,price from table  JOIN... GROUP BY.. . <прочие условия> AND kol = 0
UNION
SELECT <куча полей>,price/kol from table  JOIN... GROUP BY... <прочие условия> AND kol > 0

так и использовать? а не будет ли запрос слишком тяжелым? и неужели с iif ничего нельзя сделать ни по 1, ни по 2 пункту?


ЮЮ   (2007-01-04 09:12:00) [17]

GROUP BY... HAVING...  kol = 0SELECT <куча полей>, pricefrom table  JOIN... GROUP BY... HAVING...   kol = 0

Что-то не нравится мне твой "агрегирующий" за прос :)


ЮЮ   (2007-01-04 09:10:00) [18]

А как насчет
P.S. может быть есть записи, где  kol IS NULL?  И тогда заменить условие
iif(kol > 0, price/kol, price)


VOPROS   (2007-01-04 08:52:00) [19]


>
>
> Использовать UNION, например
>
> select price from table where (kol = 0) or (kol IS NULL)
> union
> select price/kol from table


У меня на самом деле будет очень длинный запрос с кучами полей,кучей связей с таблицами и условиями. Мне тогда необходимо дважды написать запрос? Типа:
SELECT <куча полей>,price from table  JOIN... GROUP BY... HAVING...  kol = 0
UNION
SELECT <куча полей>,price/kol from table  INNER JOIN... GROUP BY... HAVING... kol > 0


ЮЮ   (2007-01-04 08:11:00) [20]


> Подскажите, как можно корректно работать с iif, или может
> ей есть какая-либо замена


Использовать UNION, например

select price from table where (kol = 0) or (kol IS NULL)
union
select price/kol from table where (kol > 0)

P.S. может быть есть записи, где  kol IS NULL?  И тогда заменить условие
iif(kol > 0, price/kol, price)


Наверх

Титульная страница Поиск, карта сайта Написать письмо