El problema es que tu campo ID lo declaraste que no puede ser nulo, por lo que no puedes intentar ingresarlo sin que darle un valor al ID.
Hay varias posibles soluciones:
1. Darle un valor por defecto, por ejemplo cero. luego en el trigger lo reemplazas por el valor autoincremental.
Código SQL
[-]CREATE TRIGGER "SET_DETALLE" FOR "DETALLE"
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
NEW.IDDETALLE = GEN_ID(GENIDDETALLE,1);
END ^
2. Ingresar el valor a traves de un procedimiento almacenado, le pasas tods los paramentros menos el ID, ahi adentro calculas el nuevo ID y se lo asignas.
Código SQL
[-]CREATE PROCEDURE ING_DETALLE
(
IDPRODUCTO INTEGER,
CANTIDAD FLOAT
)
AS
DECLARE VARIABLE ID INTEGER;
BEGIN
ID = gen_id(INC_CONST, 1);
INSERT INTO DETALLE(IDDETALLE, IDPRODUCTO, CANTIDAD)
VALUES (:ID, :IDPRODUCTO, :CANTIDAD);
END^
y posiblemente otras soluciones.