как внести одновременно запись в главную и подчиненную таблицу

Nost
Дата: 11.12.2007 09:36:26
Доброго времени суток!

Проблема такая: есть главная таблица, и связанная с ней подчиненная (связь 1:многим).
При заполнении поля главной таблицы нужно заполнить поля и подчиненой, что есстественно не получится (запись то в главной таблице новая, соотвественно РК нету, привязаться не к чему :( ).

Наверняка проблема известная, подскажите кто как выкручивался?
Гость74
Дата: 11.12.2007 10:02:14
Вообще-то в форуме было бурное обсуждение этой темы. Я так понял, что тут приходится начинать транзакцию на клиенте. Сначала сохранять master-запись, получить ID ключа, а потом детайл. Если полей немного, то можно все сделать в одной хранимке, передав туда все необходимые параметры.
Хуже ситуация, если при создании мастер записи надо одновременно ввести несколько подчиненных и все в одном диалоге. Тут при добавлении детайлов приходится принудительно сохранять мастер-запись.
Или, как вариант, кэшировать все на клиенте а при закрытии диалога делать разбор того, что накешировалось :-)
kdv
Дата: 11.12.2007 10:08:38
автор
Наверняка проблема известная, подскажите кто как выкручивался?

никакой проблемы здесь нет вообще, и никак выкручиваться не надо. если деталь требует наличия ссылки на сохраненного мастера, значит его надо создать и сохранить!
Petro123
Дата: 11.12.2007 10:21:04
после строки POST в поле с id автоматом получаешь назначенный код мастера
______________________________________________
Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде!
Naf
Дата: 11.12.2007 10:21:30
Например (по аналогии с 1С) имеем:
1. Мастер-таблица документов (Приход материалов), где указан поставщик, договор, дата, номер и т.д.
2. Подчиненная ей таблица спецификации, где указан материал, количество, сумма, НДС и т.д.
3. У мастер таблицы есть поле "Проведен", при установке которого создаются движения в сводных таблицах ("Расчеты с поставщиками", "Состояние склада"), которые зависят от детальной таблицы спецификации.

Наши действия:
1. создаем запись в мастер-таблице (Проведен=ложь)
2. Создаем записи в спецификации
3. Обновляем запись мастер-таблицы (Проведен=истина), срабатывает триггер для изменения сводных таблиц

Кстати, нужен ведь триггер на изменение уже существующей записи строки спецификации у проведенных документов, дабы согласовать итоги с документами
Гость74
Дата: 11.12.2007 10:28:12
kdv
автор
Наверняка проблема известная, подскажите кто как выкручивался?

никакой проблемы здесь нет вообще, и никак выкручиваться не надо. если деталь требует наличия ссылки на сохраненного мастера, значит его надо создать и сохранить!


В свете того, что многие гуру говорят, что транзакции на клиенте начинать - это плохо, для меня была проблемой как же правильно сохранить обе записи в ОДНОЙ транзакции
Petro123
Дата: 11.12.2007 10:37:12
Гость74
kdv
автор
Наверняка проблема известная, подскажите кто как выкручивался?

никакой проблемы здесь нет вообще, и никак выкручиваться не надо. если деталь требует наличия ссылки на сохраненного мастера, значит его надо создать и сохранить!


В свете того, что многие гуру говорят, что транзакции на клиенте начинать - это плохо, для меня была проблемой как же правильно сохранить обе записи в ОДНОЙ транзакции

beginTran
  qMaster.InsertRecord(dsscs csdc frb)
  qMaster.Post;
  qChild.InsertRecord(qMaster.FieldByName(id).AsStrung, dsscs csdc frb)
  qChild.Post;
commit
Гость74
Дата: 11.12.2007 10:43:52
2: Petro123

Спасибо. Это я и сам знаю. Но Вы невнимательно ппрочитали
>>В свете того, что многие гуру говорят, что транзакции на клиенте начинать - это плохо...
Граур Станислав
Дата: 11.12.2007 10:55:40
Гость74

В свете того, что многие гуру говорят, что транзакции на клиенте начинать - это плохо...


Попробуй к примеру в interbase/firebird начать транзакцию НЕ на клиенте.
andreymx
Дата: 11.12.2007 10:57:33
а я-то блин :) думал, что транзакция всегда выполняется сервером.
ну а что об этом думают ваши клиенты - это их дело :(