none
Generar código concatenando año y número correlativo RRS feed

  • Pregunta

  • Hola a todos.

    Mi jefe me ha pedido que mi tabla "Documentos" debe autogenerar el código concatenando el año en curso y un correlativo de 4 dígitos por ejemplo: 20170001, el siguiente registro debe generar el código 20170002 y así sucesivamente hasta 20179999.

    cuando lleguemos al año 2018 y se guarde un nuevo registro, debe generar el código 20180001. es decir al cambiar de año el correlativo regresa a 1.

    Alguien tiene u ejemplo de como hacerlo?.

    Gracias!!!!

    martes, 3 de octubre de 2017 15:33

Respuestas

  • Amigos

    realice una función que autogenera el codigo, para ello recibe el año lo cual se obtiene de la función year(getdate) me quedo así:

    declare @año varchar(4) = year(getdate())

    select FNC_SCP_GenerarCodSolicitud (@año)

    Create function [dbo].[FNC_SCP_GenerarCodSolicitud] ( @anio VARCHAR(4) ) RETURNS VARCHAR(9) as begin DECLARE @Reg int DECLARE @CODIGO VARCHAR(9) set @Reg = (SELECT COUNT (*) from SOLICITUD) if @Reg = 0 begin SET @CODIGO = @anio + '0001' end else begin DECLARE @ANIOSOL VARCHAR(4) DECLARE @CODSOL INT set @ANIOSOL = (select top 1 substring(NEWCODSOL,1,4) from SOLICITUD ORDER BY IDSOLICITUD DESC) set @CODSOL = (select top 1 substring(NEWCODSOL,5,5) from SOLICITUD ORDER BY IDSOLICITUD DESC) IF @anio = @ANIOSOL BEGIN IF @CODSOL >= 9999 BEGIN DECLARE @CODSOL_5 INT SET @CODSOL_5 = @CODSOL + 1 SET @CODIGO = @anio + RIGHT('00000' + Ltrim(Rtrim(@CODSOL_5)),5) END ELSE BEGIN SET @CODSOL = @CODSOL + 1 SET @CODIGO = @anio + RIGHT('0000' + Ltrim(Rtrim(@CODSOL)),4) END END ELSE BEGIN SET @CODIGO = @anio + '0001' END END RETURN @CODIGO END


    como verán también controlo cuando el autogenerado llega a 9999 y si por casos excepcionales se agregan 10,000 solicitudes, la función no se cae, continua generando codigo correlativo hasta 201799999, sin embargo no es muy posible que esto ocurra porque las solicitudes no llegan ni a 1000 al año, sin embargo la contingencia esta cubierta.

    gracias por sus comentarios y apoyo!!!....

    • Marcado como respuesta MateoDeveloper martes, 3 de octubre de 2017 22:57
    martes, 3 de octubre de 2017 22:57

Todas las respuestas

  • Los pasos serían (en pseudo-código, hay que traducirlos a correcto SQL, teniendo en cuenta las conversiones de numérico a varchar y viceversa, entre otras cosas):

    1) Select max(codigo) from laTabla where left(codigo,4)=AñoActual

    2) Separar el rgiht(codigo, 4) a partir del max devuelto por la anterior

    3) Sumarle 1 a ese valor

    4) rellenarlo con ceros a la izquierda hasta 4 posiciones

    5) concatenarle por la izquierda el año actual.

    6) Grabar el registro que utiliza ese código

    Estos pasos se podrían hacer desde código cliente, o en el servidor desde un procedimiento almacenado o incluso desde un trigger. Todo depende de cómo y cuándo se quieran generar esos códigos.

    Si el programa es multi-usuario, hay que hacer todos esos pasos dentro de una transacción, para impedir que se solapen dos cálculos simultáneamente.

    martes, 3 de octubre de 2017 20:20
  • Si lo que deseas es desde la misma BD tienes que usar Tigger que actualizen tu campo al cual lo  llamaria correlativo pero usarlo como idk no seria tan factible ya que para eso existen los IDENTITY lo que podrias hacer  algo asi:

    correlativo , Anio 'Aunque si tienes un campo fproceso lo podrias sacar de ahi para mostrar con un DATE_FORMAT  O FORMAT en cliente o el mismo SQL  

    1                2017

    2                2017  

    Yo he generado correlativos diarios para obtener cuantas transacciones se hacen por dias pero hacerlo cada año no le veo el fin. Haces un count por fecha de proceso y asi insertas el correlativo diario el anio solo es una parte de la fecha de proceso.


    martes, 3 de octubre de 2017 20:42
  • Amigos

    realice una función que autogenera el codigo, para ello recibe el año lo cual se obtiene de la función year(getdate) me quedo así:

    declare @año varchar(4) = year(getdate())

    select FNC_SCP_GenerarCodSolicitud (@año)

    Create function [dbo].[FNC_SCP_GenerarCodSolicitud] ( @anio VARCHAR(4) ) RETURNS VARCHAR(9) as begin DECLARE @Reg int DECLARE @CODIGO VARCHAR(9) set @Reg = (SELECT COUNT (*) from SOLICITUD) if @Reg = 0 begin SET @CODIGO = @anio + '0001' end else begin DECLARE @ANIOSOL VARCHAR(4) DECLARE @CODSOL INT set @ANIOSOL = (select top 1 substring(NEWCODSOL,1,4) from SOLICITUD ORDER BY IDSOLICITUD DESC) set @CODSOL = (select top 1 substring(NEWCODSOL,5,5) from SOLICITUD ORDER BY IDSOLICITUD DESC) IF @anio = @ANIOSOL BEGIN IF @CODSOL >= 9999 BEGIN DECLARE @CODSOL_5 INT SET @CODSOL_5 = @CODSOL + 1 SET @CODIGO = @anio + RIGHT('00000' + Ltrim(Rtrim(@CODSOL_5)),5) END ELSE BEGIN SET @CODSOL = @CODSOL + 1 SET @CODIGO = @anio + RIGHT('0000' + Ltrim(Rtrim(@CODSOL)),4) END END ELSE BEGIN SET @CODIGO = @anio + '0001' END END RETURN @CODIGO END


    como verán también controlo cuando el autogenerado llega a 9999 y si por casos excepcionales se agregan 10,000 solicitudes, la función no se cae, continua generando codigo correlativo hasta 201799999, sin embargo no es muy posible que esto ocurra porque las solicitudes no llegan ni a 1000 al año, sin embargo la contingencia esta cubierta.

    gracias por sus comentarios y apoyo!!!....

    • Marcado como respuesta MateoDeveloper martes, 3 de octubre de 2017 22:57
    martes, 3 de octubre de 2017 22:57
  • Asi como esta te genera 201700002500 por ejemplo.

    Este codigo es mas compacto

    create FUNCTION CONSECUTIVO(@AÑO CHAR(4)) RETURNS VARCHAR(MAX) AS
    BEGIN
    DECLARE @RESULTADO VARCHAR(20);
    WITH CTE AS (
    SELECT CONVERT(varCHAR(5),CONVERT(INT,ISNULL(MAX(SUBSTRING(NUMERO,5,255)),0))+1) AS NUMERO FROM SOLICITUD WHERE LEFT(NUMERO,4) = @AÑO)
    SELECT @RESULTADO = @AÑO+REPLICATE('0',
    case when len(numero) > 4 then len(numero) else 4 end -len(numero)) +NUMERO FROM CTE
    RETURN @RESULTADO
    END
    SELECT DBO.CONSECUTIVO(2018)

    martes, 3 de octubre de 2017 23:47