Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Crear Trigger para Generar Numero de Serie en SQL Server 2008 Express

Estas en el tema de Crear Trigger para Generar Numero de Serie en SQL Server 2008 Express en el foro de SQL Server en Foros del Web. Buenos dias A todos y muchas gracias por su tiempo ojala y me puedan ayudar con esto. Necesito Hacer un Trigger para Generar los Numero ...
  #1 (permalink)  
Antiguo 10/08/2012, 09:43
 
Fecha de Ingreso: agosto-2012
Mensajes: 13
Antigüedad: 11 años, 8 meses
Puntos: 0
Crear Trigger para Generar Numero de Serie en SQL Server 2008 Express

Buenos dias A todos y muchas gracias por su tiempo ojala y me puedan ayudar con esto.


Necesito Hacer un Trigger para Generar los Numero de Comprobante Fiscal para una Factura de venta ( Dichos Numeros Tienen el Siguiente Formato A010010010100000001) y cada vez que se registra una factura de venta Nueva hay que incrementar en uno(1) este número para asignarselo a la nueva factura (ej: A010010010100000002).


Algunos detalles a tener en cuenta sobre el número de Comprobante Fiscal:

1) Los Primeros 11 caracteres son Fijos "A0100100101"
2) Los demás son la Secuencia "00000001
3) No se Pueden Repetir y es Obligatorio que al registrar cada factura de Venta se le Asigne un Número de Comprobante Fiscal


Tengo una Tabla Llamada Numeros de Serie para Guardar los Números de Comprobantes Fiscal Con la Siguiente Estructura


Número Inicial nvarchar(19)
Número Final nvarchar(19)
último Número Utilizado nvarchar(19) // Este campo Guarda el Número que se le a Asignado a la última factura realizada.


Antés de registrar la factura en la Base de datos, en la tabla Numeros de Serie ya tengo llenos los campos Número_Inicial y Número_Final porque esta secuencia de numero la entrega el Gobierno. (Ej: Número inicial: A010010010100000001, Número Final: A010010010100000050).


El Trigger que necesito es para que cuando se Guarde una Nueva factura de ventas se le asigne este número de comprobante Fiscal en la Tabla Cabecera_de_ventas y se actualice la Tabla Numeros de Serie.


Gracias por Regalarme un poco de tu tiempo y por la ayuda que puedan brindarme.

Saludos,

Alberto.
  #2 (permalink)  
Antiguo 10/08/2012, 10:05
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Crear Trigger para Generar Numero de Serie en SQL Server 2008 Express

y que llevas de tu trigger? Tendrias que hacer el trigger after insert, despues tomar el ultimo valor de tu secuencia (A010010010100000050 en este caso sabes que los primeros 12 numeros son fijos asi que con un substring(cadena,12,len(cadena)) sacas la secuenci), despues convertir la secuencia a Int para poder incrementarla(te quedaria el 50) despues de eso tomar la longitud del numero y al total de 0 restarle ese numero ya despues de ahi es nada mas concatenar los 0's con el numero y ponerlo en tu secuencia final :)....... ahora te toca a ti hacerlo en sql :)

bueno ya que jajaja me gano e hice el query


Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. serie VARCHAR(MAX)
  4. )
  5.  
  6. INSERT INTO #temp VALUES ('A010010010100000000')
  7.  
  8. DECLARE @valor VARCHAR(MAX)
  9. DECLARE @cadena VARCHAR(MAX)
  10. DECLARE @numero INT
  11. DECLARE @x INT
  12. DECLARE @serie VARCHAR(MAX)
  13.  
  14. SELECT top 1 @valor=serie FROM(
  15. SELECT serie,CONVERT(INT,SUBSTRING(serie,12,len(serie))) AS numero FROM #temp
  16. )AS t1 ORDER BY numero DESC
  17.  
  18. SELECT @cadena=SUBSTRING(@valor,12,len(@valor))
  19. SET @numero=CONVERT(INT,@cadena)
  20. SET @numero=@numero+1
  21. SET @x=1
  22. SET @serie=''
  23. while @x <=(8-(SELECT len(CONVERT(VARCHAR(10),@numero))))
  24. BEGIN
  25.     SET @serie=@serie + '0'
  26.     SET @x=@x+1
  27. END
  28. SET @serie=@serie + CONVERT(VARCHAR(10),@numero)
  29. SET @serie='A0100100101' + @serie
  30. INSERT INTO #temp VALUES (@serie)

ahora nada mas tendrias que usar el trigger y despues de un insert sacar el valor (usando tus tablas claro esta) y pegarle la secuencia :)

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Última edición por Libras; 10/08/2012 a las 10:18
  #3 (permalink)  
Antiguo 10/08/2012, 10:45
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Crear Trigger para Generar Numero de Serie en SQL Server 2008 Express

y te sirvio el queyr?
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #4 (permalink)  
Antiguo 10/08/2012, 12:15
 
Fecha de Ingreso: agosto-2012
Mensajes: 13
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Crear Trigger para Generar Numero de Serie en SQL Server 2008 Express

Lo voy a probar ahora y Escribo como me fue...Muchas Gracias por tu tiempo...
  #5 (permalink)  
Antiguo 10/08/2012, 15:25
 
Fecha de Ingreso: agosto-2012
Mensajes: 13
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Crear Trigger para Generar Numero de Serie en SQL Server 2008 Express

Muchas Gracias por Tu Respuesta y por el Tiempo que has dedicado para mi.


He aplicado el código que aparece mas abajo y me genera el nuevo Número de NCF (el tuyo tambien pero este me parecio mas sencillo de entender para mi, aunke no tendria ningun inconveniente en aplicar el tuyo si incluyera los puntos que aclaro mas abajo), pero me he dado cuenta de algunas cosas que no te especifique al Principio y es lo siguiente:

1) En la Tabla Números de serie hay un campo que se llama código el cual es la Clave primaria de la Tabla, y en la tabla de Facturas al momento de registrarse la factura de venta hay un campo llamado código tambien que contiene cual código de la Tabla Numeros de serie debe afectar el update de la Tabla Numeros de Serie, lo cual el trigger no esta tomando en cuenta y no se como ponerlo en el Where de la tabla Numero de Serie.

Ejemplo:

Campo Factura.Código Tiene el Valor "NCF" EN LA TABLA Numeros de Serie el Campo Código tiene varios codigos dentro de los Cuales esta "NCF" que es que deberia actualizar...Ahora como esta el Trigger me los afecta todos con el Nuevo numero generado.

2) ¿Existe alguna forma de que no tenga que especificarle el NCF (A010010010100000000) en el campo último utilizado sino que cuando este campo este vacio tome el que este en el campo numero inicial pero si esta lleno que tome el último utilizado para hacer el incremento? o recomiendas que sea asi mejor?.

3)¿Si utilizo este trigger no importa cuantos usuarios esten registrando facturas al mismo tiempo, le asignara un numero de Serie diferente a cada factura? Cierto o Falso? Controlar esto es la razón Fundamental por la que quiero utilizar un Trigger.

Muchas Gracias por Tu Apoyo, muy valioso Aporte y mil disculpas por hacer este tipo depreguntas, pero es que me estoy iniciando en el Mundo de la programación y manejo de base de datos.

Saludos,

Alberto


Este es el Código que tengo en la Base de Datos actualmente:


USE [Prueba]
GO
/****** Object: Trigger [dbo].[TI_Factura] Script Date: 08/11/2012 17:13:10 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[TI_Factura] ON [dbo].[Factura] FOR INSERT AS
DECLARE @Generado as Varchar(19)

SELECT @Generado =LEFT(Ultimo_Utilizado,11) +
RIGHT('00000000' + CAST(CAST(RIGHT(Ultimo_Utilizado,8) AS Int) + 1 AS Varchar(8)),8) FROM table_3

UPDATE Factura SET ncf = @Generado FROM inserted
WHERE Inserted.id = Factura.id

UPDATE table_3 Set Ultimo_Utilizado = @Generado
  #6 (permalink)  
Antiguo 10/08/2012, 15:53
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Crear Trigger para Generar Numero de Serie en SQL Server 2008 Express

...............................
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Última edición por Libras; 10/08/2012 a las 15:54 Razón: Respondi pero me arrepenti de lo que puse..............
  #7 (permalink)  
Antiguo 10/08/2012, 19:36
 
Fecha de Ingreso: agosto-2012
Mensajes: 13
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Crear Trigger para Generar Numero de Serie en SQL Server 2008 Express

Para este Caso en especifico cual Nivel Isolacion me recomiendas....?
  #8 (permalink)  
Antiguo 12/08/2012, 17:54
 
Fecha de Ingreso: agosto-2012
Mensajes: 13
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Crear Trigger para Generar Numero de Serie en SQL Server 2008 Express

Muchas Gracias Libras por toda la Ayuda que me has Ofrecido Tu código me Funciona a la Perfección.

Me Gustaria Saber como podria agregar una condición que valide si el Campo Ultimo_Utilizado esta Vacio o sea Null que le asigne a la Factura el Ncf que este en el Campo Número Inicial de lo contrario que incremente el Ultimo_Utilizado que es lo que hace el siguiente trigger:

USE [Prueba]
GO
/****** Object: Trigger [dbo].[TI_Factura] Script Date: 08/13/2012 19:26:23 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[TI_Factura] ON [dbo].[Factura] FOR INSERT AS


declare @valor varchar(19)
declare @cadena varchar(19)
declare @numero int
declare @x int
declare @serie varchar(19)

DECLARE @CADENA2 varchar(19)
DECLARE @Prueba varchar(19)

SELECT @valor=[Ultimo_Utilizado] FROM(
SELECT [Ultimo_Utilizado],convert(int,substring([Ultimo_Utilizado],12,len([Ultimo_Utilizado]))) AS numero FROM Table_3 where codigo=(Select Inserted.codigo from Inserted where Inserted.codigo = table_3.codigo)
)AS t1 ORDER BY numero DESC

SELECT @cadena=substring(@valor,12,len(@valor))
SELECT @CADENA2 =substring(@valor,1,11)
SET @numero=convert(int,@cadena)
SET @numero=@numero+1
SET @x=1
SET @serie=''

while @x <=(8-(SELECT len(convert(varchar(10),@numero))))
begin
SET @serie=@serie + '0'
SET @x=@x+1
end
SET @serie=@serie + convert(varchar(10),@numero)

Set @serie=@CADENA2 + @serie

--SET @serie='A0100100101' + @serie Si CADENA2 Funciona borrar esta linea
--INSERT INTO #temp values (@serie)

UPDATE Factura SET NCF = @serie FROM inserted
WHERE Inserted.id = Factura.id

Update Table_3
Set Ultimo_Utilizado= @serie,
Resultado = @CADENA2
--where Codigo='NCFCR'

WHERE table_3.Codigo = (Select Inserted.codigo from Inserted where Inserted.codigo = table_3.codigo)


Saludos,

hondaalberto
  #9 (permalink)  
Antiguo 13/08/2012, 08:05
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Crear Trigger para Generar Numero de Serie en SQL Server 2008 Express

select case when
isnull(campo,0)=0 then '00000' else valor_campo end as campo from tabla


saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #10 (permalink)  
Antiguo 14/08/2012, 15:24
 
Fecha de Ingreso: agosto-2012
Mensajes: 13
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Crear Trigger para Generar Numero de Serie en SQL Server 2008 Express

Muchas Gracias Libras ojala este ejemplo le sirva a otra persona...

Etiquetas: express, numero, serie, server, sql, tabla, trigger, campos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:12.