Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Поиск locate  [new]
Spartachek
Guest
Добрый день подскажите такой вопрос:

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

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

он ищет что нужно только по первой записи таблицы как сделать чтобы он перескакивал на следующую запись, и так пока не сравнит все записи?
11 ноя 15, 13:14    [18399594]     Ответить | Цитировать Сообщить модератору
 Re: Поиск locate  [new]
правильный проходящий.
Guest
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 никогда не создавал цикла по записям.
Короче, схема должна быть такая:

SELECT f100001
locate ... (без EOF())  && ищем первую
do while found()  && если нашли

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

endif
endfor
continue && ищем следущую
enddo
11 ноя 15, 13:33    [18399765]     Ответить | Цитировать Сообщить модератору
 Re: Поиск locate  [new]
T1gRa_NT
Member

Откуда:
Сообщений: 116
И не легче заменить столько
IF
на
CASE

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

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

11 ноя 15, 13:47    [18399886]     Ответить | Цитировать Сообщить модератору
 Re: Поиск locate  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Для перебора записей логично использовать цикл SCAN..ENDSCAN. Если Ваша задача - найти записи, у которых значение поля f100001.data начинается с указанного значения thisform.text1.Value и до 7 следующих значений, то получим такой код

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
11 ноя 15, 15:32    [18400675]     Ответить | Цитировать Сообщить модератору
 Re: Поиск locate  [new]
q1w1e1
Member

Откуда: Кы-рск
Сообщений: 1034
для аргументированного выбора в конкретной ситуации какой метод лучше
locate ... do while found() или SCAN FOR или SELECT или ещё что-то, необходимо ввести функцию измерения времени, при старте своего метода и окончании... а так что логично, что лучше это только можно принять "на веру"...:-), и форма доказательства логичности будет выглядеть типа..."Уважаемый мой метод Scan эти записи отрабатывает за 0.001 сек., а Ваш глубокоуважаемый за 0.5 сек".. :-)))))
12 ноя 15, 05:27    [18403811]     Ответить | Цитировать Сообщить модератору
 Re: Поиск locate  [new]
Spartachek
Guest
ВладимирМ, Ваш метод делает то же, что и мой, мне нужно чтобы программа сравнила все записи одной и второй таблицы, т.е. в f100001 и vedom прошлась по все записям, а она корректно работает только для f100001, а в vedom берет только первую запись.
12 ноя 15, 08:15    [18403945]     Ответить | Цитировать Сообщить модератору
 Re: Поиск locate  [new]
Spartachek
Guest
Spartachek
ВладимирМ, Ваш метод делает то же, что и мой, мне нужно чтобы программа сравнила все записи одной и второй таблицы, т.е. в f100001 и vedom прошлась по все записям, а она корректно работает только для f100001, а в vedom берет только первую запись.


Т.е. она нашла одно первое совпадение и все, а таких там множество
12 ноя 15, 08:18    [18403957]     Ответить | Цитировать Сообщить модератору
 Re: Поиск locate  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Spartachek
Spartachek
ВладимирМ, Ваш метод делает то же, что и мой, мне нужно чтобы программа сравнила все записи одной и второй таблицы, т.е. в f100001 и vedom прошлась по все записям, а она корректно работает только для f100001, а в vedom берет только первую запись.


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


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

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
12 ноя 15, 12:11    [18405268]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить