gifts2017

Функция перезагрузки Таблицы Значений по условиям

Опубликовал Стелла (stellavolf) в раздел Программирование - Универсальные функции

Возвращает таблицу значений, отфильтрованную по условию в заданной колонке (равно, не равно, больше, меньше, содержит, равны две указанные колонки)
Функция ПерегрузитьТЗ(пТЗ,пУсловие,пЗначение,пНомКол)   
	// пУсловие "=" или ">" или "<" или "<>" или "in,=К"
	// nНомКол - номер колонки в которой nЗначение должно удовлетворять условию
	// "=К" - сравнение значений в двух колонках, в этом случае nЗначение номер второй колоки    
	//--- возвращает ТЗ отфильтрованную по условиию в заданной колонке
	//-- пример вызова:  ТЗ.Загрузить(ПерегрузитьТЗ(ТЗ,"in",5,1));
	Nil=ПолучитьПустоеЗначение();
	Контроль="=,<,>,<>,in,=К";
	Контроль=СтрЗаменить(Контроль,",",РазделительСтрок);
	Ошибка=1;
	Для А=1 По СтрКоличествоСтрок(Контроль) Цикл 
		ТС=СокрЛП(СтрПолучитьСтроку(Контроль,А)); 
		Если ТС=пУсловие Тогда
			Ошибка=0;
			Прервать;
		КонецЕсли; 
	КонецЦикла;      
	Если Ошибка=1 Тогда 
		Сообщить("неверное условие "+пУсловие,"!");
		Возврат  Nil;
	КонецЕсли;
	вТЗ=СоздатьОбъект("ТаблицаЗначений");
	пУсловие=СокрЛП(пУсловие);
	вТЗ.Загрузить(пТЗ);
	вТЗ.УдалитьСтроки();
	Для А=1 По пТЗ.КоличествоСтрок() Цикл
		Если пУсловие="=К"  Тогда
			Если пТЗ.ПолучитьЗначение(А,пНомКол)=пТЗ.ПолучитьЗначение(А,пЗначение) Тогда 
				вТЗ.НоваяСтрока();
				Для Кол=1 по вТЗ.КоличествоКолонок() Цикл
					вТЗ.УстановитьЗначение(вТЗ.КоличествоСтрок(),Кол,пТЗ.ПолучитьЗначение(А,Кол));
				КонецЦикла;
			КонецЕсли;        
		ИначеЕсли пУсловие="="  Тогда
			Если пТЗ.ПолучитьЗначение(А,пНомКол)=пЗначение Тогда 
				вТЗ.НоваяСтрока();
				Для Кол=1 по вТЗ.КоличествоКолонок() Цикл
					вТЗ.УстановитьЗначение(вТЗ.КоличествоСтрок(),Кол,пТЗ.ПолучитьЗначение(А,Кол));
				КонецЦикла;
			КонецЕсли;
		ИначеЕсли пУсловие=">" Тогда   
			Если пТЗ.ПолучитьЗначение(А,пНомКол)>пЗначение Тогда 
				вТЗ.НоваяСтрока();      
				Для Кол=1 по вТЗ.КоличествоКолонок() Цикл
					вТЗ.УстановитьЗначение(вТЗ.КоличествоСтрок(),Кол,пТЗ.ПолучитьЗначение(А,Кол));
				КонецЦикла;
			КонецЕсли;
		ИначеЕсли пУсловие="<" Тогда  
			Если пТЗ.ПолучитьЗначение(А,пНомКол)<пЗначение Тогда 
				вТЗ.НоваяСтрока();
				Для Кол=1 по вТЗ.КоличествоКолонок() Цикл
					вТЗ.УстановитьЗначение(вТЗ.КоличествоСтрок(),Кол,пТЗ.ПолучитьЗначение(А,Кол));
				КонецЦикла;
			КонецЕсли;
		ИначеЕсли пУсловие="<>" Тогда
			Если пТЗ.ПолучитьЗначение(А,пНомКол)<>пЗначение Тогда 
				вТЗ.НоваяСтрока();
				Для Кол=1 по вТЗ.КоличествоКолонок() Цикл
					вТЗ.УстановитьЗначение(вТЗ.КоличествоСтрок(),Кол,пТЗ.ПолучитьЗначение(А,Кол));
				КонецЦикла;
			КонецЕсли; 
		ИначеЕсли пУсловие="in" Тогда  
			ТекСтр=Строка(пТЗ.ПолучитьЗначение(А,пНомКол));
			Если Найти(ТекСтр,пЗначение)>0 Тогда 
				вТЗ.НоваяСтрока();
				Для Кол=1 по вТЗ.КоличествоКолонок() Цикл
					вТЗ.УстановитьЗначение(вТЗ.КоличествоСтрок(),Кол,пТЗ.ПолучитьЗначение(А,Кол));
				КонецЦикла;
			КонецЕсли;
		КонецЕсли; 
	КонецЦикла;  
	Возврат вТЗ; 
КонецФункции 

См. также

Подписаться Добавить вознаграждение
Комментарии
1. fixin 06.11.08 09:47
Вообще конечно, все это хорошо для маленьких таблиц.
Автор, убей вот этот код, потому что на больших таблицах он будет жутко тормозить:

вТЗ.Загрузить(пТЗ);
вТЗ.УдалитьСтроки();

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

К тому же непонятна суть затеи - если хочется оставить в ТЗ только нужные по условию строки, то не проще ли сначала отобрать массив ненужных строк, а затем его удалить, зачем все эти перезагрузки?

Предлагаю другой алгол:
1. Сначала отбираешь строки, не удовлетворяющие условию.
2. Потом их чикаешь.

Все, никаких перезагрузок.
2. Евгений Мартыненков (JohnyDeath) 06.11.08 09:58
3. Lomok (lomok) 06.11.08 13:23
(2)Индексированная таблица рулит!
4. Алексей Константинов (alexk-is) 06.11.08 14:32
Если без использования внешних компонент, то посмотри http://infostart.ru/blogs/index.php?id=693&ref=34707
blogs/693 (7) рекомендую вариант alexk v.2
замени следующую строку на свои проверки
Код
Если УсловиеВыполняется(ТЗ.К) = 1 Тогда
Показать полностью
5. Алексей Константинов (alexk-is) 06.11.08 14:38
Код
   Nil=ПолучитьПустоеЗначение();
   Контроль="=,<,>,<>,in,=К";
   Контроль=СтрЗаменить(Контроль,",",РазделительСтрок);
   Ошибка=1;
   Для А=1 По СтрКоличествоСтрок(Контроль) Цикл 
      ТС=СокрЛП(СтрПолучитьСтроку(Контроль,А)); 
      Если ТС=пУсловие Тогда
         Ошибка=0;
         Прервать;
      КонецЕсли; 
   КонецЦикла;      
   Если Ошибка=1 Тогда 
      Сообщить("неверное условие "+пУсловие,"!");
      Возврат  Nil;
   КонецЕсли;
Показать полностью


замени на
Код
Если Найти(",=,<,>,<>,in,=К,", "," + пУсловие + "," ) = 0 Тогда
   Сообщить("Неверное условие " + пУсловие, "!");
   Возврат  ПолучитьПустоеЗначение();
КонецЕсли;
Показать полностью
6. Аркадий Кучер (Abadonna) 06.11.08 15:42
(4)>Если Найти(",=,<,>,<>,in,=К,", "," + пУсловие + "," ) = 0 Тогда
Ага! Например, были сиволы >> , и что твоя вернет? Что все зашибись?(!)
7. Аркадий Кучер (Abadonna) 06.11.08 15:47
(1)>то не проще ли сначала отобрать массив ненужных строк
И что ж ты все к семерке с восьмерочными мерками и методами? Нема такого в семерке
8. Алексей Константинов (alexk-is) 06.11.08 23:07