Fórum BDE X Ado usando o componente StoredProc, nao retorna #289028

21/07/2005

0

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

Responder

Posts

21/07/2005

Rjun

No ADO você precisa colocar Parameters antes de ParamByName.

Parameters.ParamByName(´Nome´).Value;



Responder

Gostei + 0

21/07/2005

Tremonti

Já fiz e nao deu certo


Responder

Gostei + 0

21/07/2005

Rjun

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


Responder

Gostei + 0

22/07/2005

Tremonti

Já fiz tudo isso e nada


Responder

Gostei + 0

22/07/2005

Tremonti

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


Responder

Gostei + 0

22/07/2005

Rjun

Poste tudo nesse tópico mesmo.


Responder

Gostei + 0

22/07/2005

Tremonti

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


Responder

Gostei + 0

22/07/2005

Rjun

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


Responder

Gostei + 0

22/07/2005

Tremonti

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


Responder

Gostei + 0

22/07/2005

Rjun

Ainda não entendi o porque do CURSOR?


Responder

Gostei + 0

22/07/2005

Tremonti

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

Abraços...


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar