Ir para conteúdo
Rubens Ferreira de Couto

[Resolvido] função não retorna dados à pagina

Recommended Posts

Prezados Senhores,

pelo codigo abaixo descrito consigo buscar na base de dados o que preciso, porém quando insiro em uma função a mesma consulta SQL, não me retorna os dados da mesma forma que diretamente na página porque a consulta só retorna 1 linha.

==primeiro codigo==

require_once('config/dbconfig.php');
    include "functions.php";
    $contapd = 1;
    $mes = 2;
    $ano = 2015;
    $tipo = 1;
    $data_i = "2020-01-02";
    $data_f = "2020-01-18";    

    $pdo = new Database();
    $db = $pdo->dbConnection();
    
    //$stmt = $db->prepare("SELECT * FROM lc_movimento WHERE idconta='$contapd' and mes='$mes_hoje' and ano='$ano_hoje'");
    //$stmt = $db->prepare("SELECT * FROM lc_movimento WHERE month(datamov)='$mes_hoje' and year(datamov)='$ano_hoje' and idconta='$contapd'");
    $stmt = $db->prepare("SELECT idconta, DATE_FORMAT(datamov,'%m/%Y') AS ref, DATE_FORMAT(datamov,'%m') AS mes, DATE_FORMAT(datamov,'%Y') AS ano,
                        SUM(IF(tipo = 0, valor, 0)) AS debito,
                        SUM(IF(tipo = 1, valor, 0)) AS credito,
                        (SELECT SUM(IF(tipo = 1, valor, -valor)) FROM lc_movimento AS L2
                        WHERE DATE_FORMAT(lc_movimento.datamov,'%Y%m') >=
                        DATE_FORMAT(L2.datamov,'%Y%m') and
                        idconta = lc_movimento.idconta) AS saldo
                        FROM lc_movimento WHERE idconta =:contapd and mes=:mes and ano=:ano
                        GROUP BY idconta, MONTH(datamov), YEAR(datamov) ORDER BY YEAR(datamov), MONTH(datamov);");
    $stmt->bindparam(':contapd', $contapd );
    $stmt->bindparam(':mes', $mes );
    $stmt->bindparam(':ano', $ano );
    $stmt->execute();
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC); 
    
    foreach($result as $linha){
        ?>
        <table border="1">
            <th>Conta</th>
            <th>Ref</th>
            <th>Mes</th>
            <th>Ano</th>
            <th>Saldo Ant.</th>
            <th>Debito</th>
            <th>Credito</th>
            <th>Saldo</th>
            <tr>
                <td><?php echo $linha['idconta']; ?> </td>
                <td><?php echo $linha['ref']; ?> </td>
                <td><?php echo $linha['mes']; ?> </td>
                <td><?php echo $linha['ano']; ?> </td>
                <?php $anterior = $linha['saldo'] + $linha['debito'] - $linha['credito']; ?>
                <td><?php echo formata_dinheiro($anterior); ?> </td>
                <td><?php echo formata_dinheiro($linha['debito']); ?> </td>
                <td><?php echo formata_dinheiro($linha['credito']); ?> </td>
                <td><?php echo formata_dinheiro($linha['saldo']); ?> </td>
            </tr>
        </table>
    <?php     
     }
?>

== desta forma está retornando corretamente ==

Já dentro da função não retorna. Os dados de conexão da função estão corretos porque outras funções já estão retornando os dados.

=========================== função saldo anterior ========================================================

// FUNÇÃO PARA RETORNAR OS SALDO ANTERIOR, ENTRADAS, SAIDAS E SALDO ATUAL DO MÊS E ANO SELECIONADOS
    public function dados_saldo($idconta, $mes_hoje, $ano_hoje )
    {
        try
        {
            $stmt = $this->conn->prepare("SELECT idconta, DATE_FORMAT(datamov,'%m/%Y') AS data, DATE_FORMAT(datamov,'%m') AS mes, DATE_FORMAT(datamov,'%Y') AS ano, SUM(IF(tipo = 0, valor, 0)) AS debito, SUM(IF(tipo = 1, valor, 0)) AS credito,(SELECT SUM(IF(tipo = 1, valor, -valor)) FROM lc_movimento AS L2 WHERE DATE_FORMAT(lc_movimento.datamov,'%Y%m') >=DATE_FORMAT(L2.datamov,'%Y%m') and idconta = lc_movimento.idconta) AS saldo FROM lc_movimento WHERE idconta =:contapd and mes=:mes and ano=:ano GROUP BY idconta, mes, ano ORDER BY ano, mes;");
            $stmt->execute(array(
            ':contapd'=>$idconta,    
            ':mes'=>$mes_hoje,
            ':ano'=>$ano_hoje));
            
            $result=$stmt->fetch(PDO::FETCH_ASSOC);
            
            return $result['data'];
        }
        catch(PDOException $e)
        {
            echo $e->getMessage();
        }
    }

 

O que está dando errado?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já comsegui resolver o problema. corrigido a função:

=============================================

public function dados_saldo($idconta, $mes_hoje, $ano_hoje )
    {
        try
        {
            $stmt = $this->conn->prepare("SELECT idconta, DATE_FORMAT(datamov,'%m/%Y') AS ref, DATE_FORMAT(datamov,'%m') AS mes, DATE_FORMAT(datamov,'%Y') AS ano, SUM(IF(tipo = 0, valor, 0)) AS debito, SUM(IF(tipo = 1, valor, 0)) AS credito,(SELECT SUM(IF(tipo = 1, valor, -valor)) FROM lc_movimento AS L2 WHERE DATE_FORMAT(lc_movimento.datamov,'%Y%m') >=DATE_FORMAT(L2.datamov,'%Y%m') and idconta = lc_movimento.idconta) AS saldo FROM lc_movimento WHERE idconta =:contapd and mes=:mes and ano=:ano GROUP BY idconta, mes, ano ORDER BY ano, mes;");
            $stmt->bindParam(":contapd", $idconta, PDO::PARAM_INT);
            $stmt->bindParam(":mes", $mes_hoje, PDO::PARAM_INT);
            $stmt->bindParam(":ano", $ano_hoje, PDO::PARAM_INT);
            $stmt->execute();
            
            $result=$stmt->fetchAll(PDO::FETCH_ASSOC);
            
            return $result;
        }
        catch(PDOException $e)
        {
            echo $e->getMessage();
        }
    }

=============================================

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já comsegui resolver o problema. corrigido a função:

=============================================

public function dados_saldo($idconta, $mes_hoje, $ano_hoje )
    {
        try
        {
            $stmt = $this->conn->prepare("SELECT idconta, DATE_FORMAT(datamov,'%m/%Y') AS ref, DATE_FORMAT(datamov,'%m') AS mes, DATE_FORMAT(datamov,'%Y') AS ano, SUM(IF(tipo = 0, valor, 0)) AS debito, SUM(IF(tipo = 1, valor, 0)) AS credito,(SELECT SUM(IF(tipo = 1, valor, -valor)) FROM lc_movimento AS L2 WHERE DATE_FORMAT(lc_movimento.datamov,'%Y%m') >=DATE_FORMAT(L2.datamov,'%Y%m') and idconta = lc_movimento.idconta) AS saldo FROM lc_movimento WHERE idconta =:contapd and mes=:mes and ano=:ano GROUP BY idconta, mes, ano ORDER BY ano, mes;");
            $stmt->bindParam(":contapd", $idconta, PDO::PARAM_INT);
            $stmt->bindParam(":mes", $mes_hoje, PDO::PARAM_INT);
            $stmt->bindParam(":ano", $ano_hoje, PDO::PARAM_INT);
            $stmt->execute();
            
            $result=$stmt->fetchAll(PDO::FETCH_ASSOC);
            
            return $result;
        }
        catch(PDOException $e)
        {
            echo $e->getMessage();
        }
    }

=============================================

 

Aos que se fizerem interessados, consegui fazer uma consulta ao banco de dados que me retornou os dados que eu precisava para um demonstrativo de balanço de fluxo de caixa.

a minha tabela contem a seguinte configuração:

Nome: lc_movimento

Campos: Id, tipo, dia, mes, ano, Idlivro, folha, cat, descricao, valor, datamov, idconta, data_lancamento

Consulta: idconta, mes, ano, credito, debito, bal_mes, saldo_aa, credito_acum, debito_acum.

==================================================================================

Abaixo a consulta:

