Jump to content


Photo

Algo Parecido Com Rs.eof


  • Faça o login para participar
5 replies to this topic

#1 TucaZ

TucaZ

    Normal

  • Usuários
  • 99 posts
  • Sexo:Não informado

Posted 11/01/2005, 10:18

Olá!

Estou montando uma trigger e preciso do seguinte:

Quando um registro for atualizado na minha tabela preciso atualizar outra tabela baseado em um Select. Para isso eu precisaria rodar um "loop" com os resultados do banco, mas não sei se é possível. Vou exemplificar colocando em ASP o que eu
preciso traduzir para banco de dados, SQL Server nesse caso.

rs.Open("SELECT ID, ID2 FROM TABELA")
Do Until rs.EOF
objCN.Execute("UPDATE TABELA2 SET campo1 = campo1 + 1 WHERE codigo1 = " & rs("id") & " AND codigo2 = " & rs("id2"))
rs.MoveNext
Loop

Entenderam?

Abraços

#2 Prog

Prog

    ...

  • Ex-Admins
  • 3761 posts
  • Sexo:Masculino
  • Localidade:Rio de Janeiro/RJ
  • Interesses:TI, Software Livre, Design Digital e Rock'n'Roll.

Posted 11/01/2005, 11:01

Cara... tem um tal de Books Online, quando vc instala o SQL SERVER, digamos que seja a Referencia da Linguagem, se vc procurar pelo comando WHILE, vai perceber como a coisa é bem mais simples do que imagina, exemplo:

...
DECLARE @id1 INT
DECLARE @id2 INT

DECLARE ids_cursor CURSOR FOR SELECT ID1, ID2 FROM TABELA
OPEN ids_cursor

FETCH NEXT FROM ids_cursor INTO @id1, @id2
WHILE @@FETCH_STATUS = 0
BEGIN
   UPDATE TABELA2 SET campo1=(campo1+1) WHERE codigo1=@id1 AND codigo2=@id2
   FETCH NEXT FROM ids_cursor INTO @id1, @id2
END

CLOSE ids_cursor
DEALLOCATE ids_cursor
...

------
Mero mortal!

#3 TucaZ

TucaZ

    Normal

  • Usuários
  • 99 posts
  • Sexo:Não informado

Posted 11/01/2005, 12:09

Valeu, Prog. Não uso o books online porque não tenho nada do SQL Server instalado aqui. Eu acesso ele somente pelo ASP.

Vou tentar com o código que você passou e ver o que consigo fazer.

Em todo caso, vou deixar aqui meu Trigger pra ver se vc pode me dar uma ajuda. Quando eu rodo essa Query ele me retorna erro "Near =". Acho que seja na linha 8 da query.

CREATE TRIGGER pedidos_campanha 
ON pedido
FOR UPDATE
AS
BEGIN
DECLARE @CampanhaID INT, @CampanhaFrom varchar(30)
IF EXISTS(SELECT P.datfim_ped FROM pedido P INNER JOIN updated U ON P.codped_ped = U.codped_ped WHERE NOT P.datfim_ped IS NULL)
	BEGIN
	WHILE EXISTS(SELECT @CampanhaID = PXP.intCampanhaID, @CampanhaFrom = PXP.chaPXPFrom FROM pedidoxproduto PXP INNER JOIN updated U ON PXP.codped_ped = U.codped_ped)
  BEGIN
  UPDATE campanhaassist SET intQtdPedido = intQtdPedido + 1 WHERE intCampanhaID = @CampanhaID AND chaAssistFrom = @CampanhaFrom
  END
	END
END

Edição feita por: TucaZ, 11/01/2005, 12:19.


#4 TucaZ

TucaZ

    Normal

  • Usuários
  • 99 posts
  • Sexo:Não informado

Posted 11/01/2005, 12:36

Hmm...com o Cursor teoricamente funcionou. Só tenho um problema agora. A tabela Updated não existe. No caso de Trigger só INSERTED e DELETED existem. Como vou fazer pra poder saber QUAL registro foi atualzado? Estou procurando aqui no MSDN, mas não achei ainda.

Valeu!

#5 Prog

Prog

    ...

  • Ex-Admins
  • 3761 posts
  • Sexo:Masculino
  • Localidade:Rio de Janeiro/RJ
  • Interesses:TI, Software Livre, Design Digital e Rock'n'Roll.

Posted 11/01/2005, 12:50

No cado de uma trigger do tipo UPDATE, existem ambos INSERTED e DELETED, neste caso, vc tem que avaliar qual serve melhor, acho que, neste caso, ambos funcionam, uma vez que vc não esta fazendo update na chave.
------
Mero mortal!

#6 TucaZ

TucaZ

    Normal

  • Usuários
  • 99 posts
  • Sexo:Não informado

Posted 11/01/2005, 13:46

Consegui! Valeu a ajuda, Prog!

CREATE TRIGGER pedidos_campanha 
ON pedido
FOR UPDATE
AS
DECLARE @CampanhaID INT
DECLARE @CampanhaFrom varchar(30)
IF EXISTS(SELECT P.datfim_ped FROM pedido P INNER JOIN inserted U ON P.codped_ped = U.codped_ped WHERE NOT P.datfim_ped IS NULL)
BEGIN
	DECLARE ids_cursor CURSOR FOR SELECT PXP.intCampanhaID, PXP.chaPXPFrom FROM pedidoxproduto PXP INNER JOIN inserted U ON PXP.codped_pxp = U.codped_ped
	OPEN ids_cursor
	FETCH NEXT FROM ids_cursor INTO @CampanhaID, @CampanhaFrom

	WHILE @@FETCH_STATUS = 0
	BEGIN
  UPDATE campanhaassist SET intQtdPedido = intQtdPedido + 1 WHERE intCampanhaID = @CampanhaID AND chaAssistFrom = @CampanhaFrom
  INSERT INTO tuca (texto) VALUES (CAST(@CampanhaID AS VARCHAR(100)))
  FETCH NEXT FROM ids_cursor INTO @CampanhaID, @CampanhaFrom
	END
	CLOSE ids_cursor
	DEALLOCATE ids_cursor
END





1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq