none
Ayuda en Codigo Autogenerado! RRS feed

  • Pregunta

  • Hola Comunidad, nesecito ayuda en sql!

    quiero crear un sp que permita autogenerar un codigo, estuve programando de esta forma!

    create table Cuentas(
    IdCuenta char(4) primary key not null,
    Clasificacion varchar(30),
    NombreEmpleadoAsignado varchar(50),
    Fecha date,
    CH_OP int,
    Observacion varchar(1000),
    Monto decimal,
    )
    go

    create proc RegistrarCodigoRendicion
    @clasificacion varchar(30),@NombreEmpleadoAsignado varchar(50),@fecha date,
    @CH_OP int,@observacion varchar(1000),@Monto money
    As
    if @clasificacion='Rendición'
    declare @IdCuenta char(4)
    set @IdCuenta=(select MAX(IdCuenta) from Cuentas where RIGHT(IdCuenta,2)='RE')
    set @IdCuenta='00'+LTRIM(LEFT(isnull(@IdCuenta,'00'),2)+1)+'RE'
    Insert Cuentas values(@IdCuenta,@clasificacion,@NombreEmpleadoAsignado,
    @fecha,@CH_OP,@observacion,@Monto)
    go

    si hacemos un registro nos saldra:  01RE

    si quiero realizar el registro numero 100:   100RE me saldra error porque ya estaria con 5 caracteres... ¿QUE HAGO SI EL CODIGO SOBREPASA A LA CANTIDAD DE CADENA QUE DECLARE EN LA TABLA, OSEA CHAR(4)?


    jueves, 15 de diciembre de 2016 21:34

Respuestas

  • Jimmy Sandoval,

    No entiendo realmente donde es que tienes inconvenientes, sea que uses un tipo de longitud fija (char) o un tipo de longitud variable (varchar) la idea es que definas la variable con la longitud necesaria para que puedas contener el código que generas, ¿qué longitud?, pues eso sólo tú lo sabes, ¿cuántos caracteres permitirás en tu código? ¿rellenarás las posiciones faltantes con ceros a la izquierda?

    Puestos al caso te recomiendo que dejes que SQL Server genere el número de manera automática para la columna que defines como Primary Key, y si quieres mostrar al usuario un código con un formato establecido puedes definir una columna calculada conteniendo el valor con formato.

    Para realizar lo último que te he propuesto debes cambiar la definición de la tabla:

    CREATE TABLE dbo.Cuentas
    (
        IdCuenta int IDENTITY(1,1) PRIMARY KEY NOT NULL,
        Clasificacion varchar(30),
        NombreEmpleadoAsignado varchar(50),
        Fecha date,
        CH_OP int,
        Observacion varchar(1000),
        Monto decimal,
        CodigoCuenta AS FORMAT(IdCuenta, '00000RE')
    )
    GO

    Definición del procedimiento almacenado:

    CREATE PROCEDURE dbo.RegistrarCodigoRendicion
        @Clasificacion varchar(30),
        @NombreEmpleadoAsignado varchar(50),
        @Fecha date,
        @CH_OP int,
        @Observacion varchar(1000),
        @Monto decimal
    AS
    BEGIN    
        INSERT INTO dbo.Cuentas (Clasificacion, NombreEmpleadoAsignado, 
    	   Fecha, CH_OP, Observacion, Monto)
        VALUES (@Clasificacion, @NombreEmpleadoAsignado, 
    	   @Fecha, @CH_OP, @Observacion, @Monto)
    END
    GO

    Intenta realizar una inserción y verifica que los datos insertados son los esperados, sobre todo la columna 'CodigoCuenta'

    EXECUTE dbo.RegistrarCodigoRendicion 'A', 'Juan', GETDATE(), 1, 'Ninguna', 100;
    GO
    SELECT * FROM dbo.Cuentas;
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    sábado, 17 de diciembre de 2016 21:21

Todas las respuestas

  • Jimmy Sandoval,

    Creo que la pregunta se responde por si misma: un tipo char(n) almacena datos de longitud fija y según el caso que presentas permitirá almacenar 4 caracteres, no menos, no mas. Queda claro que la solución pasa por ampliar el tamaño máximo de almacenamiento a una longitud que consideres prudente.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    jueves, 15 de diciembre de 2016 22:11
  • usa varchar(max) y te olvidas del problema.
    jueves, 15 de diciembre de 2016 23:35
  • Gracias por la respuesta Joyce, pero el problema es como hacerlo? ahi el IdCuenta es char(4) y si registramos el 100RE ya tendra 5 caracteres ya no sera char de 4 sino char de 5... eso como incremento?

    Si lo sabes, porfa echame una mano. Muchas Gracias

    sábado, 17 de diciembre de 2016 18:17
  • Hola Luis, use Varchar(max) pero el problema es que mi IdCuenta es una PK y si lo registro como varchar(max) el propio sql no me dejara registrar a la tabla con ese tipo de dato
    sábado, 17 de diciembre de 2016 18:18
  • Usa varchar(10) entonces.
    sábado, 17 de diciembre de 2016 19:00
  • Jimmy Sandoval,

    No entiendo realmente donde es que tienes inconvenientes, sea que uses un tipo de longitud fija (char) o un tipo de longitud variable (varchar) la idea es que definas la variable con la longitud necesaria para que puedas contener el código que generas, ¿qué longitud?, pues eso sólo tú lo sabes, ¿cuántos caracteres permitirás en tu código? ¿rellenarás las posiciones faltantes con ceros a la izquierda?

    Puestos al caso te recomiendo que dejes que SQL Server genere el número de manera automática para la columna que defines como Primary Key, y si quieres mostrar al usuario un código con un formato establecido puedes definir una columna calculada conteniendo el valor con formato.

    Para realizar lo último que te he propuesto debes cambiar la definición de la tabla:

    CREATE TABLE dbo.Cuentas
    (
        IdCuenta int IDENTITY(1,1) PRIMARY KEY NOT NULL,
        Clasificacion varchar(30),
        NombreEmpleadoAsignado varchar(50),
        Fecha date,
        CH_OP int,
        Observacion varchar(1000),
        Monto decimal,
        CodigoCuenta AS FORMAT(IdCuenta, '00000RE')
    )
    GO

    Definición del procedimiento almacenado:

    CREATE PROCEDURE dbo.RegistrarCodigoRendicion
        @Clasificacion varchar(30),
        @NombreEmpleadoAsignado varchar(50),
        @Fecha date,
        @CH_OP int,
        @Observacion varchar(1000),
        @Monto decimal
    AS
    BEGIN    
        INSERT INTO dbo.Cuentas (Clasificacion, NombreEmpleadoAsignado, 
    	   Fecha, CH_OP, Observacion, Monto)
        VALUES (@Clasificacion, @NombreEmpleadoAsignado, 
    	   @Fecha, @CH_OP, @Observacion, @Monto)
    END
    GO

    Intenta realizar una inserción y verifica que los datos insertados son los esperados, sobre todo la columna 'CodigoCuenta'

    EXECUTE dbo.RegistrarCodigoRendicion 'A', 'Juan', GETDATE(), 1, 'Ninguna', 100;
    GO
    SELECT * FROM dbo.Cuentas;
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    sábado, 17 de diciembre de 2016 21:21
  • Procura NO usar varchar(max) alegremente, este tipo de decisiones representan pesimas practicas que luego sufriras, con este tipo de datos no puedes luego crear NONCLUSTERED index debido a que no es reconocido y luego el dia que quieras implementar indices sobre estas columnas no podras.

    "Oh, the wind, the wind is blowing,through the graves the wind is blowing,Freedom soon will come; then well come from the shadows".The Partisan(Leonard Cohen) Email: me[at]geohernandez.net Blog:www.geohernandez.net

    lunes, 19 de diciembre de 2016 13:42