Antes de dar una solución a la pregunta, algunos puntos sobre su pregunta:
- Como la clave principal personalizada consta principalmente de tres partes Fecha (140102), ubicación física donde se lleva a cabo la transacción (entityID), 4 número de lugar (9999).
- De acuerdo con el diseño en una sola fecha en una sola ubicación física, no puede haber más de 9999 transacciones; My Solution también tendrá la misma limitación.
Algunos puntos en mi solución
- El dígito de 4 lugares está ligado a la fecha, lo que significa que para una nueva fecha, el conteo comienza desde 0000. Por ejemplo, GI_140102_1_0001, GI_140102_1_0002, GI_140102_1_0003, GI_140103_1_0000, GI_140104_1_0000
De cualquier forma, este campo será único.
- La solución compara la fecha más reciente en el registro con la fecha actual. La lógica:si la fecha actual y la fecha más reciente en el registro coinciden, entonces incrementa el dígito de 4 posiciones por el valor en 1 si la fecha actual y la fecha más reciente en el registro no coincideEl establece el dígito de 4 lugares por el valor 0000.
La solución:(El siguiente código proporciona el valor que será el próximo GoodsInwardId, utilícelo según los requisitos para adaptarse a su solución)
declare @previous nvarchar(30);
declare @today nvarchar(30);
declare @newID nvarchar(30);
select @previous=substring(max(GoodsInwardId),4,6) from SC_TD_GoodsInward;
Select @today=RIGHT('00'+CONVERT(varchar,datepart(YY,getdate())),2)
+RIGHT('00'+CONVERT(varchar,datepart(MM,getdate())),2)+RIGHT('00'+CONVERT(varchar,datepart(DD,getdate())),2);
if @[email protected]
BEGIN
Select @newID='GI_'+RIGHT('00'+CONVERT(varchar,datepart(YY,getdate())),2)
+RIGHT('00'+CONVERT(varchar,datepart(MM,getdate())),2)+RIGHT('00'+CONVERT(varchar,datepart(DD,getdate())),2)
+'_'+CONVERT(varchar,1)+'_'+(SELECT RIGHT('0000'+
CONVERT(VARCHAR,CONVERT(INT,RIGHT(MAX(GoodsInwardId),4))+1),4)
from SC_TD_GoodsInward);
END
else
BEGIN
SET @newID='GI_'+RIGHT('00'+CONVERT(varchar,datepart(YY,getdate())),2)
+RIGHT('00'+CONVERT(varchar,datepart(MM,getdate())),2)+RIGHT('00'+CONVERT(varchar,datepart(DD,getdate())),2)
+'_'+CONVERT(varchar,1)+'_0000';
END
select @newID;
T-SQL para crear la estructura requerida (Probable Guess)
Para la mesa:
CREATE TABLE [dbo].[SC_TD_GoodsInward](
[EntityId] [int] NULL,
[GoodsInwardId] [nvarchar](30) NULL
)
Registros de muestra para la tabla:
insert into dbo.SC_TD_GoodsInward values(1,'GI_140102_1_0000');
insert into dbo.SC_TD_GoodsInward values(1,'GI_140101_1_9999');
insert into dbo.SC_TD_GoodsInward values(1,'GI_140101_1_0001');
** Es una solución probable en su situación, aunque la solución perfecta sería tener una columna de identidad (utilice la reinicialización si es necesario) y vincúlela con la fecha actual como una columna calculada.