¿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
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():
Using perl Syntax Highlighting
unless ($self->{STH}) {
die "ERROR: Se ha llamado a Fetch() y no tenemos un STH.\n";
}
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Esta es una simplificación de tu código:
Using perl Syntax Highlighting
#!/usr/bin/perl
...;
$Data3->Select2(
'cred07h.historia',
"pan = '$pan->{pan}' and deborcre='D' and anomesci='$ciclo->{anomesci}'",
'valor'
);
$charge = $Data3->Fetch();
$Statements->ChargeAmount( $charge->{'valor'} );
$Data3->Finish();
...;
sub Select2 {
my $self = shift;
if (@_) {
$self->{TABLE} = shift;
$self->{KEYS} = shift;
$self->{NUM} = shift;
}
die "ERROR: Se ha llamado a Select2 sin TABLE" if not $self->{TABLE};
my $sql = $self->{TABLE};
$sql .= " WHERE $self->{KEYS}"
if $self->{KEYS};
if ( $self->{NUM} eq 'SI' ) {
$sql = "SELECT max(fingreso) as fingreso FROM $sql";
}
elsif ( $self->{NUM} eq 'valor' ) {
$sql = "SELECT sum(valor) as valor FROM $sql";
}
elsif ( $self->{NUM} eq 'ints' ) {
$sql = "SELECT sum(ints) as ints FROM $sql";
}
else {
$sql = "SELECT count(*) as count FROM $sql";
}
$self->{STH} = $self->{DBH}->prepare( $sql ) or die "Failed prepare\n";
$self->{STH}->execute() or die "Failed execute\n";
}
sub Fetch() {
my $self = shift;
unless ($self->{STH}) {
die "ERROR: Se ha llamado a Fetch() y no tenemos un STH.\n";
}
my $resultado = $self->{STH}->fetchrow_hashref();
$self->{STH} = undef; # borramos el STH, ya que hemos terminado la consulta,
# así, si alguien vuelve a llamar a Fetch, saldrá un error
return $resultado;
}
Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4