Forum: Rails-ES Buscar huecos

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
E962ae295d82a05193cc180c12bda5d8?d=identicon&s=25 Juan JosŽé Vidal Agust’ín (Guest)
on 2008-12-15 11:37
(Received via mailing list)
Hola,

En mi simple sistema de generación de facturas genero el siguiente
número de factura del siguiente modo: (Creo recordar que esto se lo vi a
Dagi3D, gracias)


   def self.next_factura_number
     year = Time.now.year
     number = Factura.maximum(:number, :conditions => ["fiscal_year =
?", year])
     number = number.nil? ? 1 : number.succ

     return {:fiscal_year =>  year, :number => number}
   end


Esto va bien, lo que sucede, aun siendo casos muy excepcionales, es que
a veces se ha de eliminar una factura. En este caso, la siguiente
factura que se genere habrá de ocupar su lugar en la numeración de
facturación. He de cambiar el método next_factura_number


¿Cómo puedo buscar un "hueco" al hacer un find en una tabla que tengo
valores enteros de forma consecutiva?



Gracias por adelantado
Un saludo!
6f952bee7570a3db2ecba5b06c0062b3?d=identicon&s=25 Fernando Guillen (fguillen)
on 2008-12-15 11:46
(Received via mailing list)
El día 15 de diciembre de 2008 11:36, Juan JosŽé Vidal
Agust'ín<juanjova@um.es>
escribió:
> ¿Cómo puedo buscar un "hueco" al hacer un find en una tabla que tengo
> valores enteros de forma consecutiva?

Con una select enrevesada podría ser:

select
  max(f1.number)
from
  factura as f1
where
  0 = (
    select
      count(f2.*)
    from
      factura as f2
    where
      f2.number = (f1.number+1)
  )

Ahora.. llevar esto a ActiveRecord ya no sé :)

f.
90ea347c45cdfbc1c5767dd6304d9c10?d=identicon&s=25 Borja Martín (Guest)
on 2008-12-15 11:52
(Received via mailing list)
Buenas,
yo creo que una posible solución sería implementar una especia de cola
de 'huecos'. Es decir, cada vez que se borre una factura, tomas su
número y lo guardas en una tabla y la próxima vez que vayas a generar
una nueva, miras si tienes algún número disponible. Si es así, lo
recuperas, se lo asignas a la factura y lo borras. Si no hubiera
ninguno, pues ya usarías el sistema para generar números que estimes
oportuno.

Salud!

Juan JosŽé Vidal Agust’ín escribió:
6f952bee7570a3db2ecba5b06c0062b3?d=identicon&s=25 Fernando Guillen (fguillen)
on 2008-12-15 12:00
(Received via mailing list)
Camnbio mi propuesta en vez de max un min.. así te sacaría el primer
hueco y en caso de no existir ninguno te sacaría el max de todos los
numbers: aquel que no tiene ningún inmediato superior:

select
 min(f1.number)
from
 factura as f1
where
 0 = (
   select
     count(f2.*)
   from
     factura as f2
   where
     f2.number = (f1.number+1)
 )

El día 15 de diciembre de 2008 11:46, Fernando Guillen
<fguillen.mail@gmail.com>
escribió:> El día 15 de diciembre de 2008 11:36, Juan JosŽé Vidal Agust'ín
> <juanjova@um.es> escribió:
>
0cd446ac0fa70a937c5ba9fd17b39d5d?d=identicon&s=25 xurde dix (Guest)
on 2008-12-15 18:10
(Received via mailing list)
En Teoria un programa de Facturacion no deberia Permiter Borrar Factura.
Añades un campo Anulada y lo pones a true cuando la quieres borrar.
Luego
solo muestras la que no esten Anuladas.



El 15 de diciembre de 2008 11:59, Fernando Guillen
<fguillen.mail@gmail.com>escribió:
This topic is locked and can not be replied to.