Hola Antonio
Si llamas al generador con un valor en el segundo parámetro distinto de cero entonces el número generado cambia. Los generadores funcionan afuera de las transacciones por lo tanto aunque hagas un ROLLBACK el valor del generador no regresa. Esto implica que puedes tener números salteados, por ejemplo: 1, 2, 3, 8, 9, 21, 22.
Si necesitas números consecutivos sin que existan números salteados en el medio entonces debes llamar a tu generador después de validar todo lo demás, es decir que debe ser tu última instrucción en esa transacción. Alternativamente, puedes usar un número negativo para que reste en lugar de sumar, pero esto generalmente no es recomendable salvo que seas extremadamente cuidadoso. En este caso lo más sencillo es establecer a tu número generado como clave primaria o clave única, de esa manera el Firebird no te permitirá tener duplicados.
Para que un valor no se duplique no debes usar ÍNDICES sino que debes usar CONSTRAINTS.
Cuando usas índices con la cláusula UNIQUE le estás diciendo que use solamente al primero de ellos, no le estás diciendo que no se puedan cargar valores duplicados. Si no quieres valores duplicados entonces debes usar una CONSTRAINT UNIQUE.
Saludos.
Walter.