BUSCAR ULTIMO REGISTRO E ACRESCENTAR 1

PARREIRA 03/08/2010 14:48:04
#349290
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
MARANZALLE 04/08/2010 10:16:58
#349393
Resposta escolhida
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
PARREIRA 04/08/2010 12:20:33
#349407
O primeiro campo!!
N_CD_Codigo

Não ,depois ela não será usada em relacionamento!
MARANZALLE 04/08/2010 13:33:53
#349411
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?
MARANZALLE 04/08/2010 13:36:51
#349412
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?
PARREIRA 04/08/2010 14:50:03
#349423
Assim também não dá!!
DIOGOMUNARIN 04/08/2010 15:44:42
#349430
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)
PARREIRA 04/08/2010 15:58:38
#349433
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....
Tópico encerrado , respostas não são mais permitidas