Array
(
)

Atualizar média

--lh-pim--
   - 08 nov 2008

Olá pessoal, estou fazendo uma aplicação e estou com algumas dúvidas...

é o seguinte, eu tenho três tabelas: CANDIDATOS, QUESTOES e PROVA..

na tabela CANDIDATOS tenho um campo chamado media que tem que ser atualizada constantemente quando uma questão é inserida, vou deixar mais claro...

em QUESTOES tenho id pk
peso

e em PROVA tenho id_cand pk fk candidatos
id_questao pk fk questoes
valor_obtido

tenho que multiplicar o valor obtido na questão pelo peso da questão e depois fazer a média do candidato que vai entrar no campo média, que tem que ser atualizado sempre que uma nova questão ou prova for adicionada
estou com muitas dúvidas sobre essa questão, tentei fazer uma trigger,mas não está dando certo, gostaria da opinião de algupem que pudesse me ajudar com isso...

agradeço desde já pela ajuda

Codename.v
   - 09 nov 2008

Seu pensamento está corrento quanto ao que fazer amigo... Utilizar triggers! :D

Tente:

#Código

CREATE TRIGGER TrgExemplo ON PROVAS
AFTER INSERT
AS
BEGIN

DECLARE @ValorObtido AS FLOAT;
DECLARE @PesoQuestao AS FLOAT;
DECLARE @Media AS FLOAT;

SET @ValorObtido = (SELECT valor_obtido FROM Inserted);
SET @PesoQuestao = (SELECT peso FROM QUESTOES WHERE id = (SELECT id FROM Inserted));

SET @Media = @ValorObtido * @PesoQuestao;

UPDATE CANDIDATOS SET media = @Media WHERE id_cand = (SELECT id_cand FROM Inserted);

END


Esse é um trigger ´after insert´ colocado em sua tabela PROVAS, ou seja, vai ser disparado depois que novos valores forem inseridos na mesma. O valor obtido e o peso da questão serão armazenados nas variáveis @ValorObtido e @PesoQuestao respectivamente. Em seguida a média é calculada e atribuida à variável @Media que por sua vez é utilizada para alterar o campo media do candidato em questão.

Recontrui suas tabelas e testei o trigger... Funciona perfeitamente. Qualquer dúvida entre em contato!

Abraços!

--lh-pim--
   - 09 nov 2008

brilhante amigo, era uma coisa dessas que eu tinha em mente,mas não conseguia desenvolver...

Agora,eu precisava criar essa trigger no Firebird, tem idéia de como eu possa fazer isso??? :?

se puder,agradecerei muito

muito obrigado pela ajuda e também muito obrigado caso possa me ajudar futuramente :wink:

--lh-pim--
   - 09 nov 2008

Olha só, estou passando essa trigger para Firebird,ela ficou assim:

#Código

 
           AS
   declare variable ValorObtido float;
   declare variable PesoQuestao float;
   declare variable media float;
BEGIN

   ValorObtido = (SELECT VALOR_OBTIDO FROM inserted);
   PesoQuestao = (SELECT PESO_QUESTAO FROM QUESTOES WHERE ID_QUESTAO = (SELECT ID_QUESTAO FROM inserted));
    
   media = ValorObtido * PesoQuestao;

   UPDATE CANDIDATOS SET media = MEDIA_CAND WHERE ID_CAND = (SELECT ID_CAND FROM inserted);
end


agora ele me retorna o seguinte erro:

Column does not belong to referenced table.
Dynamic SQL Error.
SQL error code = -206.
Subselect illegal in this context.

não estou entendendo muito bem... :?

se puder me ajudar, agradeço desde já[/tagcod]

Codename.v
   - 10 nov 2008

Poste os códigos e sua respectiva mensagem de erro na seção dedicada ao banco de dados Firebird deste fórum. Talvez alguém saiba como lhe ajudar. :D

Abraços!

Emerson
   - 11 nov 2008

tente assim:
#Código

AS
   declare variable ValorObtido float;
   declare variable PesoQuestao float;
   declare variable media float;
BEGIN

   ValorObtido := inserted.VALOR_OBTIDO;

   SELECT PESO_QUESTAO FROM QUESTOES WHERE ID_QUESTAO = inserted.ID_QUESTAO into :PesoQuestao;
    
   media = ValorObtido * PesoQuestao;

   UPDATE CANDIDATOS SET MEDIA_CAND = :media WHERE ID_CAND = inserted.ID_CAND;
end