Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Вопрос по Индексированной таблице (число прочтений - 4225 )
oslokot
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 8
Зарегистрирован: 18. Октября 2012
Вопрос по Индексированной таблице
18. Октября 2012 :: 10:14
Печать  
Здравствуйте! Совсем недавно начал пробовать ИТЗ.
Разъясните мне пожалуйста некоторые моменты.
Можно ли сделать выборку не по одному, а сразу по нескольким индексам? Если можно, то как?
Пример:
Есть ИТ с множеством колонок. Установил индекс по колонке "Поставщик"
Код
Выбрать все
ИТ1.ДобавитьИндекс("Поставщик","Поставщик");
ИТ1.УстановитьФильтр(Значение1,Значение2,"Поставщик",0);
 



Выборку делаю согласно этому индексу:
Код
Выбрать все
ИТ1.ВыбратьСтроки("Поставщик");
Пока ИТ1.ПолучитьСтроку("Поставщик") = 1 Цикл
	// заполняю обычную тз
	ТЗ_Покупатели.НоваяСтрока();
	ТЗ_Покупатели.Покупатель = ИТ1.Грузополучатель;
	ТЗ_Покупатели.Сумма = ИТ1.Сумма;
	ТЗ_Покупатели.Расстояние = ИТ1.Грузополучатель.Грузополучатель.Расстояние.Расстояние;
	ТЗ_Покупатели.Город = ПолучитьГородКонтрагента(ИТ1.Грузополучатель.Грузополучатель);
КонецЦикла;
ТЗ_Покупатели.Свернуть("Номер,Выбор,Покупатель,Город,Расстояние","Сумма");
ТЗ_Покупатели.Сортировать("Покупатель+");
ТП.ОбновитьСтроки();
 


Все работает.
Но теперь мне надо добавить еще один фильтр по другой колонке и выборку производить с учетом обоих индексов.
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Вопрос по Индексированной таблице
Ответ #1 - 18. Октября 2012 :: 10:36
Печать  
Добавь ещё индекс
ИТ1.ДобавитьИндекс("И2", "Поставщик, ДругаяКолонка");
и работай с ним
  
Наверх
 
IP записан
 
oslokot
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 8
Зарегистрирован: 18. Октября 2012
Re: Вопрос по Индексированной таблице
Ответ #2 - 18. Октября 2012 :: 11:43
Печать  
Не получается...
Код
Выбрать все
ИТ1.ДобавитьИндекс("СтрокаИндекса","Поставщик,ТипДоставки");
ИТ1.УстановитьФильтр(СписокФильтра,СписокФильтра,"СтрокаИндекса",0);
 


, где СписокФильтра - это список значений сваленных из обеих колонок, по которым надо осуществить выборку
Пишет ошибку:
"В ключе недостаточно значений!  Должно быть 2, а передано 1"

Хотя в СпискеЗначений содержатся значения из ключевых колонок "Поставщик" и "ТипДоставки", все как в инструкции...
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Вопрос по Индексированной таблице
Ответ #3 - 18. Октября 2012 :: 13:20
Печать  
Чёта не верится. Покажи как заполняешь ключ. Есть подозрение, что ты пихаешь туда пустое значение неопределенного типа.
  
Наверх
 
IP записан
 
oslokot
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 8
Зарегистрирован: 18. Октября 2012
Re: Вопрос по Индексированной таблице
Ответ #4 - 18. Октября 2012 :: 13:26
Печать  
ADirks писал(а) 18. Октября 2012 :: 13:20:
Чёта не верится. Покажи как заполняешь ключ. Есть подозрение, что ты пихаешь туда пустое значение неопределенного типа.

да-да, извиняюсь. Было неопределенное значение.
Теперь заработало!
  
Наверх
 
IP записан
 
oslokot
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 8
Зарегистрирован: 18. Октября 2012
Re: Вопрос по Индексированной таблице
Ответ #5 - 19. Октября 2012 :: 09:17
Печать  
А как мне установить фильтр, выборочно? (по единственной колонке)
Например, есть колонка "Поставщик" со значениями:

Код
Выбрать все
Поставщик1
Поставщик2
Поставщик3
Поставщик4 



А мне надо установить фильтр выборочно
Код
Выбрать все
Поставщик1
и
Поставщик3 



Для этого, я добавляю в список значений только
Код
Выбрать все
Фильтр.ДобавитьЗначение(Поставщик1)
Фильтр.ДобавитьЗначение(Поставщик3) 


и устанавливаю фильтр:
Код
Выбрать все
авщик",0); 


Но в выборку попадает еще и Поставщик2 - а этого мне не надо, как быть?

