Ver Mensaje Individual
  #11  
Antiguo 20-05-2008
xjre xjre is offline
Miembro
 
Registrado: feb 2008
Posts: 13
Reputación: 0
xjre Va por buen camino
Hola ¿Que tal?

Mira, yo te voy a dar la perspectiva desde la que trabajo yo. No utilizo IDENTITY salvo cuando quiero armar una lista en una tabla temporal y ponerle el numeraje a las lineas. La razón por la cual hago es es, simple y llanamenta , porque asi me acostumbraron (supuestamente "no recomiendan en ningun lado usar identity" porque no se que razón bla bla, nunca lo vi en google, para mi es un mito)

Ahora bien, ¿Cómo indexo entonces?

Suponete que tenemos la tabla HeaderPedido con un campo llamado NumeroPedido y otro no se, NombrePedido

Entonces:




Código SQL [-]
Begin tran

declare @NumeroPedido int

set @NumeroPedido = IsNull((select Max(NumeroPedido) from HeaderPedido),0) + 1

Insert HeaderPedido(NumeroPedido, NombrePedido)
Values(@NumeroPedido, 'Bla')

If @@error <> 0
goto Error


Commit Tran
select @NumeroPedido as NumeroPedido



Error:
Rollback
select 0 as NumeroPedido





Ahora, en mi caso al menos yo no borraría nunca un pedido sino perdería el historial de pedidos (incluso los que se borraron). De hecho, si tenes un Primary Key en una tabla, es porque casi seguro la estas relacionando con otra. Suponete que tenga otra tabla que sea "ItemPedido" cuyas columnas sean: NumeroPedido, NumeroItem, NombreItem. Si vos renumeras la columna NumeroPedido de la tabla HeaderPedido, vas a perder la conexión. Mas aún, si vos tenes una relación física en la base de datos, ni siquiera te va a dejar borrarla.

Respondiendo a lo que vos apuntas y aplicandolo al ejemplo que estoy siguiendo, yo creo que lo que deberías que la tabla HeaderPedido sea:


Código SQL [-]
create table HeaderPedido
(
Id_HeaderPedido int IDENTITY(1,1),
NumeroPedido int,
NombrePedido varchar(50)
)





Entonces la Id la utilizas para las relaciones, y luego el NumeroPedido (en el caso de que en tu lógica de negocio se pueda hacer) le asignas correlativo o alguna que falte en el medio.

Ponele que haces un procedimiento para eso:


Código SQL [-]
create proc NumeroPedidoLibre
(
@NumeroPedido int output
)
as
BEGIN

// Declaro variables a usar
declare @Auxiliar int, @Contador int

//Inicializo Contador
set @Contador = 1
set @NumeroPedido = 0

// Declaro un cursor que recorra la tabla HeaderPedido

declare pedidos cursor for select NumeroPedido from HeaderPedido
open pedidos

fetch next from pedidos into @Auxiliar

while @@fetch_status = 0 and @NumeroPedido = 0
BEGIN

//Como la variable Contador va sumando de a uno
// se supone que si en algun momento la variable
// auxiliar no es igual al contador es porque el
// numero pedido igual al contador no existe

if(@Auxiliar <> @Contador)
Begin
set @NumeroPedido = @Contador
End

set @Contador = @Contador + 1

fetch next from pedidos into @Auxiliar

END
close pedidos
deallocate pedidos

// Si @NumeroPedido es igual a cero, significa que
// existen todos los numeros pedidos y son correlativos

if(@NumeroPedido = 0)
Begin
set @NumeroPedido = @Contador + 1
End

END





Entonces en vez de usar el select max de arriba, usas:


Código SQL [-]

declare @NumeroPedido

exec NumeroPedidoLibre @NumeroPedido output






Y listo, eso debería andar

Cualquier cosa chifla


Saludos
Responder Con Cita