powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / сохранение данных в Мастер-Деталь
7 сообщений из 7, страница 1 из 1
сохранение данных в Мастер-Деталь
    #39628178
Фотография Mexanik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый час! Тема затаскана, но может мне повезёт....

Есть программа на Делфи-2007, работает с базой данных Firebird-2.1 через FIB.
Пользователь один!

Имеем связку таблиц Мастер-Деталь. Вначале в Мастере создаем строку
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
tFNarjad.Insert;
    tFNarjadDATA.AsDateTime:= Date;
    tFNarjadTIMER.AsDateTime:= Time;
  tFNarjad.Post;

  tFNarjad.ApplyUpdToBase;
  if not TransNar2.Active then TransNar2.Active:=true;
  TransNar2.Commit;
  tFNarjad.FullRefresh; TransNar2.Active:=false;



Получаем от БД значение ключевого поля Мастера – это значение генератора:
Код: pascal
1.
EKodR.Text:= IntToStr(FIBDBAVTO.Gen_Id('GEN_NARJAD_ID', 0));



После Commit и FullRefresh набор данных Мастера установился на первой строке, нам надо переместить его на вновь созданную строку и сделать её текущей. Тут я честно признаюсь от недостатка знаний начал фантазировать, например так:

Код: pascal
1.
tFNarjad.Locate('ACOD', VarArrayOf([EKodR.Text]), [loCaseInsensitive]);



Далее вставляем строку в Деталь:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
 tFNarPar.Insert;
   tFNarParDATA.AsDateTime:= Date;
   tFNarParNSTR.AsInteger:= 1;
  tFNarPar.Post;
  tFNarPar.ApplyUpdToBase;
  if not TransNarPar2.Active then TransNarPar2.Active:=true;
  TransNarPar2.Commit;  tFNarPar.FullRefresh;
  TransNarPar2.Active:=false;



На экране видим Таблицу Мастер - с новой строкой. Для этой записи в Мастере уже имеется одна строка в таблице Деталь.
Двойной щелчок по новой строке таблицы Мастера открывает окно для редактирования обеих таблиц (Форма 2).

Данные таблицы Мастера вводятся через окошки ТEdit, кроме номера рейса – он недоступен для редактирования. (Это ID Мастера)
Данные в Деталь вводятся через DBGrid, кроме одного параметра. У набора данных Деталь свойство AutoCommit установлено в true (работать удобней, но не знаю насколько это правильно?).

Изменения вносятся в обе таблицы после нажатия кнопки Записать. Вначале в Деталь. Один из параметров вносится в Деталь не через DBGrid – дата берётся из календаря.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
tFNarPar.Edit;
   tFNarParDATA.AsDateTime:= DTPViesd.Date;
  tFNarPar.Post;
  tFNarPar.ApplyUpdToBase;
  if not TransNarPar2.Active then TransNarPar2.Active:=true;
  TransNarPar2.Commit;    tFNarPar.FullRefresh;
  TransNarPar2.Active:=false;



Далее в Мастер:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
tFNarjad.Edit;
{присваиваем значения полям........}
  tFNarjad.Post;
  tFNarjad.ApplyUpdToBase;
  if not TransNar2.Active then TransNar2.Active:=true; {это Update транзакция}
  TransNar2.Commit;
  tFNarjad.FullRefresh;
  TransNar2.Active:=false;



Вот тут главный вопрос:
После Commit и FullRefresh таблицы Мастера у неё опять текущей станет первая строка. Соответственно в DBGrid Детали будут видны строки, связанные с этой первой строкой. А нам нужны данные, соответствующие строке Мастера, которая редактировалась.

Как мне после записи данных и рефреш удержать Мастера на нужной строке. Если я опять использую метод Locate, то строку в Мастере я найду, но в DBGrid Детали скорее всего не отразятся связанные с этой строкой записи. Их также надо искать, несмотря на то, что в свойстве SelectSQL Детали написано

Код: plsql
1.
«SELECT * FROM  ДЕТАЛЬ WHERE  NOMN = :mas_ACOD».



Если в Детали одна запись, то работать это будет через раз (проверено), ну а если 2 или более ?
В общем, либо я иду не той дорогой изначально, либо тут есть возможность использовать другой код?
Скиньте, пожалуйста конкретный пример или ссылку на простую и доходчивую книжку!
...
Рейтинг: 0 / 0
сохранение данных в Мастер-Деталь
    #39628186
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не сформулирован вопрос.

MexanikПосле Commit и FullRefresh набор данных Мастера установился на первой строке, нам надо переместить его на вновь созданную строку и сделать её текущей.

- непонятно зачем ты это делаешь, как-то не хочется дальше вникать.
Это же FIB+, просто отрефрешь одну-единственную измененную (или добавленную) запись.
Более того, если у тебя в табличке/выборка есть PK, то и FullRefreh повторное позиционирование делает автоматически. Но - ни к чему это, глупая нагрузка на сервер.


И - зачем мастер и деталь НД's в раздельных транзакциях? Неужели нужно, чтобы кто-то мог видеть мастер-запись, пока ты детали не накидал? Почему редактирование мастер-деталь связки поэтапное, не в одной транзакции? Боишься "длинных" транзакций? Не бойся. В конце концов, есть режим кэшированных изменений на клиенте и т.п.
...
Не нужно расписывать твое представление о бизнеслогике, тут решаются технические вопросы.

книжка - со стр. 141,
примеры Ч1, примеры Ч2, см. Master-Detail...

всякая всячина.

...ещё
...
Рейтинг: 0 / 0
сохранение данных в Мастер-Деталь
    #39628187
Dmitry Kurbsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mexanik,

1. Не надо хтонического ужаса gen_id(X,0). Всё равно же явно делаешь запрос для получения значения генератора, так делай это до инсерта. Через N или через M лет кто-то (может быть, ты) будет мучиться, переделывая это для работы двух пользователей.

2. Если вставляешь сразу и мастер и деталь, то зачем делать это в двух разных транзакциях и два раза потом перечитывать датасеты? Стартовал транзакцию - получил новое значение генератора - вставил мастер с этим (явно указанным) новым значением - вставил деталь - вставил вторую деталь, если надо - подтвердил транзакцию.
...
Рейтинг: 0 / 0
сохранение данных в Мастер-Деталь
    #39628188
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
После Commit и FullRefresh таблицы Мастера у неё опять текущей станет первая строка. Соответственно в DBGrid Детали будут видны строки, связанные с этой первой строкой. А нам нужны данные, соответствующие строке Мастера, которая редактировалась.
Ты не делай Commit читающей транзакции мастер-датасета. Делай Commit пишущей. Вот у тебя мастер-датасет и не закроется.
А FullRefresh - это CloseOpen с сохранением/восстановлением позиции и отключением событий скроллинга (см. исходники).

В книжке (ссылку см.выше) об этом понятно расписано.
...
Рейтинг: 0 / 0
сохранение данных в Мастер-Деталь
    #39628194
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mexanik,

ахинея какая-то.

Код: pascal
1.
2.
if not TransNar2.Active then TransNar2.Active:=true;
  TransNar2.Commit;


то есть, если транзакция неактивна, то она стартует, и потом ей тут же делается коммит

Код: pascal
1.
  tFNarjad.FullRefresh; TransNar2.Active:=false;



а в этот момент транзакция неактивна, и ей делается либо commit, либо rollback, в зависимости от свойств TransNar2.
Да еще, видимо, у TransNar2 включен автостарт (и может быть автокоммит, и еще хуже - commitRetaining).

Вообще вот с этим - Trans???.Active:= ... надо завязывать. И писать явно StartTransaction, Commit или Rollback.
Насчет почитать - как минимум вот это
http://www.ibase.ru/ibx/#tran_use
для FIBplus тоже подходит. Ну и целиком
http://delphi-help.ru/index.php?option=com_k2&view=item&id=308:rabota-s-tranzaktsiyami-i-ih-ispolzovanie-v-fibplus-chast-1
вплоть до 4 части. Хотя и там есть спорные моменты.
...
Рейтинг: 0 / 0
сохранение данных в Мастер-Деталь
    #39628204
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я правильно понял суть первого поста ТС, ему нужен 'insert..... returning ID', похоже

Модератор: Тема перенесена из форума "Firebird, InterBase".
...
Рейтинг: 0 / 0
сохранение данных в Мастер-Деталь
    #39628298
Фотография Mexanik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Котовасия,
за книжку и другие источники СПАСИБО!
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / сохранение данных в Мастер-Деталь
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]