• Publicidad

Fichero contador de facturas

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

Fichero contador de facturas

Notapor josele » 2014-03-29 17:33 @773

Buenas noches.

Me estoy volviendo loco pues he de realizar una pequeña modificación en un programa de facturación y no encuentro cómo hacerlo.

El asunto es que el programa en Perl ha de abrir un fichero donde se encuentra el número de cliente y el número de la última factura, algo así como:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
987;1
1030;1
987;2
1030;2
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
compararlo con el número de cliente que se está facturando.

El programa ha de quedarse con el último número, excepto si el número de cliente no existe aún en dicho fichero en cuyo caso el número de factura ha de ser "1", y sumarle uno y después grabar los datos de la última factura en el fichero.

Lo he conseguido si solo manejo un cliente, pero en cuanto meto más de uno no sé por qué pero siempre me asigna 1 a todas las facturas.

Aquí está mi código:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. # Generamos y comprobamos el número de la factura.
  2.  
  3. open( NoFACTURAS, "NoFACTURAS.txt" ) || die "ERROR";
  4. while (<NoFACTURAS>) {
  5.     ( $id_nofac, $_nofac ) = split /;/, $_;
  6.  
  7.     # Eliminamos el salto de linea de la variable $_nofac.
  8.     chomp($_nofac);
  9.     if ( $matricula eq $id_nofac ) {
  10.         print "ID coincide $id_nofac\n";
  11.         print "Número de factura anterior $_nofac\n";
  12.         $_nofac++;
  13.         print "No factura +1 = $_nofac\n";
  14.     }
  15. }
  16. if ( $_nofac eq '' )                   # Si no hay número de factura anterior entonces...
  17. {
  18.     $_nofac = "1"                      # el número de factura es 1
  19. }
  20. print "factura número $_nofac\n";
  21. print "matricula número $matricula\n";
  22. print "id_nofac número $id_nofac\n";
  23.  
  24. # Grabamos la línea de la nueva factura
  25. close(NoFACTURAS);
  26. open( SALIDANoFACTURAS, ">>NoFACTURAS.txt" ) || die "ERROR";
  27. print SALIDANoFACTURAS "$matricula;$_nofac\n";
  28. close(SALIDANoFACTURAS);
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4



Al final siempre el número de factura es "1".

¿Alguien ve dónde he metido la pata?

Muchas gracias.
--
Josele
Última edición por explorer el 2014-03-29 17:45 @781, editado 1 vez en total
Razón: Formateado de código con Perltidy y poner marcas Perl
josele
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2012-09-11 20:03 @877

Publicidad

Re: Fichero contador de facturas

Notapor explorer » 2014-03-29 18:13 @801

No veo el error, pero es muy posible que sea debido a la presencia de espacios en blanco al final del archivo.

En el bucle while estás leyendo el código de la última factura, pero no estás comprobando que lo esté haciendo bien. Si la última línea del archivo está en blanco, $_nofac será '' al final del bucle, por lo que te genera una factura 1.

Y... si no lo he entendido mal, creo que hay otro error: Si vas a llevar una numeración de facturas distinta por cada cliente, debes recordar cuál es el último número de factura de ese cliente. Si solo usas $_nofac para guardar ese número, fíjate que es actualizado por cada línea del archivo. Si da la casualidad de que la última línea del archivo sí coincide con el id del cliente, entonces $_nofac sí que coincide con el último número de factura de ese cliente. Pero esto no es lo normal. Lo normal es que el archivo puede terminar con cualquier cliente. Y el último $_nofac que salga será el de ese cliente, que no coincidirá con el de $matricula.

Esta es una solución. Se ejecuta pasándole como primer argumento el número de cliente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. # Generamos y comprobamos el número de la factura.
  3. #
  4. # Ejemplo:
  5. #
  6. # perl code_36993_1.pl 987
  7. #
  8.  
  9. my $matricula = shift;  # el número de matrícula se lo pasamos por argumento
  10.  
  11. open( NoFACTURAS, "NoFACTURAS.txt" ) or die "ERROR";
  12.  
  13. my $ultima_nofac = 0;                                           # inicializamos a cero por si es un nuevo cliente
  14.  
  15. while (<NoFACTURAS>) {
  16.     my ( $id_nofac, $_nofac ) = split /[;]/;
  17.  
  18.     # Eliminamos el salto de linea de la variable $_nofac.
  19.     chomp($_nofac);
  20.     if ( $matricula eq $id_nofac ) {
  21.         print "ID $matricula. Factura $_nofac\n";
  22.         $ultima_nofac = $_nofac;
  23.     }
  24. }
  25.  
  26. close(NoFACTURAS);
  27.  
  28. $ultima_nofac++;                                                # siguiente
  29.  
  30. print "Nueva factura: $matricula. Factura $ultima_nofac\n";
  31.  
  32.                                                                 # Grabamos la línea de la nueva factura
  33. open( SALIDANoFACTURAS, ">>NoFACTURAS.txt" ) or die "ERROR";
  34. print SALIDANoFACTURAS "$matricula;$ultima_nofac\n";
  35. close(SALIDANoFACTURAS);
Coloreado en 0.001 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: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Fichero contador de facturas

Notapor josele » 2014-03-31 12:28 @561

Muchísimas gracias, era justo eso, cambiar el nombre a la variable una vez obtenida para evitar que se confundiera con las siguientes lecturas.

En mi caso he quitado los "my" pues necesito que esos valores vayan mas allá de la subrutina.

Gracias de nuevo y enhorabuena por tu trabajo en el foro.
--
Josele
josele
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2012-09-11 20:03 @877


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron