BDE X Ado usando o componente StoredProc, nao retorna

Delphi

21/07/2005

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´);



Mas mudei minha conexão para ADO e nao me retorna nada...
O que pode estar acontecendo?

Abraços...


Tremonti

Tremonti

Curtidas 0

Respostas

Rjun

Rjun

21/07/2005

No ADO você precisa colocar Parameters antes de ParamByName.

Parameters.ParamByName(´Nome´).Value;



GOSTEI 0
Tremonti

Tremonti

21/07/2005

Já fiz e nao deu certo


GOSTEI 0
Rjun

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

Tremonti

21/07/2005

Já fiz tudo isso e nada


GOSTEI 0
Tremonti

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...


GOSTEI 0
Rjun

Rjun

21/07/2005

Poste tudo nesse tópico mesmo.


GOSTEI 0
Tremonti

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?!


GOSTEI 0
Rjun

Rjun

21/07/2005

Explica a finalidade da procedure. Outra coisa, pq vc ta usando Cursor?


GOSTEI 0
Tremonti

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


GOSTEI 0
Rjun

Rjun

21/07/2005

Ainda não entendi o porque do CURSOR?


GOSTEI 0
Tremonti

Tremonti

21/07/2005

Cara, esquece o cursor
só quero saber pq nao funciona com ADO e BDE funciona bem...

Abraços...


GOSTEI 0
POSTAR