Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » PostgreSQL »

error al tratar de insertar datos en una función de postgres

Estas en el tema de error al tratar de insertar datos en una función de postgres en el foro de PostgreSQL en Foros del Web. Hola amigos del foro, tengo un problema cuando trato de insertar datos de una función. Tengo dos tablas relacionas entre si por la llave primaria, ...
  #1 (permalink)  
Antiguo 09/01/2013, 13:08
 
Fecha de Ingreso: enero-2013
Mensajes: 6
Antigüedad: 11 años, 10 meses
Puntos: 0
error al tratar de insertar datos en una función de postgres

Hola amigos del foro, tengo un problema cuando trato de insertar datos de una función. Tengo dos tablas relacionas entre si por la llave primaria, la primera tabla es la cabezera donde guardo los datos de algún préstamo hecho por los socio, donde esta los datos del número de préstamo(pk), la cantidad de cuotas, el valor del préstamo,y la taza de intéres, la segunda sería los detalles de dicho préstamo, dónde la llave primaria es el número de préstamo, y guardo la cantidad de cuotas, el intéres pagado en cada cuota, la amortización de cada cuota, y el monto de cada cuota, la función que hice calcula todo bien los intéres, amortización y cuota, pero al tratar de insertarlos en la tabla de detalles de prestamos de un error, y no se como resolverlo.

Estas son mis dos tablas hechas en postgresql

create table prestamos
(socio_nro int not null,
cod_pres serial not null, check(cod_pres>0),
fecha date,
tipo_pres varchar(20) not null,
sist_pago varchar(20) not null,
monto_solic int not null,check(monto_solic>=500000 and monto_solic<=10000000),
destino varchar(10),
monto_aprob int not null, check(monto_aprob>=500000 and monto_aprob<=10000000),
plazo int not null, check(plazo>=6 and plazo<=30),
t_interes float not null,
estado varchar(20) not null,
primary key(cod_pres),
foreign key(socio_nro) references socios(socio_nro));


create table det_prestamos
(cod_pres int not null,
nro_cuo int not null, check(nro_cuo>=6 and nro_cuo<=30),
interes int not null, check(interes>0),
amortizacion int not null, check(amortizacion>0),
cuota int not null, check(cuota>=0),
fecha_venc date,
estado varchar(20),
primary key(cod_pres),
foreign key(cod_pres) references prestamos(cod_pres));

Este el código de mi función

create or replace function sist_frances(a_codPres int,a_interes float,a_cant int,a_valor int)
returns void as $$
declare
v_ncuotas bigint:=0;
v_acumulado bigint:=0;
v_pendiente bigint:=a_valor;
v_amortAcum bigint:=0;
ou_interes bigint;
amort bigint;
x float:=a_interes;
y int:=a_cant;
c float;
c1 float;
i float;

begin
i:=x/100;
c:=((1+i)^y*i)/((1+i)^y-1);
c1=round(v_pendiente*c);

while(v_ncuotas< a_cant) loop
v_ncuotas=v_ncuotas+1;
ou_interes=round(v_pendiente*i);
v_acumulado=round(v_acumulado+ou_interes);
amort=round(c1-v_pendiente*i);
v_amortAcum=round(v_amortAcum+amort);
v_pendiente=round(v_pendiente-amort);

insert into det_prestamos(nro_cuo,interes,amortizacion,cuota,f echa_venc,estado) values(v_ncuotas,ou_interes,amort,c1,'1995-01-01','pendiente');

end loop;

end;
$$ LANGUAGE plpgsql

select sist_frances(1,2,6,1000000); // con este llamo a la función

y me da el siguiente error
ERROR: llave duplicada viola restricción de unicidad «det_prestamos_pkey»
DETAIL: Ya existe la llave (cod_pres)=(1).
CONTEXT: sentencia SQL: «insert into det_prestamos(cod_pres,nro_cuo,interes,amortizacio n,cuota,fecha_venc,estado) values(a_codPres,v_ncuotas,ou_interes,amort,c1,'19 95-01-01','pendiente')»
PL/pgSQL function "sist_frances" line 29 at sentencia SQL


********** Error **********

ERROR: llave duplicada viola restricción de unicidad «det_prestamos_pkey»
SQL state: 23505
Detail: Ya existe la llave (cod_pres)=(1).
Context: sentencia SQL: «insert into det_prestamos(cod_pres,nro_cuo,interes,amortizacio n,cuota,fecha_venc,estado) values(a_codPres,v_ncuotas,ou_interes,amort,c1,'19 95-01-01','pendiente')»
PL/pgSQL function "sist_frances" line 29 at sentencia SQL

Si algiuén puede ayudarme le agradecería mucho.
  #2 (permalink)  
Antiguo 09/01/2013, 15:15
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: error al tratar de insertar datos en una función de postgres

Cita:
create table det_prestamos
(cod_pres int not null,
nro_cuo int not null, check(nro_cuo>=6 and nro_cuo<=30),
interes int not null, check(interes>0),
amortizacion int not null, check(amortizacion>0),
cuota int not null, check(cuota>=0),
fecha_venc date,
estado varchar(20),
primary key(cod_pres),
foreign key(cod_pres) references prestamos(cod_pres));
cod_pres en esta tabla no puede ser primary key. Si es una referencia a prestamos que si es primary esta solo debe ser foreign key y se va a poder repetir en esta tabla.

Por eso te sale el error.

En pocas palabras, no puedes tener un campo con primary y foreign key al mismo tiempo. No es funcional.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 09/01/2013, 17:12
 
Fecha de Ingreso: enero-2013
Mensajes: 6
Antigüedad: 11 años, 10 meses
Puntos: 0
Respuesta: error al tratar de insertar datos en una función de postgres

gracias por la ayuda.
He seguido tu consejo y cambie la tabla det_prestamos, por otra que contiene la llave primaria aparte y no relacionada directamente con la llave principal de la tabla prestmaos.- Mi necesidad es que me muestre en la tabla prestamos_pendientes, la cantidad de cuotas, con sus respectivos interese, amortizaciones y cuotas una por una, es decir si tiene 6 cuotas, visualice las 6 cuotas en la tabla, he modificado mi funcion, pero como resultado me arroja espacios en blanco, aalguna idea de como solucionar el problema.
desde ya gracia por la colaboración

create table prestamos_pendientes
(cod_presPend int not null, check(cod_presPend>0),
cod_pres int not null,
nro_cuo int not null, check(nro_cuo>=6 and nro_cuo<=30),
interes int not null, check(interes>0),
amortizacion int not null, check(amortizacion>0),
cuota int not null, check(cuota>=0),
fecha_venc date,
estado varchar(20),
primary key(cod_pres),
foreign key(cod_pres) references prestamos(cod_pres));

create or replace function sist_frances(a_codPres int,a_interes float,a_cant int,a_valor int)
returns void as $$
declare
v_ncuotas int:=0;
v_acumulado int:=0;
v_pendiente int:=a_valor;
v_amortAcum int:=0;
ou_interes int;
amort int;
x float:=a_interes;
y int:=a_cant;
c float;
c1 float;
i float;
maximo int;
codigo int;

begin
maximo=(select max(cod_presPend) from prestamos_pendientes)::integer;
if(maximo is null) then
maximo=0;
else
maximo=maximo+1;
codigo=maximo;

i:=x/100;
c:=((1+i)^y*i)/((1+i)^y-1);
c1=round(v_pendiente*c);

while(v_ncuotas< a_cant) loop
v_ncuotas=v_ncuotas+1;
ou_interes=round(v_pendiente*i);
v_acumulado=round(v_acumulado+ou_interes);
amort=round(c1-v_pendiente*i);
v_amortAcum=round(v_amortAcum+amort);
v_pendiente=round(v_pendiente-amort);
insert into prestamos_pendientes(cod_presPend,cod_pres,nro_cuo ,interes,amortizacion,cuota,fecha_venc,estado) values(codigo,a_codPres,v_ncuotas,ou_interes,amort ,c1,'1995-01-01','pendiente');
end loop;
end if;
end;
$$ LANGUAGE plpgsql

y el resultado da los campos en blanco

Etiquetas: as, create, postgres, sql, table, trazar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:19.