Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Позскажите как правильно наложить фильтр в запросе? (число прочтений - 3863 )
dimm73
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 414
Зарегистрирован: 03. Июля 2006
Пол: Мужской
Позскажите как правильно наложить фильтр в запросе?
14. Октября 2011 :: 11:03
Печать  
Есть справочник"Скидки" в котором (по мимо прочих) имеются реквизиты "Контрагент" и "Номенклатура".  Причем номенклатура это может быть и элемент и группа.

Допускается (теоретически) , что для одного контрагента может быть установлена скидка как на конкретную номенклатуру, так и группу (к которой принадлежит номенклатура) - одновременно. Выше приоритет скидки у которой ниже уровень номенклатуры.

В документе при вводе строки мне нужно применять назначенные скидки для выбранной номенклатуры.
Если с фильтром по контрагенту все понятно, то с фильтром по номенклатуре пока не получается.
Если я фильтрую только номенклатуре

$Скидки.Номенклатура = :ТекНомеклатура

то естествено получаю скидки установленные на это товар, и не получаю скидки на группу
Если же попытатся фильтровать по родителю
ParentID
то тоже не прокатит, так как вложенность может быть до 5 уровней
Наверное я сумбужно изложил проблему.
Но если поняли суть подскажите: как получить в запросе все скидки относящиеся к выбранному товару с учетом скидок на вышестоящие группы
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Позскажите как правильно наложить фильтр в запросе?
Ответ #1 - 14. Октября 2011 :: 11:09
Печать  
$Скидки.Номенклатура in( :ТекНомеклатура,:РодительТекНомеклатура
,:ДедТекНомеклатура,:ПрадедТекНомеклатура,:ПрапрадедТекНомеклатура)

нет не так.

покажи как хранятся скидки.там в справочнике скидки
надо хранить также уровень ( уровень() ) Номенклатуры и тогда выбирать из этих строк
с наименьшим уровнем
  
Наверх
 
IP записан
 
dimm73
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 414
Зарегистрирован: 03. Июля 2006
Пол: Мужской
Re: Позскажите как правильно наложить фильтр в запросе?
Ответ #2 - 14. Октября 2011 :: 11:19
Печать  
$Скидки.Номенклатура in( :ТекНомеклатура,:РодительТекНомеклатура
,:ДедТекНомеклатура,:ПрадедТекНомеклатура,:ПрапрадедТекНомеклатура)

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

На счет уровня это был мой следущий вопрос, но я так понял в запросе его не получить?
Если так , то придется действительно записывать уровень в скидках и потом результат запроса сортировать по уровню
  
Наверх
 
IP записан
 
dimm73
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 414
Зарегистрирован: 03. Июля 2006
Пол: Мужской
Re: Позскажите как правильно наложить фильтр в запросе?
Ответ #3 - 14. Октября 2011 :: 11:26
Печать  
Наверноя сегодня я торможу, но что-то сходу не могу придумать способа как сформировать список всех список родителей выбранного товара не перебирая весь справочник Номенклатура ?
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Позскажите как правильно наложить фильтр в запросе?
Ответ #4 - 14. Октября 2011 :: 11:27
Печать  
dimm73 писал(а) 14. Октября 2011 :: 11:19:
$Скидки.Номенклатура in( :ТекНомеклатура,:РодительТекНомеклатура
,:ДедТекНомеклатура,:ПрадедТекНомеклатура,:ПрапрадедТекНомеклатура)

это уже , что-то , можно попробовать

На счет уровня это был мой следущий вопрос, но я так понял в запросе его не получить?
Если так , то придется действительно записывать уровень в скидках

если не хранить уровни в таблице скидок то
так ты все равно получишь уровни когда будешь искать родителей
можешь сохранить  в тз Уровень,Предок после этого получать все строки скидок и брать строку которая в тз биже к концу.
ну когда все это заработает и если не будет хватать скорости то все это можно переписать на t-sql

еще вариант чтобы не вычислять уровень то хранить уровень в самом справочнике номенклатура ( естественно если храним уровень в номенклатуре или скидках ) то при изменеии принадлежности номенклатуры другой папке это соотношение надо будет пересчитывать.

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Позскажите как правильно наложить фильтр в запросе?
Ответ #5 - 14. Октября 2011 :: 11:29
Печать  
dimm73 писал(а) 14. Октября 2011 :: 11:26:
Наверноя сегодня я торможу, но что-то сходу не могу придумать способа как сформировать список всех список родителей выбранного товара не перебирая весь справочник Номенклатура ?


Код
Выбрать все
СписокТов = СоздатьОбъект("СписокЗначений");
ТекЗн = Номенклатура;
Пока 1 = 1 Цикл
   Если ПустоеЗначение(ТекЗн) = 1 Тогда Прервать; КонецЕсли;
   СписокТов.ДобавитьЗначение(ТекЗн,"");
   ТекЗн = ТекЗн.Родитель;
КонецЦикла;
 

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


I Love YaBB 2!

Сообщений: 414
Зарегистрирован: 03. Июля 2006
Пол: Мужской
Re: Позскажите как правильно наложить фильтр в запросе?
Ответ #6 - 14. Октября 2011 :: 11:32
Печать  
Спасибо
  
Наверх
 
IP записан
 
dimm73
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 414
Зарегистрирован: 03. Июля 2006
Пол: Мужской
Re: Позскажите как правильно наложить фильтр в запросе?
Ответ #7 - 14. Октября 2011 :: 11:40
Печать  
Z1 писал(а) 14. Октября 2011 :: 11:27:
не хранить уровни в таблице скидок то
так ты все равно получишь уровни когда будешь искать родителей
можешь сохранить  в тз Уровень,Предок после этого получать все строки скидок и брать строку которая в тз биже к концу.
ну когда все это заработает и если не будет хватать скорости то все это можно переписать на t-sql

еще вариант чтобы не вычислять уровень то хранить уровень в самом справочнике номенклатура ( естественно если храним уровень в номенклатуре или скидках ) то при изменеии принадлежности номенклатуры другой папке это соотношение надо будет пересчитывать.



Хотелось бы все таки вытащить уровень в запросе и потом только отсортировать по уровню и взять первую строку из таблицы скидок.
  
Наверх
 
IP записан
 
dimm73
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 414
Зарегистрирован: 03. Июля 2006
Пол: Мужской
Re: Позскажите как правильно наложить фильтр в запросе?
Ответ #8 - 18. Октября 2011 :: 06:32
Печать  
сделал дополнительный реквизит "Уровень" в справочнике Скидки , но в ситуации когда возможно будут переносить номенклатуру из одной группы в другую уровень будет менятся.

такой способ не подходит (или придетсяпри переносе перезаписывать скидки)
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Позскажите как правильно наложить фильтр в запросе?
Ответ #9 - 18. Октября 2011 :: 07:42
Печать  
dimm73 писал(а) 18. Октября 2011 :: 06:32:
сделал дополнительный реквизит "Уровень" в справочнике Скидки , но в ситуации когда возможно будут переносить номенклатуру из одной группы в другую уровень будет менятся.

такой способ не подходит (или придетсяпри переносе перезаписывать скидки)

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

ps да и я говорил не о уровне в справочнике Скидки а об уровне в справочнике Товары.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Позскажите как правильно наложить фильтр в запросе?
Ответ #10 - 18. Октября 2011 :: 08:53
Печать  
Z1 писал(а) 14. Октября 2011 :: 11:29:
dimm73 писал(а) 14. Октября 2011 :: 11:26:
Наверноя сегодня я торможу, но что-то сходу не могу придумать способа как сформировать список всех список родителей выбранного товара не перебирая весь справочник Номенклатура ?


Код
Выбрать все
СписокТов = СоздатьОбъект("СписокЗначений");
ТекЗн = Номенклатура;
Пока 1 = 1 Цикл
   Если ПустоеЗначение(ТекЗн) = 1 Тогда Прервать; КонецЕсли;
   СписокТов.ДобавитьЗначение(ТекЗн,"");
   ТекЗн = ТекЗн.Родитель;
КонецЦикла;
 


Вот тебе еще вариант решения но это не отменяет (9)
Код
Выбрать все
rc = СоздатьОбъект("ODBCRecordSet");
rc.ВыполнитьСкалярный("create table #x_tovar(
|tovar char(9) not null,
|level tinyint not null,
|CONSTRAINT PK0_x_tovar  PRIMARY KEY (tovar)
|)
|");
ТекущУровень = -10;
ТекЗн = Номенклатура;
Пока 1 = 1 Цикл
  Если ПустоеЗначение(ТекЗн) = 1 Тогда Прервать; КонецЕсли;
  ТекстЗАпроса = "insert into #x_tovar values(:val_toval, :val_level)";
  rc.УстановитьТекстовыйПараметр("val_toval",ТекЗн);
  rc.УстановитьТекстовыйПараметр("val_level",ТекущУровень);
  rc.ВыполнитьСкалярный(ТекстЗАпроса);
  ТекЗн = ТекЗн.Родитель;
  ТекущУровень = ТекущУровень + 1;
КонецЦикла;
 


Далее эту временную таблицу inner join c таблицей скидок
по совпадению клиента и товара и в том что получилось ищем строку с максимальным level ( т.к. отчет уровня считаем от -10 вверх).
  
Наверх
 
IP записан
 
dimm73
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 414
Зарегистрирован: 03. Июля 2006
Пол: Мужской
Re: Позскажите как правильно наложить фильтр в запросе?
Ответ #11 - 18. Октября 2011 :: 10:16
Печать  
Классно. Надо попробовать.

Спасибо
  
Наверх
 
IP записан
 
dimm73
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 414
Зарегистрирован: 03. Июля 2006
Пол: Мужской
Re: Позскажите как правильно наложить фильтр в запросе?
Ответ #12 - 18. Октября 2011 :: 12:46
Печать  
выдает ошибку
рс.ВыполнитьСкалярный("create table #x_tovar(
{Глобальный модуль(4893)}: State 42S01, native 2714, message [Microsoft][ODBC SQL Server Driver][SQL Server]There is already an object named '#x_tovar' in the database.


Код
Выбрать все
	рс.ВыполнитьСкалярный("create table #x_tovar(
	|tovar char(9) not null,
	|level tinyint not null,
	|CONSTRAINT PK0_x_tovar  PRIMARY KEY (tovar)
	|)
	|");
	ТекущУровень = 1;
	ТекЗн = Товар;
	Пока 1 = 1 Цикл
		Если ПустоеЗначение(ТекЗн) = 1 Тогда Прервать; КонецЕсли;
		ТекстЗАпроса = "insert into #x_tovar values(:val_toval, :val_level)";
		рс.УстановитьТекстовыйПараметр("val_toval",ТекЗн);
		рс.УстановитьТекстовыйПараметр("val_level",ТекущУровень);
		рс.ВыполнитьСкалярный(ТекстЗАпроса);
		ТекЗн = ТекЗн.Родитель;
		ТекущУровень = ТекущУровень + 1;
	КонецЦикла;

ТекстЗапроса = "
	|SELECT Скидки.ID [Скидки $Справочник.Скидки]
	|	, $Скидки.Контрагент [Контрагент $Справочник.Контрагенты]
	|	, $Скидки.Номенклатура [Номенклатура $Справочник.Номенклатура]
	|	, $Скидки.ДатаНачала ДатаНачала
	|	, $Скидки.ДатаОкончания ДатаОкончания
	|	, $Скидки.Процент Процент
	| , $Скидки.ФиксЦена ФиксЦена
	| , $Скидки.Акция Акция
	| , $Скидки.УровеньНоменклатуры УровеньНоменклатуры
	|, Таб.level level
	|FROM $Справочник.Скидки AS Скидки
	|INNER JOIN #x_tovar Таб(nolock) ON $Скидки.Номенклатура = Таб.tovar
	|WHERE Скидки.IsMark=0
		|and (($Скидки.Номенклатура IN (SELECT Val FROM #ГруппаН)) or ($Скидки.Номенклатура = :ТекНоменклатура))
		|and $Скидки.Контрагент = :ТекКонтра
	|GROUP BY Скидки.ID
	|	, $Скидки.Контрагент
	|	, $Скидки.Номенклатура
	|	, $Скидки.ДатаНачала
	|	, $Скидки.ДатаОкончания
	|	, $Скидки.Процент
	|	, $Скидки.ФиксЦена
	|	, $Скидки.Акция
	|	, $Скидки.УровеньНоменклатуры
	|, Таб.level
	|ORDER BY $Скидки.Акция DESC, $Скидки.ФиксЦена DESC, $Скидки.УровеньНоменклатуры DESC
	|";

 



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


I Love YaBB 2!

Сообщений: 414
Зарегистрирован: 03. Июля 2006
Пол: Мужской
Re: Позскажите как правильно наложить фильтр в запросе?
Ответ #13 - 18. Октября 2011 :: 12:51
Печать  
ошибка выходит при повторном запросе, а если делается первый раз -то все классно, уровень показывает
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Позскажите как правильно наложить фильтр в запросе?
Ответ #14 - 18. Октября 2011 :: 12:56
Печать  
Ну дак... у тебя временная таблица создана, второй раз не создается и ругается с ошибкой. Чисть за собой, делай в конце запросов - рс.ВыполнитьСкалярный("DROP TABLE #x_tovar");
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать