Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Минимальные/Масимальные значения ключа в ИТЗ (число прочтений - 3447 )
desty
Full Member
***
Отсутствует



Сообщений: 135
Зарегистрирован: 19. Апреля 2007
Пол: Мужской
Минимальные/Масимальные значения ключа в ИТЗ
14. Июня 2007 :: 08:08
Печать  
Очень хочется назначить фильтр на значение колонок ИТЗ типа НЕ БОЛЕЕ
то есть

Код
Выбрать все
ПоЗначениям"); 



Вопрос:
<КакойСписокЗдесьДолженБыть> - какой список необходимо предоставить ИТЗ, если заранее неизвестны Минимальные значения колонок, могут быть -1000 а могут быть -500000.
Известен только верхний предел.

PS В принципе такой же вопрос существует и в плане фильтра НЕ МЕНЕЕ...

Самый прямой способ в лоб: заполнить <КакойСписокЗдесьДолженБыть> максимально/минимально допустимыми значениями согласно Типа (Число 15 Точность 2 к примеру), максимальным будет 999999999999,99 а минимальным -999999999999,99
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Минимальные/Масимальные значения ключа в ИТЗ
Ответ #1 - 14. Июня 2007 :: 10:28
Печать  
В текущем состоянии можно поступить так:
Минимальные значения получать методом ПолучитьПустоеЗначение(), а максимальные - СоздатьОбъект("КакойНибудьТип"), при этом ТипЗначения(СоздатьОбъект("КакойНибудьТип")) должен возвращать 100.  Фишка в том, что при сортировке (и соответственно фильтрации)  вначале сравниваются числовые коды типов, а потом уже всё остальное.  Вообще-то это не очень здорово, но работать будет.

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Минимальные/Масимальные значения ключа в ИТЗ
Ответ #2 - 14. Июня 2007 :: 11:24
Печать  
ADirks писал(а) 14. Июня 2007 :: 10:28:
Надо бы наверное сделать, чтобы одно из значений ключа для фильтра могло быть пустым.

+1
  

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



Сообщений: 135
Зарегистрирован: 19. Апреля 2007
Пол: Мужской
Re: Минимальные/Масимальные значения ключа в ИТЗ
Ответ #3 - 14. Июня 2007 :: 12:04
Печать  
kms писал(а) 14. Июня 2007 :: 11:24:
ADirks писал(а) 14. Июня 2007 :: 10:28:
Надо бы наверное сделать, чтобы одно из значений ключа для фильтра могло быть пустым.

+1


Тоже согласен: +1, а то как то некрасиво получается

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

  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Минимальные/Масимальные значения ключа в ИТЗ
Ответ #4 - 14. Июня 2007 :: 12:12
Печать  
Да, Леша, я добавлю, что у меня такая задача вставала только с числами и строками.
Где-то, кстати, эта идея об однополярных фильтрах уже встречалась, я помню.
« Последняя редакция: 14. Июня 2007 :: 16:24 - kms »  

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


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

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Минимальные/Масимальные значения ключа в ИТЗ
Ответ #5 - 18. Июня 2007 :: 08:57
Печать  
Сделал. Завтра должно в ночной сборке появиться.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Минимальные/Масимальные значения ключа в ИТЗ
Ответ #6 - 18. Июня 2007 :: 09:20
Печать  
Леш, а фильтрация будет только от минус бесконечности до текущего значения ?
В другую, большую сторону никак?
  

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


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

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Минимальные/Масимальные значения ключа в ИТЗ
Ответ #7 - 18. Июня 2007 :: 10:48
Печать  
artbear писал(а) 18. Июня 2007 :: 09:20:
Леш, а фильтрация будет только от минус бесконечности до текущего значения ?
В другую, большую сторону никак?

Да ну почему же...  Какой ключ не указан, с той стороны и граница открыта будет.  Это я в коммите так написал, чтоб уж совсем документацию не повторять  Улыбка
А в доке я написал так:
Цитата:
Один из ключей может быть опущен - при этом в качестве опущеного значения будет автоматически задействовано минимально/максимально возможное значение. Т.е. фильтр будет с открытой границей.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Минимальные/Масимальные значения ключа в ИТЗ
Ответ #8 - 18. Июня 2007 :: 15:20
Печать  
Да, пожалуй, надо вот что еще отметить.
У нас сейчас в ИТ несколько нессиметричные границы слева и справа получились.

Правая граница с type == USHRT_MAX - строгая, всегда больше любого возможного значения;
Левая граница с type == 0 - нестрогая, можно запросто провалитьсся в сравнение строк на таблицах с пустыми значениями;

Вроде это пока не является проблемой, во всяком случае абсолютный ноль "ПолучитьПустоеЗначение()" попадает в границы фильтра (равен левой границе).
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Минимальные/Масимальные значения ключа в ИТЗ
Ответ #9 - 18. Июня 2007 :: 16:29
Печать  
Короче, пришел к осознанию двух проблем:

1. В новой версии будет невозможно работать с одномерными фильтрами по неопределенным (пустым) значениям
2. Схема сравнения неопределенных пустых значений в ИТ и вообще в 1С различны.

Вот такой тест (для старого варианта):
Код
Выбрать все
Процедура _ТестПустые()
	_пусто = ПолучитьПустоеЗначение();

	_т =СоздатьОбъект("ИндексированнаяТаблица");
	_т.НоваяКолонка("к1");
	_т.НоваяСтрока(); _т.к1 =_пусто;
	_т.НоваяСтрока(); _т.к1 ="ПолучитьПустоеЗначение..."; _т.к1 =ПолучитьПустоеЗначение(); // формируем пустое с непустой строкой

	Сообщить(?(_т.к1 =_пусто, "равно", "не равно")); // равно

	_т.ДобавитьИндекс("к", "к1");

	_т.УстановитьФильтр(_пусто, _пусто, "к"); // в новой версии не получится
	Сообщить(_т.КоличествоСтрок("к")); // 1
КонецПроцедуры
 



У себя как вариант сделал пока так:
Код
Выбрать все
BOOL CVTExtended::defsSetFilter(int nParam, CValue* param) const
{
	switch( nParam )
	{
	case 0: param->SetTypeCode(USHRT_MAX); break;
	case 1: param->SetTypeCode(USHRT_MAX); break;
	case 2: *param = 0L; break;
	case 3: *param = 0L; break;
	case 4: *param = 0L; break;
	}
	return TRUE;
}

и

void CVTExtFilter::Set(CValue const& Min, CValue const& Max)
{
	if( Min.GetTypeCode() == USHRT_MAX )
		FillMinRow();
	else
		FillSearchKey(Min, Rec_min.IndexFields, Row_min, Rec_min);

	if( Max.GetTypeCode() == USHRT_MAX )
		FillMaxRow();
	else
		FillSearchKey(Max, Rec_max.IndexFields, Row_max, Rec_max);
}
 



Леша, я ничего не забыл? Сравнение строк для неопределенных - для чего оно может быть нужно?
  

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


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

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Минимальные/Масимальные значения ключа в ИТЗ
Ответ #10 - 19. Июня 2007 :: 03:53
Печать  
Да, вот это вот:
Код
Выбрать все
BOOL CVTExtended::defsSetFilter(int nParam, CValue* param) const
{
	switch( nParam )
	{
	case 0: param->SetTypeCode(USHRT_MAX); break;
	case 1: param->SetTypeCode(USHRT_MAX); break;
	case 2: *param = 0L; break;
	case 3: *param = 0L; break;
	case 4: *param = 0L; break;
	}
	return TRUE;
}
 

будет правильно. По крайней мере ничего другого в голову не приходит.

И ещё не понятно, нафига неопределенные значения сравниваются как
Код
Выбрать все
		case UNDEFINE_TYPE_1C:
			return string_compare(left.m_String.operator LPCSTR(), right.m_String.operator LPCSTR(), IdxRec);
			break;
 


были какие-то грабли, что-ли?...  Ведь явно же преднамеренно сделано.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Минимальные/Масимальные значения ключа в ИТЗ
Ответ #11 - 19. Июня 2007 :: 07:49
Печать  
ADirks писал(а) 19. Июня 2007 :: 03:53:
И ещё не понятно, нафига неопределенные значения сравниваются как
Код
Выбрать все
		case UNDEFINE_TYPE_1C:
			return string_compare(left.m_String.operator LPCSTR(), right.m_String.operator LPCSTR(), IdxRec);
			break;
 


были какие-то грабли, что-ли?...  Ведь явно же преднамеренно сделано.

Леша, я вспомнил! Улыбка

Это я сам, оказывается, добавил в 1.39.4.3, когда начал работать со смешанными таблицами, содержащими пустые значения.
Но, конечно, это лишнее для пустых - у них же строки не обязаны быть корректными.

Наверное, правильно будет, если мы будем считать неопределенные значения равными в любом случае:
Код
Выбрать все
		case STRING_TYPE_1C:
			return string_compare(left.m_String.operator LPCSTR(), right.m_String.operator LPCSTR(), IdxRec);
			break;
		case UNDEFINE_TYPE_1C:
			return 0;
			break;
 

  

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Минимальные/Масимальные значения ключа в ИТЗ
Ответ #12 - 19. Июня 2007 :: 13:10
Печать  
kms писал(а) 19. Июня 2007 :: 07:49:
Наверное, правильно будет, если мы будем считать неопределенные значения равными в любом случае:

+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 записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать