• Publicidad

Problema con hash_ref

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Problema con hash_ref

Notapor willbender » 2013-06-14 10:16 @469

Tengo este código y una base de datos PostgreSQL.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $Data3->Select2( 'cred07h.historia',
  2.     'pan = \'' . $$pan{'pan'} . '\' and deborcre=\'D\' and anomesci=\'' . $$ciclo{'anomesci'} . '\'', 'valor' );
  3. $charge = $Data3->Fetch();
  4. $Statements->ChargeAmount( $$charge{'valor'} );
  5. $Data3->Finish();
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Éste depende de un archivo .pm con nombre Data.pm que ejecuta los módulos Select2 y Fetch.

Estos están así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub Select2 {
  2.     my $self = shift;
  3.     my $sql  = undef;
  4.     my @row  = undef;
  5.     my @rows = undef;
  6.     my $href = undef;
  7.     my $i    = 0;
  8.     $self->{TABLE} = shift if (@_);
  9.     $self->{KEYS}  = shift;
  10.     $self->{NUM}   = shift;
  11.     if ( $self->{NUM} eq 'SI' ) {
  12.  
  13.         if ( !$self->{KEYS} ) {
  14.             $sql = "$self->{TABLE} ";
  15.         }
  16.         else {
  17.             $sql = "$self->{TABLE} WHERE $self->{KEYS} ";
  18.         }
  19.         $self->{STH} = $self->{DBH}->prepare( 'SELECT max(fingreso) as fingreso FROM ' . $sql )
  20.             or die "Failed prepare\n";
  21.         $self->{STH}->execute() or die "Failed execute\n";
  22.     }
  23.     elsif ( $self->{NUM} eq 'valor' ) {
  24.         if ( !$self->{KEYS} ) {
  25.             $sql = "$self->{TABLE} ";
  26.         }
  27.         else {
  28.             $sql = "$self->{TABLE} WHERE $self->{KEYS} ";
  29.         }
  30.         $self->{STH} = $self->{DBH}->prepare( 'SELECT sum(valor) as valor FROM ' . $sql ) or die "Failed prepare\n";
  31.         my $valor;
  32.         $self->{STH}->execute() or die "Failed execute\n";
  33.     }
  34.     elsif ( $self->{NUM} eq 'ints' ) {
  35.         if ( !$self->{KEYS} ) {
  36.             $sql = "$self->{TABLE} ";
  37.         }
  38.         else {
  39.             $sql = "$self->{TABLE} WHERE $self->{KEYS} ";
  40.         }
  41.         $self->{STH} = $self->{DBH}->prepare( 'SELECT sum(ints) as ints FROM ' . $sql ) or die "Failed prepare\n";
  42.         $self->{STH}->execute() or die "Failed execute\n";
  43.     }
  44.     else {
  45.         if ( !$self->{KEYS} ) {
  46.             $sql = "$self->{TABLE} ";
  47.         }
  48.         else {
  49.             $sql = "$self->{TABLE} WHERE $self->{KEYS} ";
  50.         }
  51.         $self->{STH} = $self->{DBH}->prepare( 'SELECT count(*) as count FROM ' . $sql ) or die "Failed prepare\n";
  52.         $self->{STH}->execute() or die "Failed execute\n";
  53.     }
  54.  
  55. }
  56.  
  57. sub Fetch() {
  58.     my $self = shift;
  59.     my $tag  = shift;
  60.     my $href = undef;
  61.  
  62.     #print "Tag : [$tag]\n";
  63.     $href = $self->{STH}->fetchrow_hashref();
  64.     return $href;
  65. }
  66.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

pero al ejecutar el script, sí realiza la condición que indica ya que el cuarto parámetro dice "valor" e ingresa a la condición correcta, pero me retorna el siguiente error:

DBD::Pg::st fetchrow_hashref failed: no statement executing at Data.pm

la cual hace referencia a la línea del $href=$self->{STH}->fetchrow_hashref();

¿Me podrían ayudar? Yo necesito desplegar el valor de sum(valor) pero no logro hacerlo. Ya probé con fetchrow_arrayref(), fetchrow_array(), y tampoco.

Gracias
Última edición por explorer el 2013-06-14 10:43 @488, editado 1 vez en total
Razón: Formateado de código con Perltidy
willbender
Perlero nuevo
Perlero nuevo
 
Mensajes: 24
Registrado: 2012-07-16 17:22 @765
Ubicación: Guatemala

Publicidad

Re: Problema con hash_ref

Notapor explorer » 2013-06-14 12:09 @548

Pues... yo no veo nada raro... salvo la línea 31, que no sirve para nada. Pero tampoco afecta al resto del código.

Según lo que aparece en las búsquedas que he hecho en Internet, el mensaje de error indica que no se ha realizado una operación execute() antes de hacer el fetchrow_hashref(). Pero el caso es que el código sí que está.

¿Funciona bien para los otros casos de $self->{NUM}?

Si modificas el Data.pm para colocar el fetchrow_hashref() dentro del if(), ¿funciona?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema con hash_ref

Notapor willbender » 2013-06-14 12:37 @567

Gracias por la respuesta. Probaré como dices, ingresando el hashref dentro del if().

Fíjate que cualquiera me da el error. Pensé que funcionaba con el primero pero al hacer el segundo elsif() y tercero, dio error y confirmé que me da error.

¡Te confirmo si funciona lo que me dijiste!

Gracias.
willbender
Perlero nuevo
Perlero nuevo
 
Mensajes: 24
Registrado: 2012-07-16 17:22 @765
Ubicación: Guatemala

Re: Problema con hash_ref

Notapor willbender » 2013-06-14 16:11 @716

No funcionó. Da el mismo error. Probaré otro código, ya que el error es cuando quiere hacer el "select sum(columna_a_sumar) from". Es como que no lo entendiera, porque probé haciendo "select * from" y sí funcionó. Buscaré un poco de información al respecto ya que no capto ¡por qué no le gusta al execute() la sintaxis!

Si supieran algo agradezco los comentarios. Buen fin de semana.
willbender
Perlero nuevo
Perlero nuevo
 
Mensajes: 24
Registrado: 2012-07-16 17:22 @765
Ubicación: Guatemala

Re: Problema con hash_ref

Notapor explorer » 2013-06-14 16:30 @729

Prueba con
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         $self->{STH} = $self->{DBH}->prepare( 'SELECT sum(valor) as "valor" FROM ' . $sql ) or die "Failed prepare\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
(comillas alrededor de valor)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema con hash_ref

Notapor willbender » 2013-08-22 11:55 @538

Buen día. ¡Perdón por no responder y hasta ahora retomar este tema!

Te comento: por prioridades me cambiaron de proyecto y ahora nuevamente retomé éste en donde me sucede el error antes mencionado. Te confirmo que probé con la sintaxis que me diste de poner la palabra entre comillas dobles y también me dio el mismo error.

Agradezco tus comentarios. Seguiré investigando. Buen día. Éxitos.
willbender
Perlero nuevo
Perlero nuevo
 
Mensajes: 24
Registrado: 2012-07-16 17:22 @765
Ubicación: Guatemala

Re: Problema con hash_ref

Notapor explorer » 2013-08-22 12:26 @560

Una pregunta: ¿este código ha llegado a funcionar alguna vez, en este servidor o en cualquier otro?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problema con hash_ref

Notapor willbender » 2013-08-22 15:36 @691

¡Sí funciona! ¡Pero en el log siempre me despliega ese error, cosa que no debería suceder!
willbender
Perlero nuevo
Perlero nuevo
 
Mensajes: 24
Registrado: 2012-07-16 17:22 @765
Ubicación: Guatemala

Re: Problema con hash_ref

Notapor explorer » 2013-08-22 16:06 @712

¿Dices que funciona, y aún así sale el error?

¿No será que se está llamando a Fetch() en algún lugar del programa sin haber hecho antes un Select2()?

Una forma de comprobarlo sería poner uno o varios print(), en Fetch(), que sacaran los valores de
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
    $self->{TABLE}
    $self->{KEYS}
    $self->{NUM}
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


antes del fetchrow_hashref().

Para estar seguros, añade estas líneas dentro de Fetch():
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     unless ($self->{STH}) {
  2.         die "ERROR: Se ha llamado a Fetch() y no tenemos un STH.\n";
  3.     }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Esta es una simplificación de tu código:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. ...;
  4.  
  5. $Data3->Select2(
  6.     'cred07h.historia',
  7.     "pan = '$pan->{pan}' and deborcre='D' and anomesci='$ciclo->{anomesci}'",
  8.     'valor'
  9. );
  10.  
  11. $charge = $Data3->Fetch();
  12.  
  13. $Statements->ChargeAmount( $charge->{'valor'} );
  14.  
  15. $Data3->Finish();
  16.  
  17. ...;
  18.  
  19. sub Select2 {
  20.     my $self = shift;
  21.  
  22.     if (@_) {
  23.         $self->{TABLE} = shift;
  24.         $self->{KEYS}  = shift;
  25.         $self->{NUM}   = shift;
  26.     }
  27.  
  28.     die "ERROR: Se ha llamado a Select2 sin TABLE" if not $self->{TABLE};
  29.  
  30.     my $sql  = $self->{TABLE};
  31.  
  32.     $sql    .= " WHERE $self->{KEYS}"
  33.                     if $self->{KEYS};
  34.  
  35.  
  36.     if ( $self->{NUM} eq 'SI' ) {
  37.  
  38.         $sql = "SELECT max(fingreso) as fingreso FROM $sql";
  39.     }
  40.     elsif ( $self->{NUM} eq 'valor' ) {
  41.  
  42.         $sql = "SELECT sum(valor) as valor FROM $sql";
  43.     }
  44.     elsif ( $self->{NUM} eq 'ints' ) {
  45.  
  46.         $sql = "SELECT sum(ints) as ints FROM $sql";
  47.     }
  48.     else {
  49.  
  50.         $sql = "SELECT count(*) as count FROM $sql";
  51.     }
  52.  
  53.     $self->{STH} = $self->{DBH}->prepare( $sql ) or die "Failed prepare\n";
  54.     $self->{STH}->execute()                      or die "Failed execute\n";
  55. }
  56.  
  57. sub Fetch() {
  58.     my $self = shift;
  59.  
  60.     unless ($self->{STH}) {
  61.         die "ERROR: Se ha llamado a Fetch() y no tenemos un STH.\n";
  62.     }
  63.  
  64.     my $resultado = $self->{STH}->fetchrow_hashref();
  65.  
  66.     $self->{STH} = undef;               # borramos el STH, ya que hemos terminado la consulta,
  67.                                         # así, si alguien vuelve a llamar a Fetch, saldrá un error
  68.  
  69.     return $resultado;
  70. }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados