PDA

Просмотр полной версии : закрытие транзакций в lazarus



ancia
02.03.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
02.03.2010, 09:37
Ну по логике нужно послать некий запрос что-то типа этого.
START TRANSACTION;
UPDATE ....
COMMIT;

2 вопрос - на onchange вешаем событие - берём значение ячейки и отправляем в функцию обрабатывающую запрос, результат выводим в 2 грид. Вопрос нагугливается быстро.

ancia
02.03.2010, 13:14
в куске кода, который я привела как раз и происходит закрытие и повторное открытие транзакций....
если я вас не так поняла, опишите поподробнее пожалейства =) я чайник в этом деле....

Duncon
02.03.2010, 18:23
По идее должно быть открытие закрытие, вполне вероятно поэтому и не закрывается, кусок кода ни о чём не говорит.

ancia
03.03.2010, 15:06
опишите, подалуйста, поподробнее- где и что тогда надо прописать?
я привела как раз продедуру сохранения... видимо она неправильная? как сделать надо?

Duncon
03.03.2010, 18:28
Нужно почитать про транзакции и прочие непонятности - материала в сети навалом.

ancia
03.03.2010, 19:16
прочитала уже много всего, врежде чем сюда обратиться... Но видимо и тут никто даже попытаться помочь не хочет :( жаль....

Duncon
03.03.2010, 20:06
Во первых вопрос телепатического плана, во вторых он как бы простой..

Игорь Акопян
09.03.2010, 12:41
ancia, судя по приведённому коду, у вас в голове всё перемешалось ;)

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


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;


по второму вопросу - решение создание связи мастер-дитейл