Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Karlo Uchoa

Passagem de parametros para transacoes sql

Recommended Posts

Caros amigos,

 

tenho o seguinte problema e gostaria de uma dica de como resolve-lo:

 

A transação a baixo esta perfeita, funcionando no SQl perfeitamente, mas gostaria de saber como faço para passar os parametros para ela a partir do Delphi.

 

Vejam que em determinado momento, terei que passar para dentro de um while a lista de itens do pedido.

 

----------------------------------------------------------------------------------------

 

begin tran  -- grava cabecalho da venda
DECLARE
  @pedido int

  insert into t_vendas  (nrven_v,cdcli_v)
  select (select max(nrven_v)+1 from t_vendas), 2 -- estou inserindo aqui informações para poucos campos,
                                                  -- apenas como exemplo
  
  set @pedido = (select nrven_v from t_vendas where autocod = @@identity)
	
  begin tran -- grava itens da venda

    declare @count int

    set @count=0  -- aqui criei este contado apenas para testar o funcionamento do while 
		
    while @count < 10500 
 	
    BEGIN
    	insert into t_itsven (nrven_iv,emisven_iv,cditem_iv,deitem_iv,qtdesol_iv,precven_iv,precpra_iv,perdes_iv)
   	values (@pedido,GETDATE(),@COUNT,'AAAA',1,1,1,0)  --- informei valores quaisquer. Passarei por parametros                                                                                  
                                                          -- por dentro do delphi, so nao sei ainda como.
	
	SET @COUNT = @COUNT+1
    END	
  
  IF @@ERROR<>0
   
	ROLLBACK  -- grava itens da venda
  ELSE
	COMMIT	  -- grava itens da venda	 
	    
IF @@ERROR<>0  
	ROLLBACK  -- grava cabecalho da venda
ELSE
	COMMIT    -- grava cabecalho da venda

--------------------------------------------------------

 

Desde já muito obrigado!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

begin tran  -- grava cabecalho da venda

DECLARE

@pedido int

 

insert into t_vendas (nrven_v,cdcli_v)

select (select max(nrven_v)+1 from t_vendas), 2 -- estou inserindo aqui informações para poucos campos,

-- apenas como exemplo

 

set @pedido = (select nrven_v from t_vendas where autocod = @@identity)

 

begin tran -- grava itens da venda

 

declare @count int

 

set @count=0 -- aqui criei este contado apenas para testar o funcionamento do while

 

while @count < 10500

 

BEGIN

insert into t_itsven (nrven_iv,emisven_iv,cditem_iv,deitem_iv,qtdesol_iv,precven_iv,precpra_iv,perdes_iv)

values (@pedido,GETDATE(),@COUNT,'AAAA',1,1,1,0) --- informei valores quaisquer. Passarei por parametros

-- por dentro do delphi, so nao sei ainda como.

 

SET @COUNT = @COUNT+1

END

 

IF @@ERROR<>0

 

ROLLBACK -- grava itens da venda

ELSE

COMMIT -- grava itens da venda

 

IF @@ERROR<>0

ROLLBACK -- grava cabecalho da venda

ELSE

COMMIT -- grava cabecalho da venda

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Karlo Uchoa,

 

Seja mais claro ao especificar o problema. Qual erro está ocorrendo? Onde você precisa de ajuda?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Karlo Uchoa,

 

Seja mais claro ao especificar o problema. Qual erro está ocorrendo? Onde você precisa de ajuda?

 

Meu querido hargon,

Estou meio que desesperado. Peço desculpas se cometi infrações contra as regras do fórum!

Postei a dois dias atras minha duvida e nao consegui resposta alguma e como tenho pelo mesno vinte clientes que precisam desta resposta para que eu implante uma solução em meu sistema, acabei apelando.

 

Preciso de uma resposta em carater de urgencia, se você consegui direcionar-me para alguem que consiga me ajudar eu serei muito grato.

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Karlo, boa noite... em primeiro lugar, peço que leia este tópico. Se seguir os passos ali descritos seus problemas podem ser resolvidos mais rapidamente.

 

