Principales respuestas
Ayuda en Codigo Autogenerado!

Pregunta
-
Hola Comunidad, nesecito ayuda en sql!
quiero crear un sp que permita autogenerar un codigo, estuve programando de esta forma!
create table Cuentas(
create proc RegistrarCodigoRendicion
IdCuenta char(4) primary key not null,
Clasificacion varchar(30),
NombreEmpleadoAsignado varchar(50),
Fecha date,
CH_OP int,
Observacion varchar(1000),
Monto decimal,
)
go
@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)
gosi 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)?
- Editado Jimmy Sandoval jueves, 15 de diciembre de 2016 21:36
Respuestas
-
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.- Propuesto como respuesta Joyce_ACModerator lunes, 19 de diciembre de 2016 18:32
- Marcado como respuesta Joyce_ACModerator jueves, 22 de diciembre de 2016 15:56
Todas las respuestas
-
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.- Propuesto como respuesta Joyce_ACModerator viernes, 16 de diciembre de 2016 16:33
- Votado como útil Joyce_ACModerator lunes, 19 de diciembre de 2016 18:32
-
-
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
-
-
-
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.- Propuesto como respuesta Joyce_ACModerator lunes, 19 de diciembre de 2016 18:32
- Marcado como respuesta Joyce_ACModerator jueves, 22 de diciembre de 2016 15:56
-
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