Estoy probando y cree un botón donde puse la rutina abajo:
delphi
procedure TFormPrincipal.Button1Click(Sender: TObject); begin DataModule1.IBQueryCargaClientes2.Open; DataModule1.IBQueryCargaClientes.Open; DataModule1.IBQueryCargaClientes2.Last; DataModule1.IBQueryCargaClientes.Last; if (DataModule1.IBQueryCargaClientes.FieldByName('cli_id').AsInteger<DataModule1.IBQueryCargaClientes2.FieldByName('cli_id').AsInteger) then begin DataModule1.IBQueryCargaClientes2.First; while (DataModule1.IBQueryCargaClientes2.FieldByName('cli_id').AsInteger<=DataModule1.IBQueryCargaClientes.FieldByName('cli_id').AsInteger) do begin DataModule1.IBQueryCargaClientes2.Next; end; while not (DataModule1.IBQueryCargaClientes2.Eof) do begin DataModule1.IBQueryInsertarClientes.Close; DataModule1.IBQueryInsertarClientes.ParamByName('cli_id').Value:=DataModule1.IBQueryCargaClientes2.FieldByName('cli_id').Value; DataModule1.IBQueryInsertarClientes.ParamByName('cli_nif').Value:=DataModule1.IBQueryCargaClientes2.FieldByName('cli_nif').Value; DataModule1.IBQueryInsertarClientes.ParamByName('cli_nombre').Value:=DataModule1.IBQueryCargaClientes2.FieldByName('cli_nombre').Value; DataModule1.IBQueryInsertarClientes.ParamByName('cli_email').Value:=DataModule1.IBQueryCargaClientes2.FieldByName('cli_email').Value; DataModule1.IBQueryInsertarClientes.ParamByName('cli_codigobanco').Value:=DataModule1.IBQueryCargaClientes2.FieldByName('cli_codigobanco').Value; DataModule1.IBQueryInsertarClientes.ParamByName('cli_codigosucursal').Value:=DataModule1.IBQueryCargaClientes2.FieldByName('cli_codigosucursal').Value; DataModule1.IBQueryInsertarClientes.ParamByName('cli_numerocuenta').Value:=DataModule1.IBQueryCargaClientes2.FieldByName('cli_numerocuenta').Value; DataModule1.IBQueryInsertarClientes.ParamByName('cli_digitocontrol').Value:=DataModule1.IBQueryCargaClientes2.FieldByName('cli_digitocontrol').Value; DataModule1.IBQueryInsertarClientes.ParamByName('cli_contacto').Value:=DataModule1.IBQueryCargaClientes2.FieldByName('cli_contacto').Value; DataModule1.IBQueryInsertarClientes.ParamByName('cli_direccion').Value:=DataModule1.IBQueryCargaClientes2.FieldByName('dir_direccion').Value; DataModule1.IBQueryInsertarClientes.ParamByName('cli_cp').Value:=DataModule1.IBQueryCargaClientes2.FieldByName('dir_cp').Value; DataModule1.IBQueryInsertarClientes.ParamByName('cli_poblacion').Value:=DataModule1.IBQueryCargaClientes2.FieldByName('dir_poblacion').Value; DataModule1.IBQueryInsertarClientes.ParamByName('cli_telefono1').Value:=DataModule1.IBQueryCargaClientes2.FieldByName('dir_telefono1').Value; DataModule1.IBQueryInsertarClientes.ParamByName('cli_telefono2').Value:=DataModule1.IBQueryCargaClientes2.FieldByName('dir_telefono2').Value; DataModule1.IBQueryInsertarClientes.ParamByName('cli_provincia').Value:=DataModule1.IBQueryCargaClientes2.FieldByName('prv_nombre').Value; DataModule1.IBQueryInsertarClientes.ExecSQL; DataModule1.IBTransactionINSERT.Commit; DataModule1.IBQueryCargaClientes2.Next; end; end; end;
Me funciona perfecto pero cuando a veces con 20 valores, otra 10, otras 5, etc. importados me salta la excepción de la PK violada, voy mirar la base y está todo bien, executo de nuevo y vuelve a hacer, pero vuelve a saltar, miro y ha importado correctamente del punto que había parado.
Utilizo Firebird 2.5, Delphi 7 las Querys citadas en el código tiene las siguintes SQL:
IBQueryCargaClientes (sobre la tabla de mi base de datos)
select CLI_ID, CLI_NIF, CLI_NOMBRE, CLI_EMAIL, CLI_CODIGOBANCO, CLI_CODIGOSUCURSAL, CLI_NUMEROCUENTA, CLI_DIGITOCONTROL, CLI_CONTACTO, CLI_DIRECCION, CLI_CP, CLI_POBLACION, CLI_TELEFONO1, CLI_TELEFONO2, CLI_PROVINCIA
from CLIENTES
order by CLI_ID;
IBQueryCargaClientes2 (sobre la tabla de la base de datos a ser importada)
select CLI_ID, CLI_NIF, CLI_NOMBRE, CLI_EMAIL, CLI_CODIGOBANCO, CLI_CODIGOSUCURSAL,
CLI_NUMEROCUENTA, CLI_DIGITOCONTROL, CLI_CONTACTO, DIR_DIRECCION,
DIR_CP, DIR_POBLACION, DIR_TELEFONO1, DIR_TELEFONO2, PRV_NOMBRE
from CLIENTE
left join DIRECCION on CLI_ID=DIR_IDPROPIETARIO
left join PROVINCIA on PRV_ID=DIR_IDPROVINCIA
order by CLI_ID;
IBQueryInsertarClientes (sobre la tabla de mi base de datos
insert into CLIENTES (CLI_ID, CLI_NIF, CLI_NOMBRE, CLI_EMAIL,
CLI_CODIGOBANCO, CLI_CODIGOSUCURSAL, CLI_NUMEROCUENTA,
CLI_DIGITOCONTROL, CLI_CONTACTO, CLI_DIRECCION, CLI_CP,
CLI_POBLACION, CLI_TELEFONO1, CLI_TELEFONO2, CLI_PROVINCIA
)
Values(:cli_id,
:cli_nif,
:cli_nombre,
:cli_email,
:cli_codigobanco,
:cli_codigosucursal,
:cli_numerocuenta,
:cli_digitocontrol,
:cli_contacto,
:cli_direccion,
:cli_cp,
:cli_poblacion,
:cli_telefono1,
:cli_telefono2,
:cli_provincia
);
A mí me dá que Firebird hace algo antes de lo que debería y por eso acaba intentando insertar el mismo valor. no sé por lo que será ese tipo de comportamiento ni si es eso.
Alguien tiene idea de porque ocurre ese comportamiento tan ilógico ?