Agora, vamos ao que interessa... no código que está montando aqui, tudo o que faz são comandos sql para executar direto no BD (pela sintaxe, suspeito que seja o SQL Server, me corrija caso esteja errado).... logo, o que você precisa fazer é transformar seu código sql numa Stored Procedure (por exemplo, STP_INSERE_VENDA) e depois apenas chamá-la dentro do delphi com uma TQuery, passando na sintaxe do comando as variáveis já na string de comando e dando um TQuery.ExecSQL (usando o ADOQUERY como exemplo) para que o aplicativo envie a mesma para o BD executar. Algo assim:

 

var sComando : String;
begin
<...>
     sComando := 'EXEC STP_INSERE_VENDA ' + QuotedStr(sCampoString) + ', ' + IntToStr(iCampoInteger) + ' ,'  + FloatToStr(rCampoFloat);
     ADOQuery1.Close;
     ADOQuery1.Sql.Clear;
     ADOQuery1.Sql.Add(sComando);
     try
          ADOQuery1.ExecSQL;
     except
          Showmessage('Ocorreu um erro na procedure STP_INSERE_VENDA.');
     end;
end;

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Chrnos,

Obrigado por sua atençao...

 

Estou usando SQL Server sim!

 

A minha Situaçao é a seguinte:

 

Tenho uma tabela de vendas (pedidos),

uma tabela de itens da venda

e outra tabela titulos a receber.

Estas tres tabelas precisam ser alimentadas em uma mesma transaçao.

Terei que fazer dois loops no interior da transaçao, o primeiro para inserir os itens do pedido, que pode ser um registro ou "N" registros e outro loop de acordocom o numeros de parcelas de titulos a receber.

 

Entao, se eu criar um procedimento armazenado, stored procedure, terei que ter um numero de variáveis muito grande, pois na mesma transacao teria que declarar as variáveis dos tres procedimentos.

 

O que fiz aqui foi... criei tres stored procedures diferentes, uma para cada ato da transacao, crei a transaçao pelo delphi, intransaction, no meio da transaçao pelo delphi fiz o loop dos itens.

no fim da transaçao coloquei um

 

try

rollback

except

commit

 

Só que percebi que pelo delphi o comando rollback nao funciona como no sql server... no sql server você pode perceber no exemplo que dei que fiz o tratamento separadamente para cada ato da transacao... assim caso um problema ocorra no primeiro ato ou mesmo em qualquer momento de cada ato, no decimo quinto item do pedido de venda por exemplo, se para um campo inteiro, mando valores char(string), entao o rollback é totalmente realizado. Desfazendo tanto o insert dos 14 itens anteriores, como do cabecalho da venda tambem.

No delphi isso nao acontece. Percebi que neste caso a transacao simplesmente esta ficando aberta, impedindo que outros computadores da rede realizem outras vendas. tenho que ir no banco e matar o processamento do banco de dados para poder liberar o banco para outros coputadores.

 

Gostaria de deixar toda a transacao para a cargo do sql server, quero comecar o begin tran no proprio sql e mandar as variaveis do loop dos itens pelo delphi e depois, executar o commit ou rollback pelo proprio sql server tambem.

 

"Uma vez li em um livro que quando a unica ferramenta que você sabe usar é um martelo, você acha que todo problema que tem é um prego!!!"

 

Talvez eu esteja tetando os meios errados por uma simples falta de conheciemntos de outros meios.

 

Agradeco por qualquer ajuda que você possa me dar!

 

Um muito obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Porque não cria uma outra procedure que recebe todos os parâmetros e dentro dela abre a transação e a fecha em caso de erro, chamando as outras sps dentro desta? Você poderia encapsular assim N procedures dentro de uma principal e no seu código no delphi só chamar a principal... o resto ficaria a cargo da sua SP.

 

Talvez seja mais interessante mover seu tópico para a área do SQL Server, eles podem lhe dar melhores dicas sobre este tipo de procedimento que eu.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.