Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Присвоить переменным значение из таблицы по совпадению поля с одной из переменных / 15 сообщений из 15, страница 1 из 1
23.01.2017, 18:27
    #39389755
p672
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Присвоить переменным значение из таблицы по совпадению поля с одной из переменных
Есть таблица t1.dbf (это справочник, код не повторяется)
В ней поля: (все текстовые)
kod C(10)
name C(90)
gost C(30)
raz C(30)
ed C(10)

И есть переменные k,n,g,r,e

Как программно, грамотно присвоить переменным n,g,r,e значения из таблицы t1.dbf по совпадению кода?!
То есть если переменная kod=t1.kod то остальным переменным присваиваются значения из этой записи в соответствии с совпавшим кодом.
Заранее благодарен.
...
Рейтинг: 0 / 0
23.01.2017, 18:30
    #39389760
p672
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Присвоить переменным значение из таблицы по совпадению поля с одной из переменных
Извиняюсь ошибка:

если переменная k=t1.kod
то
n=t1.name
g=t1.gost
r=t1.raz
e=t1.ed
...
Рейтинг: 0 / 0
23.01.2017, 19:32
    #39389808
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Присвоить переменным значение из таблицы по совпадению поля с одной из переменных
Что сделать

1. Переместить указатель записи в нужной рабочей области на запись с указанным кодом
2. Записать значения полей текущей записи в переменные памяти

Как сделать

Для перемещения указателя записи в нужной рабочей области на запись с указанным кодом можно использовать любые навигационные команды: Locate, Seek, функция seek(). В некоторых случаях имеет смысл использовать циклы вроде scan..endscan. Что именно использовать, зависит от структуры данных и постановки задачи

В простейшем случае

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
* Перейти в рабочую область нужной таблицы
select t1

* Найти нужную запись
locate for t1.kod = m.kod

* если нашли, то делаем присвоение остальным переменным
if found()
    m.n = t1.name
    m.g = t1.gost
    m.r = t1.raz
    m.e = t1.ed
else
    MessageBox("Запись с кодом " + m.kod + " не найдена")
endif



Префикс "m." означает, что далее следует имя переменной памяти. Это для того, чтобы FoxPro не перепутал с именем поля в текущей рабочей области. Если уверены, что такого имени поля быть не может, то этот префикс можно не указывать.

Для полей таблицы префикс с именем рабочей области желательно все-таки указывать. Хотя, конечно, тоже можно опустить, но в этом случае код становится слишком сложен для понимания
...
Рейтинг: 0 / 0
24.01.2017, 01:02
    #39389965
p672
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Присвоить переменным значение из таблицы по совпадению поля с одной из переменных
Уважаемый ВладимирМ благодарю за помощь.
А возможно ли написать подобный код используя команду SCATTER с MEMVAR ?!
И что лучше использовать: LOCATE, SEEK или SEEK() чтобы быстрее работала программа?!
...
Рейтинг: 0 / 0
24.01.2017, 07:01
    #39389993
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Присвоить переменным значение из таблицы по совпадению поля с одной из переменных
p672А возможно ли написать подобный код используя команду SCATTER с MEMVAR ?!
Можно, но по хорошему надо использовать встроенные средства буферизации, а не колхозить кэш из переменных.
p672И что лучше использовать: LOCATE, SEEK или SEEK() чтобы быстрее работала программа?!
LOCATE это перебор записей.
Лучше SEEK, удобнее IndexSeek() - это все поиск по индексу. По индексу на порядки быстрее.
...
Рейтинг: 0 / 0
24.01.2017, 08:58
    #39390017
p672
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Присвоить переменным значение из таблицы по совпадению поля с одной из переменных
Допустим таблица имеет первичный индекс kd по полю kod
Как будет выглядеть программный код с использованием indexseek() - я SEEK никогда не пользовался и дел не имел..
...
Рейтинг: 0 / 0
24.01.2017, 09:28
    #39390033
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Присвоить переменным значение из таблицы по совпадению поля с одной из переменных
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
if IndexSeek(m.kod, .T., 't1', 'kd')
    m.n = t1.name
    m.g = t1.gost
    m.r = t1.raz
    m.e = t1.ed
else
    MessageBox("Запись с кодом " + m.kod + " не найдена")
endif
...
Рейтинг: 0 / 0
24.01.2017, 09:39
    #39390042
p672
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Присвоить переменным значение из таблицы по совпадению поля с одной из переменных
Я нашел: Функция KEYMATCH( ) - возможно ли её использовать вместо indexseek()
Какое решение работает быстрее?
...
Рейтинг: 0 / 0
24.01.2017, 09:53
    #39390052
