Подскажите концепцию работы с FIREDAC и "правильными транзакциями"

GrigoriyFomin
Дата: 04.08.2019 17:52:23
Хотел бы в целях профессионального роста научиться работать с FireDAC и читающими и короткими пищущими транзакциями.
Итак, есть например, таблица заказов ORDERS. Есть FDQuery1, который настроен на читающую транзакцию. Есть UpdateSQL, в котором описаны основные DML операторы и подключена пишущая неавтостартующая транзакция. Использовать встроенный в FDQuery механизм работы с DML не получается, так как есть автоинкрементные поля, которые заполняет сервер, а FDQuery не дает их оставлять пустыми, несмотря на отключаемые CheckRequiered.
Посему вопрос - как красиво и академически правильно работать с FDQuery и SQLUpdate, чтоб после добавления или изменения записи не перезагружать весь FDQuery, а обновлять только измененные записи? Я так понимаю, можно задействовать FDMEmTable, но не могу понять - как этот зверинец заставить вместе работать, чтоб они были тандемом, а не отдельно работающими компонентами. Раньше с IBDAC работал - там как-то полюдски сделано - в одном IBCQuery можно было задать и читающий оператор, и модифицирующие, причем с возвращаемыми параметрами. И отлично работало игнорирование автоинкрементных полей.

Спасибо за любые наводки
ёёёёё
Дата: 04.08.2019 17:55:05
GrigoriyFomin,

на хабре были примеры приложений 'фаерберд через фаердак'.

Пожалуйсто. :)
Dimitry Sibiryakov
Дата: 04.08.2019 17:55:38

GrigoriyFomin
Хотел бы в целях профессионального роста научиться работать с FireDAC и читающими и
короткими пищущими транзакциями.

Это не рост, это деградация. А использование двух транзакций - костыль для кривых
компонент, сбрасывающих локальный кэш резал сета при завершении транзакции.

Posted via ActualForum NNTP Server 1.5

RADSeatle
Дата: 05.08.2019 07:54:36
Вот тут почитайте
https://habr.com/ru/post/273549/
GrigoriyFomin
Дата: 07.08.2019 23:01:56
Статью эту читал, жаль, единственная статья по этой теме. Но у меня остался непонятной ситуация.
Есть таблица заказов, есть подчиненная таблица пунктов заказа (классика мастер-детеил).
2 запроса с селектами и 2 UpdateSQL с соответствующими процедурами DML. Для обоих датасетов стоит CacheUpdates.
Вопрос №1 - как не выдавать ошибку при добавлении новой записи, учитывая, что FB 3.0 и стоит автоинкрементное поле нового типа (без генератора)
Вопрос №2 - как детейлед таблице указать OrderID мастер-таблицы, если ИД мастера будет выявлен лишь после ApplyUpdates? Можно генератор прописать и тогда FDQuery будет сам заполнять это поле, но как быть с автоинкрементным полем без генератора?
Vlad F
Дата: 07.08.2019 23:15:51
GrigoriyFomin,

За это все, в принципе, какую-то зарплату платят или всё-таки курсовая?
GrigoriyFomin
Дата: 07.08.2019 23:24:20
Vlad F

За это все, в принципе, какую-то зарплату платят или всё-таки курсовая?

Платят, но не за это. Это в целях повышения самообразования и желания перейти на FireDAC в будущем.
Вот уже со многим разобрался, а как работать с автоинкрементными полями, когда они ключевые и используются для связки мастер-детейл - не могу.
ёёёёё
Дата: 07.08.2019 23:26:33
GrigoriyFomin
...Вопрос №1 - как не выдавать ошибку при добавлении новой записи, учитывая, что FB 3.0 и стоит автоинкрементное поле нового типа (без генератора)
Вопрос №2 - как детейлед таблице указать OrderID мастер-таблицы, если ИД мастера будет выявлен лишь после ApplyUpdates? Можно генератор прописать и тогда FDQuery будет сам заполнять это поле, но как быть с автоинкрементным полем без генератора?


+


Непонятно, ради чего так над собой изгаляться. В "штатных" IBX и "нештатных" FIB+ все "проблемы" давным-давно решены и многократно описаны. Я буквально сегодня начал новый проект с FB 3.0, используя древние FIB+ V6.9.9 - пока не вижу никаких проблем. Если понадобится какая-нибудь новая фича - перейду "новые" на фибы с гитхаба, или допилю старые.

Даю 99%, что тебе никто не поможет. Разве что сам Арефьев.
GrigoriyFomin
Дата: 07.08.2019 23:35:13
ёёёёё,

Хорошо. Сузю задачуу
1. Стартанули пишущую транзакцию.
2. сохранили мастер запись ApplyUpdates.
3. как узнать значение автоинкрементного поля после этого? Выдает 0.
4. перебираем ранее добавленные детейл записи и присваиваем ИД родителя - полученное в шаге №3 ИД.
5. Для детейл датасета делаем ApplyUpdates.
6. Коммитим транзакцию.

Что я делаю не так? )
вариант использовать генератор оставляю на последок как выход из безвыходной ситуации.
Vlad F
Дата: 07.08.2019 23:35:49
GrigoriyFomin,

Так конкретные проблемы твои без исходников до конца не понятны.
В качестве утешения могу твердо заверить, что и на FireDAC абсолютно все это, умеючи, сделать возможно.))