On-line: гостей 0. Всего: 0 [подробнее..]
АвторСообщение
постоянный участник




Пост N: 5407
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 10.06.17 14:59. Заголовок: Непонятки при отборе из базы ?


Что то при отборе из базы двояться записи ....
База проиндексирована по полю INET.
Делаю так:
nInet := 0 
aRec := {}
.....
SELECT ZMAIN
DbSetOrder(3)
GOTO TOP
dbSeek(nInet, .T. ) // Set softseek on
DO WHILE !EOF()
IF ZMAIN->INET < 5 .AND. ZMAIN->DATE2 >= CtoD("01.01.17")
AADD( aRec, { ZMAIN->ID, ZMAIN->NNZ, RECNO() } )
ENDIF
dbSkip(1)
ENDDO
MsgDebug("массив = ", aRec)

Правлю базу, т.е. для ТРЕХ записей делаю ZMAIN->INET := 0
Вызываю эту функцию и она возвращает массив из 6 элементов !!! Почему ?
1 {56614, "622/03", 56614}
2 {56615, "623/03", 56615}
3 {56616, "624/03", 56616}
4 {56614, "622/03", 56614}
5 {56615, "623/03", 56615}
6 {56616, "624/03", 56616}

Что не так делаю ?

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 37 , стр: 1 2 All [только новые]







Пост N: 201
Зарегистрирован: 05.11.05
ссылка на сообщение  Отправлено: 21.01.20 15:28. Заголовок: Проиндексированы наз..


Проиндексированы названия фирм.
Ищу с помощью DBSEEK() или SEEK. Кстати, между ними разница есть? Что лучше использовать?

Есть название фирмы "ATOMIC Austria GmbH".
По "ATOMIC Austria GmbH" найдет.
По "ATOMIC" тоже найдет.
А вот "Austria" не найдет. Есть какой-нибудь способ найти по слову в середине или в конце?

И прописные и строчные буквы важны. Как-то можно это игнорировать?

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7155
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 21.01.20 15:41. Заголовок: rvu пишет: Как-то м..


rvu пишет:

 цитата:
Как-то можно это игнорировать?


UPPER в ключе индекса
rvu пишет:

 цитата:
Есть какой-нибудь способ найти по слову в середине или в конце?


Locate по вхождению
Функции из цикла *wild

rvu пишет:

 цитата:
Ищу с помощью DBSEEK() или SEEK. Кстати, между ними разница есть? Что лучше использовать?


Смотрим Std.ch
 
#ifdef HB_COMPAT_C53
#command SEEK <exp> [<soft: SOFTSEEK>] [<last: LAST>] => ;
dbSeek( <exp>, iif( <.soft.>, .T., NIL ), iif( <.last.>, .T., NIL ) )
#else
#command SEEK <exp> [<soft: SOFTSEEK>] => ;
dbSeek( <exp>, iif( <.soft.>, .T., NIL ) )
#endif



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 3010
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 21.01.20 15:54. Заголовок: rvu пишет Есть како..


rvu пишет
 цитата:
Есть какой-нибудь способ найти по слову в середине или в конце?


см. http://www.kresin.ru/hrbfaq_3.html#Doc13_14 3.13.14 HiPer-SEEK (Fast Text Search)
rvu gbitn
 цитата:
Кстати, между ними разница есть? Что лучше использовать?


см. std.ch команда SEEK
rvu пишет
 цитата:
Есть какой-нибудь способ найти по слову в середине или в конце?


перебором с проверкой на вхождение. Пример
 
aFnd := {"ATOMIC Austria GmbH", "Austria", "GmbH"} // что ищем
aRec := {} // результат
GO TOP
DO WHILE ! eof()
FOR EACH cN IN aFnd
IF cN $ in->FirmName // можно приводить к upper() или lower()
AAdd(aRec, RecNo())
ENDIF
NEXT
SKIP
ENDDO


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7156
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 21.01.20 16:07. Заголовок: еще https://cloud.ma..

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 202
Зарегистрирован: 05.11.05
ссылка на сообщение  Отправлено: 22.01.20 07:24. Заголовок: Dima пишет: UPPER в..


Dima пишет:

 цитата:
UPPER в ключе индекса



А как это сделать?

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 203
Зарегистрирован: 05.11.05
ссылка на сообщение  Отправлено: 22.01.20 07:31. Заголовок: SergKis пишет: пере..


SergKis пишет:

 цитата:
перебором с проверкой на вхождение. Пример

aFnd := {"ATOMIC Austria GmbH", "Austria", "GmbH"} // что ищем
aRec := {} // результат
GO TOP
DO WHILE ! eof()
FOR EACH cN IN aFnd
IF cN $ in->FirmName // можно приводить к upper() или lower()
AAdd(aRec, RecNo())
ENDIF
NEXT
SKIP
ENDDO



Не в индексном файле искать? Это очень долго будет.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6564
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 22.01.20 11:10. Заголовок: rvu пишет: Проиндек..


rvu пишет:

 цитата:
Проиндексированы названия фирм.


Когда делаешь индекс, то ставь типа такого: UPPER(in->FirmName)

Какое кол-во записей для поиска ?
Если тысяч 10-15, то это быстро будет.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 204
Зарегистрирован: 05.11.05
ссылка на сообщение  Отправлено: 22.01.20 11:28. Заголовок: Andrey пишет: Какое..


Andrey пишет:

 цитата:
Какое кол-во записей для поиска ?
Если тысяч 10-15, то это быстро будет.



Перебором базы по строчкам?

Увы, у нас счет на миллионы записей. И названия фирм это самое малое, есть еще тексты, в которых тоже нужно отдельные слова искать.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6565
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 22.01.20 11:41. Заголовок: Ну тогда нужно смотр..


