CRIEI UM SCHEMA NOVO COM PARAMETROS E ETC PRECISO CRIAR UMA TRIGGER QUE FUNCIONE , PORÉM NÃO ESTOU CONSEGUINDO QUERO FAZER O CÁLCULO DAS DOACOES
CRIEI UM SCHEMA NOVO COM PARAMETROS E ETC PRECISO CRIAR UMA TRIGGER QUE FUNCIONE , PORÉM NÃO ESTOU CONSEGUINDO QUERO FAZER O CÁLCULO DAS DOACOES
Suellen,
Pelo que eu estou vendo na tela printada, sua trigger atualiza a tabela "tab_calculo" caso ocorra uma inserção dentro da tabela "doacoes".
Então você inseriu a "A.quantidade_cestas" no campo "quantidade_deposito" e o somatório de "B.cestas" dentro de "quantidade_cestas"... okay... mas e a "quantidade_agua"?
Por favor, você poderia descrever melhor o que a tabela "doacoes" armazena e o que a sua trigger irá fazer?
Se você colocar os "creates" das tabelas e o trigger aqui aqui eu posso replicar seu banco na minha máquina e ficará mais fácil te ajudar.
[]'s,
Fabio I.
USE users;
CREATE TABLE TAB_CALCULO
(QUANTIDADE_DEPOSITO FLOAT NULL, QUANTIDADE_CESTAS FLOAT NULL, QUANTIDADE_AGUA VARCHAR(20) NULL, PROATIVIDADE FLOAT NULL) ;
USE users;
INSERT INTO TAB_CALCULO
SELECT A.QUANTIDADE_CESTAS SUM(B.CESTAS) AS TOTAL_DOACOES FROM DOACOES B INNER JOIN TAB_CALCULO
ON A.QUANTIDADE_CESTAS = B.CESTAS
GROUP BY PROATIVIDADE;
USE users;
DELIMITER //
CREATE TRIGGER TG_DOACOES_CALCULA_INSERT AFTER INSERT ON DOACOES
FOR EACH ROW BEGIN
DELETE FROM TAB_CALCULO;
INSERT INTO TAB_CALCULO
SELECT A.QUANTIDADE_DEPOSITO, A.QUANTIDADE_CESTAS, A.QUANTIDADE_AGUA, SUM( B.CESTAS + B.DEPÓSITOS + B.ÁGUA) AS TOTAL_CESTAS FROM
TAB_CALCULO A INNER JOIN DOACOES B
ON A.QUANTIDADE_CESTAS = B.CESTAS
GROUP BY TOTAL_CESTAS;
END//
Suellen,
Por favor, nas não "printe" a tela, senão eu preciso digitar tudo, copie o TEXTO do código, coque aqui e marque o conjunto todo com o símbolo acima "</>" para transformar em código-fonte copiável.
Exemplo:
CREATE DATABASE USERS;
USE USERS;
CREATE TABLE TAB_CALCULO (
QUANTIDADE_DEPOSITO FLOAT null,
QUANTIDADE_CESTAS FLOAT null,
QUANTIDADE_AGUA VARCHAR(20) NULL,
PROATIVIDADE FLOAT NULL
);
CREATE TABLE DOACOES(
PROATIVIDADE FLOAT NULL,
CESTAS FLOAT null,
DEPOSITO FLOAT null,
AGUA VARCHAR(20) NULL
);
INSERT INTO TAB_CALCULO (QUANTIDADE_DEPOSITO, QUANTIDADE_CESTAS, QUANTIDADE_AGUA)
VALUES
(870, 135, '160L'), (2500, 215, '80L');
SELECT *
FROM TAB_CALCULO;
INSERT INTO DOACOES (CESTAS, DEPOSITO, AGUA)
VALUES
(135, 870, '160L'), (215, 2500, '80L');
SELECT *
FROM DOACOES;
Agora basta eu clicar no botão "copiar código".
Obrigado,
Fabio I.
RESOLVIDO FABIO
Suellen,
Tem alguns pontos estranhos no seu SQL.
1º) Você está somando FLOAT com VARCHAR(20)? Se você quiser fazer isso, precisa fazer um CAST, mas NÃO recomendo, pois a UNIDADE DE MEDIDA pode mudar de litros para mililitros? Se mudar, precisa entender qual é a unidade e calcular de acordo. SUGESTÃO: Faça com que este campo SOMENTE receba valores em LITROS e transforme este campo em FLOAT.
2º) Seu "Group By" vai retornar somente um campo... qual campo vai receber o valor total? NÃO seria melhor TOTALIZAR por campo e armazenar em cada campo respectivo?
POR EXEMPLO:
SELECT sum(CESTAS), SUM(DEPOSITO), sum(cast(AGUA as unsigned integer))
FROM DOACOES;
sum(CESTAS) | SUM(DEPOSITO) | sum(cast(AGUA as unsigned integer)) |
---|---|---|
350 | 3370 | 240 |
Depois você pode guardar estes valores em uma linha na tabela "TAB_CALCULO".
Seria isso?
Veja também:
==========================================================
Converter string para inteiro MYSQL
Use CAST():
SELECT mov . * , prod.produto, prod.unidade, prod.icms, prod.ipi, cast(prod.codigo as unsigned integer)
FROM movimentacao AS mov, produtos AS prod
WHERE mov.Codigo = prod.codigo
https://pt.stackoverflow.com/questions/13985/converter-string-para-inteiro-mysql
==========================================================
[]'s,
Fabio I.
USE users;
INSERT INTO TAB_CALCULO
SELECT A.QUANTIDADE_CESTAS,A.QUANTIDADE_DEPOSITO, A.AGUA_LITROS SUM(B.CESTAS, B.DEPÓSITO, B.ÁGUA) AS TOTAL_DOACOES FROM DOACOES B INNER JOIN TAB_CALCULO
ON A.PROATIVIDADE = B.PROATIVIDADE
GROUP BY PROATIVIDADE;
Como faço os inserts da outra tab p essa?
Suellen,
Que bom que você conseguiu resolver.
Minha solução seria esta:
Transformar os campos "QUANTIDADE_AGUA" e "AGUA" em FLOAT e PADRONIZAR para o USUÁRIO SOMENTE inserir ÁGUA em LITROS;
Abaixo o código COMPLETO com a modificação das TABELAS e da TRIGGER:
CREATE DATABASE USERS;
USE USERS;
CREATE TABLE TAB_CALCULO (
QUANTIDADE_DEPOSITO FLOAT null,
QUANTIDADE_CESTAS FLOAT null,
QUANTIDADE_AGUA FLOAT null,
PROATIVIDADE FLOAT null
);
CREATE TABLE DOACOES(
PROATIVIDADE FLOAT null,
CESTAS FLOAT null,
DEPOSITO FLOAT null,
AGUA FLOAT null
);
DELIMITER //
CREATE trigger TG_doacoes_calcula_insert AFTER INSERT ON DOACOES
FOR EACH ROW BEGIN
DELETE FROM TAB_CALCULO;
INSERT INTO TAB_CALCULO (QUANTIDADE_DEPOSITO, QUANTIDADE_CESTAS, QUANTIDADE_AGUA)
SELECT sum(DEPOSITO), sum(CESTAS), sum(AGUA)
FROM DOACOES;
END//
INSERT INTO DOACOES (CESTAS, DEPOSITO, AGUA)
VALUES
(135, 870, 160), (215, 2500, 80);
SELECT *
FROM DOACOES;
SELECT *
FROM TAB_CALCULO;
#INSERTS PARA TESTE:
/*
INSERT INTO TAB_CALCULO (QUANTIDADE_DEPOSITO, QUANTIDADE_CESTAS, QUANTIDADE_AGUA)
VALUES
(870, 135, 160), (2500, 215, 80);
SELECT *
FROM TAB_CALCULO;
SELECT sum(CESTAS), SUM(DEPOSITO), sum(cast(AGUA as FLOAT))
FROM DOACOES;
*/
-- * SOMENTE PARA TESTES - USE COM CAUTELA:
-- DELETE FROM doacoes;
-- DROP TABLE doacoes;
-- DELETE FROM tab_calculo;
-- DROP TABLE tab_calculo;
-- DROP TRIGGER TG_doacoes_calcula_insert;
[]'s,
Fabio I.
Fabio sua explicação e exemplos estão impecáveis, mas eu já tenho um banco com dados que quero extrair para esta tab_calculo, entendeu?
Suellen,
Entendi, então você vai precisar dar um jeito de usar a função "CAST".
O CAST que eu fiz no SELECT funcionou aqui na minha máquina, mas dentro da TRIGGER deu erro... talvez se você puder mudar para FLOAT somente a tabela destino "TAB_CALCULO" no campo "AGUA", então é possível que a TRIGGER funcione... não testei esta hipótese aqui.
Agora se você NÃO puder alterar nenhuma das duas tabelas... então vai complicar um pouco... Qual unidade de medida para LÍQUIDOS será usada? Litros, Mililitros, Barril, Galão, Onça Líquida, Colher de chá, Taça, Xícara, etc... Vai precisa CONVERTER a unidade para que NÃO ocorram enganos, erros na SOMATÓRIA... entendeu? Exemplo: 1 Litro + 100 Mililitros + 1 Colher de chá = 102? ERRADO!!!
Mas se SEMPRE for em LITROS, então basta retirar o "L" na hora de somar... é uma ideia.
[]'s,
Fabio I.
INSERT INTO TAB_CALCULO
SELECT A.PROATIVIDADE, A.QUANTIDADE_DEPOSITO, A.QUANTIDADE_CESTAS, AGUA_LITROS, SUM(B.PROATIVIDADE, B.DEPÓSITO, B.CESTAS, B.ÁGUA) AS TOTAL_DOACOES
FROM TAB_CALCULO A INNER JOIN DOACOES B
ON A.PROATIVIDADE = B.PROATIVIDADE
GROUP BY PROATIVIDADE;
O ERRO AINDA PERMANECE NA TENTATIVA DO INSERT, ALGUÉM PODE ME AJUDAR
Suellen,
Por favor, pode abrir outra discussão e CITAR o LINK desta discussão. Ninguém vai querer responder discussão que NÃO ganha pontos...
... se possível, coloque um cabeçalho melhor. "HELP" é muito genérico.
[]'s,
Fabio I.