![]() |
![]() |
![]() |
|
Отбор по вхождению слова | ☑ | ||
---|---|---|---|---|
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
|
видимо что-то не так с этим справочником.. делаю аналогичные запросы в других база, все работает на ура... :(
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |