Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема ISNULL (число прочтений - 4892 )
DrunkProgrammer
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 128
Зарегистрирован: 28. Декабря 2007
ISNULL
13. Марта 2009 :: 11:41
Печать  
Доброе время суток!
У меня dbf-ная база. Почему-то не работает функция ISNULL, точнее она работает как функция, проверяющая, является ли переданное значение null, но вот как функция для подстановки определенного значения в случае null, не работате, т.е.
SELECT ISNULL(ddd,55)
выкидывает ошибку:
Too many arguments
  
Наверх
 
IP записан
 
Злой Бобр
Junior Member
**
Отсутствует



Сообщений: 56
Местоположение: Украина, Кривой Рог
Зарегистрирован: 07. Марта 2009
Пол: Мужской
Re: ISNULL
Ответ #1 - 13. Марта 2009 :: 12:58
Печать  
Попробуй в кавычки число вогнать '55'.
  

Если у вас есть деньги тогда мы идем к вам!!!
Наверх
ICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: ISNULL
Ответ #2 - 13. Марта 2009 :: 13:38
Печать  
Из документации
Цитата:

ISNULL( ), функция

ISNULL(eExpression)

Параметры
eExpression
Определяет некоторое выражение.

Возвращает значение = true (.T.), если заданное выражение = Null; в другом случае, ISNULL( ) возвращает значение = false (.F.).


Один параметр.
Too many arguments - слишком много аргументов

Для нескольких если имелось ввиду coalesce ( http://msdn.microsoft.com/ru-ru/library/ms190349.aspx ; ):
ICASE( ISNULL(ddd),55,ddd) as Коалиция
  
Наверх
 
IP записан
 
DrunkProgrammer
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 128
Зарегистрирован: 28. Декабря 2007
Re: ISNULL
Ответ #3 - 14. Марта 2009 :: 04:10
Печать  
Выдал
File 'coalesce.prg' does not exist
  
Наверх
 
IP записан
 
DrunkProgrammer
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 128
Зарегистрирован: 28. Декабря 2007
Re: ISNULL
Ответ #4 - 14. Марта 2009 :: 04:20
Печать  
Я конечно же пытался использовать IIF и ICASE, но у меня выскакивает какой-то глюк.
Короче говоря есть запрос в результате которого есть два поля: процент и количество.
В некоторых случаях поле процент может содержать null, а нужно чтобы содержало какое-нибудь другое значение, например 0.11, т.к. по этому полю я делаю соединение.
Ну так вот приведу первые строки своего запроса:
Код
Выбрать все
SELECT
   Процент,
   COUNT(ИсточникСкидки) as КоличествоКарт
FROM
.................... 



В результате запроса за некоторый период получаю:
Процент | КоличествоКарт
null | 46056
7 | 9106
10 | 2563




Далее я изменяю одну строку в своем запросе:
Код
Выбрать все
SELECT
  IIF(ISNULL(Процент),0.11) as Процент,
   COUNT(ИсточникСкидки) as КоличествоКарт
FROM
............................................... 



а в результате получаю такую хрень:
Процент | КоличествоКарт
0.11 | 46056
7 | 9106
7 | 2563



Получается, что в последнюю строку значение как бы копируется из предыдущей, вот я и подумал, что может если использовать IsNull с двумя параметрами, то вопрос получится решить.
  
Наверх
 
IP записан
 
DrunkProgrammer
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 128
Зарегистрирован: 28. Декабря 2007
Re: ISNULL
Ответ #5 - 14. Марта 2009 :: 06:03
Печать  
Нашел я дорогу для обхода глюка.

Как я уже писал у меня получилась следующая хрень:

Процент      |      КоличествоКарт
0.11      |      46056
7      |      9106
7      |      2563

где последнее значение процента должно быть равно 10. Оказалось, что все дело в самом первом значении (0.11), т.к. при получении результата запроса формат поля автоматически преобразовался в числовой с ограничениями по числу 0.11, т.е. один разряд до запятой. Когда же я изменил строку запроса так:

Код
Выбрать все
SELECT
  IIF(ISNULL(Процент),11.11) as Процент,
   COUNT(ИсточникСкидки) as КоличествоКарт
FROM
...............................................  



то все встало на свои места.
Но все равно это было нездорово. Вот если бы 10 преобразовалось бы в 1, тогда еще это можно было назвать нормальным, но когда из-за разрядности вместо 10 подставлялось значение из предыдущей строки, то это уже бага.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: ISNULL
Ответ #6 - 14. Марта 2009 :: 06:54
Печать  
Это достаточно хорошо известное свойство фокса - форматировать столбец
по первому значению поля.
Иначе бы ему пришлось перестраивать временный столбец во время выполнения соединения.

Правильно писать
IIF(ISNULL(Процент),00.11,Процент) as Процент,

в общем случае столько нулей сколько размерность Процент, например 000000000.00000
http://www.1cpp.ru/forum/YaBB.pl?num=1208438113/22#22
  
Наверх
 
IP записан
 
DrunkProgrammer
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 128
Зарегистрирован: 28. Декабря 2007
Re: ISNULL
Ответ #7 - 14. Марта 2009 :: 08:30
Печать  
Я тут подумал, может ведь возникнуть ситуация, когда первым значением будет не null, преобразованный в 11.11, а например 7. В этом случае число 10 опять же срежется. Не подскажете, каким оператором можно назначить формат и разрядность поля?
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: ISNULL
Ответ #8 - 14. Марта 2009 :: 12:01
Печать  
DrunkProgrammer писал(а) 14. Марта 2009 :: 08:30:
Я тут подумал, может ведь возникнуть ситуация, когда первым значением будет не null, преобразованный в 11.11, а например 7. В этом случае число 10 опять же срежется. Не подскажете, каким оператором можно назначить формат и разрядность поля?


7 не будет. Там же будет число 07.00

Но если очень хочется
Цитата:

CAST(eExpression AS cDataType [(nFieldWidth [, nPrecision])]   [NULL | NOT NULL])



Справка
от разработчика http://msdn2.microsoft.com/en-us/library/aa468129.aspx
на русском,обновляется       http://www.foxclub.ru/rhproject/project/
ввиде chm       http://www.1cpp.ru/forum/YaBB.pl?num=1185783552 (можно искать по ключевым словам)

OFF : есть еще интересная редкоиспользуемая функция
TRANSFORM(eExpression, [cFormatCodes])

аналог Формат() в 1С - для "красивого" отображения в отчетах и табличном поле.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать