Переключение на Главную Страницу Страницы: 1 [2]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Помогите с Индексированной таблицей (число прочтений - 7279 )
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Помогите с Индексированной таблицей
Ответ #15 - 02. Марта 2010 :: 08:45
Печать  
pRn писал(а) 01. Марта 2010 :: 20:09:
и ещё, в таблице есть элементы у которых нет кросс кода, точнее он уникальные, т.е. по идее тзПотомки должна быть пустая, а у меня почему то все пустые сгруппировалить в самой первой строчке

Ты неверно понимаешь работу метода Группировать.
Он тебе создает группировочную строку и все строки, которые участвовали в этой группировке укладывает в ТЗПотомки.
  
Наверх
ICQ  
IP записан
 
pRn
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 14
Зарегистрирован: 15. Февраля 2010
Re: Помогите с Индексированной таблицей
Ответ #16 - 16. Марта 2010 :: 21:15
Печать  
Теперь понял, но возник другой вопрос связанный с  индексированной таблицей.
Значит есть таблица значений, содержит 3 поля:
"Товар","ИндКод","Количество". поле "ИндКод" - уникальное.
И есть вторая таблица,
"НомерСтроки","Товар","ИндКод","Количество", но в ней ИндКод не уникальное поле.
Задача состоит в том, что бы взять к примеру из первой таблицы первую строчку, и по значению колонки "ИндКод" найти во второй таблице все строчки с таким же значением одноименной колонки, (точнее номера этих строчек).
Подскажите плз.
  
Наверх
 
IP записан
 
pavel_tr
Senior Member
****
Отсутствует



Сообщений: 279
Местоположение: Казань
Зарегистрирован: 14. Октября 2006
Пол: Мужской
Re: Помогите с Индексированной таблицей
Ответ #17 - 16. Марта 2010 :: 21:49
Печать  
УстановитьФильтр() + последующий перебор строк по индексу
  
Наверх
 
IP записан
 
pRn
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 14
Зарегистрирован: 15. Февраля 2010
Re: Помогите с Индексированной таблицей
Ответ #18 - 17. Марта 2010 :: 08:31
Печать  
Мне в принципе важен только номер строки во второй таблице.
т.е. я пишу
ИндексирТаблица.УстановитьФильтр(,,,,,)
//
Синтаксис: УстановитьФильтр(КлючМин, КлючМакс, [Индекс = ""], [чТолькоУникальные = 0], [чИнверсия = 0])
Параметры:
КлючМин - тип: любой. Нижняя граница фильтра. Задаётся так же, как в методе НайтиСтроку().
КлючМакс - тип: любой. Верхняя границы фильтра. Задаётся так же, как в методе НайтиСтроку().
Индекс - тип: Строка, Число. Идентификатор или номер индекса. По умолчанию используется основной индекс.
чТолькоУникальные - тип: Число. Если 1 - то в выборку попадут только строки с уникальным значением ключа.
чИнверсия - тип: Число. 0 - обычный фильтр, 1 - инверсный фильтр.

Если индекс построен по одной колонке, то в качестве ключей можно использовать значение колонки. Если же индекс по нескольким колонкам, то ключ должен быть СписокЗначений, содержащий значения ключевых колонок, заданных в методе ДобавитьИндекс().

Один из ключей может быть опущен - при этом в качестве опущеного значения будет автоматически задействовано минимально/максимально возможное значение. Т.е. фильтр будет с открытой границей.

Описание: устанавливает динамический фильтр на таблицу по указанному индексу. Фильтр влияет на работу методов: ВНачало(), ВыбратьСтроки(), ВКонец(), ПолучитьСтроку(), СледующаяСтрока(), ПредыдущаяСтрока(),Свернуть(),Итог(), ЗаполнитьКолонку(), Выгрузить(), Загрузить(), Объединить().
//
только вот что писать вместо параметров функции в моем случае
  
Наверх
 
IP записан
 
pavel_tr
Senior Member
****
Отсутствует