p672
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Присвоить переменным значение из таблицы по совпадению поля с одной из переменных
Функция INDEXSEEK()
Без перемещения указателя записи таблицы ищет в индексированной таблице первую встретившуюся запись, чей индексный ключ соответствует указанному выражению.
- получается не должно работать..
...
Рейтинг: 0 / 0
24.01.2017, 09:57
    #39390056
p672
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Присвоить переменным значение из таблицы по совпадению поля с одной из переменных
Нет получается командой SEEK только пользоваться нужно..
Какой программный код будет с командой SEEK.
...
Рейтинг: 0 / 0
24.01.2017, 10:02
    #39390058
p672
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Присвоить переменным значение из таблицы по совпадению поля с одной из переменных
SEEK Команда :
Ищет в таблице первое появление записи, индексный ключ которой соответствует общему выражению, затем перемещает указатель на соответствующую запись .
...
Рейтинг: 0 / 0
24.01.2017, 10:19
    #39390068
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Присвоить переменным значение из таблицы по совпадению поля с одной из переменных
p672Функция INDEXSEEK()
Без перемещения указателя записи таблицы ищет в индексированной таблице первую встретившуюся запись, чей индексный ключ соответствует указанному выражению.
- получается не должно работать..
Внимательней хэлп читай. Второй параметр .T. - перемещать указатель.
helplMovePointer
Specifies if the record pointer is moved to the matching record. If lMovePointer is true (.T.) and a matching record exists, the record pointer is moved to the matching record . If lMovePointer is true (.T.) and a matching record doesn't exist, the record pointer isn't moved. If lMovePointer is false (.F.) or is omitted, the record pointer isn't moved even if a matching record exists.

.F. это если надо только проверить есть ли такой ключ, это быстрее, т.к. перемещать указатель не надо.


KEYMATCH() не использую, не совсем понял что он делает. Вроде тоже самое, только индекс надо номером задавать, что неудобно.

Тут дело не в том какой конкретно функцией ищешь, а в том используются индексы или нет. С использованием индекса намного быстрее, поэтому по скорости SEEK, SEEK() и INDEXSEEK() одинаковы, INDEXSEEK() удобнее тем что ему сразу все нужные параметры можно задать.
...
Рейтинг: 0 / 0
24.01.2017, 10:30
    #39390077
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Присвоить переменным значение из таблицы по совпадению поля с одной из переменных
p672Нет получается командой SEEK только пользоваться нужно..
Какой программный код будет с командой SEEK.
Тоже самое что и IndexSeek(), только букав больше писать
Код: sql
1.
2.
3.
4.
set order to kd in t1
SEEK m.kod in t1
if found('t1')
...


SEEK() тоже можно в одну строку
Код: sql
1.
2.
if SEEK(m.kod, 't1', 'kd')
...


У SEEK и SEEK() есть еще один интересный эффект: при SET NEAR ON если не находят, то встают на ближайщее большее, а не в конец.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
15.09.2019, 13:34
    #39862002
Людмila
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Присвоить переменным значение из таблицы по совпадению поля с одной из переменных
Столкнулась с поиском таблицах по индексу, ну и хочу поведать об интересных, на мой взгляд результатах.

Протестировав на скорость SEEK, SEEK(), INDEXSEEK() и KEYMATCH() оказалось, что последняя на порядок обгоняет все остальные, но шустрая KEYMATCH() не обращает внимания на SET DELETE ON/OFF в отличии от остальных, т.е. в результате может оказаться давно удаленная запись!
...
Рейтинг: 0 / 0
18.09.2019, 08:39
    #39863145
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Присвоить переменным значение из таблицы по совпадению поля с одной из переменных
KEYMATCH() - это поиск только и исключительно по индексу, игнорируя любые ограничения и фильтры, наложенные на рабочую область. Т.е. настройки SET DELETE, SET FILTER, SET KEY для этой функции "не видны". Однако если сам индекс создан с использованием FOR-условия, то это условие будет учтено. Например, FOR !Deleted(), чтобы исключить поиск удаленных записей

SEEK, SEEK(), INDEXSEEK() - кроме поиска по индексу также учитывают и все фильтры и ограничения, наложенные на рабочую область. На что, естественно, надо потратить дополнительное время

Для поиска также можно использовать LOCATE FOR. Но здесь есть своя особенность. Для повышения производительности этой команды перед ее использованием необходимо отключить главный индекс. Т.е. ее следует использовать примерно так

SET ORDER TO 0
LOCATE FOR ....

В этом случае команда LOCATE сама найдет наиболее подходящий индекс для указанного условия и использует его для поиска. Ну, или не найдет. Тогда время поиска увеличиться... Собственно, это относится к любым командам с FOR-условием. Они автоматически предпримут попытку использовать индекс, если это возможно
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Присвоить переменным значение из таблицы по совпадению поля с одной из переменных / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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