Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) 1sqlite - Иерархическое подчинение (число прочтений - 2390 )
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
1sqlite - Иерархическое подчинение
29. Ноября 2010 :: 07:33
Печать  
Как запросом получить элементы справочника, иерархически подчиненные заданному в параметре, т.е. аналог выборки после ИспользоватьРодителя?

Дополнительно хотелось бы увидеть маленький пример получения периодических значений.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: 1sqlite - Иерархическое подчинение
Ответ #1 - 29. Ноября 2010 :: 08:06
Печать  
УложитьОбъекты
http://www.1cpp.ru/forum/YaBB.pl?num=1214205575/598#598

Ну, или куча лефт джоинов к этому же справочнику с условием на парентид = количеству уровней справочника, либо хранимкой, либо заранеее хранить список всех групп в табличке и обновлять её триггером.
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: 1sqlite - Иерархическое подчинение
Ответ #2 - 29. Ноября 2010 :: 08:09
Печать  
Eprst писал(а) 29. Ноября 2010 :: 08:06:
УложитьОбъекты
http://www.1cpp.ru/forum/YaBB.pl?num=1214205575/598#598

Ну, или куча лефт джоинов к этому же справочнику с условием на парентид = количеству уровней справочника, либо хранимкой, либо заранеее хранить список всех групп в табличке и обновлять её триггером.


Хранимка и триггер - штуки интересные, неужели 1sqlite умеет такое даже для дбф-ных баз?
По идее инфы по ссылке должно хватить. буду пробовать. Спасибо.
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
1sqlite - Периодические значения по псевдониму
Ответ #3 - 29. Ноября 2010 :: 09:45
Печать  
Есть запрос, в котором возвращаются периодические значения. Кроме этого хотелось бы в одном поле в зависимости от комбинации этих значений вычислить новое, но дважды получать периодику не хочется. Есть ли решение?
Код
Выбрать все
SELECT ном.id [Номенклатура :Справочник.Номенклатура]
, норм.Элемент [Материал :Справочник]
,(SELECT
	CAST(П.value AS NUMERIC(14,3))
	from __1S_Const as П
	where П.objid = норм.id and П.date <= '20101129'
	and П.id = :ИсторияРеквизита.НормыРасходов.Норма
	order by date desc limit 1) AS Норма
,(SELECT
	CAST(П.value AS NUMERIC(15,2))
	from __1S_Const as П
	where П.objid = норм.id and П.date <= '20101129'
	and П.id = :ИсторияРеквизита.НормыРасходов.Цена
	order by date desc limit 1) AS Цена
,(SELECT
	CAST(П.value AS NUMERIC(15,2))
	from __1S_Const as П
	where П.objid = норм.id and П.date <= '20101129'
	and П.id = :ИсторияРеквизита.НормыРасходов.Стоимость
	order by date desc limit 1) AS Стоимость
,CASE WHEN Цена = 0 THEN Стоимость / Норма ELSE Цена END AS ЦенаСНДС
FROM [Справочник.Номенклатура] ном
LEFT JOIN [Справочник.НормыРасходов] норм ON норм.parentext = ном.id AND норм.isfolder = 2 AND норм.ismark = '' AND норм.ВидЭлемента = :Перечисление.ВидыЭлементовНормРасходов.Материал
WHERE ном.ismark = '' AND ном.isfolder = 2 AND ном.parentid = '     1   ' AND Норма > 0 


Вычисляемое поле ЦенаСНДС. 1sqlite не хочет воспринимать псевдонимы в условии CASE, оно и понятно, но может есть способ это обойти?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: 1sqlite - Иерархическое подчинение
Ответ #4 - 29. Ноября 2010 :: 09:57
Печать  
Оберни в еще один запрос..
select
CASE WHEN t.Цена = 0 THEN t.Стоимость / t.Норма ELSE t.Цена END ЦенаСНДС
from
   (select
      (select
           ...
       ) Цена
       .......
   )t
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: 1sqlite - Иерархическое подчинение
Ответ #5 - 29. Ноября 2010 :: 10:05
Печать  
Eprst писал(а) 29. Ноября 2010 :: 09:57:
Оберни в еще один запрос..
select
CASE WHEN t.Цена = 0 THEN t.Стоимость / t.Норма ELSE t.Цена END ЦенаСНДС
from
  (select
      (select
           ...
       ) Цена
       .......
  )t

Это уменьшает количество запросов периодики только на 2 для Цены, т.к. в результат тоже должны попасть все значения... В итоге получается двойной запрос всех периодик, чего и ищу путь избежать.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: 1sqlite - Иерархическое подчинение
Ответ #6 - 29. Ноября 2010 :: 10:06
Печать  
Цитата:
В итоге получается двойной запрос всех периодик, чего и ищу путь избежать.


Че за бред ?
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: 1sqlite - Иерархическое подчинение
Ответ #7 - 29. Ноября 2010 :: 10:18
Печать  
Eprst писал(а) 29. Ноября 2010 :: 10:06:
Цитата:
В итоге получается двойной запрос всех периодик, чего и ищу путь избежать.


Че за бред ?

В исходном запросе есть и получение каждой периодики отдельно и хочется добавить вычисляемое поле. Твое предложение позволяет в вычисляемом поле запросить каждую периодику по разу, но оно дает только один результат, а надо еще все эти три периодики вернуть в основном запросе. Пока не вижу способа...
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: 1sqlite - Иерархическое подчинение
Ответ #8 - 29. Ноября 2010 :: 10:48
Печать  
Dmitry The Wing писал(а) 29. Ноября 2010 :: 10:18:
Eprst писал(а) 29. Ноября 2010 :: 10:06:
Цитата:
В итоге получается двойной запрос всех периодик, чего и ищу путь избежать.


Че за бред ?

В исходном запросе есть и получение каждой периодики отдельно и хочется добавить вычисляемое поле. Твое предложение позволяет в вычисляемом поле запросить каждую периодику по разу, но оно дает только один результат, а надо еще все эти три периодики вернуть в основном запросе. Пока не вижу способа...


Вообще не понимаю, о чем ты... вот так сделай и привет:
Код
Выбрать все
|SELECT t.Номенклатура [Номенклатура :Справочник.Номенклатура]
|	   ,t.Материал [Материал :Справочник]
|	   ,t.Норма
|	   ,t.Цена
|	   ,t.Стоимость
|	   ,CASE WHEN t.Цена = 0 THEN t.Стоимость/t.Норма  ELSE t.Цена END  ЦенаСНДС
|from
|(
|	SELECT ном.id Номенклатура
|	, норм.Элемент Материал
|	,(SELECT
|		CAST(П.value AS NUMERIC(14,3))
|		from __1S_Const as П
|		where П.objid = норм.id and П.date <= '20101129'
|		and П.id = :ИсторияРеквизита.НормыРасходов.Норма
|		order by date desc limit 1) Норма
|	,(SELECT
|		CAST(П.value AS NUMERIC(15,2))
|		from __1S_Const as П
|		where П.objid = норм.id and П.date <= '20101129'
|		and П.id = :ИсторияРеквизита.НормыРасходов.Цена
|		order by date desc limit 1)  Цена
|	,(SELECT
|		CAST(П.value AS NUMERIC(15,2))
|		from __1S_Const as П
|		where П.objid = норм.id and П.date <= '20101129'
|		and П.id = :ИсторияРеквизита.НормыРасходов.Стоимость
|		order by date desc limit 1)  Стоимость
|	FROM [Справочник.Номенклатура] ном
|	LEFT JOIN [Справочник.НормыРасходов] норм ON норм.parentext = ном.id AND норм.isfolder = 2 AND норм.ismark = '' AND норм.ВидЭлемента = :Перечисление.ВидыЭлементовНормРасходов.Материал
|	WHERE ном.ismark = '' AND ном.isfolder = 2 AND ном.parentid = '     1   ' AND Норма > 0
|) t  


  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: 1sqlite - Иерархическое подчинение
Ответ #9 - 30. Ноября 2010 :: 06:46
Печать  
Eprst писал(а) 29. Ноября 2010 :: 10:48:

Спасибо. Делал типизацию во внутренних, потому не работало. Теперь понял.
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
1sqlite - Не выполняется условие
Ответ #10 - 22. Декабря 2010 :: 10:00
Печать  
Есть следующий запрос
Код
Выбрать все
	ТекстЗапросаНоменклатуры = "
	|SELECT
	|Запрос.Номенклатура [Номенклатура :Справочник.Номенклатура]
	|, Запрос.Элемент [Элемент :Справочник]
	|, Запрос.Норматив [Норматив :Справочник.НормыРасходов]
	|, Запрос.Норма [Норма :Число.14.3]
	|, Запрос.Цена [Цена :Число.15.2]
	|, Запрос.Стоимость [Стоимость :Число.15.2]
	|, CASE WHEN Запрос.Цена = 0 THEN Запрос.Стоимость / Запрос.Норма ELSE Запрос.Цена END [ЦенаСНДС :Число.15.2]
	|FROM
	|(
	|SELECT
	|ном.id Номенклатура
	|, ном.ОсновнаяСпецификация
	|, норм.id Норматив
	|, норм.parentid Спецификация
	|, норм.Элемент Элемент
	|,(SELECT П.value
	|	FROM __1S_Const AS П
	|	WHERE П.objid = норм.id AND П.date <= @ДатаТек AND П.id = :ИсторияРеквизита.НормыРасходов.Норма
	|	ORDER BY date DESC LIMIT 1) AS Норма
	|,(SELECT П.value
	|	FROM __1S_Const AS П
	|	WHERE П.objid = норм.id AND П.date <= @ДатаТек AND П.id = :ИсторияРеквизита.НормыРасходов.Цена
	|	ORDER BY date DESC LIMIT 1) AS Цена
	|,(SELECT П.value
	|	FROM __1S_Const AS П
	|	WHERE П.objid = норм.id AND П.date <= @ДатаТек AND П.id = :ИсторияРеквизита.НормыРасходов.Стоимость
	|	ORDER BY date DESC LIMIT 1) AS Стоимость
	|FROM [Справочник.Номенклатура] ном
	|LEFT JOIN [Справочник.НормыРасходов] норм ON норм.parentext = ном.id AND норм.isfolder = 2 AND норм.ismark = '' AND норм.ВидЭлемента = @ВидЭлемента
	|AND COALESCE(Норма, 0) > 0 AND ((норм.parentid IS NULL) OR (норм.parentid = ном.ОсновнаяСпецификация))
	|WHERE ном.ismark = '' AND ном.isfolder = 2 AND ном.id IN (SELECT val FROM тНоменклатура)
	|AND норм.id IS NOT NULL
	|) Запрос"; 

В результат попадают строки с Норма = 0.
Поясните, почему не выполняется условие Норма > 0?
COALESCE добавил уже в попытках устранить проблему...

Пробовал даже обрамить весь запрос нормы
Код
Выбрать все
	|,COALESCE((SELECT П.value
	|	FROM __1S_Const AS П
	|	WHERE П.objid = норм.id AND П.date <= @ДатаТек AND П.id = :ИсторияРеквизита.НормыРасходов.Норма
	|	ORDER BY date DESC LIMIT 1), 0) AS Норма 

Не помогло  Злой
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite - Иерархическое подчинение
Ответ #11 - 22. Декабря 2010 :: 10:56
Печать  
Не помогло потому что там не NULL скорее всего. Сделай приведение типа к числу.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: 1sqlite - Иерархическое подчинение
Ответ #12 - 22. Декабря 2010 :: 11:32
Печать  
Ясен пень, ты в условие  не Норма >0 пихай, а целиком выражение
для его получения.
Т.е

AND (SELECT П.value
     |      FROM __1S_Const AS П
     |      WHERE П.objid = норм.id AND П.date <= @ДатаТек AND П.id = :ИсторияРеквизита.НормыРасходов.Норма
     |      ORDER BY date DESC LIMIT 1) >0
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать