Página 1 de 1

Error de DBI en dos ciclos de consultas

NotaPublicado: 2014-03-27 11:54 @537
por seafree
Hola.

Realizo varias consultas dentro de dos ciclos y en la última de las consultas arroja: Can't call method "prepare" on an undefined value. ¿Me puedes asesorar en cuál puede ser el error? Creé una segunda variable $dbh_fe, el correspondiente $sth_fe y el correspondiente while ($reg_fentra = $sth_fe->fetchrow_hashref()) { pero no arroja resultado alguno.

¿Me podrás apoyar, por favor, con alguna idea, por favor? Gracias.

Re: Error de DBI en dos ciclos de consultas

NotaPublicado: 2014-03-27 12:40 @569
por explorer
Sin ver el código, es difícil...

Apuesto a que el segundo ciclo agota todas las respuestas, y la segunda vuelta del primer ciclo es la que da el fallo.

Re: Error de DBI en dos ciclos de consultas

NotaPublicado: 2014-03-27 13:17 @595
por seafree
Ok, mira, el programa está algo extenso por lo que creo que lo mejor es enviarte las líneas correspondientes:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #############------##############
  2. my $dbh;
  3. my $sth;
  4. my $sql;
  5. my $sql_evento;
  6. my $reg_dcev;
  7. my $sql_max_fsale;
  8. my $dbh_fe;
  9. my $sth_fe;
  10.  
  11. $dbh          = DBI->connect( "DBI:Pg:dbname=eventos;host=localhost", "seafree", "", { 'RaiseError' => 1 } );
  12. $sql          = "SELECT......";
  13. $sql_eventos  = "SELECT.....";
  14. $sql_eventos2 = "SELECT....";
  15. $sth          = $dbh->prepare($sql) or die $DBI::errstr;
  16. $sth->execute();
  17. while ( $reg_dcev = $sth->fetchrow_hashref() ) {
  18.     ...;
  19.     ...;
  20.     ...;
  21. }                                      #END WHILE ($reg_dcev = $sth->fetchrow_hashref)
  22. $sth_event2 = $dbh->prepare($sql_eventos2) or die $DBI::errstr;
  23. $sth_event2->execute();
  24. while ( $reg_dcev_event2 = $sth_event2->fetchrow_hashref() ) {
  25.  
  26. }                                      #END WHILE ($reg_dcev = $sth->fetchrow_hashref)
  27.  
  28. #############################################
  29. ###---EN EL SIGUIENTE TENGO EL PROBLEMA---###
  30. #############################################
  31. $sth_fe = $dbh->prepare($sql_eventos) or die $DBI::errstr;
  32. $sth_fe->execute();
  33. $tuplas = $sth_fe->rows;               ###SÍ ME ESTÁ ARROJANDO UNA TUPLA, PORQUE SÓLO ES UNA CON EL VALOR MÁXIMO
  34.  
  35. while ( $reg_fe = $sth_fe->fetchrow_hashref() ) {
  36.     if ( $descrip_aux ne $descrip_comp ) {    # Creo una condición para cuando sea un diferente grupo "descrip_comp"
  37.         $sql_max_fsale
  38.             = "SELECT MAX(fecha_entra) FROM (SELECT id,descrip_comp,fecha_sale,fecha_entra FROM t_eventos te, c_tipo_componentes ctc, c_componentes cc WHERE (fecha_sale BETWEEN '$f_ini' AND '$f_fin') AND indice='S' AND te.id_tipo_componente=ctc.id_tipo_componente AND ctc.id_componente=cc.id_componente GROUP BY id,descrip_comp,fecha_sale,fecha_entra ORDER BY descrip_comp,fecha_entra) AS subquery WHERE descrip_comp=\'$descrip_comp\' GROUP BY descrip_comp";
  39.         $sth_fe = $dbh->prepare($sql_max_fsale) or die $DBI::errstr;
  40.         $sth_fe->execute();
  41.         $tuplas_max_fentra = $sth_fe->rows;
  42.         while ( $reg_fentra = $sth_fe->fetchrow_hashref() ) {
  43.             $fentra = $reg_fentra->{'fecha_entra'};
  44.             print $fentra              ## Envía valores vacíos y la consulta sí me da el resultado esperado
  45.         }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


¿Puedes encontrar algo con este código?

Re: Error de DBI en dos ciclos de consultas

NotaPublicado: 2014-03-27 14:14 @634
por explorer
Sí que veo algo...

En la línea 35 extraes el resultado de la consulta, en forma de referencia a un hash, y lo guardas en la variable escalar $reg_fe... que luego no usas en el resto del código...

Re: Error de DBI en dos ciclos de consultas

NotaPublicado: 2014-03-27 14:26 @643
por seafree
No, mira, la línea 35 está compuesta así:

$sth_fe= $dbh->prepare($sql_max_fsale) or die $DBI::errstr;
$sth_fe->execute();
$tuplas_max_fentra=$sth_fe->rows;
while($reg_fentra = $sth_fe->fetchrow_hashref()) {
$fentra=$reg_fentra->{'fecha_entra'};
print "FECHA ENTRA: $fentra<br>";
}

Por error tome otra línea o algo pasó. Como puedes ver el valor que obtengo con la consulta es el valor máximo de la fecha de entrada, es decir, solo me da un valor como resultado. Al ejecutar la consulta directamente en la base de datos sí me arroja un resultado, pero en el programa, nada.

Re: Error de DBI en dos ciclos de consultas

NotaPublicado: 2014-03-27 14:42 @654
por seafree
¡Ups! Era algo tan simple que es una verdadera pena que haya pasado esto.

Era la asignación del MAX(fecha_entra) a un alias, es decir, MAX(fecha_entra) AS fecha_entra y asignar ese valor como ya estaba: $fentra = $reg_fentra->{'fecha_entra'}; Lo que pasa es que quería utilizar el valor de 'fecha_entra' sin asignarlo a un alias.