Parece que
solo haces
Commit de la transacción
si falla.
Deberías utilizar un bloque
try..finally.
La diferencia es que el bloque FINALLY siempre se ejecuta (se ejecuta si el bloque TRY finaliza correctamente o falla).
El bloque EXCEPT solo se ejecuta si falla.
Si este es el caso, no estarás "cerrando" la transacción hasta que cierres el formulario, que a su vez hace commit y cierra tablas y base de datos.
Código:
begin
try
dat.datamodule1.IbTable1.Append;
dat.datamodule1.IbTable1.Fields[0].AsString:=edit1.text;
...
dat.datamodule.IbTable1.Fields[20].AsString:=Edit20.text;
dat.datamodule.IbTabl11.Post;
finally {Except}
dat.Datamodule.IbTransaction1.CommitRetaining;