Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];

Вниз

iif в Запросе   Найти похожие ветки 

 
Vopros   (2007-01-04 07:09) [0]

Доброго времени суток, уважаемые Мастера!
Использую таблицы 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, или может ей есть какая-либо замена. Спасибо.


 
ЮЮ ©   (2007-01-04 08:11) [1]


> Подскажите, как можно корректно работать с 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)


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


>
>
> Использовать 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 09:10) [3]

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


 
ЮЮ ©   (2007-01-04 09:12) [4]

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

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


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


> А как насчет
> 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 пункту?


 
sniknik ©   (2007-01-04 11:07) [6]

> и неужели с 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 BY or 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.


 
sniknik ©   (2007-01-04 11:15) [7]

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


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


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

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

> occur, typically during GROUP BY

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

> sniknik

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


 
Desdechado ©   (2007-01-05 11:20) [9]

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


 
Anatoly Podgoretsky ©   (2007-01-05 12:55) [10]

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

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


 
sniknik ©   (2007-01-05 13:17) [11]

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

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


 
sniknik ©   (2007-01-05 13:37) [12]

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


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


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

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


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

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


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


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


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


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


> CAST

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


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


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

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


 
ЮЮ ©   (2007-01-12 07:51) [17]

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


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


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

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


 
ЮЮ ©   (2007-01-12 09:03) [19]


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


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

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


 
Anatoly Podgoretsky ©   (2007-01-12 13:22) [20]

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

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



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.041 c
2-1168587328
Access
2007-01-12 10:35
2007.01.28
"ОписАние"


2-1168630655
Moholith
2007-01-12 22:37
2007.01.28
Поиск фрагментов строки и фрагментов слова.


15-1167850639
Kolan
2007-01-03 21:57
2007.01.28
Не пойму почему код работает :)


15-1168345518
vasIzmax
2007-01-09 15:25
2007.01.28
"Рукопись"


15-1168445011
Галинка
2007-01-10 19:03
2007.01.28
Сделать из зеленого красное





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский