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

problemas con base de datos

Estas en el tema de problemas con base de datos en el foro de Programación General en Foros del Web. tengo un script que escribe sobre una base de datos, y las tablas tienen llaves foraneas. al momento de realizar $dbh_final->commit, me genera un error ...
  #1 (permalink)  
Antiguo 31/08/2004, 12:42
ezk
 
Fecha de Ingreso: agosto-2004
Ubicación: de requinoa... ¿alguien sabe?
Mensajes: 47
Antigüedad: 20 años, 3 meses
Puntos: 0
problemas con base de datos

tengo un script que escribe sobre una base de datos, y las tablas tienen llaves foraneas.

al momento de realizar $dbh_final->commit, me genera un error que indica que estoy violando una llave foranea, pero al momento de escribir en la base de datos, mantengo el orden de los datos.

debo indicar que trabajo con postgres, mod_perl y apache, pero como esto esta relacionado 100% con Perl lo he posteado aca

Este es el codigo (me falta cepillar el codigo, ya que estoy en contra del tiempo):

************************************************** *********************************
package Clonar;

use General;
use Data::Dumper;
use DBI;

sub clonar_datos {

my $id_familia = shift;

my $familia = $dbh->prepare("select * from familia where id_familia=$id_familia");
$familia->execute();

while (my ($f) = $familia->fetchrow_hashref) {

# verificar datos del promotor familiar, ingresar si corresponde
my $usuario = $dbh_final->prepare("select id_usuario from usuario where id_usuario='$f->{id_promotor_asignado}'");
$usuario->execute;
while (my ($usr) = $usuario->fetchrow_array) {

if ($usr ne $f->{id_promotor_asignado}) {
my $usuario_puente = $dbh->prepare("select * from usuario where id_usuario='$f->{id_promotor_asignado}'");
$usuario_puente->execute;
while (my ($u) = $usuario_puente->fetchrow_hashref) {

my $usuario_final = $dbh_final->prepare("insert into usuario(id_usuario,id_tipo_usuario,id_comuna,nombr e,passwd,email,tel,cel,ind_activo,ind_primer_login ,apaterno,amaterno,sexo,ciudad,educacion,profesion ,fecha_nac) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
$usuario_final->execute($u->{id_usuario},$u->{id_tipo_usuario},$u->{id_comuna},$u->{nombre},$u->{passwd},$u->{email},$u->{tel},$u->{cel},$u->{ind_activo},$u->{ind_primer_login},$u->{apaterno},$u->{amaterno},$u->{sexo},$u->{ciudad},$u->{educacion},$u->{profesion},$u->{fecha_nac});
}

#tabla promotor (campo id_promotor y tipo_promotor
my $promotor = $dbh_final->prepare("select id_promotor from promotor where id_promotor = '$f->{id_promotor_asignado}'");
$promotor->execute;
while (my ($promo) = $promotor->fetchrow_array) {

if ($promo ne $f->{id_promotor_asignado}){
my $promotor_puente = $dbh->prepare("select * from promotor where id_promotor = '$f->{id_promotor_asignado}'");
$promotor_puente->execute;
while (my ($p) = $promotor_puente->fetchrow_hashref) {
my $promotor_final = $dbh_final->prepare("insert into promotor(id_promotor, tipo_promotor) values(?,?)");
$promotor_final->execute($p->{id_promotor},$p->{tipo_promotor});
}

}
}
}

}

# verificar datos de la familia, ingresar si corresponde
my $family = $dbh_final->prepare("select id_familia from familia where id_familia = $id_familia");
$family->execute;
while(my ($fam) = $family->fetchrow_array) {

if ($fam != $f->{id_familia}) {
my $familia_final = $dbh_final->prepare("insert into familia(id_familia,id_comuna,id_promotor_asignado, nombre,direccion,nombre_representate,tel,cel,id_et nia,ind_participacion,situacion) values(?,?,?,?,?,?,?,?,?,?,?)");
$familia_final->execute($f->{id_familia},$f->{id_comuna},$f->{id_promotor_asignado},$f->{nombre},$f->{direccion},$f->{nombre_representate},$f->{tel},$f->{cel},$f->{id_etnia},$f->{ind_participacion},$f->{situacion});

}

}

# verificar datos de los integrantes, ingresar si corresponde
my $persona = $dbh->prepare("select * from persona where id_familia=$f->{id_familia}");
$persona->execute;
while (my ($pers) = $persona->fetchrow_hashref) {

if ($dbh_final->selectrow_array("select count(*) from persona where id_persona=$pers->{id_persona}")) {
# existe
} else {
# no existe
my $persona_final = $dbh_final->prepare("insert into persona(id_persona,id_actividad,id_parentezco_pers ona,id_familia,nombre,ape1,ape2,sexo,fec_nac,rut) values(?,?,?,?,?,?,?,?,?,?)");
$persona_final->execute($pers->{id_persona},$pers->{id_actividad},$pers->{id_parentezco_persona},$id_familia,$pers->{nombre},$pers->{ape1},$pers->{ape2},$pers->{sexo},$pers->{fec_nac},$pers->{rut});

}
}

}

}
$dbh_final->commit();

1;
************************************************** ******************
Gracias de antemano
__________________
---------------------------------------------------

Ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn.

(oO) Cthulhu R001Z
/ | | \


---------------------------------------------------
  #2 (permalink)  
Antiguo 31/08/2004, 13:11
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 9 meses
Puntos: 90
En transacciones el Commit() se puede usar siempre y cuando autocommit está en off.

Verifica ese detalle, porque si no, no entiendo porque no te guarda los cambios.

Para colocar el autocommit en of coloca:

$dbh->{AutoCommit} = 0;

Si quieres aprender más sobre el uso de transacciones en perl te recomiendo este PDF

http://linux.ubiobio.cl/documentacio...inoza/perl.pdf

Espero que te sirva

Saludos
__________________
Esteban Quintana

Última edición por monoswim; 31/08/2004 a las 13:15
  #3 (permalink)  
Antiguo 31/08/2004, 13:17
ezk
 
Fecha de Ingreso: agosto-2004
Ubicación: de requinoa... ¿alguien sabe?
Mensajes: 47
Antigüedad: 20 años, 3 meses
Puntos: 0
el autocommit esta desactivado, ya que yo tampoco entiendo por que no guarda los datos

de hecho pienso invertir el orden de los datos al momento de guardar, empezar por personnas, luego familia hasta llegar a usuarios... creo que es una estupidez, pero a estas alturas el tiempo apremia, y cualquier posible solucion sera valida... aunque ya estoy realizando nuevos cambios en la estructura.

de todas maneras muchas gracias por tu respuesta

Saludos
__________________
---------------------------------------------------

Ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn.

(oO) Cthulhu R001Z
/ | | \


---------------------------------------------------
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 15:41.