Ну тогда нужно смотреть что советовал SergKis !

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 205
Зарегистрирован: 05.11.05
ссылка на сообщение  Отправлено: 22.01.20 11:58. Заголовок: Andrey пишет: Ну то..


Andrey пишет:

 цитата:
Ну тогда нужно смотреть что советовал SergKis !



Я так понимаю, речь про

SergKis пишет:

 цитата:
HiPer-SEEK



?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 3011
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.01.20 12:01. Заголовок: rvu пишет Не в индек..


rvu пишет
 цитата:
Не в индексном файле искать? Это очень долго будет


Если не хотите использовать HiPer-SEEK, создайте и ведите базу, где все слова из наименования
перенесены в одно поле, т.е. dbf структура {{"Name", "C", 30, 0},{"ID", "N", 10, 0}, {"RECN", "N",10,0}}
Преобразуйте поле с наим. фирмы (можно добавить и ИНН ...) примерно так
 
FOR EACH cT IN hb_Atokens(alltrim(IN->FirmName)+' '+alltrim(IN->INN), ' ')
IF ! empty(cT)
dbAppend()
OU->NAME := cT
OU->ID := IN->ID
OU->RECN := IN->(RecNo())
ENDIF
NEXT
INDEX ON upper(NAME) TAG NAME
...
Эту базу ведете совместно с ведением основной, но поиск делаете по созданной выше, используя scope
Все будет летать



Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 206
Зарегистрирован: 05.11.05
ссылка на сообщение  Отправлено: 22.01.20 13:23. Заголовок: SergKis пишет: Если..


SergKis пишет:

 цитата:
Если не хотите использовать HiPer-SEEK



Почему не хочу? Надо попробовать. Мне кажется, это для меня вообще единственный вариант.

SergKis пишет:

 цитата:
создайте и ведите базу, где все слова из наименования
перенесены в одно поле, т.е. dbf структура {{"Name", "C", 30, 0},{"ID", "N", 10, 0}, {"RECN", "N",10,0}}



Это не спасет. Там еще и тексты, иногда большие. И в них нужно искать отдельные слова.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 3013
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.01.20 14:13. Заголовок: rvu пишет Это не спа..


rvu пишет
 цитата:
Это не спасет. Там еще и тексты, иногда большие. И в них нужно искать отдельные слова.


Никто не мешает добавить поле TEXT в создаваемую базу и фильтровать по доп. условию. Или
- получив список RecNo в массиве, ставить BM filter на осн. базу и делать доп. поиск
- сделав SeT RELATION ID TO <осн. база>, проделать доп. поиски
Такая схема работала до появления HiPer-SEEK еще со времен Summer 87

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 207
Зарегистрирован: 05.11.05
ссылка на сообщение  Отправлено: 22.01.20 14:30. Заголовок: SergKis пишет: Никт..


SergKis пишет:

 цитата:
Никто не мешает добавить поле TEXT в создаваемую базу и фильтровать по доп. условию.



Как я понял DBSEEK() не ищет отдельные слова внутри текста. Не делать же поля на каждое слово в тексте.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 3015
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.01.20 14:52. Заголовок: rvu пишет Как я поня..


rvu пишет
 цитата:
Как я понял DBSEEK() не ищет отдельные слова внутри текста. Не делать же поля на каждое слово в тексте.


В показанной схеме нет использования dbseek(), используем scope на слово\часть и по полученному списку работаем
Если в основной базе есть M поля с текстом, то из них можно выбрать ключевые и записать в поле TEXT для поска
aFnd := {""...", "..."}
aTxt := {""...", "..."}
hRec := hb_Hash()
SET SCOPE TO "GmbH", "GmbH"
SET RELATION ID TO BASE // для поиска в осн. базе, если надо
GO TOP
DO WHILE ! eof()
FOR EACH cN IN aFnd
IF cN $ BASE->NOTE
hb_HSet(hRec, ID, RECN)
ENDIF
NEXT
FOR EACH cT IN aTxt
IF cT $ TEXT
hb_HSet(hRec, ID, RECN)
ENDIF
NEXT
SKIP
ENDDO
SET SCOPE TO
в hRec будет список ID и соотв. RecNo осн. базы для дальнейшего исп. Можно сбросить в MEMIO и дать
на Browse, связав с основной базой.
С HiPer-SEEK будет похожая работа, только по правилам (ф-ям HiPer-SEEK)

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 3016
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.01.20 16:44. Заголовок: rvu пишет А вы им по..


rvu пишет
 цитата:
А вы им пользовались?


Давно с SixNsx драйвером в 5.2, но потом вернулся на схему из Summer 87
пример
 
LOCAL cExpr := "test->FIRST + test->LAST + test->STREET + test->CITY"
LOCAL bExpr := &( "{||" + cExpr + "}" )
LOCAL cVal := "John", h := 0, nRec := 0

CLS
USE test EXCL

IF !file("TEST.HSX")
? "Building HiPer-SEEK Index..."
h := hs_Index( "TEST.HSX", cExpr, 2 )
ELSE
h := hs_Open( "TEST.HSX", 8, 1 )
ENDIF

hs_Set( h, cVal )
nRec := hs_Next( h )

DO WHILE nRec > 0
dbGoto( nRec )
IF hs_Verify( bExpr, cVal )
? nRec
ENDIF
nRec := hs_Next( h )
ENDDO

hs_Close( h )


Спасибо: 1 
ПрофильЦитата Ответить





Пост N: 209
Зарегистрирован: 05.11.05
ссылка на сообщение  Отправлено: 23.01.20 08:38. Заголовок: SergKis, спасибо, по..


SergKis, спасибо, понял в чем было дело, вроде, заработало.

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 37 , стр: 1 2 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 1
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет