Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

связывание таблиц [D6, Access]


fert ©   (2002-06-07 19:40:00) 

Мастера! Я понимаю, что мой вопрос вызовет дружное ржание, однако помогите. Есть здоровенная БД (медицинская, полей под 300 – фамилия (может повторяться), дата и куча параметров). Т.к. Access не поддерживает более 255 полей, БД разделил на две таблицы – Tmain и Tparametr. Проблема со связыванием таблиц:
1. Связал через MasterSource, все в принципе работает нормально. Но мне нужно, чтобы одной записи из первой таблицы соответствовала только одна запись из второй, т.е., я так полагаю, нужно исключить отношение мастер-детали.
2. Следующая проблема – В первой таблице есть ключевое аутоинкрементное поле ID. Хотелось бы его значение присваивать числовому полю для вновь добавленной записи второй таблицы. Знаю, что значение аутоинкрементного поля присваивается после Post, но может быть можно эту проблему решить программно (типа прибавить единичку к самому большому значению ID первой таблицы или предыдущей записи первой таблицы), или есть какой-нибудь компонент.
Вероятнее всего что вышеописанные проблемы решаются гораздо проще, чем я себе представляю, но башка уже кипит и ничего не соображает. Поэтому помогите чем можете.
С уважением, Fert.


mike kouzmine   (2002-06-11 14:26:00) [1]

Как мне кажется, при мастер-детайл, поле, по котому идет связь, заполняется автоматически, его даже трогать не надо? Или нет? А чтобы была одна запись, можно сделать так:
на BeforeInsert вставить проверку на RecordCount
Может я не понял вопрос?


kva   (2002-06-11 13:17:00) [2]

2Johnmen
А разве после AfterInsert состояние второй (TParametr) таблицы
не dsInsert ? Пока Post не сделаешь, так и будет dsInsert.


fert   (2002-06-11 13:16:00) [3]

ВСЕМ ОГРОМНОЕ СПАСИБО!!!

С уважением,
Fert.


Johnmen   (2002-06-11 13:11:00) [4]

>kva (11.06.02 12:59)
>А в чем разница по сравнению в AfterInsert?

>OnNewRecord, >тогда таблица будет в состоянии dsInsert


kva   (2002-06-11 12:59:00) [5]

2fert
Мне кажется в Tparametr связное поле надо делать не автоинкрементным, а целым. Тогда можно воспользоваться советом yozhik

2Виталий Панасенко
>подстановку ID нужно делать в обработчике событий OnNewRecord, >тогда таблица будет в состоянии dsInsert

А в чем разница по сравнению в AfterInsert?
Поделитесь своими соображениями


Виталий Панасенко   (2002-06-11 08:42:00) [6]

Вообщето, подстановку ID нужно делать в обработчике событий OnNewRecord, тогда таблица будет в состоянии dsInsert


TSV   (2002-06-10 20:06:00) [7]

Нормализация, нормализация и еще раз нормализация!!!
Допустим, тебе надо по каждому человеку хранить 300 параметров. Теоретически. Т.е. все 300 будут вноситься не для всех (как вариант, хотя это не важно). Итак:
1. Таблица персон (ID, ФИО, дата рождения, пол, вес и т.д.).
2. Таблица параметров (ID, Name, комментарий...).
3. Таблица "персоны-параметры" (ID_персоны, ID_параметра, Значение, комментарий).
При такой структуре хоть 100000 параметров в БД пиши по каждому человеку ;-). Я написал просто, наверняка там у тебя еще что-то можно сделать в плане нормализации.

P.S.
Купи хорошую книгу по теории реляционных БД.
Удачи.


fert   (2002-06-10 19:35:00) [8]

Так оно и было, пока полей хватало. Я уже упоминал, что БД медицинская. Организм человека - штука очень большая и параметров с него можно (а мне - нужно) собрать очень много.
Так что, пронблема.
С уважением,
Fert.


TSV   (2002-06-10 14:52:00) [9]

Чего делать, чего делать... Структуру нормализовывать!!! Судя по прочитанному, там просто все в одну таблицу засовывали, пока полей хватало... 300 полей!!! Очень интересно, что же там лежит??? ;-)


fert   (2002-06-10 13:55:00) [10]

to yozhik
Спасибо за ответ. Идею понял, но ничего не выходит, т.к. аутоинкрементное поле ID в Tparametr.AfterInsert остается пустым!! Тот же финт сделал в Tparametr.AfterPost, Дельфий ругнулся, мол DataSet не находится в Insert или Edit, добавил
if not (Tparametr.State in [dsEdit]) then Tparametr.Edit;
И все заработало!! Но... в Tparametr добавилась вторая запись со
связанными полями и TMainID=TparametrID, первая с пустым ID. А мне нужна одна запись(см. первый вопрос).
Чего делать, не пойму.
С уважением,
Fert.


yozhik   (2002-06-07 20:41:00) [11]

Не обязательно держать в табличке.
Если я правильно понял, добавление в Tparametr происходит после добаваления в Tmain либо когда Tmain открыта и активна какая-то запись.
В этом случае, можно сделать так:
в Tparametr.AfterInsert добавить
Tparametr.FieldByName("ParamID").Value := Tmain.FieldByName("ID").Value


shulc   (2002-06-07 20:25:00) [12]

В отдельной таблице держишь последнее значение твоего инкремента
При добавлении считываешь значение, делаешьINC(1) записываешь в эту отдельную таблицу и в свою. и т.д.


Наверх

Титульная страница Поиск, карта сайта Написать письмо