Página 1 de 1

Métodos para llenar popup_menu POO

NotaPublicado: 2014-03-19 09:19 @430
por sarriaga
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

Re: Métodos para llenar popup_menu POO

NotaPublicado: 2014-03-19 10:54 @495
por explorer
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.001 segundos, usando GeSHi 1.0.8.4

Re: Métodos para llenar popup_menu POO

NotaPublicado: 2014-03-19 11:23 @516
por sarriaga
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.002 segundos, usando GeSHi 1.0.8.4

Re: Métodos para llenar popup_menu POO

NotaPublicado: 2014-03-19 16:10 @715
por explorer
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.

Re: Métodos para llenar popup_menu POO

NotaPublicado: 2014-03-25 11:23 @516
por sarriaga
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.