Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Подскажите концепцию работы с FIREDAC и "правильными транзакциями" / 18 сообщений из 18, страница 1 из 1
04.08.2019, 17:52
    #39845135
GrigoriyFomin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите концепцию работы с FIREDAC и "правильными транзакциями"
Хотел бы в целях профессионального роста научиться работать с FireDAC и читающими и короткими пищущими транзакциями.
Итак, есть например, таблица заказов ORDERS. Есть FDQuery1, который настроен на читающую транзакцию. Есть UpdateSQL, в котором описаны основные DML операторы и подключена пишущая неавтостартующая транзакция. Использовать встроенный в FDQuery механизм работы с DML не получается, так как есть автоинкрементные поля, которые заполняет сервер, а FDQuery не дает их оставлять пустыми, несмотря на отключаемые CheckRequiered.
Посему вопрос - как красиво и академически правильно работать с FDQuery и SQLUpdate, чтоб после добавления или изменения записи не перезагружать весь FDQuery, а обновлять только измененные записи? Я так понимаю, можно задействовать FDMEmTable, но не могу понять - как этот зверинец заставить вместе работать, чтоб они были тандемом, а не отдельно работающими компонентами. Раньше с IBDAC работал - там как-то полюдски сделано - в одном IBCQuery можно было задать и читающий оператор, и модифицирующие, причем с возвращаемыми параметрами. И отлично работало игнорирование автоинкрементных полей.

Спасибо за любые наводки
...
Рейтинг: 0 / 0
04.08.2019, 17:55
    #39845138
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите концепцию работы с FIREDAC и "правильными транзакциями"
GrigoriyFomin,

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

Пожалуйсто. :)
...
Рейтинг: 0 / 0
04.08.2019, 17:55
    #39845139
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите концепцию работы с FIREDAC и "правильными транзакциями"
GrigoriyFominХотел бы в целях профессионального роста научиться работать с FireDAC и читающими и
короткими пищущими транзакциями.

Это не рост, это деградация. А использование двух транзакций - костыль для кривых
компонент, сбрасывающих локальный кэш резал сета при завершении транзакции.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.08.2019, 07:54
    #39845246
RADSeatle
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите концепцию работы с FIREDAC и "правильными транзакциями"
Вот тут почитайте
https://habr.com/ru/post/273549/
...
Рейтинг: 0 / 0
07.08.2019, 23:01
    #39846669
GrigoriyFomin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите концепцию работы с FIREDAC и "правильными транзакциями"
Статью эту читал, жаль, единственная статья по этой теме. Но у меня остался непонятной ситуация.
Есть таблица заказов, есть подчиненная таблица пунктов заказа (классика мастер-детеил).
2 запроса с селектами и 2 UpdateSQL с соответствующими процедурами DML. Для обоих датасетов стоит CacheUpdates.
Вопрос №1 - как не выдавать ошибку при добавлении новой записи, учитывая, что FB 3.0 и стоит автоинкрементное поле нового типа (без генератора)
Вопрос №2 - как детейлед таблице указать OrderID мастер-таблицы, если ИД мастера будет выявлен лишь после ApplyUpdates? Можно генератор прописать и тогда FDQuery будет сам заполнять это поле, но как быть с автоинкрементным полем без генератора?
...
Рейтинг: 0 / 0
07.08.2019, 23:15
    #39846677
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите концепцию работы с FIREDAC и "правильными транзакциями"
GrigoriyFomin,

За это все, в принципе, какую-то зарплату платят или всё-таки курсовая?
...
Рейтинг: 0 / 0
07.08.2019, 23:24
    #39846682
GrigoriyFomin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите концепцию работы с FIREDAC и "правильными транзакциями"
Vlad F
За это все, в принципе, какую-то зарплату платят или всё-таки курсовая?
Платят, но не за это. Это в целях повышения самообразования и желания перейти на FireDAC в будущем.
Вот уже со многим разобрался, а как работать с автоинкрементными полями, когда они ключевые и используются для связки мастер-детейл - не могу.
...
Рейтинг: 0 / 0
07.08.2019, 23:26
    #39846683
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите концепцию работы с FIREDAC и "правильными транзакциями"
GrigoriyFomin...Вопрос №1 - как не выдавать ошибку при добавлении новой записи, учитывая, что FB 3.0 и стоит автоинкрементное поле нового типа (без генератора)
Вопрос №2 - как детейлед таблице указать OrderID мастер-таблицы, если ИД мастера будет выявлен лишь после ApplyUpdates? Можно генератор прописать и тогда FDQuery будет сам заполнять это поле, но как быть с автоинкрементным полем без генератора?

[spoiler]
YouTube Video
...
Рейтинг: 0 / 0
07.08.2019, 23:35
    #39846687
GrigoriyFomin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите концепцию работы с FIREDAC и "правильными транзакциями"
ёёёёё,

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

Что я делаю не так? )
вариант использовать генератор оставляю на последок как выход из безвыходной ситуации.
...
Рейтинг: 0 / 0
07.08.2019, 23:35
    #39846688
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите концепцию работы с FIREDAC и "правильными транзакциями"
GrigoriyFomin,

Так конкретные проблемы твои без исходников до конца не понятны.
В качестве утешения могу твердо заверить, что и на FireDAC абсолютно все это, умеючи, сделать возможно.))
...
Рейтинг: 0 / 0
07.08.2019, 23:39
    #39846689
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите концепцию работы с FIREDAC и "правильными транзакциями"
GrigoriyFomin,

да кто, кроме тебя, знает, что ты не так делаешь. Может, ты returning в insert не добавил. Все, что угодно может быть.

Что там у тебя за код и скрипт? Поди догадайся.
...
Рейтинг: 0 / 0
07.08.2019, 23:44
    #39846691
GrigoriyFomin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите концепцию работы с FIREDAC и "правильными транзакциями"
Vlad F,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
  qBIDS.Append;
//Заполняем мастер-запись
...
  qBIDS.FieldByName('BCAID').AsInteger:=edrCAID.Properties.Value;
...
  qBIDS.post;
  trsOrdWr.StartTransaction;
  try
    qBIDS.ApplyUpdates;
//vvvvvvvvvvv
    BID:=qBIDS.FieldByName('BID').AsLargeInt; //Хотим тут сохранить присвоенное сервером значение автоинкрементного поля
//^^^^^^^^ вот ключевая строка - значение аввтоинкрементного поля - 0. Делать коммит? 
// а если на следующих строках будет ошибка? мастер запись останется, детейлы - нет

//Хотим перебрать детейл-записи и прописать у них ИД родительской мастер-записи
    qBIS.First;
    while not qBIS.eof do
    begin
      qBIS.Edit;
      qBIS.FieldByName('BIBID').AsLargeInt:=BID;
      qBIS.Post;
      qBIS.next;
    end;
    qBIS.ApplyUpdates;
    trsOrdWr.Commit;
except
    trsOrdWr.Rollback;
end
...
Рейтинг: 0 / 0
07.08.2019, 23:48
    #39846692
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите концепцию работы с FIREDAC и "правильными транзакциями"
GrigoriyFomin,

"Кисочка, миленькая, ну ещё хоть капельку..." - (с).

Теперь insert предложение покажи. И DDL таблички.
------
Конечно, Commit после master - записи делать не стоит, в любом случае. У тебя же составной документ. Только после успешной заливки деталей.
...
Рейтинг: 0 / 0
07.08.2019, 23:48
    #39846693
GrigoriyFomin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите концепцию работы с FIREDAC и "правильными транзакциями"
ёёёёёGrigoriyFomin,

да кто, кроме тебя, знает, что ты не так делаешь. Может, ты returning в insert не добавил. Все, что угодно может быть.

Что там у тебя за код и скрипт? Поди догадайся.
в returning поля прописаны. Меня интересует правильный академичсекий подход, задача-то типовая - как сохранить мастер и детейл записи при автоинкрементном связующем поле и CachedUpdates.
...
Рейтинг: 0 / 0
07.08.2019, 23:50
    #39846694
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите концепцию работы с FIREDAC и "правильными транзакциями"
GrigoriyFominёёёёёGrigoriyFomin,

да кто, кроме тебя, знает, что ты не так делаешь. Может, ты returning в insert не добавил. Все, что угодно может быть.

Что там у тебя за код и скрипт? Поди догадайся.
в returning поля прописаны. Меня интересует правильный академичсекий подход, задача-то типовая - как сохранить мастер и детейл записи при автоинкрементном связующем поле и CachedUpdates.

Ну, раз ты все делаешь как надо - ошибка в компонентах, а что ж ещё.
...
Рейтинг: 0 / 0
07.08.2019, 23:52
    #39846696
GrigoriyFomin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите концепцию работы с FIREDAC и "правильными транзакциями"
ёёёёё"Кисочка, миленькая, ну ещё хоть капельку..." - (с).

Теперь insert предложение покажи. И DDL таблички.
------
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
INSERT INTO BIDS
(BCAID, BFROM, BTO, BDATE, BDEADLINE, 
  BEXECUTED, BCANCELED, BEMPSTART, BEMPEXEC, 
  BEMPEND, BNOTES, BTYPE, BRESULT, BPRIORITY, 
  BSTART, BEND, BADR, BNAME, BPHONE, 
  BPAYTYPE, BADD, BPREPAYED, BPREPAYSUM, 
  BSTATUS, BORDERID)
VALUES (:NEW_BCAID, :NEW_BFROM, :NEW_BTO, :NEW_BDATE, :NEW_BDEADLINE, 
  :NEW_BEXECUTED, :NEW_BCANCELED, :NEW_BEMPSTART, :NEW_BEMPEXEC, 
  :NEW_BEMPEND, :NEW_BNOTES, :NEW_BTYPE, :NEW_BRESULT, :NEW_BPRIORITY, 
  :NEW_BSTART, :NEW_BEND, :NEW_BADR, :NEW_BNAME, :NEW_BPHONE, 
  :NEW_BPAYTYPE, :NEW_BADD, :NEW_BPREPAYED, :NEW_BPREPAYSUM, 
  :NEW_BSTATUS, :NEW_BORDERID)
RETURNING /*вот автоинкрементное поле от сервера*/BID,/*будь оно не ладно */ DBDATE, BPRIORITY, _BFROMNAME, _BTONAME, _BCANAME, _EMPSTART, _EMPEXEC, _EMPEND, _PAYTYPE, _BTYPE, _PRIORITY, BSTATUS, _STATUS, _ITEMS


вот как описана таблица
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
CREATE TABLE BIDS (
    BID           D_REGID GENERATED BY DEFAULT AS IDENTITY /* D_REGID = BIGINT NOT NULL */,
    BCAID         D_ID /* D_ID = INTEGER NOT NULL */,
    BFROM         D_ID NOT NULL /* D_ID = INTEGER NOT NULL */,
    BTO           D_ID /* D_ID = INTEGER NOT NULL */,
    BDATE         D_TS /* D_TS = TIMESTAMP */,
    BDEADLINE     D_TS /* D_TS = TIMESTAMP */,
    BEXECUTED     D_TS /* D_TS = TIMESTAMP */,
    BCANCELED     D_TS /* D_TS = TIMESTAMP */,
    BEMPSTART     D_ID /* D_ID = INTEGER NOT NULL */,
    BEMPEXEC      D_ID /* D_ID = INTEGER NOT NULL */,
    BEMPEND       D_ID /* D_ID = INTEGER NOT NULL */,
    DBDATE        D_TS DEFAULT current_timestamp NOT NULL /* D_TS = TIMESTAMP */,
    BNOTES        D_TB /* D_TB = BLOB SUB_TYPE 1 SEGMENT SIZE 80 */,
    BTYPE         D_ID /* D_ID = INTEGER NOT NULL */,
    BRESULT       D_ID /* D_ID = INTEGER NOT NULL */,
    BPRIORITY     D_ID DEFAULT 1 NOT NULL /* D_ID = INTEGER NOT NULL */,
    BSTART        D_TS /* D_TS = TIMESTAMP */,
    BEND          D_TS /* D_TS = TIMESTAMP */,
    BADR          D_NAME /* D_NAME = VARCHAR(100) */,
    BNAME         D_NAME /* D_NAME = VARCHAR(100) */,
    BPHONE        D_NAME /* D_NAME = VARCHAR(100) */,
    BPAYTYPE      D_ID /* D_ID = INTEGER NOT NULL */,
    BADD          D_PATH /* D_PATH = VARCHAR(1000) */,
    BPREPAYED     D_TS /* D_TS = TIMESTAMP */,
    BPREPAYSUM    D_SUM /* D_SUM = DECIMAL(18,2) */,
    "_BFROMNAME"  COMPUTED BY ((select caname from cas where caid=bfrom)),
    "_BTONAME"    COMPUTED BY (((select caname from cas where caid=bto))),
    "_BCANAME"    COMPUTED BY (((select caname from cas where caid=bcaid))),
    "_EMPSTART"   COMPUTED BY ((select caname from cas where bEMPSTART=caid)),
    "_EMPEXEC"    COMPUTED BY ((select caname from cas where bEMPexec=caid)),
    "_EMPEND"     COMPUTED BY ((select caname from cas where bEMPEND=caid)),
    "_PAYTYPE"    COMPUTED BY ((select ptname from paytypes where ptid=bpaytype)),
    "_BTYPE"      COMPUTED BY ((select btname from bidtypes where btid=btype)),
    "_PRIORITY"   COMPUTED BY ((select prname from priorities where prid=bpriority)),
    BSTATUS       D_ID DEFAULT 1 NOT NULL /* D_ID = INTEGER NOT NULL */,
    "_STATUS"     COMPUTED BY ((select bsname from bidstatus where bstatus=bsid)),
    "_ITEMS"      BLOB SUB_TYPE 1 COMPUTED BY ((select list("_BRIEFART" || ': ' || BICNT, ascii_char(13)) as BI 
from BIDIT where BIBID = BID)),
    BORDERID      D_BIGINT /* D_BIGINT = BIGINT */
);
...
Рейтинг: 0 / 0
07.08.2019, 23:55
    #39846698
GrigoriyFomin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите концепцию работы с FIREDAC и "правильными транзакциями"
ёёёёёGrigoriyFominпропущено...

в returning поля прописаны. Меня интересует правильный академичсекий подход, задача-то типовая - как сохранить мастер и детейл записи при автоинкрементном связующем поле и CachedUpdates.

Ну, раз ты все делаешь как надо - ошибка в компонентах, а что ж ещё.
Так я как раз и понимаю, что я делаю то-то не так - хочу разобраться. Раз задача тривиальная, значит решение есть бескостыльное и красивое. А найти его не получается, для чего на форуме и вопрошаю )
...
Рейтинг: 0 / 0
08.08.2019, 00:22
    #39846702
GrigoriyFomin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите концепцию работы с FIREDAC и "правильными транзакциями"
Поигрался со свойствами датасетов и вроде как получил теперь ИД мастер-записи (сам не понял, правда, как). Как теперь этот ИД прописать в детеил записях?
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Подскажите концепцию работы с FIREDAC и "правильными транзакциями" / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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