Имя: Пароль:
1C
 
Отбор по вхождению слова
0 cardexc
 
11.11.09
15:17
Здравствуйте, Процедура УстановитьОтбор() отбирает только те значения, которые точно соответствуют..
Подскажите как организовать сабж?
1 Ёпрст
 
гуру
11.11.09
15:19
Отбор где нужен?
2 cardexc
 
11.11.09
15:20
Отбор нужен в списке справочника
3 v_rtex
 
11.11.09
15:23
запросом only..
хотя если нужно штатно.. и есть список предопределенных вхождений.. то сделать новый строкой реквизит с сортировкой и отбором..
4 Ёпрст
 
гуру
11.11.09
15:24
(2) ну вот так можешь пофильтровать:
http://www.1cpp.ru/forum/YaBB.pl?num=1211491690/0
5 cardexc
 
11.11.09
15:28
запросом наверное ресурсоемко сильно получится. Справочник содержит огромное количество записей.. списка предопределенных нету.. текстом для  отбора может быть любой элемент справочника.

спасибо, буду копать
6 Sadovnikov
 
11.11.09
15:33
(0) Скуль ии dbf?
7 cardexc
 
11.11.09
15:35
dbf структура
8 v_rtex
 
11.11.09
15:39
(7) прямым запросом с помощью 1С++
если LIKE 'строка%'.. то по идее будет летать.. а если LIKE '%строка%'.. то не очень.. но все равно быстрее штатного запроса или перебора..
9 Фрид
 
11.11.09
15:39
метод формы списка справочника ИспользоватьСписокЭлементов(<СписокЗначений>)
а список значений формировать запросиками)
10 Torquader
 
11.11.09
18:55
По вхождению слова проще вообще открыть dbf-файл как текстовый и в нём искать (или воспользоваться командой find), а уже по вхождению найти начальную позицию записи и прочитать ID.
Хотя, если у справочника есть поля - строки неограниченной длины, то такой фокус не пройдёт.
11 cardexc
 
12.11.09
11:51
Проблема заключается в том, что поиск необходимо выполнять каждый раз при добавлении нового элемента, а их добавляется очень много, записей в базе порядка 200к..
Пробую прямым запросом делать, по примеру..

 База = СоздатьОбъект("OLEDBData");
 Соединение = "Provider=VFPOLEDB.1;Set Deleted=Yes;Data Source=" + КаталогИБ()+ ";Mode=ReadWrite;Extended Properties="";User ID="";Password="";Mask Password=False;Collating Sequence=MACHINE;DSN=""";
 Рез = База.Соединение(Соединение);
 Запрос = База.СоздатьКоманду();    
 
 Запрос = СоздатьОбъект("ODBCRecordset");
 Запрос.УстБД1С();
 
 ТекстЗапроса = "
|SELECT              
|  Спр.Code as Код,  
|  Спр.SP14 as Наименование
|FROM                          
|  sc433 as Спр";                

 
 ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
 ТЗ.ВыбратьСтроку();

Вылетает на строке
 ТЗ.ВыбратьСтроку();

----Значение не представляет агрегатный объект (ВыбратьСтроки)

Как тогда получить доступ к результатам выборки?
12 Фрид
 
12.11.09
17:01
попробуй
ТЗ = СоздатьОбъект("ТаблицаЗначений");
Запрос.ВыполнитьИнструкцию(ТекстЗапроса);  //хз что там за запрос
Запрос.Выгрузить(ТЗ);
ТЗ.ВЫбратьСтроки();
пока ТЗ.ПолучитьСТроку() = 1 Цикл
13 cardexc
 
12.11.09
17:30
В таком варианте кидает:

Запрос.Выгрузить(ТЗ);
Поле агрегатного объекта не обнаружено (Выгрузить)
14 Ёпрст
 
гуру
12.11.09
17:41
(11) а чего за бред написан ? У тя дбф или скуль ? Нафига там строка для фоксового провайдера и потом переопределение на ODBCRecordset ?
16 Ёпрст
 
гуру
12.11.09
17:42
+14 если пользуешь 1срр , то там есть метапарсер имён. писать имена табличек не надо..
17 Cap_1977
 
12.11.09
17:48
(0) В процедуру "ПриЗаписи" (для интерактивного добавления) повесить проверку на вхождение и взводить соответствующий флажок у элемента, потом фильтровать штатно через УстановитьОтбор - не канает ?
18 Ёпрст
 
гуру
12.11.09
17:49
(17) конечно нет ..отбор "по вхождению"  нужен..
19 Mikeware
 
12.11.09
17:58
http://www.rikcenter.ru/solutions.php
для dbf вроде тоже работал.... Хотя утверждать не буду...
22 GreyK
 
