Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2002.07.04;
Скачать: [xml.tar.bz2];

Вниз

связывание таблиц   Найти похожие ветки 

 
fert   (2002-06-07 19:40) [0]

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


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

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


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

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


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

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


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

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


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

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


 
TSV   (2002-06-10 20:06) [6]

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

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


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

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


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

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

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

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


 
Johnmen   (2002-06-11 13:11) [9]

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

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



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

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

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


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

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


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

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



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2002.07.04;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.005 c
6-9957
Aleksandr
2002-04-19 11:43
2002.07.04
Как обработать Socket Error #100054?


3-9709
Oleg_er
2002-06-10 08:56
2002.07.04
глюк какой то :-(


4-10056
Sirus
2002-05-07 13:15
2002.07.04
Нужно запустить DOS приложение, подождать его завершения и ...


3-9763
Siv Soft
2002-06-12 14:32
2002.07.04
Как правильно использовать CT-lib и CashedUpdates?


3-9730
Alex-kosmonavt
2002-06-11 09:56
2002.07.04
Картинки в базе данных





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский