Buscar huecos


#1

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!


#2

El día 15 de diciembre de 2008 11:36, Juan JosŽé Vidal
Agust’ínremoved_email_address@domain.invalid
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é :slight_smile:

f.


#3

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ó:


#4

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 G.
removed_email_address@domain.invalid
escribió:> El día 15 de diciembre de 2008 11:36, Juan JosŽé Vidal Agust’ín

removed_email_address@domain.invalid escribió:


#5

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 G.
removed_email_address@domain.invalidescribió: