Foxpro, Связь многие-ко-многим

  • Автор темы Rommmm
  • Дата начала
R

Rommmm

#1
У меня есть таблица книг, таблица авторов, они связаны между собой отношением многие-ко-многим. Сделал промежуточную таблицу. Схема таблиц есть в прикрепленном файле. Проблема вот в чем:
необходимо разместить на форме combobox для выбора книги, разместить grid, в котором будут отображаться авторы этих книг.
У меня получается загружать в grid значения промежуточной таблицы, соответствующие выбранному значению в combobox, но ФИО авторов загрузить не получается... Помогите хоть кто-нибудь!!!!!!!
 

Вложения

BOPOHA

Well-known member
26.04.2006
118
0
#2
Если не расскажете или покажете, как вы делаете, то помочь никто не сможет.
 
R

Rommmm

#3
Размещаю на форме Combo1. Через Builder связываю его с таблицей BOOK, возвращаемое значение pk_book, свойство BoundTo=.t.
Размещаю Grid1, через билдер связываю его с AUTOR.
Размещаю Grid2, через билдер связываю его с IDT3. Во вкладке Relationship ставлю для родителя book.pk_book, для дочерней таблицы pk_book.
В Data Environment для таблиц ставлю order (для book - pk_book, для autor - pk_autor), пессимистическую буферизацию для строк.
Когда запускаю форму и выбираю в комбобоксе книгу, в гриде2 выводятся первичные ключи авторов, соответствующих этой книге, т.е. нормально всё.
Но в гриде1 только один автор отображается....

p.s. сильно не ругайтесь, я начинающий... учусь...

Добавлено: Ну я еще пробовал через командную строку, все получается... (здесь в примере выводятся авторы для книги с первичным ключом = 4)
Но мне бы на формочку всё это и в таблицу....

CLEAR all
USE idt3 IN 0
USE autor ORDER pk_autor IN 0
SELECT idt3
SET RELATION TO pk_autor INTO autor additive
SET FILTER TO pk_book=4 IN idt3
BROWSE FIELDS pk_book,autor.fio
SET FILTER TO IN idt3
set relation to
 
R

Rommmm

#4
Разобрался с проблемой! Кому интересно пишу как делать:

создаем 2 формы.
на 1-й: размещаем combobox. Через Builder связываем его с таблицей Book, выбираем поля name_book, pk_book. Во вкладке Value устанавливаем pk_book. В свойствах combobox во вкладке data, в поле BoundTo ставим true. Затем выбираем View->Data Environment, у таблицы book ставим 2 в свойствах, в поле BufferModeOverride. Делаем кнопку "авторы", прописываем в click
do form show_autor.
на 2-й форме (show_autor): создаем сначала grid для промежуточной таблицы (idt3), помещаем поля pk_book, pk_autor. Затем делаем grid для autor, помещаем поле fio. Заходим в View->Data Environment, для таблиц ставим BufferModeOverride=2, для таблицы idt3 в поле Filter пишем idt3.pk_book=book.pk_book, для таблицы autor в filter пишем autor.pk_autor=idt3.pk_autor. Делаем первый grid незаметным, т.е. можно поместить его ниже второго грида, сделать нижнюю границу формы выше первого грида.

Также можно делать фильтры при загрузке формы, например,
SELECT idt3
SET FILTER TO idt3.pk_book=book.pk_book
SELECT autor
SET FILTER TO autor.pk_autor=idt3.pk_autor
GO TOP && для перемещения вверх в таблице, т.к. строки грида могут отобразиться некорректно.
И чуть не забыл!!!! При выгрузке формы надо отменить фильтры:
SELECT idt3
SET FILTER TO
SELECT autor
SET FILTER TO

Важно также заметить, что фильтр можно ставить любой, например: SET FILTER TO (idt3.pk_book=book.pk_book) and !deleted()
будут выведены авторы книги, которые не помечены на удаление в таблице idt3.

Спасибо за помощь!)