Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) ICASE и IIF (число прочтений - 9742 )
Rubin
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 70
Зарегистрирован: 31. Июля 2007
ICASE и IIF
13. Августа 2007 :: 11:57
Печать  
Возникла проблема с условием в селекте:

Код:
Код
Выбрать все
ICASE(((Журн.$ОбщийРеквизит.Автор = $Клиенты.Менеджер) AND
	   (1-($ПТ.НДС+$ПТ.Стоимость)/$ПТ.Оборот >= :Процент) AND
	   ($ПТ.КодОперации <> :КО)),1,0) as СуммаОборот 


работает абсолютно нормально... То есть в результате СуммаОборот = 1 или 0

А код:
Код
Выбрать все
ICASE(((Журн.$ОбщийРеквизит.Автор = $Клиенты.Менеджер) AND
	   (1-($ПТ.НДС+$ПТ.Стоимость)/$ПТ.Оборот >= :Процент) AND
	   ($ПТ.КодОперации <> :КО)),$ПТ.Оборот,0) as СуммаОборот 



возвращает все нули (хотя должны быть либо нули, либо значение "оборот"), и если сделать отдельно выборку по $ПТ.Оборот:
Код
Выбрать все
$ПТ.Оборот as СуммаОборот 


все выполняет правильно.
« Последняя редакция: 13. Августа 2007 :: 13:19 - Rubin »  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ICASE и IIF
Ответ #1 - 13. Августа 2007 :: 12:38
Печать  
Я что-то не вижу отличий в этих запросах. Или плохо смотрю?
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: ICASE и IIF
Ответ #2 - 13. Августа 2007 :: 12:42
Печать  
а почему в первом >= :ПроцентЦифр , а во втором >= :Процент ?
  

1&&2&&3
Наверх
 
IP записан
 
Rubin
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 70
Зарегистрирован: 31. Июля 2007
Re: ICASE и IIF
Ответ #3 - 13. Августа 2007 :: 13:18
Печать  
trad писал(а) 13. Августа 2007 :: 12:42:
а почему в первом >= :ПроцентЦифр , а во втором >= :Процент ?


))) Это одно и то же, не обращайте внимания

Разница:
1. ICASE(Условие,1,0) as СуммаОборот
2. ICASE(Условие,$ПТ.Оборот,0) as СуммаОборот
Где ПТ = регистр остатков (ПартииТоваров)

Первое условие, само собой нормально работает, а второе - никак
  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ICASE и IIF
Ответ #4 - 13. Августа 2007 :: 14:21
Печать  
А если нолик кастануть до типа $ПТ.Оборот?
  
Наверх
ICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: ICASE и IIF
Ответ #5 - 13. Августа 2007 :: 14:27
Печать  
Полностью скопируй условие из 1. и положи в 2.
Бываю проблемы со шрифтами.
Также проверь на IIF.

Присоединяюсь - 000000000000.00 думаю немного ускорит.
  
Наверх
 
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2343
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ICASE и IIF
Ответ #6 - 13. Августа 2007 :: 15:34
Печать  
Ну и в итоге?
  
Наверх
IP записан
 
Rubin
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 70
Зарегистрирован: 31. Июля 2007
Re: ICASE и IIF
Ответ #7 - 14. Августа 2007 :: 05:23
Печать  
Спасибо за подсказку. Всё заработало после того, как подставил "000000000000.00"  вместо "0"
  
Наверх
 
IP записан
 
Rubin
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 70
Зарегистрирован: 31. Июля 2007
Re: ICASE и IIF
Ответ #8 - 14. Августа 2007 :: 05:48
Печать  
А отчего когда я пишу $0 вместе тех нулей в большом количетсве, пишет, что алиас не известен. Так и должно быть? (работаю с dbf базой).

И ещё небольшой оффтоп. Есть ли в FoxPro аналог какой-нить WITH ROLLUP?
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ICASE и IIF
Ответ #9 - 14. Августа 2007 :: 06:05
Печать  
Такого алиаса нет. Это сделали просто для наглядности. После формирования текста запроса надо сделать так:
Код
Выбрать все
СтрЗаменить(ТекстЗапроса, "$0", "000000000000.00");  

  
Наверх
 
IP записан
 
Rubin
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 70
Зарегистрирован: 31. Июля 2007
Re: ICASE и IIF
Ответ #10 - 14. Августа 2007 :: 06:06
Печать  
Ясно...
  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ICASE и IIF
Ответ #11 - 14. Августа 2007 :: 06:45
Печать  
а от "000000000000.00" точность не потеряется?
Может $ПТ.Оборот имеет больше 2 знаков после запятой?
  
Наверх
ICQ  
IP записан
 
Rubin
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 70
Зарегистрирован: 31. Июля 2007
Re: ICASE и IIF
Ответ #12 - 14. Августа 2007 :: 06:59
Печать  
spock писал(а) 14. Августа 2007 :: 06:45:
а от "000000000000.00" точность не потеряется?
Может $ПТ.Оборот имеет больше 2 знаков после запятой?


Да, кстати, есть и такое Улыбка
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: ICASE и IIF
Ответ #13 - 14. Августа 2007 :: 08:17
Печать  
Rubin писал(а) 14. Августа 2007 :: 05:48:
И ещё небольшой оффтоп. Есть ли в FoxPro аналог какой-нить WITH ROLLUP?


Увы Печаль
В принципе реализовать несложно, если была бы возможность сохранять промежуточный запрос
во временную таблицу в оперативке (не в файл! ).
Спрашивал на форуме sql.ru у foxpro-программистов - они не знают как это сделать в vfpoledb.
Разве что Spock что нибудь придумает Улыбка

Пока все дальнейшие операции - через метод группировать индексной таблицы.
Но к сожалению - инд. табл. не делает все операции доступные через запросы Печаль
  
Наверх
 
IP записан
 
Rubin
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 70
Зарегистрирован: 31. Июля 2007
Re: ICASE и IIF
Ответ #14 - 14. Августа 2007 :: 08:24
Печать  
Код
Выбрать все
SELECT
	Автор as [Автор $Справочник.Пользователи],
	Отдел,
	СуммаВыдал,
	Приоритет
FROM (
	SELECT
		Журн.$ОбщийРеквизит.Автор as Автор,
		Сотр.ParentID as Отдел,
		SUM(ICASE($РН.ВыдалП=1, $РН.СуммаП, 000000000000.00)) as СуммаВыдал,
		2 as Приоритет
	FROM
		1SJourn as Журн
	INNER JOIN
		$Документ.РасходнаяНакладная as РН On РН.IDDoc = Журн.IDDoc  
	INNER JOIN
		$Справочник.Пользователи as Сотр On Сотр.ID = Журн.$ОбщийРеквизит.Автор  
	WHERE
	Журн.IDDocDef = $ВидДокумента.РасходнаяНакладная AND
		Журн.Date BETWEEN {d :ДатаНач} AND {d :ДатаКон} AND
		Журн.Closed = 1 AND
		$РН.ВыдалП = 1 AND
		$РН.ДатаП >= {d :ДатаНач1} AND $РН.ДатаП <= {d :ДатаКон1} AND
		Журн.$ОбщийРеквизит.Автор IN "+Условия+"
	GROUP BY
		Автор, Отдел, Приоритет

	UNION ALL

	SELECT
		Сотр.ParentID as Автор,
		Сотр.ParentID as Отдел,
		SUM(ICASE($РН.ВыдалП=1, $РН.СуммаП, 000000000000.00)) as СуммаВыдал,
		1 as Приоритет
	FROM
		1SJourn as Журн
	INNER JOIN
		$Документ.РасходнаяНакладная as РН On РН.IDDoc = Журн.IDDoc  
	INNER JOIN
		$Справочник.Пользователи as Сотр On Сотр.ID = Журн.$ОбщийРеквизит.Автор  
	WHERE
		Журн.IDDocDef = $ВидДокумента.РасходнаяНакладная AND
		Журн.Date BETWEEN {d :ДатаНач} AND {d :ДатаКон} AND
		Журн.Closed = 1 AND
		$РН.ВыдалП = 1 AND
		$РН.ДатаП >= {d :ДатаНач1} AND $РН.ДатаП <= {d :ДатаКон1} AND
		Журн.$ОбщийРеквизит.Автор IN "+Условия+"
	GROUP BY
		Автор, Отдел, Приоритет
	) tmp
ORDER BY Отдел, Приоритет 



Я делаю это так.. ))) Просто хотел узнать, есть ли возможность заменить кучу писанины одной командой. Да и на быстродйествие наверное влияет... ((
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать