Значения ключевых полей в связанных таблицах

miv32
Дата: 27.08.2012 17:33:09
Добрый день!
Форма для ввода/редактирования данных построена на связке 2-х параметрических буферизованных LocalVew, связанных отношением один-ко-многим.
Родительская таблица: "customer" с полями customer_id,customer_name
Дочерняя: "contract" с полями contract_id,customer_id,contract_name
При вводе новой записи значение ключевого поля customer_id в родительской таблице заранее неизвестно, и при добавлении строк в дочернюю
1) для customer_id в "contract" нечего ставить.
2) для contract_id значение тоже пока неизвестно, т.к. возможно на момент сброса буфера это значение изменится (работа на сети)
Приращение +1 по ключевым полям идет через функцию, аналогичную NewId (последние значения храняться в служебной таблице)
Поэтому, если ставить NewId в default value, выпадает последовательность значений, если юзер передумал сохраняться.
В данный момент для "customer" использую временные ключи, а при сбросе буфера генерю уже по NewId,
Для "contract" contract_id приходится при добавлении делать MAX(contract_id) и опять при сбросе получать реальный по NewId для вставки в таблицы. Какие-то танцы с бубном. Есть решение поизящней?
Dima T
Дата: 27.08.2012 18:16:03
В дочерней использовать табличную буферизацию или курсор отдельный. Сначала сохранять запись в родительскую, брать ее ИД, проставлять в дочерней, сохранять дочернюю.
AndreTM
Дата: 27.08.2012 20:27:31
Можно еще попробовать сделать так: заранее добавлять в родительскую энное количество записей, и по некоторому полю-признаку считать их "буферными". Т.е. ID в родителе будет уже проставлен, а при необходимости "добавления" - вы не добавляете запись физически, а просто сбрасываете признак у нужной записи. При этом дочерняя может в любой момент запросить "свободный ID" из родительской, просто по полю-признаку. А "буферные" записи добавляются по мере необходимости - например, при обслуживании БД, или при запуске приложения...
Неудобство одно - приходится иметь две процедуры для добавления записей в дочернюю - такую, как у вас, и такую, как описано - и выбирать, которая будет отрабатывать.
Кстати, заранее добавлять "буферные" записи можно и в дочерние таблицы...