Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Leonardo-gyn

SubTotais em Php

Recommended Posts

Fala galera,

 

Não gosto muito de abrir tópicos, mas este foi de estrema necessidade. não consegui achar soluçõa no fórum que possa me atender.

 

Então vamos lá.

 

Tenho uma consulta realizada no Sql Server 2005 me me da um retorno colunado em um relatório php. Acontece que eu queria que este relatório mostrasse uma linha de subtotal a cada alteração da data de vencimento. Seria mais ou menos assim:

 

 

Num Doc Data Vencimento Empresa Valor

0001 01/04/2011 Emp1 100,00

0002 01/04/2011 Emp1 130,00

 

SUB TOTAL DIA 01/04/2011 ===>> 230,00

 

0003 03/04/2011 Emp1 140,00

0004 03/04/2011 Emp2 30,00

 

SUB TOTAL DIA 03/04/2011 ===>> 170,00

 

0005 06/04/2011 Emp3 500,00

0006 06/04/2011 Emp1 200,00

 

SUB TOTAL DIA 06/04/2011 ===>> 700,00

 

TOTAL GERAL===>>1.200,00

 

 

Peguei esta solução:

 

SubTotais MySql

 

Neste exemplo, ele utiliza WITH ROLLUP, só que não sei se é por causa de ser em mysql, mas no Sql 2005 não quer funcionar, até por que ele coloca selec *,coluna_a_agrupar from tabela quando no sql 2005 até onde eu sei, só posso informar as colunas que forem informadas no group by.

 

Enfim, não deu certo.

 

Uma vez ouvi falar que teria que fazer um laço dentro de outro laço(a expressão foi esta mesmo). Já tentei fazer por partes, informando o primeiro laço, vincunlando ele à data de vencimento e posteriomente dentro deste laço, somente as demais colunas, mas consigo sintetizar esta ideia. Apelei pro sql, mas lá não consegui tb.

 

Alguem tem algum exemplo para que possa trabalhar?

 

Vlw galera, meus antecipados agradecimentos.

 

Atenciosamente,

 

Leonardo Cabral

Compartilhar este post


Link para o post
Compartilhar em outros sites

então, deve existir vários meios melhores para fazer isso, mas eu faria assim:

 

$sub_total = 0;
$data_antiga = 0;
while(){ // laço que pega os dados do banco
if($data_antiga == 0)
$data_antiga = $data;
if($data_antiga != $data){ 
echo "Sub-total dia $data_antiga => R$ $sub_total";
$sub_total = 0;
}

echo "$num $doc $data $vencimento $empresa $valor"; // imprime o reltorio

$data_antiga = $data;
$sub_total = $sub_total + $valor;
}

 

 

 

fiz esse código aqui no fórum, se vocênão entendeu a idéia é só perguntar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

jhrhp, obrigado pela resposta.

 

fiz um codigo simples, adaptando seu codigo com meu ambiente. Você poderia me dizer o que esta errado, por que ele não imprimi o subtotal?

 

<?php
   include ("conectaquadrant.php");



$rs = mssql_query("select Parcela.DataVencimentoUtil, Empresa.Empresa, Parcela.NumParcela, Documento.QtdParcelas, Parcela.Competencia, Documento.NumDocumento, Fornecedor.NomeFantasia, ContaGerencial.Descricao, Parcela.ValorParcela, Parcela.ID_Titulo, Parcela.Observacoes,  Parcela.TipoValor, Documento.CodEmpresa	From Parcela, Documento, Empresa, Fornecedor, ContaGerencial, ContaGerencialDocumento
   where  Documento.ID_Titulo=Parcela.ID_Titulo
   and    Documento.CodFornecedor=Fornecedor.CodFornecedor
   and    Documento.CodEmpresa=Empresa.CodEmpresa
   and    Documento.ID_Titulo=ContaGerencialDocumento.ID_Titulo
   and    ContaGerencial.CodContaGerencial=ContaGerencialDocumento.CodContaGerencial
   And    Parcela.DataVencimentoUtil>='20110401'
   And    Parcela.DataVencimentoUtil<='20110430'
order by 1");


$sub_total = 0;
$data_antiga = 0;
   while($row = mssql_fetch_row($rs)){ // laço que pega os dados do banco
$data = $row[0];
$empresa = $row[1];
$valor = $row[8];
if($data_antiga == 0)
{
	$data_antiga = $data; 
}
if($data_antiga != $data)
{ 
	echo "Sub-total dia $data_antiga => R$ $sub_total";
	$sub_total = 0;
}

echo "$data  -  $empresa  -  $valor" . "<br>"; // imprime o reltorio

$data_antiga = $data;
$sub_total = $sub_total + $valor;
}

?>

 

Meus antecipados agradecimentos,

 

Leonardo Cabral

Compartilhar este post


Link para o post
Compartilhar em outros sites

vendo o código assim parece estar tudo certo.

 

ele imprime alguma coisa? erro?

 

Não, ele só imprime esta parte do codigo:

 

echo "$data  -  $empresa  -  $valor" . "<br>"; // imprime o reltorio

 

Mas não imprime o sub-total só no final do relatório.

 

 

Olha, analisando a logica do comando, o $data_antiga, sempre vai ser igual ao $data. Não concorda?

 

no aguardo,

 

Leonardo Cabral

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara essa consulta tá muito confusa e você está usando identificadores muito longos. Será que somar o que achar nesse date-range que você colocou em WHERE não dá certo pra conseguir esse subtotal? Vamos ver, né...

 

Não testei nem sei se tem erros de escrita:

SELECT (SELECT SUM(Parcela.ValorParcela)
FROM Parcela
WHERE Parcela.DataVencimentoUtil>='20110401'
AND Parcela.DataVencimentoUtil<='20110430') AS subtotal,
Parcela.DataVencimentoUtil,
Empresa.Empresa,
Parcela.NumParcela,
Documento.QtdParcelas,
Parcela.Competencia,
Documento.NumDocumento,
Fornecedor.NomeFantasia,
ContaGerencial.Descricao,
Parcela.ValorParcela,
Parcela.ID_Titulo,
Parcela.Observacoes,
Parcela.TipoValor,
Documento.CodEmpresa
FROM
Parcela,
Documento,
Empresa,
Fornecedor,
ContaGerencial,
ContaGerencialDocumento
WHERE
Documento.ID_Titulo=Parcela.ID_Titulo
AND Documento.CodFornecedor=Fornecedor.CodFornecedor
AND Documento.CodEmpresa=Empresa.CodEmpresa
AND Documento.ID_Titulo=ContaGerencialDocumento.ID_Titulo
AND ContaGerencial.CodContaGerencial=ContaGerencialDocumento.CodContaGerencial
AND Parcela.DataVencimentoUtil>='20110401'
AND Parcela.DataVencimentoUtil<='20110430'
ORDER BY 1 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Leonardo-gyn, a lógica esta certa, porque ele muda o valor só no fim do laço.

 

substitua a linha:

if($data_antiga != $data) 

 

por

if(strtotime($data_antiga) != strtotime($data))

Compartilhar este post


Link para o post
Compartilhar em outros sites

jhrhp bom dia,

 

cara, mil desculpas. Realmente seu comando ta certo. É que eu carregava a $data com valor bruto, sem tratamento. Inclusive, este foi meu erro em todas as logicas utilizadas. Então resolvi carrega-la com a data formatada, ai funcinou. O codigo ficou assim:

 

 

<?php
   include ("conectaquadrant.php");
$sub_total = 0;
$data_antiga = 0;


$rs = mssql_query("select Parcela.DataVencimentoUtil, Empresa.Empresa, Parcela.NumParcela, Documento.QtdParcelas, Parcela.Competencia, Documento.NumDocumento, Fornecedor.NomeFantasia, ContaGerencial.Descricao, Parcela.ValorParcela, Parcela.ID_Titulo, Parcela.Observacoes,  Parcela.TipoValor, Documento.CodEmpresa	From Parcela, Documento, Empresa, Fornecedor, ContaGerencial, ContaGerencialDocumento
   where  Documento.ID_Titulo=Parcela.ID_Titulo
   and    Documento.CodFornecedor=Fornecedor.CodFornecedor
   and    Documento.CodEmpresa=Empresa.CodEmpresa
   and    Documento.ID_Titulo=ContaGerencialDocumento.ID_Titulo
   and    ContaGerencial.CodContaGerencial=ContaGerencialDocumento.CodContaGerencial
   And    Parcela.DataVencimentoUtil>='20110401'
   And    Parcela.DataVencimentoUtil<='20110430'
order by 1");


$sub_total = 0;
$data_antiga = 0;
   while($row = mssql_fetch_row($rs)){ // laço que pega os dados do banco
$data = date('d/m/Y',strtotime($row['0']));
$empresa = $row[1];
$valor = $row[8];
if($data_antiga == 0)
{
	$data_antiga = $data; 
}
if(strtotime($data_antiga) != strtotime($data))
{ 
	echo "Sub-total dia $data_antiga => R$ $sub_total <br>";
	$sub_total = 0;
}

echo "$data -  $empresa  -  $valor <br>" ; // imprime o reltorio

$data_antiga = $data;
$sub_total = $sub_total + $valor;
}

?>

 

Deu certinho, muito obrigado.

 

 

magakah, seu comando não funcionou como você achou que funcionaria. Ele informa na coluna sub-total o valor de todos os titulos do periodo selecionado, e não somente o valor subtotal da data. Mesmo assim meu muito obrigado. Sobre o comando, sei usar o join, só que prefiro identificar um a um. Só uso quando preciso que os registros busquem informações mesmo que elas não estejam nas duas tabelas. Tentei olhar uma forma, mas não consegui daquele jeito. Achei ele muito interessante. Sinceramente, não conhecia aquela forma. Se souber o que pode ser para melhorar, acredito ser muito util em determinadas situações.

 

Mesmo assim, meu muito obrigado.

 

 

Atenciosamente,

 

Leonardo Cabral

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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