Hola.
Creo que el problema que tienes es el siguiente
Código Delphi
[-]
for I := 0 to query1.Fields.Count - 1 do
begin
IBTable1.FieldByName('NUM_REG').AsInteger := nr;
IBTable1.Fields[i].Value := query1.Fields[i].Value;
en este código asignas por un lado el valor nuevo al campo "NUM_REG" pero en la siguiente linea al empezar desde el campo 0 de la tabla vuelves a asignar el mismo campo con el valor antiguo.
Suponiendo que el campo "NUM_REG" es el primero deberías de empezar en el for por el 1 o chequear antes de asignarlo que no es ese campo si empiezas desde el 0, por ejemplo:
Código Delphi
[-]
for I := 0 to query1.Fields.Count - 1 do
begin
IBTable1.FieldByName('NUM_REG').AsInteger := nr;
If IBTable1.Fields[i].Name<>'NUM_REG' then
IBTable1.Fields[i].Value := query1.Fields[i].Value;
Saludos