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

Subtrair valores no mesmo campo e na mesma tabela


Jesio Costa

Pergunta

Olá pessoal, preciso de uma ajuda.

tenho um script que me retorna da tabela transacoes a soma de valores de um mesmo campo tvalor, para recuperar essa soma, usei condições WHERE, que pega somente os registros relacionados ao campo ttipos como está abaixo.

<?php
include "../../configbd.php";
$sql = mysql_query("SELECT sum(tvalor) AS soma FROM transacoes WHERE ttipos='RECEITA' OR ttipos='DESPESA FIXA' AND ttipos='DESPESA VARIÁVEL'");
while($dados = mysql_fetch_array($sql)){
echo "R$ ".$dados['soma'].",00";
}
?>

Ou seja, será exibido a soma dos valores, nos registros como RECEITA, DESPESA FIXA e DESPESA VARIÁVEL.

Eu preciso nesta mesma situação fazer uma subtração no lugar da soma, entende? Mas usando o WHERE.
eu tenho uma tabela transacoes, nela um campo tvalor e outro campo ttipos (que é um input select com 3 options: RECEITA, DESPESA FIXA, DESPESA VARIÁVEL), na hora do cadastro, eu escolho qual tipo da transação.
É um controle financeiro, e eu preciso recuperar a diferença de valor entre os registros com tipo RECEITA e os do tipo DESPESA FIXA e DESPESA VARIÁVEL juntas.

TOTAL = RECEITA - DESPESA FIXA + DESPESA VARIÁVEL.

Grato.

Link para o comentário
Compartilhar em outros sites

21 respostass a esta questão

Posts Recomendados

  • 0

Penso que o melhor caminho será criar uma stored procedure que faz os cálculos necessários internamente e devolve apenas o resultado final.

Fica um exemplo. Seguindo essa lógica, para obteres o total (a que chamei lucro) basta fazeres o seguinte:

<?php

$result = mysql_query("CALL spLucro(@lucro)");
if (!$result)
{
   echo "Ocorreu um erro: " . mysql_errno() . ': '. mysql_error();
}
else 
{
   while ($row = mysql_fetch_row($result)) 
   {
     echo $row;
   }
}
    

Atenção que o código PHP não foi testado, pelo que pode precisar de alguns ajustes mas a lógica é essa.

Considera também utilizar mysqli ou PDO em vez da extensão mysql para aceder à base de dados.

Link para o comentário
Compartilhar em outros sites

  • 0
Eu não tenho muita experiência, mas coloquei dessa forma, deu erro. Fiz errado né?
A minha tabela aqui é transacoes, com um 's' só.
<span style="position:absolute; top:0; right:0; color:green; text-align:right; font-size:18px;">
<?php
include "../../configbd.php";
CREATE PROCEDURE spLucro (OUT lucro FLOAT)
BEGIN
DECLARE receita float;
DECLARE despesa float;
SET receita = (SELECT sum(tvalor) FROM transacoes
WHERE ttipos='RECEITA');
SET despesa = (SELECT sum(tvalor) FROM transacoes
WHERE ttipos='DESPESA FIXA' OR ttipos='DESPESA VARIÁVEL');
SELECT (receita-despesa) INTO lucro FROM transacoes LIMIT 1;
END//
$sql = mysql_query("SELECT sum(tvalor) AS Receita FROM transacoes WHERE ttipos='RECEITA';
SELECT sum(tvalor) AS Despesa FROM transacoes WHERE ttipos='DESPESA FIXA' OR ttipos='DESPESA VARIÁVEL';
CALL spLucro(@lucro);
SELECT @lucro AS Lucro;");
while($dados = mysql_fetch_array($sql)){
echo "R$ ".$dados['soma'].",00";
}
?>
<h1 style="margin:0; padding:0; font-size:12px; font-weight:normal; color:#AAA;">LÍQUIDO NO MÊS</h1>
</span>
Link para o comentário
Compartilhar em outros sites

  • 0

A stored procedure tem de ser criada no MySQL e não a partir do PHP.

SELECT sum(tvalor) AS Receita FROM transacoes WHERE ttipos='RECEITA'; 
SELECT sum(tvalor) AS Despesa FROM transacoes WHERE ttipos='DESPESA FIXA' OR ttipos='DESPESA VARIÁVEL'; 
CALL spLucro(@lucro);
SELECT @lucro AS Lucro;

Estas quatro linhas eram simplesmente de exemplo. Não é possível executar várias instruções num único comando mysql_query().

Experimenta antes algo assim:

$sql = mysql_query("CALL spLucro(@lucro)");
while ($dados = mysql_fetch_array($sql)) {
  echo "R$ ".$dados[0].",00";
}
Editado por wootzor
Link para o comentário
Compartilhar em outros sites

  • 0

Acho que to entendendo, mas quando executei o sql deu um erro:

dot.gif

Erro

Comando SQL:

CREATE PROCEDURE spLucro (OUT lucro FLOAT)
BEGIN
  DECLARE receita float;

Mensagens do MySQL : dot.gif

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 3

Um erro na linha 3

Link para o comentário
Compartilhar em outros sites

  • 0

Penso que o problema é que, antes de criar a stored procedure, tens de alterar o limitador de uma instrução para um (conjunto de) caracter(es) diferente do ponto-e-vírgula, assim:

DELIMITER //;
CREATE PROCEDURE spLucro (OUT lucro FLOAT)
BEGIN
  DECLARE receita FLOAT;
  DECLARE despesa FLOAT;
  SET receita = (SELECT sum(tvalor) FROM transaccoes
  WHERE ttipos='RECEITA');
  SET despesa = (SELECT sum(tvalor) FROM transaccoes
  WHERE ttipos='DESPESA FIXA' OR ttipos='DESPESA VARIÁVEL');
  SELECT (receita-despesa) INTO lucro FROM transaccoes LIMIT 1;
END//

DELIMITER ;
Link para o comentário
Compartilhar em outros sites

  • 0

Esse erro específico costuma ocorrer quando o result set (no caso a variável $sql), devolve um valor booleano e não um objecto. Experimenta fazer debug e verifica o valor da variável após a execução da instrução mysql_query e antes de entrar no ciclo while.

Edit: Reparei agora que na imagem não tens nenhum IDE aberto. Usas o Notepad++ para escrever código em PHP, é? Nesse caso, fazer debug torna-se um pouco mais complexo. Tenta escrever a variável com echo ou um print_r da variável $sql (para perceber se é um array ou booleano).

Editado por wootzor
Link para o comentário
Compartilhar em outros sites

  • 0

Eu uso o notepad++ sim, eu chamei no html dessa forma:

<span style="position:absolute; top:0; right:0; color:green; text-align:right; font-size:18px;">
<?php
$sql = mysql_query("CALL spLucro(@lucro)");
while ($dados = mysql_fetch_array($sql)) {
echo "R$ ".$dados[0].",00";
}
?>
<h1 style="margin:0; padding:0; font-size:12px; font-weight:normal; color:#AAA;">LÍQUIDO NO MÊS</h1>
</span>
Está correto?
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,7k
×
×
  • Criar Novo...