Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Проблема с наложением фильтра в ИТ (число прочтений - 5252 )
SMAch
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 22
Зарегистрирован: 20. Марта 2007
Проблема с наложением фильтра в ИТ
05. Марта 2008 :: 10:06
Печать  
Столкнулся с проблемой в наложении фильтра на ИТ.
Суть проблемы изложил в небольшой обработке:
В общем смысл наверное будет понятен. Ожидалось что выведет сообщение с нулем строк, но
результат оказался иным:
Кол строк фильmр: 1


Процедура Сформировать()
     Т = СоздатьОбъект("ИндексированнаяТаблица");
     Т.НоваяКолонка("ДатаИсп");
     Т.НоваяКолонка("Данные");
     
     Т.НоваяСтрока();
     Т.ДатаИсп = Дата(53,01,01);
     Т.Данные = "данные";
     
     Т.ДобавитьИндекс("_Дан_Дата","ДатаИсп,Данные");
     
     СпФ = СоздатьОбъект("СписокЗначений");
     СпФ2 = СоздатьОбъект("СписокЗначений");
     
     СпФ.ДобавитьЗначение(ПолучитьПустоеЗначение("Дата"));
     СпФ.ДобавитьЗначение("ДругиеДанные");
     
     СпФ2.ДобавитьЗначение(Дата(2050,01,01));
     СпФ2.ДобавитьЗначение("ДругиеДанные");

     Т.УстановитьФильтр(СпФ,СпФ2,"_Дан_Дата");
     
     Сообщить("Кол строк фильmр: " + Т.КоличествоСтрок("_Дан_Дата"));
КонецПроцедуры

Прошу поделится своими соображениями...
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Проблема с наложением фильтра в ИТ
Ответ #1 - 05. Марта 2008 :: 10:13
Печать  

ПолучитьПустоеЗначение("Дата") < Дата('01.01.0053') < Дата('01.01.2050')

Тут все нормально.

P.S.
Неплохой разброс дат...
  

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


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

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Проблема с наложением фильтра в ИТ
Ответ #2 - 05. Марта 2008 :: 10:14
Печать  
Боюсь что всё дело в Дата(53,01,01)
  
Наверх
 
IP записан
 
SMAch
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 22
Зарегистрирован: 20. Марта 2007
Re: Проблема с наложением фильтра в ИТ
Ответ #3 - 05. Марта 2008 :: 11:11
Печать  
Поле дата тут не причем.
Проблема с полем "Данные"
В таблице "Данные" = данные
А в фильтре "Данные" = ДругиеДанные
Но при этом в фильтр все равно эта строчка попадает

Фильтр почему то это второе поле не учитывает, а фильтрует тока по дате
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Проблема с наложением фильтра в ИТ
Ответ #4 - 05. Марта 2008 :: 11:30
Печать  
Я думаю, что проблема на самом деле в твоем понимании сущности сложного индекса.

Для более правильного понимания попробуй представить себе индекс по строке как сложный индекс по символам.

"ab" < "bd" < "cb"
несмотря на то, что "d" не попадает в интервал между "b" и "b".
  
Наверх
www  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Проблема с наложением фильтра в ИТ
Ответ #5 - 05. Марта 2008 :: 11:33
Печать  
Попробуй в строках
  Т.ДатаИсп = Дата(53,01,01);
и
  СпФ.ДобавитьЗначение(ПолучитьПустоеЗначение("Дата"));
указать одинаковые даты.
  
Наверх
www  
IP записан
 
SMAch
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 22
Зарегистрирован: 20. Марта 2007
Re: Проблема с наложением фильтра в ИТ
Ответ #6 - 05. Марта 2008 :: 12:11
Печать  
естественно ето ничего не дает, т.к. попадаем в начало интервала даты, и фильтр опять не обращает внимания на второе поле индекса.

Не совсем уверен что именно так нужно понимать сущность сложного индекса.
  
Наверх
 
IP записан
 
SMAch
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 22
Зарегистрирован: 20. Марта 2007
Re: Проблема с наложением фильтра в ИТ
Ответ #7 - 05. Марта 2008 :: 12:15
Печать  
Получается, что нельзя наложить интервальный фильтр по двум полям. А только на одно, причем этот интервал должен быть указан в последнем поле индекса??? Так или нет???
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Проблема с наложением фильтра в ИТ
Ответ #8 - 05. Марта 2008 :: 12:36
Печать  
SMAch писал(а) 05. Марта 2008 :: 12:11:
естественно ето ничего не дает, т.к. попадаем в начало интервала даты, и фильтр опять не обращает внимания на второе поле индекса.


Учти, что в данном случае "Д" < "д", так что фильтр на самом деле обращает внимание на второе поле индекса, просто твоя запись опять попадает в фильтр.

Код
Выбрать все
Процедура Сформировать()

	Т = СоздатьОбъект("ИндексированнаяТаблица");
	Т.НоваяКолонка("ДатаИсп");
	Т.НоваяКолонка("Данные");

	Т.НоваяСтрока();
	Т.ДатаИсп = Дата(53,01,01);
	Т.Данные = "данные";

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

	СпФ = СоздатьОбъект("СписокЗначений");
	СпФ2 = СоздатьОбъект("СписокЗначений");

	СпФ.ДобавитьЗначение(Дата(53,01,01));
	СпФ.ДобавитьЗначение("другиеДанные");

	СпФ2.ДобавитьЗначение(Дата(2050,01,01));
	СпФ2.ДобавитьЗначение("другиеДанные");

	Т.УстановитьФильтр(СпФ,СпФ2,"_Дан_Дата");

	Сообщить("Кол строк фильmр: " + Т.КоличествоСтрок("_Дан_Дата"));
КонецПроцедуры 



сообщит "Кол строк фильmр: 0"
  
Наверх
www  
IP записан
 
SMAch
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 22
Зарегистрирован: 20. Марта 2007
Re: Проблема с наложением фильтра в ИТ
Ответ #9 - 05. Марта 2008 :: 16:07
Печать  
как то очень странно фильтр обращает внимание на второе поле. По какому принципу он вообще сравнивает соответствие или несоответсвие значений второго поля таблицы.
И почему необходимо задавать в интервале дату равную значению в таблице. Если задать меньше то отрабатывается совершенно иначе.

В данном примере проблема решается перестановкой интервального ключа фильтра в последнее поле индекса.

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

СпФ.ДобавитьЗначение("ДругиеДанные");
СпФ.ДобавитьЗначение(ПолучитьПустоеЗначение("Дата"));

СпФ2.ДобавитьЗначение("ДругиеДанные");
СпФ2.ДобавитьЗначение(Дата(2050,01,01));

Но ето ведь частный случай.
на самом деле задача стоит в том чтобы отфильтровать ИТ по нескольким конкретным значениям и еще по нескольким интервальным значениям, при этом не зная конкретных данных в исходной ИТ(которые могут быть и пустыми).
Думается это можно сделать, если понять суть построения сложного индекса. Видимо я чего то недопонимаю. Нерешительный

Пожалуста, просветите по использованию сложного индекса  или подкинте статейку, которая все прояснит. Заранее спасибо...........
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Проблема с наложением фильтра в ИТ
Ответ #10 - 05. Марта 2008 :: 17:01
Печать  
Для реализации (щас умное слово скажу, я его совсем недавно выучил) ортогонального фильтра я бы попробовал следующее (именно в этом порядке).
1. Попробовал бы создать два индекса, а потом попробовал бы выполнить метод УстановитьФильтр() два раза, последовательно для каждого индекса.
2. Если не получится - закинуть идею о добавлении такого поведения ADirks'у или kms'у.
3. Пока они там лоб морщат - реализовал бы необходимое доступными средствами. Таких средств вижу как минимум два.
3.1. Добавление сложного поля, по которому бы и индексировал и фильтровал (негибкое, но быстрое решение)
3.2. Много полей, по каждому отдельный индекс, дальше последовательный вызов УстановитьФильтр() - Выгрузить() для каждого измерения, участвующего в пересечении. (гибкое, но медленное решение).
  
Наверх
www  
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Проблема с наложением фильтра в ИТ
Ответ #11 - 05. Марта 2008 :: 17:09
Печать  
Цитата:
1. Попробовал бы создать два индекса, а потом попробовал бы выполнить метод УстановитьФильтр() два раза, последовательно для каждого индекса.

Так не работает, для любой выборки результатов необходимо указать конкретный индекс
  
Наверх
ICQ  
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Проблема с наложением фильтра в ИТ
Ответ #12 - 06. Марта 2008 :: 04:20
Печать  
Цитата:
Пожалуста, просветите по использованию сложного индекса  или подкинте статейку, которая все прояснит. Заранее спасибо...........

Попробую.
Самое простое - давайте представим составной индекс как строку. В нашем случае это будет "19530101данные".  Интервал фильтра ["0000000ДругиеДанные", "20500101ДругиеДанные"].  При таком представлении невооружённым глазом видно, что строка попадает в заданный диапазон.  А вот строка "20530101данные" уже не попала бы, о чём я и намекал в (2).

Иногда бывает полезно не оперировать высокими абстракциями, типа "коммутативность" или "транзитивность", а тупо взять свои руки, и сложить два и два при помощи пальцев.  Правда, больше чем пять плюс пять сложить не удастся, но ведь нам этого и не нужно, правда  Подмигивание.  Чтобы придумать арифметику достаточно двух пальцев, и ещё один нужен чтобы понять все законы арифметики.  (к чемя я всё это, а?)

PS отчего-то вспомнился древний прикол: to be or not to be = FFFF
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Проблема с наложением фильтра в ИТ
Ответ #13 - 06. Марта 2008 :: 11:20
Печать  
Леш, а правда, можно ли сделать пересечение индексов?
То есть есть две независимые колонки и нам нужно найти строки, которые попадают в ДВА фильтра одновременно.

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Проблема с наложением фильтра в ИТ
Ответ #14 - 06. Марта 2008 :: 11:24
Печать  
Я начинал думать о синтаксическом анализаторе конструкций вроде


Выгрузить("(инд1 && инд2) || инд3")


Это было бы полезно и можно было бы сделать эффективно.
К сожалению, лимит времени не позволил реализовать.

P.S.
Плюс сейчас у меня есть мысль о добавлении объекта для работы c SQLite.
Не знаю, в каких рамках, 1cpp 3.0, не 1cpp 3.0, но он будет реализован, ибо мне нужен.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать