Ir para conteúdo
Fórum Script Brasil
  • 0

Comparar valores de tabelas distintas antes de inserir


ramosaires

Pergunta

Olá, tenho uma tabela chamada 'Venda' que contém um valor total da venda.. e outra chamada pagamento que me da opcoes de cartao e dinheiro,(podendo inserir varios pagamentos) porém antes de inserir um valor de pagamento , gostaria de buscar o valor da referida venda e verificar se a soma de valores daquela venda caso exista na tabela de pagamento, não seja maior que o valor total da venda... tentando a sp abaixo mas ate agora sem sucesso.. alguém pode me ajudar porfavor?

 

CREATE DEFINER=`root`@`localhost` PROCEDURE `verificapagamento`(infcodigo int, pagcodigo int, vencodigo int, valor double)
BEGIN
 
set @posicao = vencodigo;
 
set @valorvenda = (select venvalortotal from venda where vencodigo=@posicao);
 
set @somavalores= (SELECT COALESCE(SUM(valor),0) FROM informaformapgto
WHERE vencodigo=vencodigo);
 
 
if (@somavalores <= @valorvenda) then
 
insert into informaformapgto(infcodigo, pagcodigo, vencodigo, valor) values
(infcodigo, pagcodigo, vencodigo, valor);
end if;
END

 

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

Faça assim:

CREATE DEFINER=`root`@`localhost` PROCEDURE `verificapagamento`(IN pinfcodigo INT, IN ppagcodigo INT, IN pvencodigo INT, IN pvalor DOUBLE)
BEGIN
 
   DECLARE valorvenda DOUBLE;
   DECLARE somavalores DOUBLE;
   DECLARE msg VARCHAR(1000) DEFAULT "sem mensagem";
   DECLARE excecao SMALLINT DEFAULT 0;
   DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET excecao = 1;
   
   SELECT venvalortotal INTO valorvenda FROM venda WHERE vencodigo = pvencodigo;
 
   SELECT COALESCE(SUM(valor),0) INTO somavalores FROM informaformapgto WHERE vencodigo = pvencodigo;
 
   IF somavalores > valorvenda THEN
      SET mensagem = "Valor não confere";
      SELECT mensagem AS msg;
   ELSE
      START TRANSACTION;
      INSERT INTO informaformapgto(infcodigo, pagcodigo, vencodigo, valor) 
      VALUES (pinfcodigo, ppagcodigo, pvencodigo, pvalor);
      IF excecao = 1 THEN
         SET mensagem = "Erro na gravação";
         ROLLBACK;
      ELSE
         SET mensagem = "Gravado com sucesso";
         COMMIT;
      END;
      SELECT mensagem AS msg;
   END IF;
END

Não testei o código. Por favor informe o resultado.

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Denis ,grato pelo retorno, ainda não funcionou, simplesmente não retorna nada e também não insere, realizei mudanças apenas na variavel mensagem , 

CREATE DEFINER=`root`@`localhost` PROCEDURE `verificapagamento`(IN pinfcodigo INT, IN ppagcodigo INT, IN pvencodigo INT, IN pvalor DOUBLE)
BEGIN
 
   DECLARE valorvenda DOUBLE;
   DECLARE somavalores DOUBLE;
   DECLARE msg VARCHAR(1000) DEFAULT "sem mensagem";
   DECLARE excecao SMALLINT DEFAULT 0;
   DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET excecao = 1;
   
   SELECT venvalortotal INTO valorvenda FROM venda WHERE vencodigo = pvencodigo;
 
   SELECT COALESCE(SUM(valor),0) INTO somavalores FROM informaformapgto WHERE vencodigo = pvencodigo;
 
   IF somavalores > valorvenda THEN
      SET msg = "Valor não confere";
      SELECT msg AS msg;
   ELSE
      START TRANSACTION;
      INSERT INTO informaformapgto(infcodigo, pagcodigo, vencodigo, valor) 
      VALUES (pinfcodigo, ppagcodigo, pvencodigo, pvalor);

      IF excecao = 1 THEN
         SET msg = "Erro na gravação";
         ROLLBACK;
      ELSE
         SET msg = "Gravado com sucesso";
         COMMIT;
      END if;
      END if;
      SELECT msg AS msg;
END

 

Vou colocar aqui um exemplo do banco para que possa me ajudar: 

 

create database verif_valores;
use verif_valores;

create table venda(
vencodigo int not null auto_increment primary key,
vendata date not null,
venvalortotal double);

create table formapagamento(
pagcodigo int not null auto_increment primary key,
pagdescrição varchar(8) not null);

create table informaformapgto(
infcodigo int not null,
pagcodigo int not null,
vencodigo int not null,
valor double not null,
constraint pk_informafpgto primary key (infcodigo),
constraint fk_infpgto_pgto foreign key(pagcodigo)
references formapagamento (pagcodigo) match simple
on update restrict on delete restrict,
constraint fk_infpgto_venda foreign key(vencodigo)
references venda (vencodigo) match simple
on update restrict on delete restrict);


insert into venda (vencodigo,vendata,venvalortotal) values 
(1,'2017-06-13',500);
insert into formapagamento (pagcodigo,pagdescrição) values 
(1,'Dinheiro'),
(2,'Débito'),
(3,'Crédito'); 
insert into informaformapgto (infcodigo,pagcodigo,vencodigo,valor) values
(1,1,1,300);

 

Att

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...