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: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()) } )


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




Пост N:6450
Зарегистрирован:17.05.05
ссылка на сообщение  Отправлено:10.06.17 17:22.Заголовок:Ходишь по базе ZAIVK..


Ходишь по базе ZAIVKA2MAIN в цикле а массив заполняешь с одной и той же записи ZMAIN ,
так как не видать ни каких телодвижений с ней.
С будуна код писал ?

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




Пост N:5408
Зарегистрирован:12.09.06
ссылка на сообщение  Отправлено:11.06.17 14:28.Заголовок:Dima пишет: Ходишь ..


Dima пишет:

 цитата:
Ходишь по базе ZAIVKA2MAIN в цикле а массив заполняешь с одной и той же записи ZMAIN ,


Да нет, ошибся при переносе в форум.

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



Пост 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")

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



Пост 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")

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




Пост 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


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



Пост 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
...


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




Пост N:5411
Зарегистрирован:12.09.06
ссылка на сообщение  Отправлено:11.06.17 21:21.Заголовок:SergKis пишет: Наде..


SergKis пишет:

 цитата:
Надеюсь ты делал тут COPY ... ?


Нет конечно...

Сделал где посоветовал, образуется база с 3-мя записями. Всё верно !
А в моём алгоритме 6 элементов... Непонятка какая-то...


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



Пост N:1519
Зарегистрирован:17.02.12
ссылка на сообщение  Отправлено:11.06.17 22:23.Заголовок:Andrey где copy по..


Andrey
где copy поставь _logfile(.T., hb_valtoexp(aRec)) и после enddo

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


Пост N:1104
Зарегистрирован:20.02.11
ссылка на сообщение  Отправлено:12.06.17 00:55.Заголовок:Andrey пишет: ZMAIN..


Andrey пишет:

 цитата:
ZMAIN->INET == 5


Точно больше ошибок при переносе в форум не добавилось?

Что у тебя в полях по которым идёт отбор никому не показал, а ответ просишь.,
. Пиши подробнее.
Да и незачем было делать while! Eof если по ключу отбираешь, достаточно
While ZMAIN->INET <5
Aadd
Skip
End

По коду который в форуме дублироваться записи в массиве не должны,
Выкладывай код из программы без изменений. Мож там что есть. Всю функцию целиком!

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




Пост 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


А если конец базы ?
С таким уже сталкивался.

Ну как не задашь вопрос на форуме - ВСЁ начинает сразу работать !!!
Всё таки не зря говорят: задай вопрос и сам поймешь на него ответ...

Спасибо всем за поддержку !
Алгоритм был правильным !

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




Пост N:6451
Зарегистрирован:17.05.05
ссылка на сообщение  Отправлено:12.06.17 15:18.Заголовок:Andrey пишет: While..


Andrey пишет:

 цитата:
While ZMAIN->INET <5


Andrey пишет:

 цитата:
А если конец базы ?



While ZMAIN->INET <5 .and. !ZMAIN->(eof())

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




Пост N:3564
Зарегистрирован:23.05.05
ссылка на сообщение  Отправлено:12.06.17 18:24.Заголовок:У меня после первого..


У меня после первого зацикливания лет дцать назад выработался безусловный рефлекс: любой while со skip делать обязятельно с eof(), т.е:

go top / seek
while ! eof() .and. ...
...
skip
enddo

ставлю так не думая, на автомате.

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




Пост N:5414
Зарегистрирован:12.09.06
ссылка на сообщение  Отправлено:12.06.17 19:54.Заголовок:Dima пишет: While Z..


Dima пишет:

 цитата:
While ZMAIN->INET <5 .and. !eof()


Так раньше делал и перестал.
На таком варианте, программа подвешивается...
Не знаю, может из-за сбойного индекса.

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




Пост N:6452
Зарегистрирован:17.05.05
ссылка на сообщение  Отправлено:12.06.17 19:56.Заголовок:Andrey пишет: На та..


Andrey пишет:

 цитата:
На таком варианте, программа подвешивается...


Маловероятно.
У меня не вешается и у Паши не вешается.
Повесить её можно только если Dbskip() не в том месте сделать.

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


Пост N:1105
Зарегистрирован:20.02.11
ссылка на сообщение  Отправлено:12.06.17 20:27.Заголовок:Там какая то мутная ..


Там какая то мутная история с индексом))
Дублирование в массиве могло косвенно указывать что что по ключу 5 сбит в индексе адрес записи
И скип опять бросало на три позиции вверх, но тогда почему не циклило и всего один повтор.
Андрей, в следующий раз весь секретный код своей секретной функции выкладывай, а то народ на фантизии изойдет искать
тараканов там где их нет

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


Пост N:1518
Зарегистрирован:09.10.06
ссылка на сообщение  Отправлено:12.06.17 20:48.Заголовок:Haz пишет: Там кака..


Haz пишет:

 цитата:
Там какая то мутная история с индексом))


К примеру аддитивный индекс.
Haz пишет:

 цитата:
Андрей, в следующий раз весь секретный код своей секретной функции выкладывай


А вот провоцировать не надо



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




Пост N:5415
Зарегистрирован:12.09.06
ссылка на сообщение  Отправлено:14.06.17 09:31.Заголовок:Haz пишет: Андрей, ..


Haz пишет:

 цитата:
Андрей, в следующий раз весь секретный код своей секретной функции выкладывай


Хорошо !
Только я всю функцию выложил почти целиком.
Там у меня один IF был, но я думаю что его и не нужно было выкладывать.

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




Пост 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



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




Пост N:5416
Зарегистрирован:12.09.06
ссылка на сообщение  Отправлено:14.06.17 15:05.Заголовок:Спасибо Pasha ! :sm..


Спасибо Pasha !

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





Пост 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 час. Хитов сегодня: 287
Права: смайлыда,картинкида,шрифтыда,голосованиянет
аватарыда,автозамена ссылоквкл,премодерацияоткл,правканет