BDE X Ado usando o componente StoredProc, nao retorna
Galera, criei uma rotina que funciona perfeitamente no BDE
é a seguinte :
CREATE PROCEDURE sp_ProxNumero(@Campo varchar(20), @ProxNumero varchar(20) OUTPUT) AS --10:14
DECLARE @AnoStr char(4)
DECLARE @Num varchar(20)
DECLARE @n int
DECLARE @UltValor float
DECLARE @Ano smallint
DECLARE @TamCampo tinyint
DECLARE @UsaAno char(1)
DECLARE @ResultStr varchar(20)
DECLARE @AnoAtual smallint
SELECT @AnoAtual = DATEPART(year, GETDATE())
SELECT @Ano = Ano, @UsaAno = UsaAno FROM NrContr WHERE CdCampo = @Campo
IF @UsaAno = ´S´ AND @AnoAtual <> @Ano
Begin
BEGIN TRAN
UPDATE NrContr SET Ano = @AnoAtual, UltValor = 0 WHERE CdCampo = @Campo
COMMIT
End
-- //////// METODO NOVO
DECLARE cursor_prox CURSOR FOR SELECT UltValor, Ano, TamCampo, UsaAno FROM NrContr
WHERE CdCampo = @Campo
OPEN cursor_prox
FETCH NEXT FROM cursor_prox INTO @UltValor, @Ano, @TamCampo, @UsaAno
UPDATE NrContr SET UltValor = @UltValor + 1
WHERE CURRENT OF cursor_prox
CLOSE cursor_prox
DEALLOCATE cursor_prox
-- METODO ANTIGO (NAO APAGAR AINDA)
/*
SELECT @UltValor = UltValor, @Ano = Ano,
@TamCampo = TamCampo, @UsaAno = UsaAno
FROM NrContr
WHERE CdCampo = @Campo
UPDATE NrContr SET UltValor = @UltValor+1
WHERE CdCampo = @Campo
*/
-- FIM DO METODO ANTIGO (NAO APAGAR AINDA)
SELECT @AnoStr = STR(@Ano,4)
SELECT @Num = STR(@UltValor+1, @TamCampo)
SELECT @n = 1
while @n <= @TamCampo
begin
if substring(@Num, @n, 1) = ´ ´
SELECT @ResultStr = @ResultStr + ´0´
else
SELECT @ResultStr = @ResultStr + Substring(@Num, @n, 1)
SELECT @n = @n + 1
end
SELECT @Num = @ResultStr
if @UsaAno = ´S´
SELECT @ProxNumero = @AnoStr + @Num
else
SELECT @ProxNumero = @Num
GO
Uso ela no Delphi da seguinte Forma:
function ProxNumero(prNmCampo: String): String;
begin
with dtmConfig.stpProxNumero do begin
ParamByName(´@Campo´).AsString := prNmCampo;
try
ExecProc;
except
ProxNumero := ProxNumero(prNmCampo);
Exit;
end;
ProxNumero := ParamByName(´@ProxNumero´).AsString;
end;
end;
e para usar é só
Ex
Label1.caption := ProxNumero(´NrContrObAvulso´);
Só
Mas mudei minha conexão para ADO e nao me retorna nada...
O que pode estar acontecendo?
Abraços...
é a seguinte :
CREATE PROCEDURE sp_ProxNumero(@Campo varchar(20), @ProxNumero varchar(20) OUTPUT) AS --10:14
DECLARE @AnoStr char(4)
DECLARE @Num varchar(20)
DECLARE @n int
DECLARE @UltValor float
DECLARE @Ano smallint
DECLARE @TamCampo tinyint
DECLARE @UsaAno char(1)
DECLARE @ResultStr varchar(20)
DECLARE @AnoAtual smallint
SELECT @AnoAtual = DATEPART(year, GETDATE())
SELECT @Ano = Ano, @UsaAno = UsaAno FROM NrContr WHERE CdCampo = @Campo
IF @UsaAno = ´S´ AND @AnoAtual <> @Ano
Begin
BEGIN TRAN
UPDATE NrContr SET Ano = @AnoAtual, UltValor = 0 WHERE CdCampo = @Campo
COMMIT
End
-- //////// METODO NOVO
DECLARE cursor_prox CURSOR FOR SELECT UltValor, Ano, TamCampo, UsaAno FROM NrContr
WHERE CdCampo = @Campo
OPEN cursor_prox
FETCH NEXT FROM cursor_prox INTO @UltValor, @Ano, @TamCampo, @UsaAno
UPDATE NrContr SET UltValor = @UltValor + 1
WHERE CURRENT OF cursor_prox
CLOSE cursor_prox
DEALLOCATE cursor_prox
-- METODO ANTIGO (NAO APAGAR AINDA)
/*
SELECT @UltValor = UltValor, @Ano = Ano,
@TamCampo = TamCampo, @UsaAno = UsaAno
FROM NrContr
WHERE CdCampo = @Campo
UPDATE NrContr SET UltValor = @UltValor+1
WHERE CdCampo = @Campo
*/
-- FIM DO METODO ANTIGO (NAO APAGAR AINDA)
SELECT @AnoStr = STR(@Ano,4)
SELECT @Num = STR(@UltValor+1, @TamCampo)
SELECT @n = 1
while @n <= @TamCampo
begin
if substring(@Num, @n, 1) = ´ ´
SELECT @ResultStr = @ResultStr + ´0´
else
SELECT @ResultStr = @ResultStr + Substring(@Num, @n, 1)
SELECT @n = @n + 1
end
SELECT @Num = @ResultStr
if @UsaAno = ´S´
SELECT @ProxNumero = @AnoStr + @Num
else
SELECT @ProxNumero = @Num
GO
Uso ela no Delphi da seguinte Forma:
function ProxNumero(prNmCampo: String): String;
begin
with dtmConfig.stpProxNumero do begin
ParamByName(´@Campo´).AsString := prNmCampo;
try
ExecProc;
except
ProxNumero := ProxNumero(prNmCampo);
Exit;
end;
ProxNumero := ParamByName(´@ProxNumero´).AsString;
end;
end;
e para usar é só
Ex
Label1.caption := ProxNumero(´NrContrObAvulso´);
Só
Mas mudei minha conexão para ADO e nao me retorna nada...
O que pode estar acontecendo?
Abraços...
Tremonti
Curtidas 0
Respostas
Rjun
21/07/2005
No ADO você precisa colocar Parameters antes de ParamByName.
Parameters.ParamByName(´Nome´).Value;
GOSTEI 0
Tremonti
21/07/2005
Já fiz e nao deu certo
GOSTEI 0
Rjun
21/07/2005
function ProxNumero(prNmCampo: String): String; begin dtmConfig.stpProxNumero.Parameters.ParamByName(´@Campo´).AsString := prNmCampo; try ExecProc; except ProxNumero := ProxNumero(prNmCampo); Exit; end; ProxNumero := ParamByName(´@ProxNumero´).AsString; end;
Assim deveria funcionar. Agora, algumas observações.
Por que você usa try..except? Seria mais simples você encerrar a stored procedure com return(0) e avaliar o parametro @RETURNVALUE.
Na stored procedure você abre uma transação só para efetuar um update. Isso não faz sentido.
Em cada operação de gravação, verifique as variáveis @@ERROR e @@ROWCOUNT para verificar se a operação foi bem sucedida, caso contrario finalize a stored procedure com return(@ERROR).
GOSTEI 0
Tremonti
21/07/2005
Já fiz tudo isso e nada
GOSTEI 0
Tremonti
21/07/2005
Cara, se quizer me ajudar a corrigir a procedure eu agradeceria...
te explico como ela funciona também
me manda um e-mail
fernando_tremonti@yahoo.com.br
Abraços...
te explico como ela funciona também
me manda um e-mail
fernando_tremonti@yahoo.com.br
Abraços...
GOSTEI 0
Rjun
21/07/2005
Poste tudo nesse tópico mesmo.
GOSTEI 0
Tremonti
21/07/2005
Ah cara, se ja deve ter entendido, ele soh soma um no campo que eu colocar entre aspas na procedure do Delphi
Mas como otmizar esta procedure no sql, me ajuda?!
Mas como otmizar esta procedure no sql, me ajuda?!
GOSTEI 0
Rjun
21/07/2005
Explica a finalidade da procedure. Outra coisa, pq vc ta usando Cursor?
GOSTEI 0
Tremonti
21/07/2005
Opa...
Eu localizo nas tabelas o campo correspondente para incrementar.
E assim vai
E na NrContr eu armazeno o ultimo valor, somo 1 e jogo nesse novo nrcontrole
Eu localizo nas tabelas o campo correspondente para incrementar.
E assim vai
E na NrContr eu armazeno o ultimo valor, somo 1 e jogo nesse novo nrcontrole
GOSTEI 0
Rjun
21/07/2005
Ainda não entendi o porque do CURSOR?
GOSTEI 0
Tremonti
21/07/2005
Cara, esquece o cursor
só quero saber pq nao funciona com ADO e BDE funciona bem...
Abraços...
só quero saber pq nao funciona com ADO e BDE funciona bem...
Abraços...
GOSTEI 0