Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) ИндексированнаяТаблица и запрос (число прочтений - 6030 )
PRO100_Mixa
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 11
Зарегистрирован: 11. Августа 2013
ИндексированнаяТаблица и запрос
11. Августа 2013 :: 22:00
Печать  
Хочется собрать две таблицы в одну,  в первой иерархия справочника
"
|Номенклатура = Справочник.Номенклатура.ТекущийЭлемент;
|Группировка Номенклатура;
|Без Итогов;
"
во второй куча данных полученных прямым запросом, не работает метод ВнутреннееСоединение, хотя в описании ИндексированнойТаблицы есть такой... Со сжатыми губами
может есть способ в запросе объединить с такой таблицей, или получить результат по аналогии с "В ИЕРАРХИИ" в 1с8, или выполнить метод в ИТЗ
« Последняя редакция: 12. Августа 2013 :: 12:05 - PRO100_Mixa »  
Наверх
 
IP записан
 
PRO100_Mixa
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 11
Зарегистрирован: 11. Августа 2013
Re: ИндексированнаяТаблица и запрос
Ответ #1 - 11. Августа 2013 :: 22:07
Печать  
ВнутреннееСоединение / InnerJoin

Синтаксис: ВнутреннееСоединение(стрКолонкиЛевойИТ, ПраваяИТ, ИндексПравойИТ, стрКолонкиПравойИТ)

Параметры:
стрКолонкиЛевойИТ - тип: Строка. Колонки, значения которых будут использованы для поиска строки в правой таблице.
ПраваяИТ - тип: ИндексированнаяТаблица. Присоединяемая таблица.
ИндексПравойИТ - тип: Строка, Число. Имя или номер индекса, по которому будут искаться строки в правой таблице. Количество колонок индекса должно быть равно количеству колонок поиска (см. параметр стрКолонкиЛевойИТ).
стрКолонкиПравойИТ - тип: Строка. Список колонок, которые будут копироваться из правой таблицы в левую. Список задаётся в формате "<ИмяКолИст>|<ИмяКолИст:ИмяКолНазн> [,...]". <ИмяКолИст> - имя колонки в правой таблице; если такой колонки нет в левой таблице, то она будет создана. <ИмяКолНазн> - если указана, то значение из колонки правой таблицы с названием <ИмяКолИст> будет скопировано в колонку левой таблицы <ИмяКолНазн>.
Описание: Выполняет операцию, аналогичную команде SQL Inner Join. Для каждой строки из левой таблицы (левой таблицей является текущий объект) добавляются все строки из правой таблицы, соответствующие ключевому выражению. Ключевое выражение определяется параметром стрКолонкиЛевойИТ. Из правой таблицы в левую переносятся значения колонок, указанных в параметре стрКолонкиПравойИТ. Если строка левой таблицы не найдена в правой, то строка в левой таблице удаляется.
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: ИндексированнаяТаблица и запрос
Ответ #2 - 12. Августа 2013 :: 04:46
Печать  
1. Индексы хоть построены на нужных колонках? И тут, видимо, правильнее использовать "ЛевоеСоединение"
2. Рационально ли использовать... А из-за чего сомнения?

Что касается Иерархии - Можно и просто Результат запроса загнать в Индексированную таблицу и там сделать "Группировать". Если дополнительные колонки в запросе еще собрать, то весьма шустро отработает
  
Наверх
ICQ  
IP записан
 
PRO100_Mixa
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 11
Зарегистрирован: 11. Августа 2013
Re: ИндексированнаяТаблица и запрос
Ответ #3 - 12. Августа 2013 :: 07:46
Печать  
1. Соединения ИТЗ совсем не отрабатывает
2. union использую потому что работает, просто может быстрее join использовать!?

группировать создает вложенные таблицы, а не одним списком  Печаль
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: ИндексированнаяТаблица и запрос
Ответ #4 - 12. Августа 2013 :: 08:14
Печать  
А зачем тебе 1 список ?!

Обходи ИТЗ рекурсивно и привет.
Можно ИТЗ в любой типовой отчет встроить, где есть функция ВывестиГруппировку ..типа АнализПродаж в ТиСе
  
Наверх
 
IP записан
 
PRO100_Mixa
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 11
Зарегистрирован: 11. Августа 2013
Re: ИндексированнаяТаблица и запрос
Ответ #5 - 12. Августа 2013 :: 12:04
Печать  
Да спасибо Улыбка все сделал Улыбка
еще вопрос по запросу, можно ли в этом запросе накладывать условия в одном месте на справочник Номенклатура? или в каждом селекте надо со справочником объединять?
  
Наверх
 
IP записан
 
PRO100_Mixa
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 11
Зарегистрирован: 11. Августа 2013
Re: ИндексированнаяТаблица и запрос
Ответ #6 - 12. Августа 2013 :: 12:07
Печать  
Код
Выбрать все
|SELECT
|Номенклатура [Номенклатура $Справочник.Номенклатура]
|,SUM(СреднееОстаток)-SUM(СреднееРезерв) СреднееОстаток
|,CASE
|   WHEN SUM(СреднееОстаток)-SUM(СреднееРезерв) > 0 THEN
|	 Резерв)))*100
|   ELSE
|   0
|   END ОстатокВПроцентах
|,CASE
|   WHEN SUM(СреднееОстаток)-SUM(СреднееРезерв) > 0 AND SUM(КоличествоПриходОстаток)-SUM(КоличествоПриходРезерв) > 0 THEN
|	 -SUM(СреднееРезерв)))*100
| WHEN SUM(СреднееОстаток)-SUM(СреднееРезерв) <= 0 AND SUM(КоличествоПриходОстаток)-SUM(КоличествоПриходРезерв) > 0  THEN 100
| ELSE 0
|   END ПриходВПроцентах
|,CASE
|   WHEN SUM(СреднееОстаток)-SUM(СреднееРезерв) > 0 AND SUM(КоличествоПервыйПриход)-SUM(КоличествоПриходРезерв) > 0 THEN
|	 SUM(СреднееРезерв)))*100
|   WHEN SUM(СреднееОстаток)-SUM(СреднееРезерв) <= 0 AND SUM(КоличествоПервыйПриход)-SUM(КоличествоПриходРезерв) > 0 THEN 100
| ELSE 0
|   END ПервыйПриходВПроцентах
|, MAX(ДатаПервогоПоступления) ДатаПервогоПоступления
|FROM(
|
|SELECT
|Номенклатура.ID Номенклатура
|, 0 СреднееОстаток
|, 0 СреднееРезерв
|, 0 КоличествоОстаток
|, 0 КоличествоРезерв
|, 0 КоличествоПриходОстаток
|, 0 КоличествоПриходРезерв
|, Null ДатаПервогоПоступления
|, 0 КоличествоПервыйПриход
|FROM
|$Справочник.Номенклатура AS Номенклатура With (NOLOCK)
|GROUP BY
|Номенклатура.ID
|
|UNION ALL
|
|SELECT
|ОстаткиТМЦОстаткиОбороты.Номенклатура Номенклатура
|, Avg(ОстаткиТМЦОстаткиОбороты.КоличествоКонечныйОстаток) СреднееОстаток
|, 0 СреднееРезерв
|, 0 КоличествоОстаток
|, 0 КоличествоРезерв
|, 0 КоличествоПриходОстаток
|, 0 КоличествоПриходРезерв
|, Null ДатаПервогоПоступления
|, 0 КоличествоПервыйПриход
|FROM $РегистрОстаткиОбороты.ОстаткиТМЦ(:НачДата,
|:КонДата,
|День,
|Движения,,,
|Номенклатура,) AS ОстаткиТМЦОстаткиОбороты
|GROUP BY ОстаткиТМЦОстаткиОбороты.Номенклатура
|
|UNION ALL
|
|SELECT
|РезервыТМЦОстаткиОбороты.Номенклатура Номенклатура
|, 0 СреднееОстаток
|, Avg(РезервыТМЦОстаткиОбороты.КоличествоКонечныйОстаток) СреднееРезерв
|, 0 Количествостаток
|, 0 КоличествоРезерв
|, 0 КоличествоПриходОстаток
|, 0 КоличествоПриходРезерв
|, Null ДатаПервогоПоступления
|, 0 КоличествоПервыйПриход
|FROM $РегистрОстаткиОбороты.РезервыТМЦ(:НачДата,
|  :КонДата,
|  День,
|  Движения,,,
|  Номенклатура,) AS РезервыТМЦОстаткиОбороты
|GROUP BY РезервыТМЦОстаткиОбороты.Номенклатура
|
|UNION ALL
|
|SELECT ОстаткиТМЦОстатки.Номенклатура Номенклатура
|, 0 СреднееОстаток
|, 0 СреднееРезерв
|, Sum(ОстаткиТМЦОстатки.КоличествоОстаток) КоличествоОстаток
|,0 КоличествоРезерв
|, 0 КоличествоПриходОстаток
|, 0 КоличествоПриходРезерв
|, Null ДатаПервогоПоступления
|, 0 КоличествоПервыйПриход
|FROM $РегистрОстатки.ОстаткиТМЦ(:КонДата,,,
|Номенклатура,) AS ОстаткиТМЦОстатки
|GROUP BY ОстаткиТМЦОстатки.Номенклатура
|
|UNION ALL
|
|SELECT РезервыТМЦОстатки.Номенклатура Номенклатура
|,0 СреднееОстаток
|,0 СреднееРезерв
|,0 КоличествоОстаток
|, Sum(РезервыТМЦОстатки.КоличествоОстаток) КоличествоРезерв
|, 0 КоличествоПриходОстаток
|, 0 КоличествоПриходРезерв
|, Null ДатаПервогоПоступления
|, 0 КоличествоПервыйПриход
|FROM $РегистрОстатки.РезервыТМЦ(,,,
|Номенклатура,) AS РезервыТМЦОстатки
|GROUP BY РезервыТМЦОстатки.Номенклатура
|
|UNION ALL
|
|SELECT ЗаказыОстатки.Номенклатура Номенклатура
|,0 СреднееОстаток
|,0 СреднееРезерв
|,0 КоличествоОстаток
|,0 КоличествоРезерв
|, Sum(ЗаказыОстатки.КоличествоПриходОстаток) КоличествоПриходОстаток
|, 0 КоличествоПриходРезерв
|, Null ДатаПервогоПоступления
|, 0 КоличествоПервыйПриход
|FROM $РегистрОстатки.Заказы(:КонДата,,,
|  Номенклатура,
|  КоличествоПриход) AS ЗаказыОстатки
|GROUP BY ЗаказыОстатки.Номенклатура
|
|UNION ALL
|
|SELECT ЗаказыЗаявкиОстатки.Номенклатура Номенклатура
|, 0 СреднееОстаток
|, 0 СреднееРезерв
|, 0 КоличествоОстаток
|, 0 КоличествоРезерв
|, 0 СуммаКоличествоПриходОстаток
|, Sum(ЗаказыЗаявкиОстатки.КоличествоОстаток) КоличествоПриходРезерв
|, Null ДатаПервогоПоступления
|, 0 КоличествоПервыйПриход
|FROM $РегистрОстатки.ЗаказыЗаявки(:КонДата,,,
|  Номенклатура,) AS ЗаказыЗаявкиОстатки
|WHERE (ЗаказыЗаявкиОстатки.КоличествоОстаток > 0)
|GROUP BY ЗаказыЗаявкиОстатки.Номенклатура
|
 

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



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: ИндексированнаяТаблица и запрос
Ответ #7 - 12. Августа 2013 :: 12:25
Печать  
Не надо там никакого соединения.. просто условие на номенклатуру в параметрах ВТ и привет.
  
Наверх
 
IP записан
 
PRO100_Mixa
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 11
Зарегистрирован: 11. Августа 2013
Re: ИндексированнаяТаблица и запрос
Ответ #8 - 12. Августа 2013 :: 12:42
Печать  
Как в ВТ наложить условие на реквизиты Справочника?  Печаль
Номенклатура.ISmark = 0 например? в мануале не нашел  Печаль
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: ИндексированнаяТаблица и запрос
Ответ #9 - 12. Августа 2013 :: 12:47
Печать  
А зачем  ?!
Тебе не пофик, что номенклатуру пометили на удаление ?
В Регистрах же она есть!
И движуха по ней есть.
  
Наверх
 
IP записан
 
PRO100_Mixa
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 11
Зарегистрирован: 11. Августа 2013
Re: ИндексированнаяТаблица и запрос
Ответ #10 - 12. Августа 2013 :: 12:52
Печать  
это был дурацкий пример )))) например проверку на вхождение некой подстроки WHERE like '%'+Подстрока+'%', чтобы исключить товар устаревший (в артикуле указывается как ***) это частный случай, есть и такие которые в прайс не включаются или фото прайс - это другие реквизиты со значением  1 или 0
  
