Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Firebird, Interbase > Где-то я не подтверждаю транзакцию...


Автор: ksili 2.4.2008, 13:15
У меня в приложении таблица открывается в DBGrid через pFIBDatabase, pFIBDataSet, DataSource. Сделано так, что записи можно добавлять прямо в таблице. 
Но почему-то, после того, как добавлю несколько записей (или одну), их нельзя ни удалить, ни отредактировать. Точнее в гриде это всё можно делать, но реально, в базе, они не изменяются. А вот после того, как переоткрою набор данных, все нормально - можно и удалить, и изменить.
Где я что недописал? Всё выглядит так, как будто все изменения подтверждаются только по закрытию датасета. Хотя в свойствах AutoCommit = true

Автор: Esperito 2.4.2008, 18:20
Желательно подключить pFIBTransaction к pFIBDataSet. И вместо AutoCommit делать при окончании работы pFIBTransaction.Commit (или, по условию, pFIBTransaction.Rollback).

Автор: ksili 3.4.2008, 04:26
Не, ну pFIBTransaction-то конечно есть (даже два). Без него бы вообще не работало. Попробую без AutoCommit

Автор: TObject 3.4.2008, 11:45
Цитата(ksili @ 2.4.2008,  13:15)
Сделано так, что записи можно добавлять прямо в таблице.

Не очень хороший подход. Никогда так не делал. Обычно добавление и редактирование делаю в отдельной форме, где по кнопке (Ок, Сохранить, Записать) происходит чтото типа такого:

Код

procedure TfrmFCWork.actnInsertRecordExecute(Sender: TObject);
begin
if not Assigned (frmInsEdtAudit) then
   begin
      frmInsEdtAudit:=TfrmInsEdtAudit.Create(Application);
      if frmInsEdtAudit.ShowModal = mrOk then
         begin
         //
            try
            FaxControlDataModule.FCTransEdit.StartTransaction;
            FaxControlDataModule.tblFCMain.Insert;
            FaxControlDataModule.tblFCMain.FieldByName('FCITY_ID').AsInteger:=FaxControlDataModule.tblCity.Fields[0].AsInteger;
            FaxControlDataModule.tblFCMain.FieldByName('FTIME_POINT_1').AsString:=frmInsEdtAudit.MaskEdit1.Text;
            FaxControlDataModule.tblFCMain.FieldByName('FTIME_POINT_2').AsString:=frmInsEdtAudit.MaskEdit2.Text;
            FaxControlDataModule.tblFCMain.FieldByName('FSUMMA_1').AsCurrency:=StrToCurr(frmInsEdtAudit.cedtSumma1.Text);
            FaxControlDataModule.tblFCMain.FieldByName('FSUMMA_2').AsCurrency:=StrToCurr(frmInsEdtAudit.cedtSumma2.Text);
            FaxControlDataModule.tblFCMain.FieldByName('FDEBET').AsCurrency:=frmInsEdtAudit.cedtDif1.Value;
            FaxControlDataModule.tblFCMain.FieldByName('FCREDIT').AsCurrency:=frmInsEdtAudit.cedtDif2.Value;
            FaxControlDataModule.tblFCMain.Post;
            FaxControlDataModule.FCTransEdit.Commit;
            except
            on e: exception do
               begin
               FaxControlDataModule.FCTransEdit.Rollback;
               ShowMessage('Не удалось сохранить данные!');
               end;
            end;
            FaxControlDataModule.tblFCMain.Open;
            FaxControlDataModule.tblFCMain.Last;
         end;
   frmInsEdtAudit.Free;
   frmInsEdtAudit:=nil;
   end;
end;

заодно всякие проверки можно проводить еще на клиенте.

Автор: ksili 3.4.2008, 12:09
Цитата(TObject @  3.4.2008,  15:45 Найти цитируемый пост)
Не очень хороший подход.

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

Автор: TObject 3.4.2008, 12:59
Цитата(ksili @ 3.4.2008,  12:09)
Это не очень хороший подход со стороны программиста, а вот со стороны пользователя, которому эти таблицы редактировать, как раз самый замечательный подход.

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

Автор: ksili 3.4.2008, 13:01
Никаких кнопочек лепить не надо. Если настроены lookup-поля, выпадающие списки сами, где надо, появляются.

Автор: Akella 3.4.2008, 13:05
А параметры пишущей транзакции какие?

Добавлено через 27 секунд
Цитата(TObject @  3.4.2008,  12:59 Найти цитируемый пост)
На этот счет можно долго спорить.

Народ, вы отдаляетесь от темы  smile 

Автор: ksili 3.4.2008, 13:40
У pFIBDatabase и pFIBDataSet есть свойства DefaultTransaction и DefaultUpdateTransaction. Все DefaultTransaction у меня установлены в Transaction1 (один компонент), все DefaultUpdateTransaction установлены в Transaction2 (тоже один компонент). У DefaultTransaction все свойства по-умолчанию. У DefaultUpdateTransaction оказывется тоже! а я думал, чо выставлял отдельные параметры
По-умолчанию это: 
Код

TimeoutAction = TARollback
TPBMode = tpbReadCommitted 
TRParams = NULL
Попробую поставить у апдейт-транзакции параметры:
Код

write
nowait
concurrency

Автор: Deniz 4.4.2008, 05:08
У читающей должно быть:
Код

read
rec version
read commited
no wait

Автор: Akella 4.4.2008, 12:35
Цитата(ksili @  3.4.2008,  13:40 Найти цитируемый пост)
TRParams = NULL

Сделай, как Deniz советует.

в параметры засунь
для читающей транзакции
Цитата

read
rec version
read commited
no wait


для пишущей:
Цитата

write
rec version
read commited
no wait


Автор: ksili 4.4.2008, 12:42
Попробую. Но вот сейчас я заметил, что параметры добавленные в дизайнере в TRParams (оно типа TStrings), не сохраняются! Закрыл проект - открыл проект ---> TRParams = NULL. Их нужно только в run-time добавлять? Кто-нибудь сталкивался с таким?

Автор: Deniz 4.4.2008, 14:54
Akella, для пишущей короткой лучше:
Код

write
nowait
concurrency


Цитата(ksili @  4.4.2008,  15:42 Найти цитируемый пост)
Их нужно только в run-time добавлять? Кто-нибудь сталкивался с таким? 
никогда такого не было, как прописал, так и сохраняются.

Автор: ksili 7.4.2008, 07:14
Разобрался почему не сохранялись настройки в TRParams. Теперь сохраняются, но все равно не работает как надо:

Цитата(ksili @  2.4.2008,  17:15 Найти цитируемый пост)
после того, как добавлю несколько записей (или одну), их нельзя ни удалить, ни отредактировать. Точнее в гриде это всё можно делать, но реально, в базе, они не изменяются. А вот после того, как переоткрою набор данных, все нормально - можно и удалить, и изменить.


У меня стоят настройки, чтобы автоматически обновлялись все SQL. Так вот перехватывал события обновляющей транзакции BeforeEnd и AfterEnd. В обоих содержимое UpdateSQL датасета равно NULL! Хотя содержимое таблицы действительно обновляется (правда криво, как описано выше)

Автор: ksili 7.4.2008, 07:53
Цитата(ksili @  7.4.2008,  11:14 Найти цитируемый пост)
В обоих содержимое UpdateSQL датасета равно NULL

С этим разобрался - в том конкретном случае надо было смотреть InsertSQL, а не UpdateSQL.

Запросы вроде генерируются правильно, но смущает один момент. В документации FIBPlus (Developers Guide) указаны примерно такие запросы
Код

InsertSQL.Text :=
'insert into CUSTOMER(CUST_NO, CUSTOMER, CONTACT_FIRST, CONTACT_LAST )'+
' values (:CUST_NO, :CUSTOMER, :CONTACT_FIRST, :CONTACT_LAST)';

У меня генерируются такие:
Код

Insert into TRANSFORMRULES(
     DESCRIPTION
)
values (
     ?NEW_DESCRIPTION
)"

Хотя в настройках датасета я указал
Код

    AutoUpdateOptions.ParamsToFieldsLinks.Strings = (
      'TRANSFORMID=P_TRANSFORMID'
      'RULES=P_RULES'
      'DESCRIPTION=P_DESCRIPTION')

Непонятка с именами параметров: в документации оно такое же как поле, но с двоеточием, в реальности приписывается ?NEW_ или ?OLD_, хотя в настройках указаны совершенно конкретные имена 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)