|
|
|
сохранение данных в Мастер-Деталь
|
|||
|---|---|---|---|
|
#18+
Добрый час! Тема затаскана, но может мне повезёт.... Есть программа на Делфи-2007, работает с базой данных Firebird-2.1 через FIB. Пользователь один! Имеем связку таблиц Мастер-Деталь. Вначале в Мастере создаем строку Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. Получаем от БД значение ключевого поля Мастера – это значение генератора: Код: pascal 1. После Commit и FullRefresh набор данных Мастера установился на первой строке, нам надо переместить его на вновь созданную строку и сделать её текущей. Тут я честно признаюсь от недостатка знаний начал фантазировать, например так: Код: pascal 1. Далее вставляем строку в Деталь: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. На экране видим Таблицу Мастер - с новой строкой. Для этой записи в Мастере уже имеется одна строка в таблице Деталь. Двойной щелчок по новой строке таблицы Мастера открывает окно для редактирования обеих таблиц (Форма 2). Данные таблицы Мастера вводятся через окошки ТEdit, кроме номера рейса – он недоступен для редактирования. (Это ID Мастера) Данные в Деталь вводятся через DBGrid, кроме одного параметра. У набора данных Деталь свойство AutoCommit установлено в true (работать удобней, но не знаю насколько это правильно?). Изменения вносятся в обе таблицы после нажатия кнопки Записать. Вначале в Деталь. Один из параметров вносится в Деталь не через DBGrid – дата берётся из календаря. Код: pascal 1. 2. 3. 4. 5. 6. 7. Далее в Мастер: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. Вот тут главный вопрос: После Commit и FullRefresh таблицы Мастера у неё опять текущей станет первая строка. Соответственно в DBGrid Детали будут видны строки, связанные с этой первой строкой. А нам нужны данные, соответствующие строке Мастера, которая редактировалась. Как мне после записи данных и рефреш удержать Мастера на нужной строке. Если я опять использую метод Locate, то строку в Мастере я найду, но в DBGrid Детали скорее всего не отразятся связанные с этой строкой записи. Их также надо искать, несмотря на то, что в свойстве SelectSQL Детали написано Код: plsql 1. Если в Детали одна запись, то работать это будет через раз (проверено), ну а если 2 или более ? В общем, либо я иду не той дорогой изначально, либо тут есть возможность использовать другой код? Скиньте, пожалуйста конкретный пример или ссылку на простую и доходчивую книжку! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2018, 00:23 |
|
||
|
сохранение данных в Мастер-Деталь
|
|||
|---|---|---|---|
|
#18+
Не сформулирован вопрос. MexanikПосле Commit и FullRefresh набор данных Мастера установился на первой строке, нам надо переместить его на вновь созданную строку и сделать её текущей. - непонятно зачем ты это делаешь, как-то не хочется дальше вникать. Это же FIB+, просто отрефрешь одну-единственную измененную (или добавленную) запись. Более того, если у тебя в табличке/выборка есть PK, то и FullRefreh повторное позиционирование делает автоматически. Но - ни к чему это, глупая нагрузка на сервер. И - зачем мастер и деталь НД's в раздельных транзакциях? Неужели нужно, чтобы кто-то мог видеть мастер-запись, пока ты детали не накидал? Почему редактирование мастер-деталь связки поэтапное, не в одной транзакции? Боишься "длинных" транзакций? Не бойся. В конце концов, есть режим кэшированных изменений на клиенте и т.п. ... Не нужно расписывать твое представление о бизнеслогике, тут решаются технические вопросы. книжка - со стр. 141, примеры Ч1, примеры Ч2, см. Master-Detail... всякая всячина. ...ещё ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2018, 01:33 |
|
||
|
сохранение данных в Мастер-Деталь
|
|||
|---|---|---|---|
|
#18+
Mexanik, 1. Не надо хтонического ужаса gen_id(X,0). Всё равно же явно делаешь запрос для получения значения генератора, так делай это до инсерта. Через N или через M лет кто-то (может быть, ты) будет мучиться, переделывая это для работы двух пользователей. 2. Если вставляешь сразу и мастер и деталь, то зачем делать это в двух разных транзакциях и два раза потом перечитывать датасеты? Стартовал транзакцию - получил новое значение генератора - вставил мастер с этим (явно указанным) новым значением - вставил деталь - вставил вторую деталь, если надо - подтвердил транзакцию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2018, 01:44 |
|
||
|
сохранение данных в Мастер-Деталь
|
|||
|---|---|---|---|
|
#18+
После Commit и FullRefresh таблицы Мастера у неё опять текущей станет первая строка. Соответственно в DBGrid Детали будут видны строки, связанные с этой первой строкой. А нам нужны данные, соответствующие строке Мастера, которая редактировалась. Ты не делай Commit читающей транзакции мастер-датасета. Делай Commit пишущей. Вот у тебя мастер-датасет и не закроется. А FullRefresh - это CloseOpen с сохранением/восстановлением позиции и отключением событий скроллинга (см. исходники). В книжке (ссылку см.выше) об этом понятно расписано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2018, 01:46 |
|
||
|
сохранение данных в Мастер-Деталь
|
|||
|---|---|---|---|
|
#18+
Mexanik, ахинея какая-то. Код: pascal 1. 2. то есть, если транзакция неактивна, то она стартует, и потом ей тут же делается коммит Код: pascal 1. а в этот момент транзакция неактивна, и ей делается либо 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 части. Хотя и там есть спорные моменты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2018, 03:34 |
|
||
|
сохранение данных в Мастер-Деталь
|
|||
|---|---|---|---|
|
#18+
Если я правильно понял суть первого поста ТС, ему нужен 'insert..... returning ID', похоже Модератор: Тема перенесена из форума "Firebird, InterBase". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2018, 06:54 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39628298&tid=2041027]: |
0ms |
get settings: |
6ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
163ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
34ms |
get tp. blocked users: |
1ms |
| others: | 193ms |
| total: | 420ms |

| 0 / 0 |