Наверх
 
IP записан
 
PRO100_Mixa
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 11
Зарегистрирован: 11. Августа 2013
Re: ИндексированнаяТаблица и запрос
Ответ #11 - 12. Августа 2013 :: 13:01
Печать  
Это только для того чтобы оптимизировать запрос (выкинуть ненужные данные) сейчас он выполняется 5 секунд, по мне не гуд получать все данные скопом а потом проверками их выкидывать Печаль чтобы из 7тыс строк оставить 2тыс, вроде же как то можно их на стадии выборки исключить...
Это все правда круто потому что подобные данные обычные запросы собирали 4 часа по всем товарам)))) самое сложное это были конечные остатки в разрезе дня )))
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: ИндексированнаяТаблица и запрос
Ответ #12 - 12. Августа 2013 :: 13:13
Печать  
Либо всё обернуть в подзапрос и на выходе отфильтровать как надо сделав иннер джоин со справочником, либо в параметрах каждой вт делать внутреннее соединение со справочником и твоим условием.

ЗЫ: см. в параметрах ВТ <соединение>
  
Наверх
 
IP записан
 
PRO100_Mixa
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 11
Зарегистрирован: 11. Августа 2013
Re: ИндексированнаяТаблица и запрос
Ответ #13 - 12. Августа 2013 :: 13:25
Печать  
а по опыту что эффективнее
мне подсказывает что отфильтровать с помощью внутреннего соединения будет быстрее... чем в каждом запросе объединить со справочником
спасибо...
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: ИндексированнаяТаблица и запрос
Ответ #14 - 12. Августа 2013 :: 14:01
Печать  
надо смотреть план запроса
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать