Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
Konstantin-78
Member

Откуда: Земля
Сообщений: 395
Доброе время суток, такой вопрос:

У меня DELPHI 10.2, ibx19,19, ни как не найду информацию о поддержке IBX оператора RETURNING.
Я его хочу использовать в IBQuery (после вставки строки), ну как тут уже писали, предыдущие версии его не поддерживали.
2 окт 18, 13:45    [21692597]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
Любезный
Member

Откуда:
Сообщений: 566
ЕМНИП, такого предиката в InterBase нет. Следовательно, в IBX он без допиливания не поддерживается.
2 окт 18, 13:47    [21692600]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
Konstantin-78
Member

Откуда: Земля
Сообщений: 395
Любезный,

Значит без внутренней процедуры не обойтись?
2 окт 18, 13:51    [21692608]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
Котовасия
Member

Откуда:
Сообщений: 1187
Konstantin-78,

а тупо попробовать?
2 окт 18, 13:58    [21692617]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3631
Что-то мне кажется, что если тупо засунуть INSERT RETURNING в обычный TIBQuery или TIBDataset и сделать Open, то всё заработает само.
2 окт 18, 14:12    [21692645]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24623
YuRock
Что-то мне кажется

Наверное еще никого это простая мысль не посещала. :)
2 окт 18, 14:14    [21692651]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
Котовасия
Member

Откуда:
Сообщений: 1187
YuRock
Что-то мне кажется, что если тупо засунуть INSERT RETURNING в обычный TIBQuery или TIBDataset и сделать Open, то всё заработает само.

Прикинь, оно и работает.
2 окт 18, 14:16    [21692657]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
Konstantin-78
Member

Откуда: Земля
Сообщений: 395
Котовасия
Прикинь, оно и работает.


Типа так?:

var
  q: integer;
begin
IBQuery1.Close;
IBQuery1.SQL.Clear;
IBQuery1.SQL.Text := 'insert into Tab (ID, STR) values (GEN_ID(GN, 1), :STR) returning ID';
IBQuery1.Params[0].AsString := 'qwe';
IBQuery1.Open;
IBTransaction1.CommitRetaining;
q := IBQuery1.ParamByName('ID').Value;
end;


с ошибкой на "q := IBQuery1.ParamByName('ID').Value;"
'IBQuery1: List index out of bounds (0)'.
2 окт 18, 14:23    [21692684]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 46376

Konstantin-78
Типа так?:

Нет. Немного не так. Любые значения возвращаются через Fields. И запрос с RETURNING
рассматривается не как select, а как execute procedure.

Posted via ActualForum NNTP Server 1.5

2 окт 18, 14:29    [21692695]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
Konstantin-78
Member

Откуда: Земля
Сообщений: 395
Dimitry Sibiryakov
Нет. Немного не так. Любые значения возвращаются через Fields. И запрос с RETURNING
рассматривается не как select, а как execute procedure.


Вы имели в виду вот так?

var
  q: integer;
begin
IBQuery1.Close;
IBQuery1.SQL.Clear;
IBQuery1.SQL.Text := 'insert into Tab (ID, STR) values (GEN_ID(GN, 1), :STR) returning ID';
IBQuery1.Params[0].AsString := 'qwe1';
IBQuery1.ExecSQL;
IBTransaction1.CommitRetaining;
q := IBQuery1.Fields[0].AsInteger;
end;
2 окт 18, 14:40    [21692721]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 46376

Konstantin-78
Вы имели в виду вот так?

За такой код я бы отрывал руки с запретом на профессию, но в целом таки да, как-то так.

Posted via ActualForum NNTP Server 1.5

2 окт 18, 14:45    [21692727]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
Котовасия
Member

Откуда:
Сообщений: 1187
Konstantin-78,

только что проверил - работает:

var
  IBSQL1 : TIBSQL;
...
begin
...
  IBSQL1.SQL.Text := 'insert into t (name) values (''Вася'') returning id';
  IBSQL1.ExecQuery;
  id := IBSQL1.FieldByName('id').AsInteger;
2 окт 18, 14:46    [21692728]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3631
Konstantin-78,

Запомни простую истину: никогда, накогда не используй CommitRetaining/RollbackRetaining.
Иначе два варианта:
1. Ты сменишь профессию, а твоё поделие придется переделывать другому;
2. Тебе самому придется всё переделывать со временем.
2 окт 18, 14:54    [21692748]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
Котовасия
Member

Откуда:
Сообщений: 1187
YuRock
Konstantin-78,

Запомни простую истину: никогда, накогда не используй CommitRetaining/RollbackRetaining.
Иначе два варианта:
1. Ты сменишь профессию, а твоё поделие придется переделывать другому;
2. Тебе самому придется всё переделывать со временем.

Прямо вот так "никогда"? Может, тогда сразу расскажешь, как редактировать данные в ibx датасете, чтобы он не закрывался по каждому коммиту/роллбэку?
2 окт 18, 14:58    [21692756]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24623
Котовасия
YuRock
Konstantin-78,

Запомни простую истину: никогда, накогда не используй CommitRetaining/RollbackRetaining.
Иначе два варианта:
1. Ты сменишь профессию, а твоё поделие придется переделывать другому;
2. Тебе самому придется всё переделывать со временем.

Прямо вот так "никогда"? Может, тогда сразу расскажешь, как редактировать данные в ibx датасете, чтобы он не закрывался по каждому коммиту/роллбэку?

Использовать датасеты, которые поддерживают 2 транзакции.
Читающая длинная, пишущая - короткая.
2 окт 18, 15:26    [21692814]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3631
Котовасия
Может, тогда сразу расскажешь, как редактировать данные в ibx датасете, чтобы он не закрывался по каждому коммиту/роллбэку?

Ты имеешь ввиду - редактировать гриды "в гриде"? Зачем это вообще надо? Если уж надо - делаешь форму редактирования запись, после редактирования - стартуешь пишущую транзакцию, делаешь инсерт/апдейт, commit, refresh датасета, всё.

Либо использовать датасеты с двумя транзакциями, как сказал ужа wadman. Но, имхо, это нужно чаще всего для редактирования гридов в гридах, что я считаю уродством.
2 окт 18, 15:38    [21692838]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3631
А датасет должен быть открыт в read-only транзакции, ессно.
2 окт 18, 15:39    [21692840]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
Котовасия
Member

Откуда:
Сообщений: 1187
wadman
Котовасия
пропущено...

Прямо вот так "никогда"? Может, тогда сразу расскажешь, как редактировать данные в ibx датасете, чтобы он не закрывался по каждому коммиту/роллбэку?

Использовать датасеты, которые поддерживают 2 транзакции.
Читающая длинная, пишущая - короткая.

Т.е., не использовать датасеты ibx. Или использовать их после допиливания.

А чем плоха длинная "пишущая" транзакция "стандартного" датасета ibx, которая 99,999% времени ничего не пишет, кроме короткого быстрого post с последующим немедленным CommitRetaining? Расскажи, пожалуйста.
2 окт 18, 15:40    [21692843]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
Котовасия
Member

Откуда:
Сообщений: 1187
YuRock
А датасет должен быть открыт в read-only транзакции, ессно.
Почему "естественно"?
Ну вот если в этой транзакции данные не модифицируются - в чем проблема?
2 окт 18, 15:42    [21692850]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
DarkMaster
Member

Откуда: Donetsk,Ukraine
Сообщений: 6127
Котовасия
YuRock
А датасет должен быть открыт в read-only транзакции, ессно.
Почему "естественно"?
Ну вот если в этой транзакции данные не модифицируются - в чем проблема?


В этой - не модифицируются. В других - вполне себе (у других пользователей). Получаешь накопление ненужных версий записи.
2 окт 18, 16:04    [21692896]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
Котовасия
Member

Откуда:
Сообщений: 1187
DarkMaster
Котовасия
пропущено...
Почему "естественно"?
Ну вот если в этой транзакции данные не модифицируются - в чем проблема?


В этой - не модифицируются. В других - вполне себе (у других пользователей). Получаешь накопление ненужных версий записи.

После CommitRetaining начнут копиться версии?
2 окт 18, 16:11    [21692904]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
Котовасия
Member

Откуда:
Сообщений: 1187
Котовасия
DarkMaster
пропущено...


В этой - не модифицируются. В других - вполне себе (у других пользователей). Получаешь накопление ненужных версий записи.

После CommitRetaining начнут копиться версии?

Да, kdv пишет, что такое может случиться, в общем случае следует избегать Retaining, но для датасетов ibx вариантов нет, или допиливать или изменения в отдельной транзакции делать, ручками; или таки c Retainig - но учитывать ситуацию и понимать.
2 окт 18, 16:44    [21692976]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 27657
Konstantin-78
IBTransaction1.CommitRetaining;

вот зачем такую стыдобу писать?
Мало того, CommitRetaining, так он еще между открытием запроса и получением значения. Кто вас такому научил?
Выполнил insert, получил данные, сделал commit, если надо. CommitRetaining для insert/update/delete ни к селу, ни к городу.
2 окт 18, 17:36    [21693049]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
DmSer
Member

Откуда: Пенза
Сообщений: 688
Т.е., не использовать датасеты ibx. Или использовать их после допиливания.


Со стандартными компонентами IBX приходится использовать in-memory-dataset (например, TRXMemoryData или что-нибудь посвежей) и его подключать к гриду. В этом случае:
1. Обеспечивается независимость от качества соединения с БД (данные не исчезнут при дисконнекте)
2. При добавлении / изменении / удалении записи не требуется переоткрывать весь датасет
3. По факту получается не очень много дополнительного кода.
2 окт 18, 17:49    [21693067]     Ответить | Цитировать Сообщить модератору
 Re: IBX 19_19 вопрос с поддержкой оператора RETURNING  [new]
Котовасия
Member

Откуда:
Сообщений: 1187
DmSer,

да ну нафиг, уж лучше старые фибы.
2 окт 18, 17:54    [21693074]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить