Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Выборка записей, отобранных set relation / 7 сообщений из 7, страница 1 из 1
01.04.2010, 09:02
    #36554438
Eugene S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка записей, отобранных set relation
Здравствуйте.

Использую VFP 6.
У меня есть таблица t_idList - список идентификаторов записей (получается на предыдущем этапе работы).
И есть вторая таблица t_Records - записи с данными идентификаторами.

То есть, если сделать set relation, то вторая таблица показывает все записи с этим идентификатором (он для этой таблицы не уникальный). Записей немного, их надо отобрать в курсор.

Собственно, код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
select t_idList
go top
scan
  select t_Records && здесь из-за set relation мы уже стоим на первой подходящей записи
  scan for t_idList.id = t_Records.fk_id
    insert ... into cursor ...
  endscan
endscan

Можно ли придумать более быстрое решение?

Вариант нерейти на VFP 9 - как крайняя мера.
...
Рейтинг: 0 / 0
01.04.2010, 09:34
    #36554493
Выборка записей, отобранных set relation
Eugene SМожно ли придумать более быстрое решение?

Код: plaintext
select * from t_records inner join t_idlist on t_idlist.id=t_records.fk_id into cursor ...
...
Рейтинг: 0 / 0
01.04.2010, 14:51
    #36555638
Eugene S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка записей, отобранных set relation
Не.

Я, пожалуй, излишне сократил код.

to Шестипалов: ваш код отберёт все записи в t_Records с идентификаторам из t_idList.

Но между эндсканами есть обработка пачки полученных записей. Вот так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select t_idList
go top
scan
  select t_Records && здесь из-за set relation мы уже стоим на первой подходящей записи
  scan for t_idList.id = t_Records.fk_id
    insert ... into cursor ...
  endscan

  && здесь обрабатываем записи, отобранные в курсор. то есть если для t_idList.id =  1001 
  && получили в курсор  20  записей - их обработали (там много всякой работы) и перешли к    
  && следующей записи в t_idList

endscan

Хотя можно попробовать сначала отобрать все нужные записи в курсор а уже потом скопом обрабатывать.
...
Рейтинг: 0 / 0
01.04.2010, 15:22
    #36555759
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка записей, отобранных set relation
Если не опишите задачу полностью, то любое решение будет бессмысленным. Ведь Вы снова скажете, что предложеное решение не учитывает какую-то еще обработку о которой Вы не рассказали.

А по Вашему коду, есть несколько замечаний.

1) SET Relation - это "взгляд" на подчиненну таблицу со стороны главной. Т.е. когда Вы находитесь в рабочей области главной таблицы. Меняя "точку зрения" (текущую рабочую область) Вы, по сути, "разрываете" связь. Точнее, она перестает работать

2) Если в команде используется только FOR-условие, то такая команда сканирует всю таблицу. Поэтому не имеет никакого значения, где именно находился указатель записи на момент подачи команды. Все равно сканирование начнется с самой первой записи.

Другими словами - Ваш код попросту игнорирует SET RELATION. В подобном коде настройка связи - бессмысленна и бесполезна. Она просто не работает.

Обычно делают следующим образом

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
select t_Records
set order to fk_id && индекс, по внешнему ключу - ссылающемуся на главную таблицу

select t_idList
go top
scan
	select t_Records 
	=seek(t_idList.id) && поиск первой записи, соответствующей ключу главной таблицы

	* Опция WHILE означает сканирование от ТЕКУЩЕЙ записи
	* и до тех пор, пока усовие истинно. 
	* Поскольку записи упорядочены по индексу, то все записи,
	* удовлетворяющие условию расположены рядом. Друг за другом.
	* Как следствие, когда условие перестанет быть истинным не останется
	* не рассмотренных записей удовлетворяющих условию.
	scan WHILE t_Records.fk_id = t_idList.id
		insert ... into cursor ...
	endscan
endscan


Настройка SET RELATION используется, в основном, для визуальных эффектов. Ну, там для отображения в Grid или в отчете. При программных модификациях эта настройка практически бесполезна.
...
Рейтинг: 0 / 0
01.04.2010, 17:59
    #36556291
Выборка записей, отобранных set relation
Eugene S,

Тогда так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
select t_idList
go top
scan
  select * from t_records where t_Records.fk_id=t_idList.id into cursor ...

  && здесь обрабатываем записи, отобранные в курсор. то есть если для t_idList.id =  1001 
  && получили в курсор  20  записей - их обработали (там много всякой работы) и перешли к    
  && следующей записи в t_idList

endscan

Хотя ВладимирМ правильно сказал, что условия можно уточнять бесконечно :-)
...
Рейтинг: 0 / 0
02.04.2010, 09:44
    #36557027
Koryuu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка записей, отобранных set relation
Код: plaintext
1.
2.
select * from t_records where fk_id in ;
 (select id from t_idList) into cursor .....
потом работаем с полученным курсором
____________________________________________________
Истинный оргазм можно испытать только после нескольких часов жесткой е*ли с кодом
...
Рейтинг: 0 / 0
03.04.2010, 22:32
    #36559465
Eugene S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка записей, отобранных set relation
Спасибо всем ответившим!
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Выборка записей, отобранных set relation / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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