powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Присвоить переменным значение из таблицы по совпадению поля с одной из переменных
15 сообщений из 15, страница 1 из 1
Присвоить переменным значение из таблицы по совпадению поля с одной из переменных
    #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
Присвоить переменным значение из таблицы по совпадению поля с одной из переменных
    #39389760
p672
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняюсь ошибка:

если переменная k=t1.kod
то
n=t1.name
g=t1.gost
r=t1.raz
e=t1.ed
...
Рейтинг: 0 / 0
Присвоить переменным значение из таблицы по совпадению поля с одной из переменных
    #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
Присвоить переменным значение из таблицы по совпадению поля с одной из переменных
    #39389965
p672
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемый ВладимирМ благодарю за помощь.
А возможно ли написать подобный код используя команду SCATTER с MEMVAR ?!
И что лучше использовать: LOCATE, SEEK или SEEK() чтобы быстрее работала программа?!
...
Рейтинг: 0 / 0
Присвоить переменным значение из таблицы по совпадению поля с одной из переменных
    #39389993
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
p672А возможно ли написать подобный код используя команду SCATTER с MEMVAR ?!
Можно, но по хорошему надо использовать встроенные средства буферизации, а не колхозить кэш из переменных.
p672И что лучше использовать: LOCATE, SEEK или SEEK() чтобы быстрее работала программа?!
LOCATE это перебор записей.
Лучше SEEK, удобнее IndexSeek() - это все поиск по индексу. По индексу на порядки быстрее.
...
Рейтинг: 0 / 0
Присвоить переменным значение из таблицы по совпадению поля с одной из переменных
    #39390017
p672
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Допустим таблица имеет первичный индекс kd по полю kod
Как будет выглядеть программный код с использованием indexseek() - я SEEK никогда не пользовался и дел не имел..
...
Рейтинг: 0 / 0
Присвоить переменным значение из таблицы по совпадению поля с одной из переменных
    #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
Присвоить переменным значение из таблицы по совпадению поля с одной из переменных
    #39390042
p672
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я нашел: Функция KEYMATCH( ) - возможно ли её использовать вместо indexseek()
Какое решение работает быстрее?
...
Рейтинг: 0 / 0
Присвоить переменным значение из таблицы по совпадению поля с одной из переменных
    #39390052
p672
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Функция INDEXSEEK()
Без перемещения указателя записи таблицы ищет в индексированной таблице первую встретившуюся запись, чей индексный ключ соответствует указанному выражению.
- получается не должно работать..
...
Рейтинг: 0 / 0
Присвоить переменным значение из таблицы по совпадению поля с одной из переменных
    #39390056
p672
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет получается командой SEEK только пользоваться нужно..
Какой программный код будет с командой SEEK.
...
Рейтинг: 0 / 0
Присвоить переменным значение из таблицы по совпадению поля с одной из переменных
    #39390058
p672
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SEEK Команда :
Ищет в таблице первое появление записи, индексный ключ которой соответствует общему выражению, затем перемещает указатель на соответствующую запись .
...
Рейтинг: 0 / 0
Присвоить переменным значение из таблицы по совпадению поля с одной из переменных
    #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
Присвоить переменным значение из таблицы по совпадению поля с одной из переменных
    #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
Период между сообщениями больше года.
Присвоить переменным значение из таблицы по совпадению поля с одной из переменных
    #39862002
Людмila
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Столкнулась с поиском таблицах по индексу, ну и хочу поведать об интересных, на мой взгляд результатах.

Протестировав на скорость SEEK, SEEK(), INDEXSEEK() и KEYMATCH() оказалось, что последняя на порядок обгоняет все остальные, но шустрая KEYMATCH() не обращает внимания на SET DELETE ON/OFF в отличии от остальных, т.е. в результате может оказаться давно удаленная запись!
...
Рейтинг: 0 / 0
Присвоить переменным значение из таблицы по совпадению поля с одной из переменных
    #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
15 сообщений из 15, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Присвоить переменным значение из таблицы по совпадению поля с одной из переменных
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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