Модераторы: Akella
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Где-то я не подтверждаю транзакцию... FIBPlus 
:(
    Опции темы
ksili
Дата 2.4.2008, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



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


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Esperito
Дата 2.4.2008, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 2.9.2007

Репутация: нет
Всего: 3



Желательно подключить pFIBTransaction к pFIBDataSet. И вместо AutoCommit делать при окончании работы pFIBTransaction.Commit (или, по условию, pFIBTransaction.Rollback).
PM MAIL   Вверх
ksili
Дата 3.4.2008, 04:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



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


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
TObject
Дата 3.4.2008, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 13.3.2008

Репутация: нет
Всего: 1



Цитата(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;

заодно всякие проверки можно проводить еще на клиенте.
PM MAIL   Вверх
ksili
Дата 3.4.2008, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



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

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


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
TObject
Дата 3.4.2008, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 13.3.2008

Репутация: нет
Всего: 1



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

Ну как говорится на вкус и цвет, денег нет.  smile 
На этот счет можно долго спорить. Но скажи в чем удобство прямого добавления если например в добавляемую запись нужно вставить несколько данных из справочников, опять же нужно раскошелится на дополнительный код, лепить кпопочки в гриде по определенным столбцам и т.д.
PM MAIL   Вверх
ksili
Дата 3.4.2008, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



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


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Akella
Дата 3.4.2008, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



А параметры пишущей транзакции какие?

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

Народ, вы отдаляетесь от темы  smile 
PM MAIL   Вверх
ksili
Дата 3.4.2008, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



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

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

write
nowait
concurrency


Это сообщение отредактировал(а) ksili - 3.4.2008, 13:40


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Deniz
Дата 4.4.2008, 05:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



У читающей должно быть:
Код

read
rec version
read commited
no wait



--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Akella
Дата 4.4.2008, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



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

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

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

read
rec version
read commited
no wait


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

write
rec version
read commited
no wait


PM MAIL   Вверх
ksili
Дата 4.4.2008, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



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


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Deniz
Дата 4.4.2008, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



Akella, для пишущей короткой лучше:
Код

write
nowait
concurrency


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


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
ksili
Дата 7.4.2008, 07:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



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

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


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


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
ksili
Дата 7.4.2008, 07:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: нет
Всего: 17



Цитата(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_, хотя в настройках указаны совершенно конкретные имена 


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Firebird, Interbase | Следующая тема »


 




[ Время генерации скрипта: 0.1253 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.