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



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Вопрос по фильтру в индексированной таблице
Ответ #15 - 12. Февраля 2008 :: 17:36
Печать  
В общем зарегил:
http://www.1cpp.ru/bugs/show_bug.cgi?id=3559

тест навсякий случай сюда прикладываю

пошел спать
  

IndexTable2.ert ( 7 KB | Загрузки )
Наверх
ICQ  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Вопрос по фильтру в индексированной таблице
Ответ #16 - 12. Февраля 2008 :: 17:38
Печать  
Nick писал(а) 12. Февраля 2008 :: 16:30:
т.е. ты предлагаешь вот так?

Код
Выбрать все
	ИТЗ.УстановитьФильтр( , ПолучитьПустоеЗначение(),"иКонтр",,1);
 



На самом деле, корректный вариант очень простой:

     _фильтр =ПолучитьПустоеЗначение();
     _т.УстановитьФильтр(_фильтр, _фильтр, "к1", 0, 1);

К сожалению, 1С путает наличие параметра типа 0 (ПолучитьПустоеЗначение()) с отсутствием параметра.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Вопрос по фильтру в индексированной таблице
Ответ #17 - 12. Февраля 2008 :: 17:41
Печать  
kms писал(а) 12. Февраля 2008 :: 17:38:
Nick писал(а) 12. Февраля 2008 :: 16:30:
т.е. ты предлагаешь вот так?

Код
Выбрать все
	ИТЗ.УстановитьФильтр( , ПолучитьПустоеЗначение(),"иКонтр",,1);
 



На самом деле, корректный вариант очень простой:

     _фильтр =ПолучитьПустоеЗначение();
     _т.УстановитьФильтр(_фильтр, _фильтр, "к1", 0, 1);

К сожалению, 1С путает наличие параметра типа 0 (ПолучитьПустоеЗначение()) с отсутствием параметра.


Ну вот зачем баг регистрировал  Нерешительный...
  
Наверх
ICQ  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Вопрос по фильтру в индексированной таблице
Ответ #18 - 12. Февраля 2008 :: 17:44
Печать  
Nick писал(а) 12. Февраля 2008 :: 17:41:
Ну вот зачем баг регистрировал  Нерешительный...

Правильно сделал, ибо этот вопрос может возникнуть повторно.
Дядька, бросай уже этот пессимизм, все будет хорошо.
P.S.
Снофф! Улыбка
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Вопрос по фильтру в индексированной таблице
Ответ #19 - 13. Февраля 2008 :: 02:37
Печать  
Ну вот рано радовался Печаль. Проблема следующая как добавить это само "ПустоеЗначение" в список значений?
Штатное поведение 1с таково что она  их туда принципиально не вставляет Печаль
  
Наверх
ICQ  
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Вопрос по фильтру в индексированной таблице
Ответ #20 - 13. Февраля 2008 :: 03:24
Печать  
Получить пустое значение в списке можно так:

Код
Выбрать все
	сзФильтра = СоздатьОбъект("СписокЗначений");
	сзФильтра.ДобавитьЗначение(2,"ДопПоле");
	сзФильтра.ДобавитьЗначение(0,"Пустое");
	сзФильтра.УстановитьЗначение(2,_ПустоеЗначение,"Заменили",);
 



Но поведение фильтра  для 2х полей мне не понятно
По моему должна остатся только 1 строка

Прикладываю тест:
  

IndexTable3.ert ( 53 KB | Загрузки )
Наверх
ICQ  
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Вопрос по фильтру в индексированной таблице
Ответ #21 - 13. Февраля 2008 :: 04:01
Печать  
Вопрос номер следующий: как наложить фильтр:

Колонка1 = <Значение> и Колонка2 <> ПустоеЗначение()
  
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Вопрос по фильтру в индексированной таблице
Ответ #22 - 13. Февраля 2008 :: 06:29
Печать  
Nick писал(а) 13. Февраля 2008 :: 02:37:
Ну вот рано радовался Печаль. Проблема следующая как добавить это само "ПустоеЗначение" в список значений?
Штатное поведение 1с таково что она  их туда принципиально не вставляет Печаль

Никак Печаль, это штатное поведение Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Вопрос по фильтру в индексированной таблице
Ответ #23 - 13. Февраля 2008 :: 06:32
Печать  
artbear писал(а) 13. Февраля 2008 :: 06:29:
Nick писал(а) 13. Февраля 2008 :: 02:37:
Ну вот рано радовался Печаль. Проблема следующая как добавить это само "ПустоеЗначение" в список значений?
Штатное поведение 1с таково что она  их туда принципиально не вставляет Печаль

Никак Печаль, это штатное поведение Улыбка


Ну  в 20 посте я написал как это обходится
  
Наверх
ICQ  
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Вопрос по фильтру в индексированной таблице
Ответ #24 - 13. Февраля 2008 :: 08:41
Печать  
Значить так.  Как выяснилось (путём чтения документации!) пустые значения в фильтрах интерпретируются как открытая граница фильтра.
Цитата:
Один из ключей может быть опущен - при этом в качестве опущеного значения будет автоматически задействовано минимально/максимально возможное значение. Т.е. фильтр будет с открытой границей.