Сообщений: 279
Местоположение: Казань
Зарегистрирован: 14. Октября 2006
Пол: Мужской
Re: Помогите с Индексированной таблицей
Ответ #19 - 17. Марта 2010 :: 08:49
Печать  
Ну всё ж понятно! КлючМин и КлючМакс - значение ИндКод из первой таблицы, Индекс - название индекса по колонке ИндКод второй таблицы.

Дальше ВыбратьСтроки(имя_индекса), ПолучитьСтроку(имя_индекса) и смотрим номера строк
  
Наверх
 
IP записан
 
pavel_tr
Senior Member
****
Отсутствует



Сообщений: 279
Местоположение: Казань
Зарегистрирован: 14. Октября 2006
Пол: Мужской
Re: Помогите с Индексированной таблицей
Ответ #20 - 17. Марта 2010 :: 08:57
Печать  
У нас подобная конструкция используется при подгрузке прайса из Excel, когда по значению кода EAN из прайса надо вытащит описание (малость сократил, но понятно):

Код
Выбрать все
тзПрайс.ДобавитьИндекс("индЕАН","EAN",);

ТекЕАН13=СокрЛП(Партия.Владелец.EAN13);

Если ТекЕАН13<>"" тогда
выб=СоздатьОбъект("ТаблицаЗначений");
тзПрайс.УстановитьФильтр(ТекЕАН13,ТекЕАН13,"индЕАН");
тзПрайс.ВыбратьСтроки("индЕАН");
Пока тзПрайс.ПолучитьСтроку("индЕАН")=1 Цикл
	выб.НоваяСтрока();
	выб.EAN13=ТекЕАН13;
	ание"));
КонецЦикла; 

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



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Помогите с Индексированной таблицей
Ответ #21 - 17. Марта 2010 :: 11:28
Печать  
Смотри Метод ЛевоеСоединение()
Цитата:
Описание: Выполняет операцию, аналогичную команде SQL Left Join. Для каждой строки из левой таблицы (левой таблицей является текущий объект) добавляются все строки из правой таблицы, соответствующие ключевому выражению. Ключевое выражение определяется параметром стрКолонкиЛевойИТ. Из правой таблицы в левую переносятся значения колонок, указанных в параметре стрКолонкиПравойИТ. Если строка левой таблицы не найдена в правой, то значения колонок левой таблицы остаются неизменными.
  
Наверх
ICQ  
IP записан
 
pRn
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 14
Зарегистрирован: 15. Февраля 2010
Re: Помогите с Индексированной таблицей
Ответ #22 - 17. Марта 2010 :: 15:06
Печать  
Понял, большое спасибо!
  
Наверх
 
IP записан
 
pRn
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 14
Зарегистрирован: 15. Февраля 2010
Re: Помогите с Индексированной таблицей
Ответ #23 - 17. Марта 2010 :: 15:58
Печать  
что я делаю не так
М = СоздатьОбъект("ТаблицаЗначений");
М.НоваяКолонка("НомСтроки");
М.НоваяКолонка("КодИД");
Для РядБ=1 По КвоСтрокБ  Цикл
    КодТек  = СокрЛП(строка(ОкноЕхсеl.Cells(Ряд, 19).Value));
    М.НоваяСтрока();
    М.НомСтроки = РядБ;
    М.КодИД = КодТек;
    Состояние("основная таблица, обработано: " + рядБ + " строк");
КонецЦикла;                                          
ТИ = СоздатьОбъект("ИндексированнаяТаблица");
ТИ.Загрузить(М);
ТИ.ДобавитьИндекс("Инд","КодИД",);
Шиг.ВыбратьСтроки();
Пока Шиг.ПолучитьСтроку() = 1 Цикл
   ТекКод = Шиг.КодИД;      
   ТИ.УстановитьФильтр(ТекКод,ТекКод,"Инд");
   ТИ.ВыбратьСтроки("Инд");
   Пока ТИ.ПолучитьСтроку("Инд")=1 Цикл
      РабочаяКнигаБ.Cells(ТИ.ПолучитьЗначение(ТИ.НомерСтроки("Инд"),"НомСтроки"), 7).Value = Число(Шиг.Кол);
   КонецЦикла;
КонецЦикла;
Упорно не хочет получатьСтроку("Инд")
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Помогите с Индексированной таблицей
Ответ #24 - 17. Марта 2010 :: 21:44
Печать  
Так - работает:
Код
Выбрать все
Процедура Сформировать()
	ТИ = СоздатьОбъект("ИндексированнаяТаблица");
	ТИ.НоваяКолонка("НомСтроки");
	ТИ.НоваяКолонка("КодИД");
	КвоСтрокБ = 30;
	Для РядБ=1 По КвоСтрокБ  Цикл
		КодТек  = РядБ*3;
		ТИ.НоваяСтрока();
		ТИ.НомСтроки = РядБ;
		ТИ.КодИД = КодТек;
		Состояние("основная таблица, обработано: " + рядБ + " строк");
	КонецЦикла;
	Состояние("Первая таблица");
	ТИ.Показать();
	Шиг = СоздатьОбъект("ИндексированнаяТаблица");
	Шиг.НоваяКолонка("КодИд");
	Шиг.НоваяКолонка("Данные");
	Для РядБ=1 По КвоСтрокБ  Цикл
		КодТек  = РядБ*РядБ;
		Шиг.НоваяСтрока();
		Шиг.КодИД = КодТек;
		Шиг.Данные = "__"+Строка(КодТек)+"__";
	КонецЦикла;
	Состояние("Вторая таблица");
	Шиг.Показать();
	Шиг.ДобавитьИндекс("шиг_Инд","КодИД");
	ТИ.ЛевоеСоединение("КодИд",Шиг,"шиг_Инд","Данные");
	Состояние("Объединение");
	ТИ.Показать();
КонецПроцедуры 

  
Наверх
ICQ  
IP записан
 
pRn
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 14
Зарегистрирован: 15. Февраля 2010
Re: Помогите с Индексированной таблицей
Ответ #25 - 18. Марта 2010 :: 20:02
Печать  
Вроде, разобрался, работает, но вот возник вопрос сразу же, а как выцепить те позиции из Шиг. которых нет в ТИ????
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Помогите с Индексированной таблицей
Ответ #26 - 19. Марта 2010 :: 06:33
Печать  
Читать описание метода не пробовал? Повторю, если не понятно:
Цитата:
Из правой таблицы в левую переносятся значения колонок, указанных в параметре стрКолонкиПравойИТ.

значит тут: ТИ.ЛевоеСоединение("КодИд",Шиг,"шиг_Инд","Данные");
вместо одной колонки "Данные", указываешь нужные тебе колонки из "Шиг", например "Кол1, Кол2, Кол55"
  
Наверх
ICQ  
IP записан
 
pRn
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 14
Зарегистрирован: 15. Февраля 2010
Re: Помогите с Индексированной таблицей
Ответ #27 - 20. Марта 2010 :: 07:00
Печать  
сделал так - вродь работает
     Шиг.ДобавитьИндекс("шиг_Инд","КодИД");
     М.ЛевоеСоединение("КодИд",Шиг,"шиг_Инд","Кол");
     М.ВыбратьСтроки();
     Пока М.ПолучитьСтроку() = 1 Цикл
           ОкноЕхсеl2.Cells(М.НомСтроки, 7).Value = Число(М.Кол);
           нстр = Шиг.НайтиСтроку("шиг_Инд",М.КодИД,1,1);
           Если нстр <> 0 Тогда
                 Шиг.УдалитьСтроку(нстр);
           КонецЕсли;
     КонецЦикла;  
получается что в Шиг остается только те позиции, кторых нет в М
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Помогите с Индексированной таблицей
Ответ #28 - 20. Марта 2010 :: 13:56
Печать  
Эм-м-м, а зачем ты удаляешь из Шиг строки? Разумеется, если ты будешь удалять из Шиг строки, которые нашел в М, то, в конечном счете, у тебя Цитата:
в Шиг остается только те позиции, которых нет в М

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