Jump to content
lealdl

[Resolvido] Trigger não funciona

Recommended Posts

lealdl

Pessoal, alguém me ajuda com essa trigger?

Preciso dar um update em uma tabela "quartos", alterando o status do quarto para '1', sempre que um quarto for ocupado.

Isso precisa acontecer sempre que a tabela "locações" é preenchida.

Segue o meu código:

<?php if(isset($_POST['cadastrar'])){
$campo1 = strip_tags(trim($_POST['campo1']));
$campo2 = strip_tags(trim($_POST['campo2']));
$data= strip_tags(trim($_POST['data']));
$diaria= strip_tags(trim($_POST['diaria']));
$data  =date('Y/m/d H:i:s');
$entrada  =date('Y/m/d H:i:s');
$quarto_status ='locado';
$locado = 1;
$idPost = strip_tags(trim($_POST['id']));

//

"CREATE TRIGGER status AFTER UPDATE ON tb_locacoes  
  FOR EACH ROW 
  begin
INSERT INTO tb_locacoes  SET cliente = :campo1, quarto = :campo2, data_cad =:date,data_entrada =:entrada,diaria_quarto =:diaria, quarto_status =:quarto_status";

  end;
$sql_atualiza ="UPDATE quartos SET quarto_status =:locado WHERE quartoID = :idPost ORDER BY quarto_numero";;

try{
    $query_update = $conecta->prepare($sql_atualiza);
    
    $query_update->bindValue(':campo1',$campo1,PDO::PARAM_STR);

  
    $query_update->bindValue(':campo2',$campo2,PDO::PARAM_STR);
          $query_update->bindValue(':date',$data,PDO::PARAM_STR);
        $query_update->bindValue(':entrada',$entrada,PDO::PARAM_STR);
        $query_update->bindValue(':diaria',$diaria,PDO::PARAM_STR);
        $query_update->bindValue(':quarto_status',$quarto_status,PDO::PARAM_STR);
 
    $query_update->execute();
        
    echo 'Entrada registrada com sucesso!';
    
}catch (PDOexception $error_update){
    echo 'Erro ao Cadastrar '.$error_update->getMessage();
}


}

?>

Quando o "were" é retirado, o status do quarto é atualizado para todos os quartos, porém não insere na tabela "locacoes". 

Por favor, alguém me indica onde posso estar errando?

Grato, boa noite a todos!

Edited by lealdl
Dúvida resolvida

Share this post


Link to post
Share on other sites
Agostinho Marcos Garcia Si
-- drop TABLE [dbo].[NomeDaSuaTabela];

CREATE TABLE [dbo].[NomeDaSuaTabela] ( -- Preparar, Montar, Entregar, Esperar, Tolerancia, Tolerancia cliente ...
    [IdNomeDaSuaTabela] [Chave] ,
    [EstaOcupado] [IntPadraoHum] ,   -- Nao/Sim; 1- Nao, 2- Sim
    [QtdCamas] [CampoNumerico]   
        CONSTRAINT PkNomeDaSuaTabela PRIMARY KEY CLUSTERED (IdNomeDaSuaTabela)
) 
GO

If exists (select * FROM sysobjects WHERE id = object_id(N'[dbo].[NomeDaSuaTabelaTri]') AND OBJECTPROPERTY(id, N'IsTrigger') = 1)
   drop trigger [dbo].[NomeDaSuaTabelaTri]
GO

CREATE trigger NomeDaSuaTabelaTri on NomeDaSuaTabela for UPDATE
  AS
  Begin Tran     
  Declare @IdNomeDaSuaTabelaLocal Chave; -- Chave = Decimal(10,0);

  Set @IdNomeDaSuaTabelaLocal = 0;
  Select @IdNomeDaSuaTabelaLocal = INSERTED.IdNomeDaSuaTabela from INSERTED;

  UPDATE NomeDaSuaTabela Set 
    NomeDaSuaTabela.EstaOcupado = 2
    WHERE 
      NomeDaSuaTabela.IdNomeDaSuaTabela = @IdNomeDaSuaTabelaLocal;   -- IdNomeDaSuaTabela = Nome do campo chave

  If @@Error = 0   
     Commit Tran
  Else
     Begin 
       RollBack Tran
       Raiserror ('Houve erro na atualizacao', 16,10)
       Return 
     End
GO


/*
   Existem varias formas de fazer triggers, podem ser procedures ou codigo local.  Existem triggers de: Update, Delete, Insert, Login, DDL e outros.

   Se precisar de alguma ajuda extra, pode me chamar.  

   erpallbusiness@gmail.com --- Agostinho Marcos Garcia Silvestre.

*/

Insert into NomeDaSuaTabela values (1, 1, 2);
Insert into NomeDaSuaTabela values (2, 1, 1);
Insert into NomeDaSuaTabela values (3, 1, 2);
GO

Select 'Antes da atualizacao' as Antes, NomeDaSuaTabela.* from NomeDaSuaTabela;
GO

Update NomeDaSuaTabela Set
  QtdCamas = 2
  Where  
    IdNomeDaSuaTabela = 2;
GO

Select 'Depois da atualizacao ' as Antes, NomeDaSuaTabela.* from NomeDaSuaTabela;
GO

 

  • Vote 1

Share this post


Link to post
Share on other sites
Agostinho Marcos Garcia Si

Não entendi o quê querem dizer, com português "ao nível da ortografia e pontuação", utilizo português Brasil, Brasil utiliza o português do acordo ortográfico firmado entre os países que de língua portuguesa.  Eu em particular, falo e escrevo dentro desse acordo. Acredito que boa parte da população brasileira falam também. 

Eu respeito o posicionamento do fórum.  Achei, como é um fórum técnico, seu foco principal seria ajuda técnica e não discussão de português. 

Desculpe, poderei deixar o fórum, se o foco principal não for apoio técnico colaborativo de os moderados e os clientes do fórum. 

Obrigado.

 

 

Share this post


Link to post
Share on other sites
lealdl
Em 03/11/2017 às 06:46, Agostinho Marcos Garcia Si disse:

-- drop TABLE [dbo].[NomeDaSuaTabela];

CREATE TABLE [dbo].[NomeDaSuaTabela] ( -- Preparar, Montar, Entregar, Esperar, Tolerancia, Tolerancia cliente ...
    [IdNomeDaSuaTabela] [Chave] ,
    [EstaOcupado] [IntPadraoHum] ,   -- Nao/Sim; 1- Nao, 2- Sim
    [QtdCamas] [CampoNumerico]   
        CONSTRAINT PkNomeDaSuaTabela PRIMARY KEY CLUSTERED (IdNomeDaSuaTabela)

GO

If exists (select * FROM sysobjects WHERE id = object_id(N'[dbo].[NomeDaSuaTabelaTri]') AND OBJECTPROPERTY(id, N'IsTrigger') = 1)
   drop trigger [dbo].[NomeDaSuaTabelaTri]
GO

CREATE trigger NomeDaSuaTabelaTri on NomeDaSuaTabela for UPDATE
  AS
  Begin Tran     
  Declare @IdNomeDaSuaTabelaLocal Chave; -- Chave = Decimal(10,0);

  Set @IdNomeDaSuaTabelaLocal = 0;
  Select @IdNomeDaSuaTabelaLocal = INSERTED.IdNomeDaSuaTabela from INSERTED;

  UPDATE NomeDaSuaTabela Set 
    NomeDaSuaTabela.EstaOcupado = 2
    WHERE 
      NomeDaSuaTabela.IdNomeDaSuaTabela = @IdNomeDaSuaTabelaLocal;   -- IdNomeDaSuaTabela = Nome do campo chave

  If @@Error = 0   
     Commit Tran
  Else
     Begin 
       RollBack Tran
       Raiserror ('Houve erro na atualizacao', 16,10)
       Return 
     End
GO


/*
   Existem varias formas de fazer triggers, podem ser procedures ou codigo local.  Existem triggers de: Update, Delete, Insert, Login, DDL e outros.

   Se precisar de alguma ajuda extra, pode me chamar.  

   erpallbusiness@gmail.com --- Agostinho Marcos Garcia Silvestre.

*/

Insert into NomeDaSuaTabela values (1, 1, 2);
Insert into NomeDaSuaTabela values (2, 1, 1);
Insert into NomeDaSuaTabela values (3, 1, 2);
GO

Select 'Antes da atualizacao' as Antes, NomeDaSuaTabela.* from NomeDaSuaTabela;
GO

Update NomeDaSuaTabela Set
  QtdCamas = 2
  Where  
    IdNomeDaSuaTabela = 2;
GO

Select 'Depois da atualizacao ' as Antes, NomeDaSuaTabela.* from NomeDaSuaTabela;
GO
 

Obrigado, Agostinho! Irei estudar o código que enviou, precisarei com certeza de ajuda! Abraços,

Luciano

 

Share this post


Link to post
Share on other sites
lealdl
Em 03/11/2017 às 06:46, Agostinho Marcos Garcia Si disse:

-- drop TABLE [dbo].[NomeDaSuaTabela];

CREATE TABLE [dbo].[NomeDaSuaTabela] ( -- Preparar, Montar, Entregar, Esperar, Tolerancia, Tolerancia cliente ...
    [IdNomeDaSuaTabela] [Chave] ,
    [EstaOcupado] [IntPadraoHum] ,   -- Nao/Sim; 1- Nao, 2- Sim
    [QtdCamas] [CampoNumerico]   
        CONSTRAINT PkNomeDaSuaTabela PRIMARY KEY CLUSTERED (IdNomeDaSuaTabela)
) 
GO

If exists (select * FROM sysobjects WHERE id = object_id(N'[dbo].[NomeDaSuaTabelaTri]') AND OBJECTPROPERTY(id, N'IsTrigger') = 1)
   drop trigger [dbo].[NomeDaSuaTabelaTri]
GO

CREATE trigger NomeDaSuaTabelaTri on NomeDaSuaTabela for UPDATE
  AS
  Begin Tran     
  Declare @IdNomeDaSuaTabelaLocal Chave; -- Chave = Decimal(10,0);

  Set @IdNomeDaSuaTabelaLocal = 0;
  Select @IdNomeDaSuaTabelaLocal = INSERTED.IdNomeDaSuaTabela from INSERTED;

  UPDATE NomeDaSuaTabela Set 
    NomeDaSuaTabela.EstaOcupado = 2
    WHERE 
      NomeDaSuaTabela.IdNomeDaSuaTabela = @IdNomeDaSuaTabelaLocal;   -- IdNomeDaSuaTabela = Nome do campo chave

  If @@Error = 0   
     Commit Tran
  Else
     Begin 
       RollBack Tran
       Raiserror ('Houve erro na atualizacao', 16,10)
       Return 
     End
GO


/*
   Existem varias formas de fazer triggers, podem ser procedures ou codigo local.  Existem triggers de: Update, Delete, Insert, Login, DDL e outros.

   Se precisar de alguma ajuda extra, pode me chamar.  

   erpallbusiness@gmail.com --- Agostinho Marcos Garcia Silvestre.

*/

Insert into NomeDaSuaTabela values (1, 1, 2);
Insert into NomeDaSuaTabela values (2, 1, 1);
Insert into NomeDaSuaTabela values (3, 1, 2);
GO

Select 'Antes da atualizacao' as Antes, NomeDaSuaTabela.* from NomeDaSuaTabela;
GO

Update NomeDaSuaTabela Set
  QtdCamas = 2
  Where  
    IdNomeDaSuaTabela = 2;
GO

Select 'Depois da atualizacao ' as Antes, NomeDaSuaTabela.* from NomeDaSuaTabela;
GO

 

Agostinho, muito obrigado! Consegui resolver o problema do update. Depois de algumas madrugadas sem dormir, cheguei à conclusão de que o mysql não suporta múltiplas triggers, deparando-me com mais um retorno de erro(pra meu desespero). Mas insisti e consegui resolver da seguinte maneira: deletando a trigger e recriando-a se não existir.

Deixo meu código, para se alguém por ventura se enroscar no mesmo problema:



$sql_atualiza= "DROP TRIGGER IF EXISTS st_;
CREATE TRIGGER st_ BEFORE INSERT ON tb_locacoes  
  FOR EACH ROW 
  begin
UPDATE quartos SET quarto_status ='locado'
  WHERE quarto_numero = new.quarto;
 

END;

INSERT INTO tb_locacoes  SET cliente = :campo1, quarto = :campo2, data_cad =:date,data_entrada =:entrada,diaria_quarto =:diaria, 
quarto_status =:quarto_status";
 
try{
    $query_update = $conecta->prepare($sql_atualiza);
    
    $query_update->bindValue(':campo1',$campo1,PDO::PARAM_STR);

  
    $query_update->bindValue(':campo2',$campo2,PDO::PARAM_STR);
          $query_update->bindValue(':date',$data,PDO::PARAM_STR);
        $query_update->bindValue(':entrada',$entrada,PDO::PARAM_STR);
        $query_update->bindValue(':diaria',$diaria,PDO::PARAM_STR);
        $query_update->bindValue(':quarto_status',$quarto_status,PDO::PARAM_STR);
 
    $query_update->execute();
        
    echo 'Entrada registrada com sucesso!';
    
}catch (PDOexception $error_update){
    echo 'Erro ao Cadastrar '.$error_update->getMessage();
}


}

?>
[/CODE]

Grato pela imediata resposta! Um grande abraço,

Luciano D. Leal

"...o que fizermos do mundo nesta altura irá propagar-se ao longo dos séculos e decidir fortemente o destino de nossos
descendentes... (Carl Sagan)"

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.