Другими словами мне нужен множественный отбор по ключам, а не минимум и максимум
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Вопрос по Индексированной таблице
Ответ #6 - 19. Октября 2012 :: 09:28
Печать  
Напрямую не получится. Как вариант - сформировать ещё одну ИТ, напихать туда нужных значений, и сделать InnerJoin этих таблиц.
  
Наверх
 
IP записан
 
oslokot
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 8
Зарегистрирован: 18. Октября 2012
Re: Вопрос по Индексированной таблице
Ответ #7 - 19. Октября 2012 :: 10:28
Печать  
ADirks писал(а) 19. Октября 2012 :: 09:28:
Напрямую не получится. Как вариант - сформировать ещё одну ИТ, напихать туда нужных значений, и сделать InnerJoin этих таблиц.

Да, но в этом случае левая таблица "разрушается" (удаляются строки не подходящие по условию), что не хотелось бы.
По другому никак?
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Вопрос по Индексированной таблице
Ответ #8 - 19. Октября 2012 :: 10:40
Печать  
Никак.
  
Наверх
 
IP записан
 
oslokot
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 8
Зарегистрирован: 18. Октября 2012
Re: Вопрос по Индексированной таблице
Ответ #9 - 19. Октября 2012 :: 11:38
Печать  
ADirks писал(а) 19. Октября 2012 :: 10:40:
Никак.

ок, спасибо!
  
Наверх
 
IP записан
 
oslokot
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 8
Зарегистрирован: 18. Октября 2012
Re: Вопрос по Индексированной таблице
Ответ #10 - 25. Октября 2012 :: 06:01
Печать  
Здравствуйте! Возник очередной вопрос, который наверняка можно решить используя ИндексированнуюТаблицу

На входе имеется ИТ:
город       сумма   лот
Тула           100        1
Волгоград   120        1
Волгоград   150        3
Воронеж     100        1
Тула           200        2  
Воронеж     180        1

На выходе нужно свернуть таблицу по городу, сложить суммы, а лоты не суммировать, а перечислить через запятую:
город       сумма   лот
Тула           300        1,2
Волгоград   270        1,3
Воронеж     280        1

Возможно ли так сделать?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Вопрос по Индексированной таблице
Ответ #11 - 25. Октября 2012 :: 06:07
Печать  
загнать в sqllite и сделать group_concat

ЗЫ: в ИТЗ разве что перебором или тупо сгруппировать,а при выводе обходить тзПотомки в которых будут перечислены твои лоты
  
Наверх
 
IP записан
 
oslokot
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 8
Зарегистрирован: 18. Октября 2012
Re: Вопрос по Индексированной таблице
Ответ #12 - 25. Октября 2012 :: 06:32
Печать  
Eprst писал(а) 25. Октября 2012 :: 06:07:
ЗЫ: в ИТЗ разве что перебором или тупо сгруппировать,а при выводе обходить тзПотомки в которых будут перечислены твои лоты

Спасибо, это то что нужно!
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Вопрос по Индексированной таблице
Ответ #13 - 25. Октября 2012 :: 06:34
Печать  
Eprst писал(а) 25. Октября 2012 :: 06:07:
загнать в sqllite и сделать group_concat

ЗЫ: в ИТЗ разве что перебором или тупо сгруппировать,а при выводе обходить тзПотомки в которых будут перечислены твои лоты

Угу, я бы сделал по последнему варианту
  
Наверх
ICQ  
IP записан
 
antoneus
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 54
Зарегистрирован: 16. Марта 2009
Пол: Мужской
Re: Вопрос по Индексированной таблице
Ответ #14 - 25. Октября 2012 :: 08:30
Печать  
или так:


     ИТ1 = СоздатьОбъект("ИндексированнаяТаблица");
     ИТ2 = СоздатьОбъект("ИндексированнаяТаблица");
     ИТ1.Загрузить(ТаблЗнач);
     ИТ2.Загрузить(ТаблЗнач);
     ИТ2.ДобавитьИндекс("Город", "Город");
     ИТ1.Свернуть("Город", "Сумма");
     спЛоты = СоздатьОбъект("СписокЗначений");
     ИТ1.ВыбратьСтроки();
     Пока ИТ1.ПолучитьСтроку() = 1 Цикл
           ИТ2.УстановитьФильтр(ИТ1.Город, ИТ1.Город, "Город");
           ИТ2.Выгрузить(спЛоты, "Город", "Лот");
         ИТ1.Лот = СтрЗаменить(спЛоты.ВСтрокуСРазделителями(), """", "");
     КонецЦикла;
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать