Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) SQL. / УложитьСписокОбъектов(). (число прочтений - 9236 )
VasilyKushnir
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 38
Зарегистрирован: 13. Сентября 2007
SQL. / УложитьСписокОбъектов().
20. Мая 2008 :: 08:43
Печать  
Есть вот такая балалайка:
[code]
     ТекстЗапроса = "
           |SELECT $Остатки.Товар [Товар $Справочник.Товары]
           |      , Sum($Остатки.Кво) СуммаКво
           |      , Sum($Остатки.СуммаПродажи) СуммаСуммаПродажи
           |FROM $Регистр.Остатки AS Остатки With (NOLOCK)
           |WHERE      (Остатки.date_time_iddoc Between :НачДата And :КонДата~)
           |      AND  $Остатки.ХозОперация IN (SELECT VAL FROM #XO)
           | And  $Остатки.Контрагент IN (Select 'B1'+Val From #KA)
           |GROUP BY $Остатки.Товар
           |";
           
     рс.УложитьСписокОбъектов(сзТоргОперации, "#XO", "ХозОперации");
     рс.УложитьСписокОбъектов13(сзКонтрагенты, "#KA");
     рс.УстановитьТекстовыйПараметр("НачДата", НачДата);
     рс.УстановитьТекстовыйПараметр("КонДата", КонДата);
     тз = рс.ВыполнитьИнструкцию(ТекстЗапроса);
     тз.ВыбратьСтроку();

[/code]

сзТоргОперации - содержит список объектов справочника ХозОперации. Здесь все пучком работает.
сзКонтрагенты - содержит список объектов из двух справочников: Контрагенты и Склады. По той же причине в регистре Остатки.Контрагент - тип неопределенный. И вот здесь работать не хочет.  Группы справочников тоже не воспринимает.
Что мне делать?:
1. Создавать два списка (для каждого справочника с указанием типа справочника) и для каждого свое условие Where?
2. Обрабатывать выборку и "вытаскивать" элементы груп, чтобы в списке были только элементы справочников?
Оба метода довольно муторные. Может кто подскажет более изящный метод заставить заиграть эту "балалайку"?

И еще вопросс разработчикам: какие еще есть технологические модификаторы функций кроме, например числа 13 - УложитьСписокОбъектов13?
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: SQL. / УложитьСписокОбъектов().
Ответ #1 - 20. Мая 2008 :: 08:51
Печать  
Код
Выбрать все
ТекстЗапроса = "
		|SELECT $Остатки.Товар [Товар $Справочник.Товары]
		|	, Sum($Остатки.Кво) СуммаКво
		|	, Sum($Остатки.СуммаПродажи) СуммаСуммаПродажи
		|FROM $Регистр.Остатки AS Остатки With (NOLOCK)
		|WHERE 	(Остатки.date_time_iddoc Between :НачДата And :КонДата~)
		|	AND  $Остатки.ХозОперация IN (SELECT VAL FROM #XO)
		| And  $Остатки.Контрагент IN (Select 'B1'+Val From #KA1
		|				     UNION ALL
		|				     Select 'B1'+Val From   #KA2)
		|GROUP BY $Остатки.Товар
		|";

	рс.УложитьСписокОбъектов(сзТоргОперации, "#XO", "ХозОперации");
	рс.УложитьСписокОбъектов13(сзКонтрагенты1, "#KA1","Склады");
	рс.УложитьСписокОбъектов13(сзКонтрагенты2, "#KA2","Контрагенты");
	рс.УстановитьТекстовыйПараметр("НачДата", НачДата);
	рс.УстановитьТекстовыйПараметр("КонДата", КонДата);
	тз = рс.ВыполнитьИнструкцию(ТекстЗапроса);
	тз.ВыбратьСтроку();

 



Как то так
  
Наверх
ICQ  
IP записан
 
sml
Full Member
***
Отсутствует


I Love 1С++!

Сообщений: 186
Зарегистрирован: 28. Февраля 2008
Re: SQL. / УложитьСписокОбъектов().
Ответ #2 - 20. Мая 2008 :: 08:55
Печать  
если Контрагентов не много, то можно получить их ИД перед выполнением запроса (в списке значений), а потом в текст запроса вставить
Код
Выбрать все
$Остатки.Контрагент IN ("+списКонтр+") 



списКонтр должен быть в виде:
'<ID1>','<ID2>'...'IDN'

ID Контрагентов также должны включать вид справочника
  
Наверх
 
IP записан
 
VasilyKushnir
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 38
Зарегистрирован: 13. Сентября 2007
Re: SQL. / УложитьСписокОбъектов().
Ответ #3 - 20. Мая 2008 :: 08:56
Печать  
Это понятно... Так решается вопросс элементов двух справочников, а вопрос групп справочников остается висеть...
  
Наверх
 
IP записан
 
VasilyKushnir
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 38
Зарегистрирован: 13. Сентября 2007
Re: SQL. / УложитьСписокОбъектов().
Ответ #4 - 20. Мая 2008 :: 09:00
Печать  
sml писал(а) 20. Мая 2008 :: 08:55:
если Контрагентов не много, то можно получить их ИД перед выполнением запроса (в списке значений), а потом в текст запроса вставить
Код
Выбрать все
$Остатки.Контрагент IN ("+списКонтр+") 



списКонтр должен быть в виде:
'<ID1>','<ID2>'...'IDN'

ID Контрагентов также должны включать вид справочника



тоже думал над этим (тем более, что при  типе неопределенный  она даже в селекте выдает именно ИД).  Но ИД для группы справочника как-то не то....
контрагентов много, пок райней мере выбирать ручками и внутри групп очень напряжно.
  
Наверх
 
IP записан
 
sml
Full Member
***
Отсутствует


I Love 1С++!

Сообщений: 186
Зарегистрирован: 28. Февраля 2008
Re: SQL. / УложитьСписокОбъектов().
Ответ #5 - 20. Мая 2008 :: 09:01
Печать  
Код
Выбрать все
(Select 'B1'+Val From #KA) 



а это че за хрень такая?
  
Наверх
 
IP записан
 
VasilyKushnir
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 38
Зарегистрирован: 13. Сентября 2007
Re: SQL. / УложитьСписокОбъектов().
Ответ #6 - 20. Мая 2008 :: 09:04
Печать  
sml писал(а) 20. Мая 2008 :: 09:01:
Код
Выбрать все
(Select 'B1'+Val From #KA) 



а это че за хрень такая?


Это я забыл убрать - отладочный вариант: тип справочника, как он "сидит" в базе. (правда помогло оно мне, как сухой попе присыпка...)
  
Наверх
 
IP записан
 
sml
Full Member
***
Отсутствует


I Love 1С++!

Сообщений: 186
Зарегистрирован: 28. Февраля 2008
Re: SQL. / УложитьСписокОбъектов().
Ответ #7 - 20. Мая 2008 :: 09:06
Печать  
VasilyKushnir писал(а) 20. Мая 2008 :: 09:04:
sml писал(а) 20. Мая 2008 :: 09:01:
Код
Выбрать все
(Select 'B1'+Val From #KA) 



а это че за хрень такая?


Это я забыл убрать - отладочный вариант: тип справочника, как он "сидит" в базе. (правда помогло оно мне, как сухой попе присыпка...)

а убрать эту хрень и оставить "Уложить...13()" пробовал?
  
Наверх
 
IP записан
 
VasilyKushnir
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 38
Зарегистрирован: 13. Сентября 2007
Re: SQL. / УложитьСписокОбъектов().
Ответ #8 - 20. Мая 2008 :: 09:08
Печать  
Да по разному пробовал...  Лопата в том похоже, что Контрагент в регистре Неопределенный - отсюда и проблемы.
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: SQL. / УложитьСписокОбъектов().
Ответ #9 - 20. Мая 2008 :: 09:21
Печать  
Мой вариант пробвал?
  
Наверх
ICQ  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: SQL. / УложитьСписокОбъектов().
Ответ #10 - 20. Мая 2008 :: 09:24
Печать  
УложитьСписокОбъектов13 не разворачивает группы. Попробуй УложитьСписокОбъектов и

SELECT 'B1' + $ВидСправочника36.Контрагенты + Val
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: SQL. / УложитьСписокОбъектов().
Ответ #11 - 20. Мая 2008 :: 09:31
Печать  
VasilyKushnir писал(а) 20. Мая 2008 :: 09:00:
контрагентов много, пок райней мере выбирать ручками и внутри групп очень напряжно.


Я бы посмотрел в сторону алгоритма ПОЛУЧЕНИЯ списка и включения ЭТОГО в виде подзапроса
Имхо канечна...
Или много лишнего времени у сервера?
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
VasilyKushnir
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 38
Зарегистрирован: 13. Сентября 2007
Re: SQL. / УложитьСписокОбъектов().
Ответ #12 - 20. Мая 2008 :: 09:38
Печать  
Nick писал(а) 20. Мая 2008 :: 09:21:
Мой вариант пробвал?

Как раз сейчас пробую - только отвлекают черти (спасу нету от юзеров).
И вариант
berezdetsky
УложитьСписокОбъектов13 не разворачивает группы. Попробуй УложитьСписокОбъектов и

SELECT 'B1' + $ВидСправочника36.Контрагенты + Val

тоже очень привлекательный.

Модификатор 36 - что за зверь?
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: SQL. / УложитьСписокОбъектов().
Ответ #13 - 20. Мая 2008 :: 09:40
Печать  
Цитата:
Как раз сейчас пробую - только отвлекают черти (спасу нету от юзеров).
И вариант 
berezdetsky
УложитьСписокОбъектов13 не разворачивает группы. Попробуй УложитьСписокОбъектов и 
 
SELECT 'B1' + $ВидСправочника36.Контрагенты + Val 

тоже очень привлекательный.


Ага это тоже нужно
  
Наверх
ICQ  
IP записан
 
VasilyKushnir
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 38
Зарегистрирован: 13. Сентября 2007
Re: SQL. / УложитьСписокОбъектов().
Ответ #14 - 20. Мая 2008 :: 09:47
Печать  
Все! Достали юзеры. Иду в серверную, закроюсь - иначе толком не дадут поработать. Вот все варианты сейчас и проиграю.
  
Наверх
 
IP записан
 
unnamed
Full Member
***
Отсутствует


0x1c = 28

Сообщений: 166
Местоположение: Chelyabinsk
Зарегистрирован: 01. Ноября 2007
Пол: Мужской
Re: SQL. / УложитьСписокОбъектов().
Ответ #15 - 20. Мая 2008 :: 11:37
Печать  
последний вариант и правильный. только 'B1' убери, я так понял ты как раз $Вид36 этим пытался и заменить...
  
Наверх
ICQ  
IP записан
 
VasilyKushnir
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 38
Зарегистрирован: 13. Сентября 2007
Re: SQL. / УложитьСписокОбъектов().
Ответ #16 - 20. Мая 2008 :: 11:48
Печать  
unnamed писал(а) 20. Мая 2008 :: 11:37:
последний вариант и правильный. только 'B1' убери, я так понял ты как раз $Вид36 этим пытался и заменить...


Точно! Я просто не знал за модификатор 36.
  
Наверх
 
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: SQL. / УложитьСписокОбъектов().
Ответ #17 - 21. Мая 2008 :: 07:03
Печать  
сзКонтрагенты1 - список складов.
сзКонтрагенты2 - список контрагентов.
Код
Выбрать все
	ИдСкл = глMDW.ЧислоВСтроку(глMDW.ИДСправочника("Склады"),36);
	ИдСкл = Формат("","С"+Число(4-СтрДлина(ИдСкл)))+ИдСкл;

	ИдКонтр = глMDW.ЧислоВСтроку(глMDW.ИДСправочника("Контрагенты"),36);
	ИдКонтр = Формат("","С"+Число(4-СтрДлина(ИдКонтр)))+ИдКонтр;

ТекстЗапроса = "
		|SELECT $Остатки.Товар [Товар $Справочник.Товары]
		|	, Sum($Остатки.Кво) СуммаКво
		|	, Sum($Остатки.СуммаПродажи) СуммаСуммаПродажи
		|FROM $Регистр.Остатки AS Остатки With (NOLOCK)
		|WHERE 	(Остатки.date_time_iddoc Between :НачДата And :КонДата~)
		|	AND  $Остатки.ХозОперация IN (SELECT VAL FROM #XO)
		| And  $Остатки.Контрагент IN (Select '"+ИдСкл+"'+Val From #KA1
		|				     UNION ALL
		|				     Select '"+ИдКонтр+"'+Val From   #KA2)
		|GROUP BY $Остатки.Товар
		|";

	рс.УложитьСписокОбъектов(сзТоргОперации, "#XO", "ХозОперации");
	рс.УложитьСписокОбъектов(сзКонтрагенты1, "#KA1","Склады");
	рс.УложитьСписокОбъектов(сзКонтрагенты2, "#KA2","Контрагенты");
	рс.УстановитьТекстовыйПараметр("НачДата", НачДата);
	рс.УстановитьТекстовыйПараметр("КонДата", КонДата);
	тз = рс.ВыполнитьИнструкцию(ТекстЗапроса);
	тз.ВыбратьСтроку(); 

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


I Love YaBB 2!

Сообщений: 38
Зарегистрирован: 13. Сентября 2007
Re: SQL. / УложитьСписокОбъектов().
Ответ #18 - 21. Мая 2008 :: 08:35
Печать  
А что это за зверь глMDW. ?
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: SQL. / УложитьСписокОбъектов().
Ответ #19 - 21. Мая 2008 :: 08:54
Печать  
VasilyKushnir писал(а) 21. Мая 2008 :: 08:35:
А что это за зверь глMDW. ?

MetaDataWork ?
  
Наверх
ICQ  
IP записан
 
VasilyKushnir
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 38
Зарегистрирован: 13. Сентября 2007
Re: SQL. / УложитьСписокОбъектов().
Ответ #20 - 21. Мая 2008 :: 08:56
Печать  
Salimbek писал(а) 21. Мая 2008 :: 08:54:
MetaDataWork ?


Подозреваю, что да... Но как это все обявить у меня?
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: SQL. / УложитьСписокОбъектов().
Ответ #21 - 21. Мая 2008 :: 08:59
Печать  
VasilyKushnir писал(а) 21. Мая 2008 :: 08:56:
Salimbek писал(а) 21. Мая 2008 :: 08:54:
MetaDataWork ?


Подозреваю, что да... Но как это все обявить у меня?

???
Перем глMDW Экспорт;
глMDW = СоздатьОбъект("MetaDataWork")
  
Наверх
ICQ  
IP записан
 
VasilyKushnir
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 38
Зарегистрирован: 13. Сентября 2007
Re: SQL. / УложитьСписокОбъектов().
Ответ #22 - 21. Мая 2008 :: 10:05
Печать  
Баранею на глазах....
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: SQL. / УложитьСписокОбъектов().
Ответ #23 - 21. Мая 2008 :: 10:15
Печать  
Цитата:
Перем глMDW Экспорт;
глMDW = СоздатьОбъект("MetaDataWork")


Вообще то у ODBCRecordSet есть атрибут МД типа MetaDataWork

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


I Love YaBB 2!

Сообщений: 38
Зарегистрирован: 13. Сентября 2007
Re: SQL. / УложитьСписокОбъектов().
Ответ #24 - 21. Мая 2008 :: 10:39
Печать  
Все равно выдает пустой запросс (слава богу хоть уже не матерится...)

Код
Выбрать все
	ТекстЗапроса = "
		|SELECT $Остатки.Товар [Товар $Справочник.Товары]
		|	, Sum($Остатки.Кво) СуммаКво
		|	, Sum($Остатки.СуммаПродажи) СуммаСуммаПродажи
		|FROM $Регистр.Остатки AS Остатки With (NOLOCK)
		|WHERE 	(Остатки.date_time_iddoc Between :НачДата And :КонДата~)
		|	AND  $Остатки.ХозОперация IN (SELECT VAL FROM #XO)
		| And  $Остатки.Контрагент IN (Select '"+ИдКонтр+"'+Val From #KA1
		|				UNION ALL
		|					Select '"+ИдСклад+"'+Val From   #KA2)
		|GROUP BY $Остатки.Товар
		|";

	ИдСклад	= глMDW.ЧислоВСтроку(глMDW.ИДСправочника("Склады"), 36);
	ИдСклад	= Формат("","С"+Число(4-СтрДлина(ИдСклад)))+ИдСклад;

	ИдКонтр = глMDW.ЧислоВСтроку(глMDW.ИДСправочника("Контрагенты"),36);
	ИдКонтр = Формат("","С"+Число(4-СтрДлина(ИдКонтр)))+ИдКонтр;

	рс.УложитьСписокОбъектов(сзТоргОперации, "#XO", "ХозОперации");
	рс.УложитьСписокОбъектов(сзКонтрагенты, "#KA1", "Контрагенты");
	рс.УложитьСписокОбъектов(сзСклады, "#KA2", "Склады");
	рс.УстановитьТекстовыйПараметр("НачДата", НачДата);
	рс.УстановитьТекстовыйПараметр("КонДата", КонДата);
	тз = рс.ВыполнитьИнструкцию(ТекстЗапроса);
	тз.ВыбратьСтроку();
 

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



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: SQL. / УложитьСписокОбъектов().
Ответ #25 - 21. Мая 2008 :: 11:09
Печать  
Поставь РС.Отладка(1); скопируй полученный текст запроса в QueryAnalizer и гоняй его, пока не поймешь, где собака порылась
  
Наверх
ICQ  
IP записан
 
VasilyKushnir
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 38
Зарегистрирован: 13. Сентября 2007
Re: SQL. / УложитьСписокОбъектов().
Ответ #26 - 21. Мая 2008 :: 11:41
Печать  
WHERE      (Остатки.date_time_iddoc Between '20080401' And '20080430Z')
     AND  Остатки.sp4330 IN (SELECT VAL FROM #XO)
And  Остатки.sp4331 IN (Select ''+Val From #KA1
                       UNION ALL
                             Select ''+Val From   #KA2)
Хотя по
Сообщить (ИдСклад);
Выдает
3FW
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: SQL. / УложитьСписокОбъектов().
Ответ #27 - 21. Мая 2008 :: 12:20
Печать  
Откель "+" перед Val ???
  
Наверх
ICQ  
IP записан
 
VasilyKushnir
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 38
Зарегистрирован: 13. Сентября 2007
Re: SQL. / УложитьСписокОбъектов().
Ответ #28 - 21. Мая 2008 :: 12:35
Печать  
Если б я знал.... Исходная конструкция
Select '"+ИдСклад+"'+Val From   #KA2)
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: SQL. / УложитьСписокОбъектов().
Ответ #29 - 21. Мая 2008 :: 12:38
Печать  
А ничё, что ты сначала текст запроса формируешь, а потом ИдСклад вычисляешь?  Подмигивание
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
VasilyKushnir
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 38
Зарегистрирован: 13. Сентября 2007
Re: SQL. / УложитьСписокОбъектов().
Ответ #30 - 21. Мая 2008 :: 12:42
Печать  
Блииииинн!!! Все! - пошел за пивом, на сегодня хватит издевательств на мозгами (не варят совсем...).
  
Наверх
 
IP записан
 
VasilyKushnir
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 38
Зарегистрирован: 13. Сентября 2007
Re: SQL. / УложитьСписокОбъектов().
Ответ #31 - 21. Мая 2008 :: 12:52
Печать  
And  Остатки.sp4331 IN (Select '  36'+Val From #KA1
                       UNION ALL
                             Select ' 3FW'+Val From   #KA2)
и всу-равно пустой запросс... Точно придется напится....

     ИдСклад      = СокрЛП(ИдСклад);
тоже ничего не дало..
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: SQL. / УложитьСписокОбъектов().
Ответ #32 - 21. Мая 2008 :: 15:08
Печать  
Ну что... пора попробовать подзапрос?
Или еще рано?
Заодно и быстрее будет...
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: SQL. / УложитьСписокОбъектов().
Ответ #33 - 22. Мая 2008 :: 01:46
Печать  
berezdetsky писал(а) 21. Мая 2008 :: 12:38:
А ничё, что ты сначала текст запроса формируешь, а потом ИдСклад вычисляешь?  Подмигивание


Смех, действительно
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать