:: Visual Foxpro, Foxpro for DOS
Seek в цикле
BigLes
Автор

Сообщений: 9
Дата регистрации: 24.10.2010
есть такие строки:
num=2 &&дополнительная переменная
SET INDEX TO engine &&открываю индексный файл "engine"
SET ORDER TO 3 &&делаю фокус на 3-м индексе
SET NEAR ON &&включаю поиск приближенного значения
SEEK num &&делаю поиск
@ 1,i say name+develop&&вывожу на экран данные

вот только дело в том, что SEEK делает указатель на первый, соответствующий индекс, а как его запустить в цикл дабы он мне вывел все найденные индексы? желательно именно "SEEK в цикле" но если это нереально, то подскажите пожалуйста как сделать задачу другими методами
Ratings: 0 negative/0 positive
Re: Seek в цикле
AlexSSS

Сообщений: 6113
Откуда: Tallinn, Estonia
Дата регистрации: 19.09.2005
какая версия фокса?
foxpro 1.0.?

и что ты вообще хочешь получить?
Ratings: 0 negative/0 positive
Re: Seek в цикле
BigLes
Автор

Сообщений: 9
Дата регистрации: 24.10.2010
9.0

я хочу получиmь на экране список названия двигателей, а также их изготовителей, которые соответствуют некоторому ключу (допустим все "V"-образные(у меня в таблице этому соответствует 2))
Ratings: 0 negative/0 positive
Re: Seek в цикле
AlexSSS

Сообщений: 6113
Откуда: Tallinn, Estonia
Дата регистрации: 19.09.2005
select * from table where enginetype=2



Исправлено 1 раз(а). Последнее : AlexSSS, 24.10.10 00:54
Ratings: 0 negative/0 positive
Re: Seek в цикле
AlexSSS

Сообщений: 6113
Откуда: Tallinn, Estonia
Дата регистрации: 19.09.2005
ты учился по учебнику досовского фокса?
на МАЗ так уже давно никто не пишет


> SET INDEX TO engine &&открываю индексный файл "engine"
используй CDX индекс, он сам открывается вместе с таблицей

> SET ORDER TO 3 &&делаю фокус на 3-м индексе
set order to tagname

> SET NEAR ON &&включаю поиск приближенного значения
почитай хелп, для чего используется эта команда

> SEEK num &&делаю поиск
можно и так

но
> SET ORDER TO 3 &&делаю фокус на 3-м индексе
> SEEK num &&делаю поиск
легко и удобно заменяются на
seek(num, tablename, tagname)

> @ 1,i say name+develop&&вывожу на экран данные
это весьма редко используемый устаревший вариант вывода
Ratings: 0 negative/0 positive
Re: Seek в цикле
AlexSSS

Сообщений: 6113
Откуда: Tallinn, Estonia
Дата регистрации: 19.09.2005
а если тебе нужно
> я хочу получиmь на экране список названия двигателей,
> а также их изготовителей, которые соответствуют некоторому ключу
> (допустим все "V"-образные(у меня в таблице этому соответствует 2))
то здесь стоит использовать SELECT SQL
Ratings: 0 negative/0 positive
Re: Seek в цикле
BigLes
Автор

Сообщений: 9
Дата регистрации: 24.10.2010
спасибо, я знаю что это все старое уже, я только начинаю фокспро юзать, в университет надо лабу написать, потихоньку может и дойду до более умных вещей)
Ratings: 0 negative/0 positive
Re: Seek в цикле
Penner

Сообщений: 4102
Откуда: Muenster
Дата регистрации: 26.04.2002
на крайний случай
SET KEY TO


------------------
Никогда не откладывайте на завтра, то, о чем можно забыть навсегда
Ratings: 0 negative/0 positive
Re: Seek в цикле
MichaelD

Сообщений: 7578
Дата регистрации: 14.05.2005
BigLes
...дело в том, что SEEK делает указатель на первый, соответствующий индекс, а как его запустить в цикл дабы он мне вывел все найденные индексы? желательно именно "SEEK в цикле" но если это нереально, то подскажите пожалуйста как сделать задачу другими методами

Например, так:

LOCATE FOR ... &&<- or command SEEK
DO WHILE FOUND( )
*// if found
CONTINUE
ENDDO


------------------
С уважением,
Михаил Дроздов, Пермь, Россия




Исправлено 1 раз(а). Последнее : MichaelD, 24.10.10 03:14
Ratings: 0 negative/0 positive
Re: Seek в цикле
reware

