• Publicidad

Buscar con selectall_arrayref()

¿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.

Buscar con selectall_arrayref()

Notapor mgonzalez » 2010-12-09 16:19 @721

Hola amigos.

Tengo que hacer una validación que consiste en buscar si existe un código, que si lo encuentra, no debe permitir seguir.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $encuentra = $dbh->selectall_arrayref(
  2.     "select codigo from documentos where codigo like '$codigo'",
  3.     { Slice => {} }
  4. ) || die $self->error($self->{dbh}->errstr);
  5.  
  6. if ($encuentra) {
  7.     $existecodigo ="EL CODIGO YA EXISTE3 $codigo $encuentra";
  8. }
  9. else {
  10.     my $sth = $dbh->prepare(
  11.         "Update Documentos Set id_sistema =?, id_origen=?, id_tipo = ?, cod_indice=?, codigo=?, correl=?  Where id_docto = ?"
  12.     );
  13.     $sth->execute($id_sistema, $id_origen, $id_tipo, $cod_indice, $codigo, $correl_ok, $id_docto);
  14. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Supongamos que ingreso un código repetido. La primera vez funciona bien, pero si reparo el error y le doy guardar vuelve a mostrar el mensaje "repetido"...


Gracias por la ayuda.
mgonzalez
Perlero nuevo
Perlero nuevo
 
Mensajes: 28
Registrado: 2010-10-13 08:54 @412

Publicidad

Re: Buscar con selectall_arrayref()

Notapor explorer » 2010-12-09 18:06 @795

selectall_arrayref() devuelve 'undef' en caso de que ocurra un error (y, en ese caso, entraría en funcionamiento el die()). Si no hay error, siempre devuelve una referencia a un array de array, con el resultado de la consulta.

En la documentación de DBI dice que selectall_arrayref() es la combinación de prepare(), execute() y fetchall_arrayref(). Y en la sección donde explica fetchall_arrayref() se comenta que en caso de que en el resultado no existan filas, se devuelve una referencia a un array vacío.

Así que, entonces, lo que debes hacer es cambiar la condición de la línea 6 a esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if ( @$encuentra ) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

$encuentra siempre es un valor verdadero cuando llegamos a esa línea, por eso siempre te daba error. Es una referencia a algo, y las referencias siempre son valores verdaderos. Otra cosa es ver a qué hace referencia. Si lo desreferenciamos con la '@' delante para acceder al array, la condición comprobará cuántos elementos tiene ese array. Si no hay elementos, la condición fallará y saltará al else{}.
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: Buscar con selectall_arrayref()

Notapor mgonzalez » 2010-12-13 08:52 @411

Muchas gracias por tu respuesta, funciona super bien. Más abajo es el código en el que necesito dar commit()... entonces hago:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  if (!@$encuentra) {
  2.    $dbh->commit;
  3.    print redirect("$cgi_origen?    id_docto=$id_docto&id_version=$id_version");
  4.  print "\n\n";
  5.  }
  6.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


esperando que si no encuentra el repetido, lo grabe. Pero no funciona.
mgonzalez
Perlero nuevo
Perlero nuevo
 
Mensajes: 28
Registrado: 2010-10-13 08:54 @412

Re: Buscar con selectall_arrayref()

Notapor explorer » 2010-12-13 09:14 @426

¿Dónde está el prepare() y el execute()?
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: Buscar con selectall_arrayref()

Notapor mgonzalez » 2010-12-13 09:22 @432

Es el mismo hilo de la conversación anterior.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $encuentra= $dbh->selectall_arrayref("select codigo from documentos where codigo like '$codigo'",{ Slice => {} } ) || die $self->error($self->{dbh}->errstr);
  2.                                 if (@$encuentra) {
  3.                                         $existecodigo ="EL CODIGO YA EXISTE3 $codigo $encuentra";
  4.                                 }else{
  5.                                         my $sth = $dbh->prepare("Update Documentos Set id_sistema =?, id_origen=?, id_tipo = ?, cod_indice=?, codigo=?, correl=?  Where id_docto = ?");
  6.                                         $sth->execute($id_sistema, $id_origen, $id_tipo, $cod_indice, $codigo, $correl_ok, $id_docto);
  7.                                 }
  8.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


más abajo...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if (!(@$encuentra)) {
  2.                 $dbh->commit;
  3.                 print redirect("$cgi_origen?id_docto=$id_docto&id_version=$id_version");
  4.                 print "\n\n";
  5.         }
  6.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿me entiendes?
mgonzalez
Perlero nuevo
Perlero nuevo
 
Mensajes: 28
Registrado: 2010-10-13 08:54 @412

Re: Buscar con selectall_arrayref()

Notapor explorer » 2010-12-13 10:24 @475

commit() no sirve de cada si a la hora de abrir la base de datos el valor del indicador AutoCommit está puesto a un valor verdadero (que por defecto así lo tiene).

¿Por qué no metes el commit() dentro del primer if()?

Incluso mejor, si el AutoCommit ya está puesto a un valor verdadero (o si no lo tienes puesto), entonces la línea del commit() sobra.
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: Buscar con selectall_arrayref()

Notapor mgonzalez » 2010-12-13 10:35 @482

Ok, olvidémonos del commit(). Más abajo hay un redirect(), que es lo que me interesa.
mgonzalez
Perlero nuevo
Perlero nuevo
 
Mensajes: 28
Registrado: 2010-10-13 08:54 @412

Re: Buscar con selectall_arrayref()

Notapor explorer » 2010-12-13 10:46 @490

El redirect() yo lo veo bien, salvo por los siguientes detalles a tener en cuenta:

* es correcta la forma en que lo pones, si al principio del programa lo has importado de esta manera:

use CGI qw/:standard/;

Si no, es posible que tengas algo como

my $cgi = CGI->new;

entonces la línea deberías ponerla como

$cgi->redirect( ... )

* El print() que hay después no sirve para nada. Cambialo por un exit;

* Y lo más importante... ANTES del redirect() no tiene que haberse enviado NADA a la salida estándar (alias, página del usuario). Ni SIQUIERA, un header(). Nada. Nothing.
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 6 invitados