powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Поиск locate
8 сообщений из 8, страница 1 из 1
Поиск locate
    #39100590
Spartachek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день подскажите такой вопрос:

Есть вот такой код

SELECT f100001
FOR den=1 TO 7
locate FOR thisform.text1.Value = f100001.data AND vedom.km = f100001.km AND NOT EOF()

IF den=1 then
replace vedom.day1p WITH f100001.pr
replace vedom.day1t WITH f100001.ln
else
IF den=2 then
replace vedom.day2p WITH f100001.pr
replace vedom.day2t WITH f100001.ln
else
IF den=3 then
replace vedom.day3p WITH f100001.pr
replace vedom.day3t WITH f100001.ln
else
IF den=4 then
replace vedom.day4p WITH f100001.pr
replace vedom.day4t WITH f100001.ln
else
IF den=5 then
replace vedom.day5p WITH f100001.pr
replace vedom.day5t WITH f100001.ln
else
IF den=6 then
replace vedom.day6p WITH f100001.pr
replace vedom.day6t WITH f100001.ln
else
IF den=7 then
replace vedom.day7p WITH f100001.pr
replace vedom.day7t WITH f100001.ln

ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
endif
thisform.text1.Value = thisform.text1.Value + 1
continue
ENDFOR

он ищет что нужно только по первой записи таблицы как сделать чтобы он перескакивал на следующую запись, и так пока не сравнит все записи?
...
Рейтинг: 0 / 0
Поиск locate
    #39100620
SpartachekДобрый день подскажите такой вопрос:Подсказать вопрос? А ответ на него сам найдешь?
Есть вот такой код

SELECT f100001
FOR den=1 TO 7
locate FOR thisform.text1.Value = f100001.data AND vedom.km = f100001.km AND NOT EOF()И зачем тут EOF()? Думаете, за последней записью может оказаться еще одна, которая совершенно случайно еще и содержит нужные значения полей?
...

thisform.text1.Value = thisform.text1.Value + 1
continue
ENDFOR

он ищет что нужно только по первой записи таблицы как сделать чтобы он перескакивал на следующую запись, и так пока не сравнит все записи?Разумеется. Continue никогда не создавал цикла по записям.
Короче, схема должна быть такая:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT f100001
locate ... (без EOF())  && ищем первую
do while found()  && если нашли

FOR den=1 TO 7 && обрабатываем найденную ОДНУ запись
if ...

endif
endfor
continue && ищем следущую
enddo
...
Рейтинг: 0 / 0
Поиск locate
    #39100645
T1gRa_NT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И не легче заменить столько
Код: sql
1.
IF

на
Код: sql
1.
CASE


как например:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
Do CASE
Case den=1
 replace vedom.day1p WITH f100001.pr
 replace vedom.day1t WITH f100001.ln
Case den=2
 replace vedom.day2p WITH f100001.pr
 replace vedom.day2t WITH f100001.ln
Case den=3
 replace vedom.day3p WITH f100001.pr
 replace vedom.day3t WITH f100001.ln
Case den=4
 replace vedom.day4p WITH f100001.pr
 replace vedom.day4t WITH f100001.ln
Case den=5
 replace vedom.day5p WITH f100001.pr
 replace vedom.day5t WITH f100001.ln
Case den=6
 replace vedom.day6p WITH f100001.pr
 replace vedom.day6t WITH f100001.ln
Case den=7
 replace vedom.day7p WITH f100001.pr
 replace vedom.day7t WITH f100001.ln
OTHERWISE
MESSAGEBOX('Что-то пошло не так',16)
Endcase


