powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Связывание таблиц
8 сообщений из 8, страница 1 из 1
Связывание таблиц
    #32975143
Romazan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Подскажите пожалуйста как правильно связать таблицы в VFP8?
Hужна программа, что-то типа телефонного справочника. Имеются три таблицы:
1)Организация(код организации, название организации, адресс)
2)Отдел(код организации, код отдела, название отдела)
3)Работники(код отдела, код работника, фамилия, телефон)
К примеру на форме будет три "Grid_а". В первом выделяем организацию, во
втором видим отделы имеющиеся в этой организации а в третьем работников
из этого отдела. Таблица "Организиция" получается главной, в ней
делаю индекс по полю "код", но тогда возникает ошибка при добавлении
новой строки. Как правльно это все сделать? И как лучше заполнять поля "код"
в таблицах при заполнении справочников, с помощью автоматичекого
увеличения или нет? Вроде бы вопросы не сложные, но у меня в голове получается
какая-то путаница. Если можно подскажите пожалуста по шагам как это
можно и нужно делать. Может кто знает где в Интернете есть
докумнтация про это, тогда напишите пожалуйста "URL".
Заранее Вас благодарю!
...
Рейтинг: 0 / 0
Связывание таблиц
    #32975147
Ilhom_uz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это уже хоть как-то работает?
Конкретнее вопрос можно....
У Вас проблемы с автоинкрементом поля код, или установкой релейшинов?
Или еще что?
...
Рейтинг: 0 / 0
Связывание таблиц
    #32975467
Фотография Grumax_user
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думаю примерно такая структура:
organization.dbf
Id_orgKod_orgName_orgAdress0001А1АО Цыбул ул. Ленина д.10 кв.100002А2ЗАО Йцукен ул. Иванова0003А3ИТД Тундра ул. Петрова0004А4ООО Поддержка ул. Сидорова
department.dbf
Id_depfId_orgKod_orgKod_depName_dep00010001A11отдел гл. технолога00020001A12бухгалтерия00030002A23плановый00040002A24отдел труда
Personal.dbf
Id_perfId_depKod_depKod_perSurNameTelefon0001000111000Арбузов44-100002000111001Барабанов44-890003000111010Вилкин44-520004000222000Грибов44-01
Если записи в твоих полях код организации->Kod_org, код отдела->Kod_dep, код работника->Kod_per уникальны, то добавленные мною поля не нужны
Если у тебя база *.dbc, то в этом случае по полям Id_org, Id_dep, Id_per созданы индексы Primary, а по полям fId_org, fId_dep -> Regular, для создания отношений. Я создаю(временно), чтобы пользоваться стандартными средствами и вытекающей от сюда простотой создания Queries и т.д.
Если хочешь эти таблицы оставить свободными, то эти отношения тобой должны подразумеваться...
Код: plaintext
1.
2.
3.
4.
SELECT organization.*, department.*, Personal.* ;
   FROM organization ;
INNER JOIN department ON  organization.Id_org = department.fid_org ;
INNER JOIN Personal ON  department.Id_dep = Personal.fid_dep ;
   INTO CURSOR cur_one NOFILTER READWRITE
------------------------------------------------------------------------------------
Код: plaintext
Я во все дела суюсь -> всесторонне разовьюсь   
Visual FoxPro 8.0
...
Рейтинг: 0 / 0
Связывание таблиц
    #32976284
Romazan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Grumax_userДумаю примерно такая структура:
organization.dbf
Id_orgKod_orgName_orgAdress0001А1АО Цыбул ул. Ленина д.10 кв.100002А2ЗАО Йцукен ул. Иванова0003А3ИТД Тундра ул. Петрова0004А4ООО Поддержка ул. Сидорова
department.dbf
Id_depfId_orgKod_orgKod_depName_dep00010001A11отдел гл. технолога00020001A12бухгалтерия00030002A23плановый00040002A24отдел труда
Personal.dbf
Id_perfId_depKod_depKod_perSurNameTelefon0001000111000Арбузов44-100002000111001Барабанов44-890003000111010Вилкин44-520004000222000Грибов44-01
Если записи в твоих полях код организации->Kod_org, код отдела->Kod_dep, код работника->Kod_per уникальны, то добавленные мною поля не нужны
Если у тебя база *.dbc, то в этом случае по полям Id_org, Id_dep, Id_per созданы индексы Primary, а по полям fId_org, fId_dep -> Regular, для создания отношений. Я создаю(временно), чтобы пользоваться стандартными средствами и вытекающей от сюда простотой создания Queries и т.д.
Если хочешь эти таблицы оставить свободными, то эти отношения тобой должны подразумеваться...
Код: plaintext
1.
2.
3.
4.
SELECT organization.*, department.*, Personal.* ;
   FROM organization ;
INNER JOIN department ON  organization.Id_org = department.fid_org ;
INNER JOIN Personal ON  department.Id_dep = Personal.fid_dep ;
   INTO CURSOR cur_one NOFILTER READWRITE
------------------------------------------------------------------------------------
Код: plaintext
Я во все дела суюсь -> всесторонне разовьюсь   
Visual FoxPro 8.0



Спасибо Вам огромное за объяснение! Только вот как нужно заполнять поля
Kod_org, Kod_dep, Kod_per, Id_org, Id_dep, Id_per а также fId_org, fId_dep ? К примеру я простой пользователь, и ввожу название организации, какой нибудь отдел и работников с ихними номерами телефонов, я же не должен заполнять эти поля сам. Да и ктому же они же должны заполняться правильно. Если в таблице “organization” код организации 0123, то и в таблице “department” код этой организации должен быть таким же. Может в таблицу “department” поле “Kod_org”
просто копировать из таблицы “organization” и так же поступать и с талицей “Personal”, копировать в неё поле “Kod_Dep” из “department”,
вот этот вопрос мне ни как не понятен. Объясните пожалуйста, как это нужно делать? Заранее Вас благодарю!
...
Рейтинг: 0 / 0
Связывание таблиц
    #32977429
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Romazan!

1) Поиск тут и на foxclub.ru по теме NewID сильно поможет
2) Создавать связи на этапе заполнения должен твой код - т.е. сейчас у тебя видимо прописано где-то (в кнопке "добавить" в меню или ещё где) APPEND BLANK - так вот вместо этого пропиши там явное INSERT INTO department (Org_ID) VALUES (organization.Org_ID) - для Personal аналогично.
Если этой базой никто и никогда кроме тебя (кроме вот этой конкретной твоей программы) пользоваться не будет, и ты не собираешься её никогда менять и улучшать (ну т.е. КРАЙНЕ редкий случай) то можно прописать в DefaultValue для поля department.Org_ID нечто типа IIF(USED("organization") AND VARTYPE(organization.Org_ID) = "C" AND !EOF("organization"), organization.Org_ID, .NULL.) - ну соответственно поменяй выражение под свои поля (и их тип).
Тогда можно и по APPEND BLANK записи добавлять - сработает Default и заполнит поле тем значением, что было в текущей записи "вышестоящей" таблицы. Но повторюсь - это не есть красивое и правильное решение.

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
Связывание таблиц
    #32978043
Romazan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Igor Korolyov
Hi Romazan!

1) Поиск тут и на foxclub.ru по теме NewID сильно поможет
2) Создавать связи на этапе заполнения должен твой код - т.е. сейчас у тебя видимо прописано где-то (в кнопке "добавить" в меню или ещё где) APPEND BLANK - так вот вместо этого пропиши там явное INSERT INTO department (Org_ID) VALUES (organization.Org_ID) - для Personal аналогично.
Если этой базой никто и никогда кроме тебя (кроме вот этой конкретной твоей программы) пользоваться не будет, и ты не собираешься её никогда менять и улучшать (ну т.е. КРАЙНЕ редкий случай) то можно прописать в DefaultValue для поля department.Org_ID нечто типа IIF(USED("organization") AND VARTYPE(organization.Org_ID) = "C" AND !EOF("organization"), organization.Org_ID, .NULL.) - ну соответственно поменяй выражение под свои поля (и их тип).
Тогда можно и по APPEND BLANK записи добавлять - сработает Default и заполнит поле тем значением, что было в текущей записи "вышестоящей" таблицы. Но повторюсь - это не есть красивое и правильное решение.

Posted via ActualForum NNTP Server 1.1

А где там Поиск на foxclub.ru по теме NewID ? Все облазил, не нашел!
...
Рейтинг: 0 / 0
Связывание таблиц
    #32979762
Фотография Grumax_user
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри что не отвечал, инет на работе закончился :-(( Admin->@
Для начала RTFM Тут -> авторы Владимир Максимов, Сергей Чаговец, Игорь Ильин, Владислав Кулак, Пирожков Вадим...в особенности про Primary key Тут и Relation's Тут
Прочитал? Тогда дальше :-))
На данный момент принимаем примерно такую структуру:
Код: plaintext
1.
2.
3.
4.
5.
	CREATE TABLE data_s\Organization.dbf FREE (Kod_org I NOT NULL, Name_org C( 250 ), Street C( 250 ), House C( 50 ), Flat C( 50 ))
	MODIFY STRUCTURE 
	CREATE TABLE data_s\Department.dbf FREE (Kod_dep I NOT NULL, fKod_org I NOT NULL, Name_dep C( 250 ))
	MODIFY STRUCTURE 
	CREATE TABLE data_s\Personal.dbf FREE (Kod_per I NOT NULL, fKod_dep I NOT NULL, fName C( 50 ), fPatron C( 50 ), fSurName C( 50 ))
	MODIFY STRUCTURE 
А дальше как барин решит. Единственный совет, который наболел и приходет сейчас в голову -> старайся разбивать инфу на части(лучше справочники), т.е допустим в поле Address не надо забивать, что-то вроде этого "ул. Барбюса д.10 кв. 15" лучше разбить это на Shotname(район, поселок, ул., площадь и т.д.), Street(А. Невского, М. Лермонтова), House(10, 25/2), Flat(14, 58) и т.д и т.п...
В качестве Суррогатного ключа использовал поля Kod_org, Kod_dep, Kod_per, все типа Integer(AutoInc) ( Поправь! ). На практике же использую поле типа Character C(4), просто в 6-ке не было такого поля пришлось исхитряться :-)
Как говорилось ранее Суррогатный ключ пользователь НЕ ВИДИТ и НЕ РЕДАКТИРУЕТ !!! и ты его НЕ РЕДАКТИРУЕШЬ
Дальше примерный алгоритм работы пользователя:
1. Завести организацию.
Код: plaintext
1.
2.
	INSERT INTO Organization (Name_org, Street, House, Flat) VALUES ("ОА Икра Красная", "ул. Рыбная", "14/8", "строение 2")
	INSERT INTO Organization (Name_org, Street, House, Flat) VALUES ("ОА Пивко", "ул. Разливочная", "7", "корпус 1")
	INSERT INTO Organization (Name_org, Street, House, Flat) VALUES ("ЗАО Холод", "пер. Тупиковый", "7", "10")
Переменные берешь например из TextBox'ов
2. Завести отдел. Запоминаешь код организации на которую встал пользователь.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
	SELECT Organization
	GO TOP 
*!* Для "ОА Икра Красная" заводим отделы
	gnKod_org=Organization.Kod_org 
	INSERT INTO Department (fKod_org, Name_dep) VALUES (gnKod_org, "Управление")
	INSERT INTO Department (fKod_org, Name_dep) VALUES (gnKod_org, "Технологический")
	INSERT INTO Department (fKod_org, Name_dep) VALUES (gnKod_org, "Экономический")
	SELECT Organization
	SKIP 
*!* Для "ОА Пивко" заводим
	gnKod_org=Organization.Kod_org 
	INSERT INTO Department (fKod_org, Name_dep) VALUES (gnKod_org, "Генеральный директор")
	INSERT INTO Department (fKod_org, Name_dep) VALUES (gnKod_org, "Отдел главного технолога")
	INSERT INTO Department (fKod_org, Name_dep) VALUES (gnKod_org, "Металлургический отдел")
	INSERT INTO Department (fKod_org, Name_dep) VALUES (gnKod_org, "Бухгалтерия")

