Jump to content
Fórum Script Brasil
  • 0

Subtrair valores no mesmo campo e na mesma tabela


Jesio Costa

Question

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 to comment
Share on other sites

21 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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 to comment
Share on other 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";
}
Edited by wootzor
Link to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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).

Edited by wootzor
Link to comment
Share on other 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 to comment
Share on other sites

  • 0

Um erro diferente mas que me parece estar relacionado com a mesma questão. Por alguma razão, a stored procedure não deve estar a devolver nenhum valor e portanto a variável $sql deve estar a false em vez de conter um result set.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...