Таким образом, для отбора совсем пустых значений надо делать так:
Код
Выбрать все
	сзФильтр = СоздатьОбъект("СписокЗначений");
	сзФильтр.ДобавитьЗначение(0);
	сзФильтр.УстановитьЗначение(1, _ПустоеЗначение);

	ИТЗ.УстановитьФильтр(сзФильтр, сзФильтр,"иЗначение",, 1);
 



Миха, уж ты то должен был это помнить, а?   Подмигивание
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Вопрос по фильтру в индексированной таблице
Ответ #25 - 13. Февраля 2008 :: 08:53
Печать  
Помнить должен Улыбка

Но Леха, согласись, "пустое значение параметра" и "неуказанный параметр" - это не одно и то же.
Причем это только для типа 0, ПустоеЗначение("Справочник.Блаблабла") не интерпретируется 1С как пропуск параметра.
Короче, нас опять подставили, и если честно, я вчера уже этого не ожидал Улыбка

Кстати, для одноярусных фильтров такой изврат со списком, как в предыдущем предложении, не является необходимым - в багтракере я высказался:
http://www.1cpp.ru/bugs/show_bug.cgi?id=3559

Блин, Леха, я за эти три дня с STL и этой байдой понял одно - век живи - век учись - и т.д. Улыбка

A Nick - однозначно агент of foreign intelligence. Улыбка
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Вопрос по фильтру в индексированной таблице
Ответ #26 - 13. Февраля 2008 :: 09:00
Печать  
Цитата:
A Nick - однозначно агент of foreign intelligence.


Нет я из M9  Смех
  
Наверх
ICQ  
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Вопрос по фильтру в индексированной таблице
Ответ #27 - 13. Февраля 2008 :: 09:13
Печать  
Для полноты картины приведу ещё тест
Код
Выбрать все
	ИТЗ = СоздатьОбъект("ИндексированнаяТаблица");
	ИТЗ.НоваяКолонка("Значение");
	ИТЗ.НоваяКолонка("Расшифровка");
	ИТЗ.ДобавитьИндекс("иЗначение","Значение");


	Спр = СоздатьОбъект("Справочник.Контрагенты");

	ИТЗ.НоваяСтрока();
	ИТЗ.Значение = Спр.ТекущийЭлемент();
	ИТЗ.Расшифровка = "Пустой контрагент";

	ИТЗ.НоваяСтрока();
	ИТЗ.Расшифровка = "Пустое значение ";

	ИТЗ.НоваяСтрока();
	ИТЗ.Значение = 100;
	ИТЗ.Расшифровка = "Число";

	ИТЗ.НоваяСтрока();
	ИТЗ.Значение = "100";
	ИТЗ.Расшифровка = "Строка";

	Спр.ВыбратьЭлементы();

	Спр.ПолучитьЭлемент();
	ИТЗ.НоваяСтрока();
	ИТЗ.Значение = Спр.ТекущийЭлемент();
	ИТЗ.Расшифровка = "Контрагент";

	Спр.ПолучитьЭлемент();
	ИТЗ.НоваяСтрока();
	ИТЗ.Значение = Спр.ТекущийЭлемент();
	ИТЗ.Расшифровка = "Контрагент";

	сзМин = СоздатьОбъект("СписокЗначений");
	сзМин.ДобавитьЗначение(0);
	сзМин.УстановитьЗначение(1, _ПустоеЗначение);

	сзМакс = СоздатьОбъект("СписокЗначений");
	сзМакс.ДобавитьЗначение(0);
	сзМакс.УстановитьЗначение(1, ПолучитьПустоеЗначение("Справочник.Контрагенты"));

	ИТЗ.УстановитьФильтр(сзМин, сзМакс,"иЗначение",, 1);
	ИТЗ.Показать("иЗначение");
 


В результат попадут только строки с контрагентами.  Т.е. такой фильтр считает пустыми все значения, тип которых < 11.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Вопрос по фильтру в индексированной таблице
Ответ #28 - 13. Февраля 2008 :: 16:39
Печать  
ADirks

Леша, меня только что осенило. Улыбка
Проблема в 1С (ИТ тут вообще непричем, это общая тема) не с любым значением типа 0, а только с явно заданным значением "ПолучитьПустоеЗначение()"!

Поэтому

_фильтр =ПолучитьПустоеЗначение();
_т.УстановитьФильтр(_фильтр, _фильтр, "к1", 0, 1);

работает корректно (т.е. фильтр устанавливает), а

_т.УстановитьФильтр(ПолучитьПустоеЗначение(), ПолучитьПустоеЗначение(), "к1", 0, 1);

равносильно

_т.УстановитьФильтр(, , "к1", 0, 1);


Это видимо, фича интерпретатора кода 1С.
Леша... ты меня понимаешь?.. Подмигивание Верно я мыслю?
  

De quelle planète es-tu?
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Вопрос по фильтру в индексированной таблице
Ответ #29 - 14. Февраля 2008 :: 04:39
Печать  
Думаю, тут дело немножко в другом  Улыбка
а именно:
Код
Выбрать все
BOOL CVTExtended::defsSetFilter(int nParam, CValue* param) const
{
	switch( nParam )
	{
	case 0: param->SetTypeCode(USHRT_MAX); return TRUE; break;
	case 1: param->SetTypeCode(USHRT_MAX); return TRUE; break;
	case 2: *param = ""; return TRUE; break;
	case 3: *param = 0L; return TRUE; break;
	case 4: *param = 0L; return TRUE; break;
	}
	return FALSE;
} 


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