• Publicidad

Envío de variables para impresión de etiquetas en OOP

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

Envío de variables para impresión de etiquetas en OOP

Notapor sarriaga » 2014-07-15 11:20 @514

Hola, ¿qué tal?

Me pongo en contacto con ustedes ya que tengo un conflicto para enviar variables de un método a otro.

Les explico de qué trata este proyecto:

Se tiene una interfaz junto con un método que nos permite dar de alta un articulo; al darlo de alta lo guarda en la base de datos, pero además nos genera una etiqueta con un código de barras para escanear cuando hay entrada o salida de un almacén de ese artículo. También existe la posibilidad de reimprimir la etiqueta y es aquí donde hay conflictos ya que los datos no los envía al método donde se realiza la reimpresión (tómese en cuenta que realiza una impresión como la primera, solo que en la reimpresión ya existen datos cargados que solo debe tomar e imprimir nuevamente).

¿Podrían apoyarme? Ya que se ha tratado de enviar los datos de varias maneras y no se ha tenido éxito.

En este método recibo de una interfaz los datos para dar de alta un articulo e imprimir etiqueta:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub impresion_etiquetas_articulos {
  2.     my ( $self, $dbh ) = ( shift, &$connect );
  3.  
  4.     my $timestamp        = &$get_now;
  5.     my $nombre           = $q->param('NOMBRE');
  6.     my $unidad           = $q->param('UNIDAD');
  7.     my $parametro        = $q->param('PARAMETRO');
  8.     my $filtro           = $q->param('filtro');
  9.     my $descripcion      = $q->param('DESCRIPCION');
  10.     my $numero_etiquetas = $q->param('NUMERO_ETIQUETAS');
  11.     my $etiqueta_ch      = 'etiarticulos';
  12.     my $consecutivo      = $dbh->selectall_arrayref("SELECT *FROM CONSECUTIVOS");
  13.  
  14.     if ( $filtro ne 'ARTICULOS' ) {
  15.         if ( defined $nombre && length $nombre && defined $unidad && length $unidad ) {
  16.             my $path                         = &generate_etiqueta_articulos;
  17.             my $address->{etiquetaArticulos} = "$path?nombre=$nombre&filtro=$filtro&consecutivo=$consecutivo->[0]->[0]";
  18.             my $etiqueta_articulos           = ( $address->{etiquetaArticulos} );
  19.  
  20.             open( CMD, "| lpr -P $etiqueta_ch -o portrait -o fit-to-page -o media=Custom.3x1.5in" );
  21.             for ( my $con = 0; $con < $numero_etiquetas; $con++ ) {
  22.                 print CMD $etiqueta_articulos;
  23.             }
  24.             close CMD;
  25.         }
  26.     }
  27. }
  28.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Y en este método se hacen algunas validaciones para imprimir con el CMD del método impresion_etiquetas_articulos y reimpresion_etiquetas :
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub generate_etiqueta_articulos {
  2.     my ( $self, $dbh ) = ( shift, &$connect );
  3.  
  4.     my $consecutivo = $dbh->selectall_arrayref("SELECT *FROM CONSECUTIVOS");
  5.     $consecutivo->[0]->[0] = $consecutivo->[0]->[0] - 1;
  6.     my $unidad      = $q->param('UNIDAD');
  7.     my $timestamp   = &$get_now;
  8.     my $nombre      = $q->param('NOMBRE');
  9.     my $filtro      = $q->param('filtro');
  10.     my $descripcion = $q->param('DESCRIPCION');
  11.  
  12.     my %etiqueta_parametros;
  13.     my $id = $dbh->selectall_arrayref("SELECT ID FROM ARTICULOS WHERE NOMBRE='$nombre'");
  14.  
  15.     unless ( defined $filtro ) {
  16.         $| = 1;
  17.         print "Content-type: text/html\n\n";
  18.         open( STDERR, '>&STDOUT' ) || die $!;
  19.         die "tipo?";
  20.     }
  21.  
  22.     unless ( defined $nombre ) {
  23.         $| = 1;
  24.         print "Content-type: text/html\n\n";
  25.         open( STDERR, '>&STDOUT' ) || die $!;
  26.         die "articulo?";
  27.     }
  28.  
  29.     unless ( defined $consecutivo->[0]->[0] =~ /^\d{1,6}$/ ) {
  30.         $| = 1;
  31.         print "Content-type: text/html\n\n";
  32.         open( STDERR, '>&STDOUT' ) || die $!;
  33.         die "consecutivo?";
  34.     }
  35.  
  36.     $etiqueta_parametros{filtro}      = ($filtro);
  37.     $etiqueta_parametros{nombre}      = $nombre;
  38.     $etiqueta_parametros{consecutivo} = $consecutivo->[0]->[0];
  39.  
  40.     my $script = 'etiqueta_alta_articulos.pl';
  41.  
  42.     my $redirect = "Location: /.../$script?";
  43.     $redirect .= "&$_=$etiqueta_parametros{$_}" foreach keys %etiqueta_parametros;
  44.     print "$redirect\n\n";
  45. }
  46.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Y por último, el método de reimpresión, donde existe el problema para recibir los datos y enviarlos al método generate_etiqueta_articulos, se toma de la interfaz el 'id' del artículo del cual quieres reimprimir etiquetas y hace consulta de lo que ya se tiene generado:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub reimpresion_etiquetas {
  2.     my ( $self, $dbh ) = ( shift, &$connect );
  3.  
  4.     my $id               = $q->param('ARTICULOS');
  5.     my $numero_etiquetas = $q->param('NUMERO_ETIQUETAS');
  6.  
  7.     my $consulta = ( $dbh->selectall_arrayref("SELECT *FROM IMPRESION_ETIQUETAS_ARTICULOS WHERE ID_ARTICULO=$id") );
  8.     my $consulta_articulos = ( $dbh->selectall_arrayref("SELECT NOMBRE FROM ARTICULOS WHERE ID=$id") );
  9.  
  10.     my $etiqueta_ch        = 'etiarticulos';
  11.     my $nombre             = $q->param('NOMBRE');
  12.     $nombre = $consulta_articulos->[0]->[0];
  13.  
  14.     my $hdd                   = $q->hidden( -name => 'NOMBRE', -values => $nombre, -override => 1 );
  15.     my $filtro                = $consulta->[0]->[5];
  16.     my $consecutivo->[0]->[0] = $consulta->[0]->[2];
  17.  
  18.     if ( $filtro ne 'ARTICULOS' ) {
  19.         if ( defined $nombre && length $nombre ) {
  20.             my $path                         = &generate_etiqueta_articulos;
  21.             my $address->{etiquetaArticulos} = "$path?nombre=$nombre&filtro=$filtro&consecutivo=$consecutivo->[0]->[0]";
  22.             my $etiqueta_articulos           = ( $address->{etiquetaArticulos} );
  23.  
  24.             open( CMD, "| lpr -P $etiqueta_ch -o portrait -o fit-to-page -o media=Custom.3x1.5in" );
  25.             for ( my $con = 0; $con < $numero_etiquetas; $con++ ) {
  26.                 print CMD $etiqueta_articulos;
  27.             }
  28.             close CMD;
  29.         }
  30.         else {
  31.             return 'ERROR: Faltaron campos por llenar';
  32.         }
  33.     }
  34. }
  35.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


¡Espero sus respuestas o sugerencias! Saludos :D
Última edición por explorer el 2014-07-15 12:33 @565, editado 1 vez en total
Razón: Formateado de código con Perltidy
sarriaga
Perlero nuevo
Perlero nuevo
 
Mensajes: 69
Registrado: 2013-10-21 08:42 @404

Publicidad

Re: Envío de variables para impresión de etiquetas en OOP

Notapor explorer » 2014-07-15 12:47 @574

Vamos a ver... dices que esto está programado siguiendo el paradigma de programación orientado a objetos...

Y resulta que las variables $self (que supondremos que son referencias al objeto de la aplicación), no se utilizan NUNCA.

Todos los parámetros los estás leyendo con param() o con consultas a las bases de datos.

Luego... en la línea 20 de reimpresion_etiquetas() llamas a generate_etiqueta_articulos(), esperando un valor para $path, pero... en generate_etiqueta_articulos(), ¿dónde está el return?

Si no hay return(), el valor que devuelve la función es el de la última instrucción ejecutada. Como es un print "$redirect\n\n";, la función retorna el resultado de la ejecución de ese print(). En situaciones normales, un print() siempre se ejecuta, así que lo que devuelve es un '1', indicando el éxito del print(). Y eso es lo que devuelve generate_etiqueta_articulos() a $ruta.

Menudo follón de código tienes montado... Por favor, quita el defined() de la línea 29 de generate_etiqueta_articulos(). Y separa el '*' del 'FROM'. Y... :)
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: Envío de variables para impresión de etiquetas en OOP

Notapor sarriaga » 2014-07-15 13:02 @585

Ok ¡Entiendo! Vamos a revisarlo detalladamente, realizamos los ajustes y vemos qué pasa.
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 3 invitados