• Publicidad

Métodos para llenar popup_menu POO

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Métodos para llenar popup_menu POO

Notapor sarriaga » 2014-03-19 09:19 @430

Hola, ¿qué tal? Tengo un problema para llenar un control popup_menu en un .pm en POO.

Les explico lo que intento hacer: es hacer un select de todos los nombres que son distintos en una tabla, junto con su ID. Esta misma manera la he utilizado en programación convencional, es decir, en scripts pl y funciona, pero no sé si en los métodos del pm se realiza de la misma manera.

Espero puedan responderme y ayudarme en dicho conflicto.
Saludos
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub catalogoLineas{ # Obtener todas las líneas
  2.   my $self = shift;
  3.   $self->{Lineas} = $dbh->selectall_arrayref("SELECT DISTINCT(NOMBRE), LINEA_ARTICULO_ID FROM LINEAS_ARTICULOS");
  4.   my (@linea, %linea) = ('');
  5.   if(defined $self->{Lineas}){
  6.     foreach(sort {$a->[1] cmp $b->[1] } @$self->{Lineas}){
  7.       push(@linea, $_->{Lineas}->[1]);
  8.       $self->{Lineas}{$_->{Lineas}->[1]} = "$_->{Lineas}->[0]";
  9.     }
  10.   }
  11.      
  12.  print CGI->popup_menu(-align=>'left',-name=>'tipo', -values=>\@linea, -labels=>\%linea, -override=>1);
  13. }
  14.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
sarriaga
Perlero nuevo
Perlero nuevo
 
Mensajes: 69
Registrado: 2013-10-21 08:42 @404

Publicidad

Re: Métodos para llenar popup_menu POO

Notapor explorer » 2014-03-19 10:54 @495

Sí, se hace de la misma manera, pero no das información de la forma de comunicar el resultado de la ejecución de los métodos, con el programa principal. En el ejemplo que pones, el método saca el resultado de forma directa a la salida estándar (print). No es obligatorio de esta manera, desde luego. Solo es una forma más.

En cuanto al código, se ve un problema grave: confundes %lineas con $self->{Lineas}.

El código corregido sería así (no probado):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub catalogoLineas {                        # obtener todas las líneas
  2.     my $self = shift;
  3.     my (@linea, %linea);
  4.  
  5.     my $array_ref = $dbh->selectall_arrayref("SELECT DISTINCT(NOMBRE), LINEA_ARTICULO_ID FROM LINEAS_ARTICULOS");
  6.     $self->{Lineas} = $array_ref;
  7.  
  8.     if (defined $array_ref){
  9.         for (sort {$a->[1] cmp $b->[1] } @$array_ref) {        # ordenados por ID
  10.             push(@linea, $_->[1]);                               # guardar el ID
  11.             $linea{$_->[1]} = $_->[0];                           # guardar el nombre, indexada por el ID
  12.         }
  13.     }
  14.  
  15.     print CGI->popup_menu(-align => 'left', -name => 'tipo', -values => \@linea, -labels => \%linea, -override=>1);
  16. }
Coloreado en 0.002 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: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Métodos para llenar popup_menu POO

Notapor sarriaga » 2014-03-19 11:23 @516

Lo siento :( es que aún estoy aprendiendo este modo de programación, gracias si funciona así, ahora debo mandarlo llamar en otro método. ¿Se pondría solo de la siguiente manera en el nuevo método?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub displayFormArticulos {                          # BUILDING crear un formulario en interfaz
  2.     my $self = shift;
  3.     $self = CGI->h3( { -align => 'CENTER' }, 'Nuevo articulo' );
  4.     print CGI->table(
  5.         { -border => 0, -align => 'center', -textalign => 'left' },
  6.         CGI->Tr(
  7.             [   CGI->td( { align => 'left' }, 'Nombre: ' . '<br>' )
  8.                     . CGI->td( { -align => 'left' },
  9.                     CGI->textfield( name => 'nom_articulo', -override => 1 ) . '<br>' ),
  10.             ]
  11.         ),
  12.         CGI->Tr(
  13.             [   CGI->td( { -align => 'left' }, 'Almacenable: ' . '<br>' )
  14.                     . CGI->td(
  15.                     { -align => 'left' },
  16.                     CGI->popup_menu(
  17.                         -align    => 'left',
  18.                         -name     => 'almacenable',
  19.                         -values   => [ '', 'S', 'N' ],
  20.                         -override => 1
  21.                         )
  22.                         . '<br>'
  23.                     ),
  24.             ]
  25.         ),
  26.         CGI->Tr(
  27.             [         CGI->td( { -align => 'left' }, 'Tipo: ' . '<br>' )
  28.                     . CGI->td( { -align => 'left' }, $self->catalogoLineas . '<br>' ),
  29.             ]
  30.         ),
  31.  
  32.     );
  33. }
  34.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
sarriaga
Perlero nuevo
Perlero nuevo
 
Mensajes: 69
Registrado: 2013-10-21 08:42 @404

Re: Métodos para llenar popup_menu POO

Notapor explorer » 2014-03-19 16:10 @715

Ya vemos más problemas... :)

Verás: si en la línea 28 llamas al método, para insertar en esa posición el select con el resultado de la consulta SQL, entonces es que el método debe devolverlo con un return, no con un print, como lo tienes ahora.

El método catalogoLineas ejecutará el print. El select saldrá por la salida estándar. El resultado de la ejecución de print será -normalmente- un '1'. Como es también la última sentencia del método, ese será el valor de retorno del método, y ese será el valor que obtendrás si ejecutas el código tal como lo tienes.

Entonces... en catalogoLineas, debes cambiar print por return, para que el select sea devuelto al llamador (que en tu caso es displayFormArticulos).

Esto va en cascada... ¿quién llama a displayFormArticulos? Si es otra función, debes tener en cuenta que displayFormArticulos saca su resultado en pantalla, en el momento en que se le llama, por la misma razón: lo hace con un print.

Por otra parte, la línea 3 seguro que está mal... ¿lees $self en la línea 2 y luego lo sobreescribes con lo que ejecutas en la línea 3? Seguro que no es eso lo que quieres hacer.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Métodos para llenar popup_menu POO

Notapor sarriaga » 2014-03-25 11:23 @516

Lo estoy haciendo todo en un mismo método (me está funcionando de ésta manera), creo que es mejor recoger los valores para procesarlos en otro método que necesito.
sarriaga
Perlero nuevo
Perlero nuevo
 
Mensajes: 69
Registrado: 2013-10-21 08:42 @404


Volver a Básico

¿Quién está conectado?

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