Encontrei na documentação o seguinte texto na macro sc_begin_trans:
Nas aplicações de fomulário, os eventos (onAfterInsert, onAfterUpdate, onAfterDelete, onBeforeInsert, onBeforeUpdate or onBeforeDelete) são automaticamente protegidos por um controle de transação, desde que a conexão seja a mesma da aplicação.
Como estou usando o evento onBeforeInsert e de acordo com o texto acima, não coloquei o sc_begin_trans.
Coloque nesse evento um update e tudo certo.
Após o insert, forcei um erro no sql seguinte.
Checo o erro e se existir, dou um rollback e a mensagem de erro.
O problema ven aí, erro rollback não funciona, o update anterior não é desfeito.
Existe um bug aí?
Existe mesmo uma transação iniciada antes do evento?
É preciso então iniciar uma transação no evento?