3. Заводим персонал. Запоминаешь код отдела на котором стоит пользователь.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
	SELECT Department
	GO TOP 
	gnKod_dep=Department.Kod_dep
	INSERT INTO Personal (fKod_dep, fName, fPatron, fSurName) VALUES (gnKod_dep, "Андрей", "Андреевич", "Андреев")
	INSERT INTO Personal (fKod_dep, fName, fPatron, fSurName) VALUES (gnKod_dep, "Борис", "Борисович", "Борисов")
	INSERT INTO Personal (fKod_dep, fName, fPatron, fSurName) VALUES (gnKod_dep, "Виталий", "Витальевич", "Витальев")
	SELECT Department
	SKIP 
	gnKod_dep=Department.Kod_dep
	INSERT INTO Personal (fKod_dep, fName, fPatron, fSurName) VALUES (gnKod_dep, "Гурий", "Гурьевич", "Гурьев")
	INSERT INTO Personal (fKod_dep, fName, fPatron, fSurName) VALUES (gnKod_dep, "Дмитрий", "Дмитриевич", "Дмитрев")
	SELECT Department
	SKIP 
	gnKod_dep=Department.Kod_dep
	INSERT INTO Personal (fKod_dep, fName, fPatron, fSurName) VALUES (gnKod_dep, "Евгений", "Евгеньевич", "Евгеньев")
	INSERT INTO Personal (fKod_dep, fName, fPatron, fSurName) VALUES (gnKod_dep, "Жанна", "Жандармовна", "Жаннон")
Принцып думаю понятен. Вставляешь запись в главную таблицу(далее МАМА), далее если пользователь спускается на уровень ниже в дочернюю, ты запоминаешь ключ МАМЫ и если он вставляет запись, то вставляешь в дочерную таблицу ключ и ключ МАМЫ.
Сделаем выборку из нашей базы.
Код: plaintext
1.
2.
3.
4.
5.
6.
	SELECT Organization.*, Department.*, Personal.* ;
	 FROM Organization ;
	LEFT OUTER JOIN Department ON  Organization.kod_org = Department.fkod_org ;
    LEFT OUTER JOIN Personal   ON  Department.kod_dep = Personal.fkod_dep ;
     INTO CURSOR cur_one NOFILTER READWRITE 
	SELECT cur_one
	BROWSE NORMAL 
Видим, что "ОА Икра Красная" соответствует 7 записей Personal.dbf и 3 записи Department, по остальным нет персонала и в одном случае нет отделов.
Допусти пользователь встал на "ОА Икра Красная", ты должен ему показать
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
	SELECT Organization
	GO TOP 
	gnKod_org=Organization.Kod_org 
	SELECT Department.name_dep FROM Department WHERE Department.fkod_org == gnKod_org 
*!* Далее он выбирает "Технологический"
	SELECT Department
	LOCATE FOR ALLTRIM(Department.name_dep)=="Технологический" && на случай если ты указатель премещял
	gnKod_dep=Department.Kod_dep
	SELECT Personal.fname, Personal.fpatron, Personal.fsurname FROM Personal WHERE Personal.fkod_dep == gnKod_dep
Допустим организация "ОА Икра Красная" стала "ООО Икра Чёрная" (как это часто бывает). Пользователь делает редактирование этой записи, твой код содержит что-то подобное:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
*!* запоминаешь Id записи на которой он стоял и все остальные отрибуты
	SELECT Organization
	GO TOP 
	gnKod_org=Organization.Kod_org 
	pcName_org=Organization.Name_org
	pcStreet=Organization.Street
	pcHouse=Organization.House
	pcFlat=Organization.Flat
*!* например вызываешь форму на редактирование с TextBox'ами и передаешь в них параметры, стало:
	pcName_org="ООО Икра Чёрная"
	pcStreet="ул. Овражная"
	pcHouse="47"
	pcFlat="строение 2"
*!* далее находишь по Id запись в таблице и меняешь данные
	UPDATE Organization SET Organization.Name_org=pcName_org, Organization.Street=pcStreet, ;
		Organization.House=pcHouse, Organization.Flat=pcFlat WHERE Organization.Kod_org == gnKod_org 
	SELECT Organization.*, Department.*, Personal.* ;
	 FROM Organization ;
	LEFT OUTER JOIN Department ON  Organization.kod_org = Department.fkod_org ;
    LEFT OUTER JOIN Personal   ON  Department.kod_dep = Personal.fkod_dep ;
     INTO CURSOR cur_one NOFILTER READWRITE 
	SELECT cur_one
	BROWSE LAST
Что-то я увлекся...читай HELP он рулез, Омельченко сакс

------------------------------------------------------------------------------------
Код: plaintext
Я во все дела суюсь -> всесторонне разовьюсь   
Visual FoxPro 8.0
...
Рейтинг: 0 / 0
Связывание таблиц
    #32980148
Romazan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
СПАСИБО ВАМ ОГРОМНОЕ!!!!!
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Связывание таблиц
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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