SELECT idconta, month(datamov) AS mes, year(datamov) AS ano,
SUM(IF(lc_movimento.tipo = 1, valor, 0)) AS credito,
SUM(IF(lc_movimento.tipo = 0, -1*valor, 0)) AS debito,
(SELECT SUM(IF(tipo = 1, valor, -1*valor)) FROM lc_movimento AS L2
WHERE DATE_FORMAT(lc_movimento.datamov,'%Y%m') =
DATE_FORMAT(L2.datamov,'%Y%m') and
idconta = lc_movimento.idconta) AS bal_mes,
(SELECT SUM(IF(tipo = 1, valor, -1*valor)) FROM lc_movimento AS L2
WHERE DATE_FORMAT(lc_movimento.datamov,'%Y%m') >=
DATE_FORMAT(L2.datamov,'%Y%m') and
idconta = lc_movimento.idconta) AS saldo_atual,
(SELECT SUM(IF(tipo = 1, valor, -1*valor)) FROM lc_movimento AS L2
WHERE year(lc_movimento.datamov) >
year(L2.datamov) and 
idconta = lc_movimento.idconta) AS saldo_aa,
(SELECT SUM(valor) FROM lc_movimento AS L3
WHERE tipo=1 and year(lc_movimento.datamov) = year(L3.datamov) and month(lc_movimento.datamov) >=
month(L3.datamov) and 
idconta = lc_movimento.idconta) AS credito_acum,
(SELECT SUM(valor)*-1 FROM lc_movimento AS L3
WHERE tipo=0 and year(lc_movimento.datamov) = year(L3.datamov) and month(lc_movimento.datamov) >=
month(L3.datamov) and 
idconta = lc_movimento.idconta) AS debito_acum
FROM lc_movimento
WHERE idconta=1 and year(datamov)=2015 and month(datamov)<=5
GROUP BY idconta, ano, mes;

======================================================================================

O retorno dos dados ficaram assim:

idconta mes ano credito debito bal_mes saldo_atual saldo_aa credito_acum debito_acum  
1 1 2015 1490.00 -1510.00 -20.00 550.00 570.00 1490.00 -1510.00
1 2 2015 1429.50 -1169.00 260.50 810.50 570.00 2919.50 -2679.00
1 3 2015 2270.00 -1866.00 404.00 1214.50 570.00 5189.50 -4545.00
1 4 2015 1190.00 -2202.50 -1012.50 202.00 570.00 6379.50 -6747.50
1 5 2015 2206.50 -2320.00 -113.50 88.50 570.00 8586.00 -9067.50

 

Boa sorte e bons aproveitamento a todos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por Fábio BN
      Olá pessoal.

      Preciso fazer um Select Count, e um Setect Count com Group By numa tabela para pegar a quantidade total de registros.
      Exemplo:
       
      $estoque = "1" $var_total_geral=$pdo->prepare("select count(categoria) from loja_virtual WHERE estoque=:estoque"); $var_total_geral->bindValue(":estoque",$estoque); $var_total_geral->execute(); Depois preciso pegar e exibir a quantidade total  do código acima, porém tem algum erro acima e não sei qual comando usar para exibir a quantidade total.

      Depois preciso fazer outros select agrupado, onde eu preciso saber as quantidade de registros de cada categoria.
      Exemplo:
      Categoria 1 ( 40 Registros )
      Categoria 2 ( 32 Registros )
      Categoria 3 ( 18 Registros )

      Tentei isso abaixo:
      $var_quantidades=$pdo->prepare("select count(categoria) as total from loja_virtual WHERE estoque=:estoque group by categoria" ); $var_quantidades->bindValue(":estoque",$estoque); $var_quantidades->execute(); Como eu faço esse código acima funcionar e como exibo as quantidade agrupadas?

      Se alguém puder me ajudar, Obrigado!
       
      Fábio.
       
    • Por srmacedo
      Gostaria de compartilhar com vocês uma biblioteca responsável por se comunicar com seu banco de dados.
      Acredito que a grande maioria tem problemas na hora de fazer o velho crud.
      Funções complexas Métodos grandes Excesso de bindValue Trabalho extra  
      Mais informações sobre a biblioteca estará no próprio readme.
      https://github.com/devmacedo/norme
       
       
      Prev:
      Para eu buscar um usuário de um id especifico basta eu usar:
      $user->find(1)  
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.