BUSCAR ULTIMO REGISTRO E ACRESCENTAR 1
Ola pessoal.
Estou criando uma procedure para incluir varios registro de uma ,porém,minha chaves não identety,ou seja,eu sempre busco o ultimo registro e acrescento + 1,porém quando executo a procedure abaixo,se ela trazer 20 registro ,ela coloca o mesmo codigo nos 20 ,só acresenta + 1 no primeiro registro..Alguêm pode ajudar aonde que está o erro desta rotina???
PRECEDURE
CREATE PROCEDURE CONTROLE_KM_FUNC_CONTRATO_SP
AS
DECLARE @ERRO AS VARCHAR(MAX)
BEGIN
BEGIN TRY
BEGIN TRANSACTION
Insert Into Tbl_Ctrl_KM
(N_CD_Codigo,
N_CD_Filial,
S_Dsc_Data,
N_CD_Funcionario,
N_CD_FilialFunc,
N_CD_Cliente,
N_CD_FilialCli,
N_CD_CodContr,
N_CD_FilialContr,
N_CD_ItemContr,
N_Dsc_KmInicial,
N_Dsc_KmFinal,
N_Dsc_FranquiaCli,
N_Dsc_FranquiaFunc,
N_Dsc_ValKM,
N_Dsc_ValKM_Func,
N_Dsc_KM,
S_Dsc_Obs,
N_CD_User_Alt,
N_CD_Filial_Alt,
S_Dsc_Data_Alt,
S_Dsc_Hora_Alt)
Select
dbo.BUSCA_CODKM(1) + 1, 1,
(SELECT REPLACE(CONVERT(CHAR,GETDATE(),102),[ô].[ô],[ô]/[ô])),
CASE WHEN (A.N_CD_TPFUNC = 1 AND A.N_DSC_TPCONTRATO = 1) THEN A.N_CD_FUNCIONARIO
ELSE
0
END AS FUNCIONARIO,
CASE WHEN (A.N_CD_TPFUNC = 1 AND A.N_DSC_TPCONTRATO = 1) THEN A.N_CD_FILIAL
ELSE
0
END AS FILIAL,
B.N_CD_CLIENTE,
dbo.BUSCA_FILIALCLI(B.N_CD_CLIENTE,A.N_CD_FILIALCTRL),
A.N_CD_CODIGO,
A.N_CD_FILIAL,
A.N_CD_Indice,
0,
0,
A.N_Dsc_FranquiaKM,
A.N_Dsc_FranqFunc,
(SELECT REPLACE(A.N_Val_KmExcedPF,[ô],[ô],[ô].[ô])),
(SELECT REPLACE(A.N_Val_PGFuncPF,[ô],[ô],[ô].[ô])),
0,
[ô].[ô],
63,
1,
(SELECT REPLACE(CONVERT(CHAR,GETDATE(),102 ),[ô].[ô],[ô]/[ô])),
[ô]01:00:00[ô]
From Tbl_Contrato_Item as A
INNER JOIN Tbl_Contrato as B ON B.N_CD_CodContr = A.N_CD_Codigo And B.N_CD_FilialCtrl = A.N_CD_FilialCtrl
Where A.N_Dsc_TpContrato IN (1,2)
And A.S_Dsc_PgKM = [ô]S[ô]
And A.N_CD_Filial = 1
AND (SELECT COUNT(B.N_CD_CODIGO) FROM TBL_Feriado AS B WHERE B.S_Dsc_Dia = DATEPART(DAY,(SELECT REPLACE(CONVERT(CHAR,GETDATE(),102 ),[ô].[ô],[ô]/[ô]))) AND B.S_Dsc_Mes = DATEPART(MONTH,(SELECT REPLACE(CONVERT(CHAR,GETDATE(),102 ),[ô].[ô],[ô]/[ô]))) ) <= 0
AND (SELECT COUNT(B.N_CD_CODIGO) FROM TBL_Ponto_Facultativo AS B WHERE B.S_Dsc_Dia = DATEPART(DAY,(SELECT REPLACE(CONVERT(CHAR,GETDATE(),102 ),[ô].[ô],[ô]/[ô]))) AND B.S_Dsc_Mes = DATEPART(MONTH,(SELECT REPLACE(CONVERT(CHAR,GETDATE(),102 ),[ô].[ô],[ô]/[ô]))) ) <= 0
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
SET @ERRO = ERROR_MESSAGE()
RAISERROR(@ERRO,16,1)
END CATCH
END
E a function que busca o codigo
CREATE FUNCTION BUSCA_CODKM(@FILIAL TINYINT)
RETURNS INT
AS
BEGIN
RETURN(
SELECT TOP 1 N_CD_CODIGO FROM TBL_CTRL_KM
WHERE N_CD_FILIAL = (@FILIAL)
ORDER BY N_CD_CODIGO DESC)
END
Desde já agradeço
Estou criando uma procedure para incluir varios registro de uma ,porém,minha chaves não identety,ou seja,eu sempre busco o ultimo registro e acrescento + 1,porém quando executo a procedure abaixo,se ela trazer 20 registro ,ela coloca o mesmo codigo nos 20 ,só acresenta + 1 no primeiro registro..Alguêm pode ajudar aonde que está o erro desta rotina???
PRECEDURE
CREATE PROCEDURE CONTROLE_KM_FUNC_CONTRATO_SP
AS
DECLARE @ERRO AS VARCHAR(MAX)
BEGIN
BEGIN TRY
BEGIN TRANSACTION
Insert Into Tbl_Ctrl_KM
(N_CD_Codigo,
N_CD_Filial,
S_Dsc_Data,
N_CD_Funcionario,
N_CD_FilialFunc,
N_CD_Cliente,
N_CD_FilialCli,
N_CD_CodContr,
N_CD_FilialContr,
N_CD_ItemContr,
N_Dsc_KmInicial,
N_Dsc_KmFinal,
N_Dsc_FranquiaCli,
N_Dsc_FranquiaFunc,
N_Dsc_ValKM,
N_Dsc_ValKM_Func,
N_Dsc_KM,
S_Dsc_Obs,
N_CD_User_Alt,
N_CD_Filial_Alt,
S_Dsc_Data_Alt,
S_Dsc_Hora_Alt)
Select
dbo.BUSCA_CODKM(1) + 1, 1,
(SELECT REPLACE(CONVERT(CHAR,GETDATE(),102),[ô].[ô],[ô]/[ô])),
CASE WHEN (A.N_CD_TPFUNC = 1 AND A.N_DSC_TPCONTRATO = 1) THEN A.N_CD_FUNCIONARIO
ELSE
0
END AS FUNCIONARIO,
CASE WHEN (A.N_CD_TPFUNC = 1 AND A.N_DSC_TPCONTRATO = 1) THEN A.N_CD_FILIAL
ELSE
0
END AS FILIAL,
B.N_CD_CLIENTE,
dbo.BUSCA_FILIALCLI(B.N_CD_CLIENTE,A.N_CD_FILIALCTRL),
A.N_CD_CODIGO,
A.N_CD_FILIAL,
A.N_CD_Indice,
0,
0,
A.N_Dsc_FranquiaKM,
A.N_Dsc_FranqFunc,
(SELECT REPLACE(A.N_Val_KmExcedPF,[ô],[ô],[ô].[ô])),
(SELECT REPLACE(A.N_Val_PGFuncPF,[ô],[ô],[ô].[ô])),
0,
[ô].[ô],
63,
1,
(SELECT REPLACE(CONVERT(CHAR,GETDATE(),102 ),[ô].[ô],[ô]/[ô])),
[ô]01:00:00[ô]
From Tbl_Contrato_Item as A
INNER JOIN Tbl_Contrato as B ON B.N_CD_CodContr = A.N_CD_Codigo And B.N_CD_FilialCtrl = A.N_CD_FilialCtrl
Where A.N_Dsc_TpContrato IN (1,2)
And A.S_Dsc_PgKM = [ô]S[ô]
And A.N_CD_Filial = 1
AND (SELECT COUNT(B.N_CD_CODIGO) FROM TBL_Feriado AS B WHERE B.S_Dsc_Dia = DATEPART(DAY,(SELECT REPLACE(CONVERT(CHAR,GETDATE(),102 ),[ô].[ô],[ô]/[ô]))) AND B.S_Dsc_Mes = DATEPART(MONTH,(SELECT REPLACE(CONVERT(CHAR,GETDATE(),102 ),[ô].[ô],[ô]/[ô]))) ) <= 0
AND (SELECT COUNT(B.N_CD_CODIGO) FROM TBL_Ponto_Facultativo AS B WHERE B.S_Dsc_Dia = DATEPART(DAY,(SELECT REPLACE(CONVERT(CHAR,GETDATE(),102 ),[ô].[ô],[ô]/[ô]))) AND B.S_Dsc_Mes = DATEPART(MONTH,(SELECT REPLACE(CONVERT(CHAR,GETDATE(),102 ),[ô].[ô],[ô]/[ô]))) ) <= 0
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
SET @ERRO = ERROR_MESSAGE()
RAISERROR(@ERRO,16,1)
END CATCH
END
E a function que busca o codigo
CREATE FUNCTION BUSCA_CODKM(@FILIAL TINYINT)
RETURNS INT
AS
BEGIN
RETURN(
SELECT TOP 1 N_CD_CODIGO FROM TBL_CTRL_KM
WHERE N_CD_FILIAL = (@FILIAL)
ORDER BY N_CD_CODIGO DESC)
END
Desde já agradeço
Cara, qual é o campo que deve ser incrementado? E outra pergunta: essa tabela que deve ter o número incrementado, ela será usada em algum relacionamento?
Abs!
Maranzalle
Abs!
Maranzalle
O primeiro campo!!
N_CD_Codigo
Não ,depois ela não será usada em relacionamento!
N_CD_Codigo
Não ,depois ela não será usada em relacionamento!
Então pode fazer assim:
Declare @Maior int
Set @Maior = (Select Max(N_CD_Codigo) + 1 From TBL_CTRL_KM)
Na hora de gravar o campo N_CD_Codigo, você passa a variável @Maior. Entendeu?
Declare @Maior int
Set @Maior = (Select Max(N_CD_Codigo) + 1 From TBL_CTRL_KM)
Na hora de gravar o campo N_CD_Codigo, você passa a variável @Maior. Entendeu?
Então pode fazer assim:
Declare @Maior int
Set @Maior = (Select Max(N_CD_Codigo) + 1 From TBL_CTRL_KM)
Na hora de gravar o campo N_CD_Codigo, você passa a variável @Maior. Entendeu?
Declare @Maior int
Set @Maior = (Select Max(N_CD_Codigo) + 1 From TBL_CTRL_KM)
Na hora de gravar o campo N_CD_Codigo, você passa a variável @Maior. Entendeu?
Assim também não dá!!
Faz assim, na function vc coloca
CREATE FUNCTION BUSCA_CODKM(@FILIAL TINYINT)
RETURNS INT
AS
BEGIN
RETURN(
SELECT TOP 1 N_CD_CODIGO + 1 FROM TBL_CTRL_KM
WHERE N_CD_FILIAL = (@FILIAL)
ORDER BY N_CD_CODIGO DESC)
END
e na procedure de insercao, naquela linha vc tira o + 1 e deixa so dbo.BUSCA_CODKM(1)
CREATE FUNCTION BUSCA_CODKM(@FILIAL TINYINT)
RETURNS INT
AS
BEGIN
RETURN(
SELECT TOP 1 N_CD_CODIGO + 1 FROM TBL_CTRL_KM
WHERE N_CD_FILIAL = (@FILIAL)
ORDER BY N_CD_CODIGO DESC)
END
e na procedure de insercao, naquela linha vc tira o + 1 e deixa so dbo.BUSCA_CODKM(1)
Também não deu certo Diogo,o que acontece.Quando ele vai para essa function e da o select ,ele me traz o registro certinho,até ai beleza,o x da questão está quando ele retorna,pois ele dá o select novamente,porém a procedure não enceriu nenhum registro ainda,então sempre vai ficar retornando o mesmo valor,pois o insert que a procedure dá vai de uma ,pois os valores ficam guardado na memória.
Ja tentei criar uma variável contadora,mas não tem jeito.
Tá dificil essa....
Ja tentei criar uma variável contadora,mas não tem jeito.
Tá dificil essa....
Tópico encerrado , respostas não são mais permitidas