...
Рейтинг: 0 / 0
Поиск locate
    #39100817
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для перебора записей логично использовать цикл SCAN..ENDSCAN. Если Ваша задача - найти записи, у которых значение поля f100001.data начинается с указанного значения thisform.text1.Value и до 7 следующих значений, то получим такой код

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
SELECT f100001
SCAN FOR f100001.km = vedom.km AND between(f100001.data, thisform.text1.Value, thisform.text1.Value+6)

    select vedom
    do case 
    case f100001.data = thisform.text1.Value
        replace vedom.day1p WITH f100001.pr
        replace vedom.day1t WITH f100001.ln

    case f100001.data = thisform.text1.Value + 1
        replace vedom.day2p WITH f100001.pr
        replace vedom.day2t WITH f100001.ln

    case f100001.data = thisform.text1.Value + 2
        replace vedom.day3p WITH f100001.pr
        replace vedom.day3t WITH f100001.ln

    case f100001.data = thisform.text1.Value + 3
        replace vedom.day4p WITH f100001.pr
        replace vedom.day4t WITH f100001.ln

    case f100001.data = thisform.text1.Value + 4
        replace vedom.day5p WITH f100001.pr
        replace vedom.day5t WITH f100001.ln

    case f100001.data = thisform.text1.Value + 5
        replace vedom.day6p WITH f100001.pr
        replace vedom.day6t WITH f100001.ln

    case f100001.data = thisform.text1.Value + 6
        replace vedom.day7p WITH f100001.pr
        replace vedom.day7t WITH f100001.ln
    endcase

ENDSCAN
...
Рейтинг: 0 / 0
Поиск locate
    #39101329
q1w1e1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для аргументированного выбора в конкретной ситуации какой метод лучше
locate ... do while found() или SCAN FOR или SELECT или ещё что-то, необходимо ввести функцию измерения времени, при старте своего метода и окончании... а так что логично, что лучше это только можно принять "на веру"...:-), и форма доказательства логичности будет выглядеть типа..."Уважаемый мой метод Scan эти записи отрабатывает за 0.001 сек., а Ваш глубокоуважаемый за 0.5 сек".. :-)))))
...
Рейтинг: 0 / 0
Поиск locate
    #39101362
Spartachek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ, Ваш метод делает то же, что и мой, мне нужно чтобы программа сравнила все записи одной и второй таблицы, т.е. в f100001 и vedom прошлась по все записям, а она корректно работает только для f100001, а в vedom берет только первую запись.
...
Рейтинг: 0 / 0
Поиск locate
    #39101363
Spartachek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SpartachekВладимирМ, Ваш метод делает то же, что и мой, мне нужно чтобы программа сравнила все записи одной и второй таблицы, т.е. в f100001 и vedom прошлась по все записям, а она корректно работает только для f100001, а в vedom берет только первую запись.

Т.е. она нашла одно первое совпадение и все, а таких там множество
...
Рейтинг: 0 / 0
Поиск locate
    #39101610
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SpartachekSpartachekВладимирМ, Ваш метод делает то же, что и мой, мне нужно чтобы программа сравнила все записи одной и второй таблицы, т.е. в f100001 и vedom прошлась по все записям, а она корректно работает только для f100001, а в vedom берет только первую запись.

Т.е. она нашла одно первое совпадение и все, а таких там множество

Если Вам надо перебрать все записи как таблицы f100001, так и таблицы vedom, то нужно 2 цикла. Один цикл перебирает записи одной таблицы, другой цикл - записи другой таблицы. Если я правильно понимаю, то Вам нужно вот это

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
select vedom
SCAN

    SELECT f100001
    SCAN FOR f100001.km = vedom.km AND between(f100001.data, thisform.text1.Value, thisform.text1.Value+6)

        select vedom
        do case 
        case f100001.data = thisform.text1.Value
            replace vedom.day1p WITH f100001.pr
            replace vedom.day1t WITH f100001.ln

        case f100001.data = thisform.text1.Value + 1
            replace vedom.day2p WITH f100001.pr
            replace vedom.day2t WITH f100001.ln

        case f100001.data = thisform.text1.Value + 2
            replace vedom.day3p WITH f100001.pr
            replace vedom.day3t WITH f100001.ln

        case f100001.data = thisform.text1.Value + 3
            replace vedom.day4p WITH f100001.pr
            replace vedom.day4t WITH f100001.ln

        case f100001.data = thisform.text1.Value + 4
            replace vedom.day5p WITH f100001.pr
            replace vedom.day5t WITH f100001.ln

        case f100001.data = thisform.text1.Value + 5
            replace vedom.day6p WITH f100001.pr
            replace vedom.day6t WITH f100001.ln

        case f100001.data = thisform.text1.Value + 6
            replace vedom.day7p WITH f100001.pr
            replace vedom.day7t WITH f100001.ln
        endcase

    ENDSCAN
ENDSCAN
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Поиск locate
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]