kdv писал(а):Merlin, заносит тебя иногда...
Дык потому всё больше и прикалываюсь. Или под настроение разжёвываю какой-нибудь абсолютный примитив, раскрывая вокруг него горизонты, типа думать учу

А как пытаюсь всерьёз что-то на среднем уровне изложить, так и несёт - втиснуть всего Дейта с Грабером в одну ёмкую толстовскую фразу
kdv писал(а):
если все это написано именно так как выглядит, то работать не будет, потому что:
1. первый exception будет съеден первым except. Поэтому всегда будет вызываться commit.
Если это update одной записи, то почему же не будет-то? Как раз и будет, причём без лишних роллбаков. Что получилось - закоммитит, что нет - отпустит транзакцию.
kdv писал(а):
2. DS_towns.Cancel не "отменяет" ввод записи. См. хелп. То есть, конечно, отменяет, но на уровне "ввода клиента". То есть, таким способом рубить клиенту ввод новой записи - извините. По любой ошибке тут же сразу хрясь - и DataSet в предыдущий вид возвращать?
Топорно конечно, но это дело его личного вкуса. Когда захочет - научится и конфликт обрабатывать и при настоящих неприятностях показывать причину и всё не теряя буфера ввода. Правда на одном гриде этого в общем случае не сделаешь, тут малость поболе потрудиться надо. Но это меня уже опять понесло
kdv писал(а):
3. Как сказал Merlin, commit может выдать ошибку только если сервер сдох или соединение оборвано (еще на savepoints). То есть, когда уже собственно, поздно делать commit.
И ещё при выполнении DDL, где основную работу сервер делает именно на коммите, а при выполнении операторов, грубо говоря, берёт для этого данные себе на заметку. Хотя ему об этом рано пожалуй

isql по умолчанию работает в autocommit DDL, по-моему Хвастунов и др. в конце концов тоже к этому пришли. А "Как сказал Merlin" - это звучит
kdv писал(а):
Так что, я бы написал (если добавление записи автоматизировано, а так конечно если это интерактивный ввод пользователя, то так не пишут)
Код: Выделить всё
towns_write.StartTransaction;
try
DS_towns.append;
<..........>
DS_towns.Post;
except
on ...
DS_towns.Cancel;
end;
towns_write.Commit;
Если приглядеться к его коду, то он отработает также, за исключением того, что если при коммите шнурок таки оборван, то выдаст ещё и исключение на роллбаке

Но в этом случае уже вообще всё по фигу, IBX при обрыве уходит в штопор, как известно, навсегда.