|
|
su.dbms.sql- SU.DBMS.SQL ------------------------------------------------------------------ From : Alexander Sakhatovskiy 2:5020/400 11 Apr 2001 14:12:48 To : All Subject : Re: Дремина хитрость 2 -------------------------------------------------------------------------------- Hi! Tolik Gusin <stalker@giac.dp.ua> пишет в сообщении:3AD41B42.ACF60E31@giac.dp.ua... > > >> или как ноpмальные люди - SP на вставку. > > >Это можно легко сделать в случае One Master-One Detail, а вот в случае > > >One Master-Many Detail > > >этот фокус уже не пройдет. > > Рассказывай ... Еще как пройдет. > А где ты предлагаешь хранить данные для Detail до того как они попадут в > базу ? И как насчет универсальности кода ? Hигде не хранить. Да и зачем, если не известно, будет вообще сохранение данных или нет? А как сохраняем, тогда и проставим в Detail что нужно. что до универсальности, смотри к примеру: // Создает форму вызывая виртуальный метод CreateEditForm procedure TF_Grid_Common.ShowCommon(DataSet : TDataSet; State : TDataSetState); begin if CreateEditForm(DataSet, State) then Begin DataSet.Post; // если форма имеет Detail if Assigned(FrameDataSet) then SetMasterFields(FrameDataSet); F_DataModule.AfterPost(FrameDataSet); end else Begin DataSet.Cancel; F_DataModule.Refresh(FrameDataSet); end; end; procedure TF_DataModule.Refresh(DataSet : TDataSet); var PK : Variant; begin if not Assigned(DataSet) then Exit; with DataSet do begin PK := Fields[0].Value; if VarIsNull(PK) then PK := Identity; DisableControls; Close; Open; Locate(Fields[0].FullName, PK, []); EnableControls; end; end; // установка в Detail нужного нам занчения procedure TF_Grid_Document_Common.SetMasterFields(DataSet: TDataSet); begin DataSet.First; while not DataSet.Eof do Begin DataSet.Edit; // в F_DataModule.Identity храниться ID последнего сохранненого/добавленого документа DataSet.FieldByName('DOCUMENT_ID').Value := F_DataModule.Identity; DataSet.Post; DataSet.Next; end; end; procedure TF_DataModule.AfterPost(DataSet: TDataSet); begin if not Assigned(DataSet) then Exit; DB.StartTransaction; Q_Identity.Close; Identity := Null; try (DataSet as TBDEDataSet).ApplyUpdates; DB.Commit; except DB.Rollback; raise; end; (DataSet as TBDEDataSet).CommitUpdates; Q_Identity.Open; if VarIsNull(DataSet.Fields[0].Value) then Identity := Q_Identity.FieldByName('Identity').Value; else Identity := DataSet.Fields[0].Value; Refresh(DataSet); end; ну и так далее. Смысл, я надеюсь, ясен. PS: а вообще, с этим пожалуй в ru.delphi.db - --- Alexander Sakhatovskiy --- ifmail v.2.15dev5 * Origin: Marka Ltd (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /su.dbms.sql/14234c7942054.html, оценка из 5, голосов 10
|