закрытие транзакций в lazarus

Общие вопросы: версии и диалекты, синтаксис языка, cтруктуры и типы данных (массивы, строки, списки...), обработка данных и т.д.
Ответить
ancia
Сообщения: 6
Зарегистрирован: 22 фев 2010, 03:40

02 мар 2010, 00:59

есть проблема :( : закрытие транзакций происходит только при закрытии самой программы.
база на firebird, интерфейс на lazarus.
Создана форма DataModule, на ней располагаются IBConnection1, Datasource1, SQLQuery1, SQLTransaction1. Для каждой формы программы создан на DataModule свои Datasource, SQLQuery. запросы работат отлично. данные отображаю и изменяю через dbgrid. Но при нажатии кнопки "сохранить" визуально изменения сохраняются, а вот в самой базе это происходит только после закрытия программы.
процедура сохранения:

Код: Выделить всё

procedure TForm6.Button1Click(Sender: TObject);
begin
  dm.SQLQuery6.ApplyUpdates;
  dm.sqlquery6.Active:=false;
  dm.SQLTransaction1.Commit;
  dm.sqltransaction1.StartTransaction;
  dm.sqlquery6.Active:=true;
  end;  
Это неудобно потому что при заполнении некоторых таблиц используются выпадающие списки из других таблиц. И если данные были внесены только что, а программа еще не была перезапущена, то их соответственно нет в списке.
Получается что при запуске прогруммы подключаемся к базе и данные не обновляются до нового подключения? Но при этом все же сохраняются? как исправить эту ситуацию?

и еще вопрос =)
как уже писала-данные отображаются в dbGrid. как сделать так, чтобы при выборе строки в dgbrid, выполнялся запрос и в другом dbgrid отображался результат этого запроса.

например: таблица с полями N, vid. выбираем определенную строку. надо чтобы прочитал из этой строки только N и выполнил такой запрос 'SELECT N, N_dog, nazv, predm, stoim FROM table1, table2 where N=N_dog '. Надо чтобы отобразились только значения с выбранным N.

заранее спасибо =)
Аватара пользователя
Duncon
Сообщения: 1974
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

02 мар 2010, 09:37

Ну по логике нужно послать некий запрос что-то типа этого.
START TRANSACTION;
UPDATE ....
COMMIT;

2 вопрос - на onchange вешаем событие - берём значение ячейки и отправляем в функцию обрабатывающую запрос, результат выводим в 2 грид. Вопрос нагугливается быстро.
[syntax=Delphi] [/syntax]
ancia
Сообщения: 6
Зарегистрирован: 22 фев 2010, 03:40

02 мар 2010, 13:14

в куске кода, который я привела как раз и происходит закрытие и повторное открытие транзакций....
если я вас не так поняла, опишите поподробнее пожалейства =) я чайник в этом деле....
Аватара пользователя
Duncon
Сообщения: 1974
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

02 мар 2010, 18:23

По идее должно быть открытие закрытие, вполне вероятно поэтому и не закрывается, кусок кода ни о чём не говорит.
[syntax=Delphi] [/syntax]
ancia
Сообщения: 6
Зарегистрирован: 22 фев 2010, 03:40

03 мар 2010, 15:06

опишите, подалуйста, поподробнее- где и что тогда надо прописать?
я привела как раз продедуру сохранения... видимо она неправильная? как сделать надо?
Аватара пользователя
Duncon
Сообщения: 1974
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

03 мар 2010, 18:28

Нужно почитать про транзакции и прочие непонятности - материала в сети навалом.
[syntax=Delphi] [/syntax]
ancia
Сообщения: 6
Зарегистрирован: 22 фев 2010, 03:40

03 мар 2010, 19:16

прочитала уже много всего, врежде чем сюда обратиться... Но видимо и тут никто даже попытаться помочь не хочет :( жаль....
Аватара пользователя
Duncon
Сообщения: 1974
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

03 мар 2010, 20:06

Во первых вопрос телепатического плана, во вторых он как бы простой..
[syntax=Delphi] [/syntax]
Аватара пользователя
Игорь Акопян
Сообщения: 1419
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

09 мар 2010, 12:41

ancia, судя по приведённому коду, у вас в голове всё перемешалось ;)

почитайте справку по разделу "Cached Updates"
вот пример из хелпа

[syntax='Delphi']
procedure TForm1.ApplyButtonClick(Sender: TObject)
begin
Database1.StartTransaction;
try
if not (Database1.IsSQLBased) and not (Database1.TransIsolation = tiDirtyRead) then
Database1.TransIsolation := tiDirtyRead;
CustomerQuery.ApplyUpdates; { try to write the updates to the database }
Database1.Commit; { on success, commit the changes }
except
Database1.Rollback; { on failure, undo any changes }
raise; { raise the exception again to prevent a call to CommitUpdates }
end;
CustomerQuery.CommitUpdates; { on success, clear the internal cache }
end;
[/syntax]

по второму вопросу - решение создание связи мастер-дитейл
Изображение
Ответить