Сообщений: 4116
Откуда: Хабаровск
Дата регистрации: 21.07.2008
BigLes
есть такие строки:
num=2 &&дополнительная переменная
SET INDEX TO engine &&открываю индексный файл "engine"
SET ORDER TO 3 &&делаю фокус на 3-м индексе
SET NEAR ON &&включаю поиск приближенного значения
SEEK num &&делаю поиск
@ 1,i say name+develop&&вывожу на экран данные

вот только дело в том, что SEEK делает указатель на первый, соответствующий индекс, а как его запустить в цикл дабы он мне вывел все найденные индексы? желательно именно "SEEK в цикле" но если это нереально, то подскажите пожалуйста как сделать задачу другими методами
Непонятки. Команда SEEK не управляет перечнем индексов/тегов. Коль указали SET ORDER TO 3, так по третьему тегу и будет искать.
Насчёт "цикла" - ну сделайте себе элементарный цикл (только зачем он ?) с переключением SET ORDER TO TAG ...
Ratings: 0 negative/0 positive
Re: Seek в цикле
ssa

Сообщений: 13008
Откуда: Москва
Дата регистрации: 23.03.2005
BigLes
есть такие строки:
num=2 &&дополнительная переменная
SET INDEX TO engine &&открываю индексный файл "engine"
SET ORDER TO 3 &&делаю фокус на 3-м индексе
SET NEAR ON &&включаю поиск приближенного значения
SEEK num &&делаю поиск
@ 1,i say name+develop&&вывожу на экран данные

вот только дело в том, что SEEK делает указатель на первый, соответствующий индекс, а как его запустить в цикл дабы он мне вывел все найденные индексы? желательно именно "SEEK в цикле" но если это нереально, то подскажите пожалуйста как сделать задачу другими методами
Каша в голове. Seek не делает указателей на индекс. Ищутся не индексы, а записи. Seek ищет всегда только первую удовлетворяющую выражению индекса запись. И нет понятия "фокус на индекс". Set index указывает файл с индексом. Set order указывает какой из индексов будет использоваться для поиска при наличии нескольких индексов. Варианты уже накидали.

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Seek в цикле
matod

Сообщений: 3062
Откуда: Иркутск
Дата регистрации: 31.10.2001
Еще один вариант - использовать цикл scan

SCAN ALL FOR num=2
... обработка очередной записи ...
ENDSCAN

Или, если надо выполнить какие-то действия только в случае если найдена хотя бы одна запись, то можно так:

LOCATE ALL FOR num=2
IF FOUND()
SCAN REST FOR num=2
... обработка очередной записи ...
ENDSCAN
ELSE
MESSAGEBOX('Нет таких!')
ENDIF

При этом можно обойтись вообще без индексов и установки активного. Если же будет структурный индекс (CDX) по полю num, то скорость выполнения будет почти такая-же, как и при использовании активного индекса и цикла.
Ratings: 0 negative/0 positive
Re: Seek в цикле
BigLes
Автор

Сообщений: 9
Дата регистрации: 24.10.2010
MichaelD
Например, так:

LOCATE FOR ... &&<- or command SEEK
DO WHILE FOUND( )
*// if found
CONTINUE
ENDDO

а как здесь заменить LOCATE FOR ... &&<- or command SEEK? ведь фокспро ругается и говорит что для CONTINUE нужен только LOCATE?
Ratings: 0 negative/0 positive
Re: Seek в цикле
MichaelD

Сообщений: 7578
Дата регистрации: 14.05.2005
BigLes
а как здесь заменить LOCATE FOR ... &&<- or command SEEK? ведь фокспро ругается и говорит что для CONTINUE нужен только LOCATE?

Да, с командой SEEK я возможно погорячился... :

- http://www.foxclub.ru/rhproject/project/html/fe9bb458-0229-4841-b3f7-3762e61228c6.htm
- http://www.foxclub.ru/rhproject/project/html/dd60dab3-c995-47b1-9efb-761750fc9492.htm
- http://www.foxclub.ru/rhproject/project/html/4d0bef69-fd9f-4ae8-beed-e236dcd7efca.htm
- ...

1) Для использования именно команды/функции SEEK, следует:
- разово выполнить SEEK
- и в случае удачи, далее:
. крутить условный DO WHILE <условие> + SKIP
. или условный SCAN REST <условие>

2) В использовании LOCATE FOR ... с учётом http://www.foxclub.ru/rhproject/project/html/e7c36f99-0993-40a7-be80-0717cbe85b8c.htm

Цитата:
...
В своей самой простой форме, Rushmore ускоряет выполнение одно-табличных команд, использующих предложения FOR (FOR clauses) для точного определения наборов записей с точки зрения существующих индексов. Кроме того, Rushmore может ускорять работу таких команд, как LOCATE ...

чего именно смущает?


------------------
С уважением,
Михаил Дроздов, Пермь, Россия




Исправлено 6 раз(а). Последнее : MichaelD, 24.10.10 12:07
Ratings: 0 negative/0 positive
Re: Seek в цикле
BigLes
Автор

Сообщений: 9
Дата регистрации: 24.10.2010
MichaelD
1) Для использования именно команды/функции SEEK, следует:
- разово выполнить SEEK
- и в случае удачи, далее:
. крутить условный DO WHILE <условие> + SKIP
. или условный SCAN REST <условие>

дело в том что SEEK все ровно просто делает указатель на первый попавшийся в таблице соответствующий индекс. в этом вся загвоздка, я делаю SKIP, а он возвращается в начало индексного файла
Ratings: 0 negative/0 positive
Re: Seek в цикле
MichaelD

Сообщений: 7578
Дата регистрации: 14.05.2005
BigLes
дело в том что SEEK все ровно просто делает указатель на первый попавшийся в таблице соответствующий индекс. в этом вся загвоздка, я делаю SKIP, а он возвращается в начало индексного файла

Вывод результатов где организован:

- в цикле в случае удачи
- или вне цикла

?

- тот код который показан и не должен выводить больше чем одну найденную запись...
- код, который "прямо сейчас" используешь с учётом высказанных замечаний, можно сюда показать? Ибо телепатов здесь нет...


------------------
С уважением,
Михаил Дроздов, Пермь, Россия
Ratings: 0 negative/0 positive
Re: Seek в цикле
BigLes
Автор

Сообщений: 9
Дата регистрации: 24.10.2010
SEEK num
@ 1,1 say name+develop
DO WHILE .not.eof()
SEEK num
@ 1,1 say name+develop
SKIP
ENDDO
Ratings: 0 negative/0 positive
Re: Seek в цикле
pioner-v

Сообщений: 1656
Дата регистрации: 01.05.2010
BigLes
SEEK num
@ 1,1 say name+develop
DO WHILE .not.eof()
SEEK num
@ 1,1 say name+develop
SKIP
ENDDO
Зачем Seek внутри цикла? Нужно поставить сравнение num с выражением равным ключу текущего тега. Чему равно индексное выражение в engine? Надо, примерно, так:
SEEK num
@ 1,1 say name+develop
DO WHILE .not.eof() and num=<ключ_из_engine> && выделенное жирным шрифтом надо уточнить!
@ 1,1 say name+develop
SKIP
END
По хорошему, надо привести стрктуру таблицы, выражение индекса и указать по каким полям идет выборка-сравнение... А так вилами по воде машем.



Исправлено 1 раз(а). Последнее : pioner-v, 24.10.10 14:02
Ratings: 0 negative/0 positive
Re: Seek в цикле
MichaelD

Сообщений: 7578
Дата регистрации: 14.05.2005
SEEK num
@ 1,1 say name+develop
DO WHILE .not.eof()
SEEK num
@ 1,1 say name+develop
SKIP
ENDDO

Хм...

- команда SEEK num, расположенная в цикли ищет поновой, плевать хотела на предшествующи поиск
- относительно SEEK выше было сказано: разово выполнить SEEK

вот одна из схем, которая была озвучена выше:

SET NEAR ON
SELECT <alias>
SET ORDER TO TAG <KeyFieldTagName>
IF SEEK(<value>, <alias>, <KeyFieldTagName>)
DO WHILE <KeyFieldTagName> = <value>
*// show result
SKIP
ENDDO
ELSE
*// NOT FOUND
ENDIF

т.е. докручивание цикла производится именно в условном DO WHILE <KeyFieldTagName> = <value>... + SKIP, без каких-либо SEEK внутри...


------------------
С уважением,
Михаил Дроздов, Пермь, Россия




Исправлено 3 раз(а). Последнее : MichaelD, 24.10.10 14:27
Ratings: 0 negative/0 positive
Re: Seek в цикле
BigLes
Автор

Сообщений: 9
Дата регистрации: 24.10.2010
Спасибо всем! из всего предложенного написал вот что:
i=1
num=1
SET INDEX TO engine
SET ORDER TO 3
SET NEAR ON
SEEK num
@ i,1 say name+develop
DO WHILE .not.eof() and type=num
@ i,1 say name+develop
i=i+1
SKIP
ENDDO
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 32 (Гостей: 32)

© 2000-2024 Fox Club 
Яндекс.Метрика