12.11.09
18:23
(17) А в это время где-то в .... другой юзверь удивляется прыгающим окнам.
23 Злопчинский
 
12.11.09
19:30
для чтения справочника на дбфе (в т.ч и МОНОПОЛЬНОМ) можно и SQLite заюзать через прямые запросы. На десяти тысячах - практически мгновенно ответ по %like%.
24 los_hooliganos
 
12.11.09
19:33
(19) вряд ли)
не любит он к дбф нетиповые фичи прикручивать))
25 los_hooliganos
 
12.11.09
19:36
(8)
"если LIKE 'строка%'.. то по идее будет летать.. а если LIKE '%строка%'.. то не очень.. "
ты где такой хрени начитался?
27 МихаилМ
 
12.11.09
21:15
то (25)
(8) прав

ЗАПУСТИТЕ ТАКОЙ КОД В SSMS или QA

SELECT     descr
FROM         SC33 (NOLOCK)
WHERE   descr  LIKE 'Крышка%'



SELECT     descr
FROM         SC33 (NOLOCK)
WHERE   descr  LIKE '%Крышка%'

посмотрите exeqution plan и поймете разницу
28 Torquader
 
12.11.09
22:04
Понятно, что поле descr было индексированным, и поиск по его началу будет по индексу, а поиск по вхождению где-либо - нет.
Вот если поле не индексируемое, то поиск по началу будет того же порядка, что и поиск по вхождению.
33 МихаилМ
 
12.11.09
22:24
как же товарищу (31)(32)  мозг свело, бедному
34 МихаилМ
 
12.11.09
22:28
то (28) УстановитьОтбор() из (0)
используется только для индексированых полей
36 cardexc
 
13.11.09
16:10
(14) ДБФ у меня, бред - потому что никогда не использовал прямые запросы к базе..

Решил сделать с помощью SQLITE, время выбора конструкцией LIKE из такого количества записей - приятно удивляет, около одной секунды.

В результате получается список значений, в котором содержится нужные элементы:

Процедура СобытиеВыходаИзПИБ()
   
   
   СЗ = СоздатьОбъект ("СписокЗначений");  
   
   Попытка
       база = СоздатьОбъект("SQLiteBase");
   Исключение
       ЗагрузитьВнешнююКомпоненту("1sqlite.dll");
       база = СоздатьОбъект("SQLiteBase");
   КонецПопытки;
                                             
   база.Открыть(":memory:");
   запрос = база.НовыйЗапрос();
   запрос.ВыполнитьЗапрос("PRAGMA journal_mode = OFF");    
   запрос.ВыполнитьЗапрос("create virtual table Спид using dbeng(Справочник.Спид)");
   запрос.Подставлять("НужныйПараметр", ФИО);    
   
   СЗ =  запрос.ВыполнитьЗапрос("select id [ФИО :Справочник.Спид] from Спид where Спид.ФИО LIKE :НужныйПараметр");

   СЗ.Выгрузить(ТЗ1);
   ИспользоватьСписокЭлементов(СЗ);
   
КОнецПроцедуры                    

Но, ввиду особенности использования функции ИспользоватьСписокЭлементов, в которую нужно передать непосредственно список существующиъ элементов справочника, конечный результат получить не удается..
37 Ёпрст
 
гуру
13.11.09
16:12
(36) Почему не удается?
38 cardexc
 
13.11.09
16:16
Если с таким запросом
"select id [ФИО :Справочник.Спид] from Спид where Спид.ФИО LIKE :НужныйПараметр"

выбирает просто "<>", хотя, если я правильно понял по документации, там должен содержаться уже элемент справочника.


Если с таким запросом
"select ФИО from Спид where Спид.ФИО LIKE :НужныйПараметр"

в СЗ попадают данные, тип которых строка, и если передать их в ф-цию ИспользоватьСписокЭлементов, получается пустой список.
39 Ёпрст
 
гуру
13.11.09
16:28
А попробовать готовый код из(4) не судьба ? Там есть и для фоксового провайдера и для 1sqlite.
И всё работает..
40 Злопчинский
 
13.11.09
23:14
(39) там столько по ссылке написано, что сходу фиг поймешь что качать и в каком это состоянии... ;-) но ознакомиться надо стопудово
41 los_hooliganos
 
14.11.09
03:23
Функция LIKE
Определяет, совпадает ли данная символьная строка с указанным шаблоном. Шаблон может включать в себя обычные символы и подстановочные символы. При обработке шаблона обычные символы должны точно совпасть с символами, указанными в символьной строке. Однако подстановочные символы могут совпасть с произвольными фрагментами символьной строки. Использование подстановочных символов, в отличие от использования операторов сравнения строки "= and !=", делает оператор LIKE более гибким. Если какие-либо аргументы не относятся к типу данных символьной строки, Microsoft SQL Server 2005 Compact Edition (SQL Server Compact Edition) преобразовывает их в тип данных символьной строки, если это возможно.

Синтаксис

match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]

Аргументы
match_expression
Любое допустимое выражение типа данных nchar, nvarchar или ntext в SQL Server Compact Edition.

pattern
Шаблон для поиска в match_expression. Он включает в себя следующие допустимые подстановочные символы SQL Server Compact Edition.

Подстановочный символ  Описание  Пример  
%
Любая строка с нулевым символом или с большим количеством символов.
WHERE title LIKE '%computer%' обнаруживает все названия книг, которые включают в себя слово "computer".

_ (символ подчеркивания)
Любой одиночный символ.
WHERE au_fname LIKE '_ean' обнаруживает имена из четырех букв, которые оканчиваются на "ean", например "Dean" или "Sean".


escape_character
Любое допустимое выражение SQL Server Compact Edition с данными любого типа из категории типа данных символьной строки. В аргументе escape_character нет стандартных символов, он должен состоять только из одного символа.
42 Злопчинский
 
14.11.09
11:19
(41) а есть "опция" фонетического поиска? в дремучие 80-ые в ADABAS вроде была такая типа FONETIC
...???
43 kitt
 
14.11.09
11:21
по моему вполне реально сначала прямым запросом выбрать список нужных элементов, затем сделать Справочник.ИспользоватьСписокЭлементов(НашСписок)
44 kitt
 
14.11.09
11:22
+(43) для дбф справочников прямые запросы по наименованию (индексированное поле) при правильном составлении запроса работают очень быстро
45 ДенисЧ
 
14.11.09
11:23
(42) soundex(), только она для аглицкого...
46 los_hooliganos
 
14.11.09
11:59
(45) юзать soundex черевато))
47 los_hooliganos
 
14.11.09
12:25
Электронная документация по SQL Server 2005 (сентябрь 2007 г.)  

SOUNDEX (Transact-SQL)  


Возвращает четырехсимвольный код (SOUNDEX) для оценки степени сходства двух строк.


Соглашения о синтаксисе в Transact-SQL

Синтаксис

SOUNDEX ( character_expression )


Аргументы
character_expression
Алфавитно-цифровое выражение символьных данных. Аргумент character_expression может быть константой, переменной или столбцом.

Типы возвращаемых данных
varchar

Замечания
Функция SOUNDEX преобразует алфавитно-цифровую строку в четырехсимвольный код, используемый для нахождения сходно звучащих слов или имен. Первый символ кода является первым символом аргумента character_expression, а второй, третий и четвертый — числами. Гласные в аргументе character_expression игнорируются, если только не являются первой буквой строки. Строковые функции могут быть вложенными.

Примеры
Следующий пример демонстрирует использование функции SOUNDEX и связанной с ней функции DIFFERENCE. В первом примере стандартные значения SOUNDEX возвращаются для всех согласных. Функция SOUNDEX для имен Smith и Smythe возвращает одинаковый код SOUNDEX, поскольку все гласные, буква y, удвоенные буквы и буква h не включаются.

Копировать код
-- Using SOUNDEX
SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe');


Ниже приводится результирующий набор.

Копировать код
----- -----
S530  S530  

(1 row(s) affected)


Функция DIFFERENCE производит сравнение шаблонов, возвращенных функцией SOUNDEX. В следующем примере показаны две строки, различающиеся только по гласной. Возвращенное значение 4 означает максимальное сходство.

Копировать код
-- Using DIFFERENCE
SELECT DIFFERENCE('Smithers', 'Smythers');
GO


Ниже приводится результирующий набор.

Копировать код
-----------
4          

(1 row(s) affected)


В следующем примере строки различаются в согласных, следовательно, возвращенное значение 2 указывает на большую степень различия.

Копировать код
SELECT DIFFERENCE('Anothers', 'Brothers');
GO


Ниже приводится результирующий набор.

Копировать код
-----------
2          

(1 row(s) affected)


См. также
Справочник
Строковые функции (Transact-SQL)


Справка и поддержка
Получение помощи по SQL Server 2005
49 Злопчинский
 
15.11.09
03:09
(47) ага...
можно запросом выбрать всех "похожих" на Смита...?
50 cardexc
 
19.11.09
16:12
Задача почти решена, только вот одного не могу понять, запрос вида

select ФИО from НужнаяТаблица where ФИО LIKE '%А%' AND Реквизит1='     X'

возвращает нужного человека, а зпрос вида

select ФИО from НужнаяТаблица where ФИО LIKE '%А%' AND (Реквизит1='     X'  or Реквизит2='     X')

ничего не возвращает. Значения в Реквизит1 и Реквизит2 = '     X', проверял 10 раз. Почему добавление конструкции OR влияет таким образом на результат?
51 Ёпрст
 
гуру
19.11.09
16:39
(50) не верю..
52 cardexc
 
19.11.09
16:59
(51)
Использовал обработку - консоль запросов, для 1sqlite.. такой же эффект...
53 NS
 
19.11.09
17:02
Может скобки надо поставить?
AND ((Реквизит1='     X')  or (Реквизит2='     X'))
54 cardexc
 
19.11.09
17:03
(53)
пробовал, не помогло..
55 Mikeware
 
19.11.09
17:05
select Реквизит1,Реквизит2, (Реквизит1='     X'),( Реквизит2='     X'),(Реквизит1='     X'  or Реквизит2='     X') from  НужнаяТаблица  
что скажет?
56 NS
 
19.11.09
17:05
(54) А если в первом скобки поставить?
А AND-а приоритет точно меньше чем у "="?
57 NS
 
19.11.09
17:09
В (50) первый запрос выдает результат только потому что он написан НЕВЕРНО.
Все скобки расставь...
http://msdn.microsoft.com/ru-ru/library/ms190276.aspx
58 cardexc
 
19.11.09
17:18
(55)
запрос вернул все 120к записей таблицы, которые там были.

(57)
расставил, все равно, возвращает нужное значение, за ссылку спасибо, почитаю
59 cardexc
 
19.11.09
17:20
+(58)
select Реквизит1,Реквизит2, (Реквизит1='     X'),( Реквизит2='     X'),(Реквизит1='     X'  or Реквизит2='     X') from  НужнаяТаблица  

и значения были не пусты только в двух колонках Реквизит1,Реквизит2, в остальных пусто
60 Mikeware
 
19.11.09
17:20
(58) Естественно, все записи вернет. в значения возвращаемые вглядываться не пробовал?
61 Mikeware
 
19.11.09
17:21
(59) Что и требовалось доказать
62 NS
 
19.11.09
17:24
(58) Точно все скобки поставил?
И Like в скобки завернул?
(ФИО LIKE '%А%')
63 cardexc
 
19.11.09
17:27
(61)
Если я правильно понял, это доказывает то, что Реквизит1, Реквизит2 не содержат записей, которые входили бы в условия (Реквизит1='     X'),( Реквизит2='     X'),(Реквизит1='     X'  or Реквизит2='     X') ?
Почему тогда в (50), в первом запросе результатом возвращается нужное значение?

(62) да, LIKE тоже завернул
64 Ёпрст
 
гуру
19.11.09
17:39
(63) ошибка синтаксиса поди.. либо количество пробелов разное или Х - русская..
65 cardexc
 
19.11.09
17:46
(64)
Может быть из-за того что, эти два реквизита содержат перечисление (+,-). В случае "+" 1С в то поле записывает '     X', в случае минуса '     Y'
66 NS
 
19.11.09
18:50
(63) потому что в (50)  в первом запросе LIKE не в скобках.
67 cardexc
 
20.11.09
10:29
(66) с запросом
select ФИО from НужнаяТаблица where (ФИО LIKE '%А%') AND (Реквизит1='     X' )
аналогично, т.е. работает.
68 NS
 
20.11.09
12:56
Как может работать, если сам говоришь что в табличке условие
(Реквизит1='     X' ) не соблюдается ни в одной строке...
69 cardexc
 
20.11.09
13:00
в том то и вопрос... условие вида (Реквизит1='     X' ) соблюдается, все хорошо. А вот с условием вида (Реквизит1='     X' ) OR (Реквизит2='     X') никак.. даже (Реквизит1='     X' ) OR (Реквизит1='     X')тоже, пусто..
70 NS
 
20.11.09
13:04
А покажи как у тебя скобки расставлены в полном выражении в последнем случае.
71 cardexc
 
20.11.09
14:10
Вот в таком виде, что первый, что второй, результат - пусто

select ФИО from НужнаяТаблица where (ФИО LIKE '%А%') and (Реквизит1='     X' or Реквизит1='     X')

select ФИО from НужнаяТаблица where (ФИО LIKE '%А%') and ((Реквизит1='     X') or (Реквизит1='     X'))


А вот так, куча значений возвращает
select ФИО from НужнаяТаблица where (ФИО LIKE '%А%') and (Реквизит1='     X')
72 cardexc
 
20.11.09
15:06
видимо что-то не так с этим справочником.. делаю аналогичные запросы в других база, все работает на ура... :(
Основная теорема систематики: Новые системы плодят новые проблемы.