Автор | Сообщение |
|
| постоянный участник
|
Пост 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} Что не так делаю ?
|
|
|
Ответов - 37
, стр:
1
2
All
[только новые]
|
|
|
| |
Пост N: 6449
Зарегистрирован: 17.05.05
|
|
Отправлено: 10.06.17 16:55. Заголовок: Andrey пишет: AADD(..
Andrey пишет: цитата: | AADD( aRec, { ZMAIN->ID, ; ZMAIN->NNZ, RECNO() } ) |
| Для начала AADD( aRec, { ZMAIN->ID, ; ZMAIN->NNZ, ZMAIN->(RECNO()) } )
|
|
|
|
| |
Пост N: 6450
Зарегистрирован: 17.05.05
|
|
Отправлено: 10.06.17 17:22. Заголовок: Ходишь по базе ZAIVK..
Ходишь по базе ZAIVKA2MAIN в цикле а массив заполняешь с одной и той же записи ZMAIN , так как не видать ни каких телодвижений с ней. С будуна код писал ?
|
|
|
|
| постоянный участник
|
Пост N: 5408
Зарегистрирован: 12.09.06
|
|
Отправлено: 11.06.17 14:28. Заголовок: Dima пишет: Ходишь ..
Dima пишет: цитата: | Ходишь по базе ZAIVKA2MAIN в цикле а массив заполняешь с одной и той же записи ZMAIN , |
| Да нет, ошибся при переносе в форум.
|
|
|
|
| постоянный участник
|
Пост N: 1515
Зарегистрирован: 17.02.12
|
|
Отправлено: 11.06.17 16:11. Заголовок: Andery пишет Да нет,..
Andery пишет цитата: | Да нет, ошибся при переносе в форум. |
| Что даст в файл комада COPY all FOR ZMAIN->INET < 5 .AND. ZMAIN->DATE2 >= CtoD("01.01.17")
|
|
|
|
| постоянный участник
|
Пост N: 1516
Зарегистрирован: 17.02.12
|
|
Отправлено: 11.06.17 16:14. Заголовок: PS. COPY all TO _a_..
PS. COPY all TO _a_ FOR ZMAIN->INET < 5 .AND. ZMAIN->DATE2 >= CtoD("01.01.17")
|
|
|
|
| постоянный участник
|
Пост N: 5410
Зарегистрирован: 12.09.06
|
|
Отправлено: 11.06.17 18:14. Заголовок: SergKis пишет: Что ..
SergKis пишет: цитата: | Что даст в файл комада COPY all TO _a_ FOR ZMAIN->INET < 5 .AND. ZMAIN->DATE2 >= CtoD("01.01.17") |
| Получается база из 3-х записей.... Всё правильно ! А в моём алгоритме 6 элементов. Так как база проиндексирована по полю INET, сделал доп.условие - получается тоже 3 элемента: 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) IF ZMAIN->INET == 5 EXIT ENDIF ENDDO
|
|
|
|
| постоянный участник
|
Пост N: 1518
Зарегистрирован: 17.02.12
|
|
Отправлено: 11.06.17 19:24. Заголовок: Andrey пишет Получае..
Andrey пишет цитата: | Получается база из 3-х записей.... |
| Надеюсь ты делал тут COPY ... ? DbSetOrder(3) COPY all ... GOTO TOP dbSeek(nInet, .T. ) // Set softseek on ...
|
|
|
|
| постоянный участник
|
Пост N: 5411
Зарегистрирован: 12.09.06
|
|
Отправлено: 11.06.17 21:21. Заголовок: SergKis пишет: Наде..
SergKis пишет: цитата: | Надеюсь ты делал тут COPY ... ? |
| Нет конечно... Сделал где посоветовал, образуется база с 3-мя записями. Всё верно ! А в моём алгоритме 6 элементов... Непонятка какая-то...
|
|
|
|
| постоянный участник
|
Пост N: 1519
Зарегистрирован: 17.02.12
|
|
Отправлено: 11.06.17 22:23. Заголовок: Andrey где copy по..
Andrey где copy поставь _logfile(.T., hb_valtoexp(aRec)) и после enddo
|
|
|
|
| |
Пост N: 1104
Зарегистрирован: 20.02.11
|
|
Отправлено: 12.06.17 00:55. Заголовок: Andrey пишет: ZMAIN..
Andrey пишет: Точно больше ошибок при переносе в форум не добавилось? Что у тебя в полях по которым идёт отбор никому не показал, а ответ просишь., . Пиши подробнее. Да и незачем было делать while! Eof если по ключу отбираешь, достаточно While ZMAIN->INET <5 Aadd Skip End По коду который в форуме дублироваться записи в массиве не должны, Выкладывай код из программы без изменений. Мож там что есть. Всю функцию целиком!
|
|
|
|
| постоянный участник
|
Пост N: 5412
Зарегистрирован: 12.09.06
|
|
Отправлено: 12.06.17 14:57. Заголовок: SergKis пишет: где ..
SergKis пишет: цитата: | где copy поставь _logfile(.T., hb_valtoexp(aRec)) и после enddo |
| Дибилизм ! Сегодня попробовал, ВСЁ работает, костыль убрал и теперь выбирается 3 элемента. Может индекс был сбойным, а сегодня сделал индексацию и всё заработало ... Haz пишет: цитата: | Да и незачем было делать while! Eof если по ключу отбираешь, достаточно While ZMAIN->INET <5 |
| А если конец базы ? С таким уже сталкивался. Ну как не задашь вопрос на форуме - ВСЁ начинает сразу работать !!! Всё таки не зря говорят: задай вопрос и сам поймешь на него ответ... Спасибо всем за поддержку ! Алгоритм был правильным !
|
|
|
|
|
| |
Пост N: 6451
Зарегистрирован: 17.05.05
|
|
Отправлено: 12.06.17 15:18. Заголовок: Andrey пишет: While..
Andrey пишет: Andrey пишет: While ZMAIN->INET <5 .and. !ZMAIN->(eof())
|
|
|
|
| Администратор
|
Пост N: 3564
Зарегистрирован: 23.05.05
|
|
Отправлено: 12.06.17 18:24. Заголовок: У меня после первого..
У меня после первого зацикливания лет дцать назад выработался безусловный рефлекс: любой while со skip делать обязятельно с eof(), т.е: go top / seek while ! eof() .and. ... ... skip enddo ставлю так не думая, на автомате.
|
|
|
|
| постоянный участник
|
Пост N: 5414
Зарегистрирован: 12.09.06
|
|
Отправлено: 12.06.17 19:54. Заголовок: Dima пишет: While Z..
Dima пишет: цитата: | While ZMAIN->INET <5 .and. !eof() |
| Так раньше делал и перестал. На таком варианте, программа подвешивается... Не знаю, может из-за сбойного индекса.
|
|
|
|
| |
Пост N: 6452
Зарегистрирован: 17.05.05
|
|
Отправлено: 12.06.17 19:56. Заголовок: Andrey пишет: На та..
Andrey пишет: цитата: | На таком варианте, программа подвешивается... |
| Маловероятно. У меня не вешается и у Паши не вешается. Повесить её можно только если Dbskip() не в том месте сделать.
|
|
|
|
| |
Пост N: 1105
Зарегистрирован: 20.02.11
|
|
Отправлено: 12.06.17 20:27. Заголовок: Там какая то мутная ..
Там какая то мутная история с индексом)) Дублирование в массиве могло косвенно указывать что что по ключу 5 сбит в индексе адрес записи И скип опять бросало на три позиции вверх, но тогда почему не циклило и всего один повтор. Андрей, в следующий раз весь секретный код своей секретной функции выкладывай, а то народ на фантизии изойдет искать тараканов там где их нет
|
|
|
|
| постоянный участник
|
Пост N: 1518
Зарегистрирован: 09.10.06
|
|
Отправлено: 12.06.17 20:48. Заголовок: Haz пишет: Там кака..
Haz пишет: цитата: | Там какая то мутная история с индексом)) |
| К примеру аддитивный индекс. Haz пишет: цитата: | Андрей, в следующий раз весь секретный код своей секретной функции выкладывай |
| А вот провоцировать не надо
|
|
|
|
| постоянный участник
|
Пост N: 5415
Зарегистрирован: 12.09.06
|
|
Отправлено: 14.06.17 09:31. Заголовок: Haz пишет: Андрей, ..
Haz пишет: цитата: | Андрей, в следующий раз весь секретный код своей секретной функции выкладывай |
| Хорошо ! Только я всю функцию выложил почти целиком. Там у меня один IF был, но я думаю что его и не нужно было выкладывать.
|
|
|
|
| Администратор
|
Пост N: 3565
Зарегистрирован: 23.05.05
|
|
Отправлено: 14.06.17 11:14. Заголовок: Andrey пишет: ..
Andrey пишет: цитата: | 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 |
| Не забываем про оптимизацию. Оператор go top лишний - его можно выбросить. Поскольку индекс по полю INET - грех его не использовать в условии цикла, чтобы не обрабатывать всю таблицу. В итоге получаем: SELECT ZMAIN DbSetOrder(3) dbSeek(nInet, .T. ) DO WHILE !EOF() .and. ZMAIN->INET < 5 IF ZMAIN->DATE2 >= CtoD("01.01.17") AADD( aRec, { ZMAIN->ID, ZMAIN->NNZ, RECNO() } ) ENDIF dbSkip(1) ENDDO
|
|
|
|
| постоянный участник
|
Пост N: 5416
Зарегистрирован: 12.09.06
|
|
Отправлено: 14.06.17 15:05. Заголовок: Спасибо Pasha ! :sm..
Спасибо Pasha !
|
|
|
|
| |
Пост N: 201
Зарегистрирован: 05.11.05
|
|
Отправлено: 21.01.20 15:28. Заголовок: Проиндексированы наз..
Проиндексированы названия фирм. Ищу с помощью DBSEEK() или SEEK. Кстати, между ними разница есть? Что лучше использовать? Есть название фирмы "ATOMIC Austria GmbH". По "ATOMIC Austria GmbH" найдет. По "ATOMIC" тоже найдет. А вот "Austria" не найдет. Есть какой-нибудь способ найти по слову в середине или в конце? И прописные и строчные буквы важны. Как-то можно это игнорировать?
|
|
|
|
|
| |
Пост 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
|
|
|
|
| постоянный участник
|
Пост 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
|
|
|
|
| |
Пост N: 7156
Зарегистрирован: 17.05.05
|
|
Отправлено: 21.01.20 16:07. Заголовок: еще https://cloud.ma..
|
|
|
|
| |
Пост N: 202
Зарегистрирован: 05.11.05
|
|
Отправлено: 22.01.20 07:24. Заголовок: Dima пишет: UPPER в..
Dima пишет: А как это сделать?
|
|
|
|
| |
Пост 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 |
| Не в индексном файле искать? Это очень долго будет.
|
|
|
|
| постоянный участник
|
Пост N: 6564
Зарегистрирован: 12.09.06
|
|
Отправлено: 22.01.20 11:10. Заголовок: rvu пишет: Проиндек..
rvu пишет: цитата: | Проиндексированы названия фирм. |
| Когда делаешь индекс, то ставь типа такого: UPPER(in->FirmName) Какое кол-во записей для поиска ? Если тысяч 10-15, то это быстро будет.
|
|
|
|
| |
Пост N: 204
Зарегистрирован: 05.11.05
|
|
Отправлено: 22.01.20 11:28. Заголовок: Andrey пишет: Какое..
Andrey пишет: цитата: | Какое кол-во записей для поиска ? Если тысяч 10-15, то это быстро будет. |
| Перебором базы по строчкам? Увы, у нас счет на миллионы записей. И названия фирм это самое малое, есть еще тексты, в которых тоже нужно отдельные слова искать.
|
|
|
|
| постоянный участник
|
Пост N: 6565
Зарегистрирован: 12.09.06
|
|
Отправлено: 22.01.20 11:41. Заголовок: Ну тогда нужно смотр..
Ну тогда нужно смотреть что советовал SergKis !
|
|
|
|
| |
Пост N: 205
Зарегистрирован: 05.11.05
|
|
Отправлено: 22.01.20 11:58. Заголовок: Andrey пишет: Ну то..
Andrey пишет: цитата: | Ну тогда нужно смотреть что советовал SergKis ! |
| Я так понимаю, речь про SergKis пишет: ?
|
|
|
|
| постоянный участник
|
Пост 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 Все будет летать
|
|
|
|
|
| |
Пост 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}} |
| Это не спасет. Там еще и тексты, иногда большие. И в них нужно искать отдельные слова.
|
|
|
|
| постоянный участник
|
Пост N: 3013
Зарегистрирован: 17.02.12
|
|
Отправлено: 22.01.20 14:13. Заголовок: rvu пишет Это не спа..
rvu пишет цитата: | Это не спасет. Там еще и тексты, иногда большие. И в них нужно искать отдельные слова. |
| Никто не мешает добавить поле TEXT в создаваемую базу и фильтровать по доп. условию. Или - получив список RecNo в массиве, ставить BM filter на осн. базу и делать доп. поиск - сделав SeT RELATION ID TO <осн. база>, проделать доп. поиски Такая схема работала до появления HiPer-SEEK еще со времен Summer 87
|
|
|
|
| |
Пост N: 207
Зарегистрирован: 05.11.05
|
|
Отправлено: 22.01.20 14:30. Заголовок: SergKis пишет: Никт..
SergKis пишет: цитата: | Никто не мешает добавить поле TEXT в создаваемую базу и фильтровать по доп. условию. |
| Как я понял DBSEEK() не ищет отдельные слова внутри текста. Не делать же поля на каждое слово в тексте.
|
|
|
|
| постоянный участник
|
Пост 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)
|
|
|
|
| постоянный участник
|
Пост 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 )
|
|
|
|
| |
Пост N: 209
Зарегистрирован: 05.11.05
|
|
Отправлено: 23.01.20 08:38. Заголовок: SergKis, спасибо, по..
SergKis, спасибо, понял в чем было дело, вроде, заработало.
|
|
|
Ответов - 37
, стр:
1
2
All
[только новые]
|
|