Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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!!!
Olá Karlo Uchoa,
Seja mais claro ao especificar o problema. Qual erro está ocorrendo? Onde você precisa de ajuda?
>
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!
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
Tópico em Sql Server Excluido, não duplique suas dúvidas.
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!
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
begin tran -- grava cabecalho da venda
DECLARE
@pedido int
IF @@ERROR<>0
ROLLBACK -- grava cabecalho da venda
ELSE
COMMIT -- grava cabecalho da venda