Ir para conteúdo

POWERED BY:

Arquivado

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

Douglas Fabiano

Consulta Entre Datas

Recommended Posts

Pessoal tenho código abaixo em uma página onde exibe na tela resultado da consulta:

Porem eu gostaria de criar campos de data inicial e data final, e um outro filtro por veículo (campo vtr), ou seja, gostaria de saber os valores nos períodos escolhidos.

 

Alguem poderia me ajudar ou me dar uma como posso fazer isso:

 

vejam o meu código da consulta que ja tenho:

 

<tr>
    <td width="130">Viatura:</td>
    <td width="130">Data Manutenção:</td>
    <td width="130">Tipo de Manutenção:</td>
    <td width="130">Valor Serviços;</td>
    <td width="130">Valor Peças:</td>
	<td width="130">Valor Total:</td>
</tr>
<?php
//faz um looping e cria um array com os campos da consulta
//consulta sql
$query = mysql_query("SELECT * FROM tbl_principal ORDER BY vtr") or die(mysql_error());
while($array = mysql_fetch_array($query))
   {
   //mostra na tela o nome do carro e tipo de manutenção
   echo '  <tr>',chr(10);
   echo '    <td>'.$array['vtr'].'</td><td>'.date('d/m/Y',strtotime($array['data_manutencao'])).'</td><td>'.$array['tipo_manutencao'].'</td><td>'.$array['vr_unitario_servico'].'</td><td>'.$array['vr_total_pecas'].'</td><td>'.$array['vr_total_manutencao'].'</td>',chr(10);
   echo '  </tr>',chr(10);
   }
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

No seu formulário de consulta crie os campos, data_inicial, data_final e viatura:

     Viatura: <input type="text" name="viatura" value="" size="55" maxlength="100">
     Data Inicial: <input type="text" name="data_inicial" value="" size="10" maxlength="10"> (dd/mm/aaaa)
     Data Final: <input type="text" name="data_final" value="" size="10" maxlength="10"> (dd/mm/aaaa)

No formulário de consulta, quando clicar em enviar você chamará o seu script porém alterando a sua query para:

   $opcoes = '';
   if ($_POST['viatura']<>'')
      $opcoes.= ' vtr like "%'.$_POST['viatura'].'%"';
   if ($_POST['data_inicial']<>'')
      $opcoes.= ($opcoes==''?'':' AND').' data_manutencao>="'.$_POST['data_inicial'].'"';
   if ($_POST['data_final']<>'')
      $opcoes.= ($opcoes==''?'':' AND').' data_manutencao<="'.$_POST['data_final'].'"';
   $query = mysql_query("SELECT * FROM tbl_principal".($opcoes==''?'':' WHERE'.$opcoes)." ORDER BY vtr") or die(mysql_error());

Compartilhar este post


Link para o post
Compartilhar em outros sites

Após eu submeter a página, fica em branco... sem resultado...

 

Vejam se conseguem ver o erro no meu código:

 

formulário que envia os critérios:

<form action="consulta_data.php" method="post" name="form1" id="form1">
  <p>Informe a Viatura:
    <input type="text" name="viatura" />
      <span class="style4">* Caso Queira ver todas as viaturas deixe em branco </span></p>
  <p><strong>Informe a Período</strong>:  </p>
  <p>Data Inicial
    <input type="text" name="data_inicial" />
  </p>
  <p>Data Final:
    <input type="text" name="data_final" />
  </p>
  <p>
    <input type="submit" name="Submit" value="Gerar Relatório" />
  </p>
</form>

Agora a consulta em PHP:

 

<?php
//chama o arquivo de conexão com o bd
include("conexao_1_sysvtr.php");
?>
<?
 $opcoes = '';
   if ($_POST['viatura']<>'')
      $opcoes.= ' vtr like "%'.$_POST['viatura'].'%"';
   if ($_POST['data_inicial']<>'')
      $opcoes.= ($opcoes==''?'':' AND').' data_manutencao>="'.$_POST['data_inicial'].'"';
   if ($_POST['data_final']<>'')
      $opcoes.= ($opcoes==''?'':' AND').' data_manutencao<="'.$_POST['data_final'].'"';
   $query = mysql_query("SELECT * FROM tbl_principal".($opcoes==''?'':' WHERE'.$opcoes)." ORDER BY vtr") or die(mysql_error());
   ?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alguem sabe como posso mostrar esses resultado com echo?

 

No final da sua consulta.php coloque as seguintes linhas:

while($array = mysql_fetch_array($query))
   {
   //mostra na tela o nome do carro e tipo de manutenção
   echo '  <tr>',chr(10);
   echo '    <td>'.$array['vtr'].'</td><td>'.date('d/m/Y',strtotime($array['data_manutencao'])).'</td><td>'.$array['tipo_manutencao'].'</td><td>'.$array['vr_unitario_servico'].'</td><td>'.$array['vr_total_pecas'].'</td><td>'.$array['vr_total_manutencao'].'</td>',chr(10);
   echo '  </tr>',chr(10);
   }

Compartilhar este post


Link para o post
Compartilhar em outros sites

Deu certo a exibição... porem quando no critério (página onde coloco o carro e o período) eu coloca a data de 01/01/2010 a 02/03/2010 ele não retorna nada, ou seja não está filtrando por data... tenho que converter alguma coisa para fazer essa pesquisa?

 

Vejam meu código de consulta (em funcionamento):

 

  <table width="900" border="1">
</p>

<tr>
    <td width="130">Viatura:</td>
    <td width="130">Data Manutenção:</td>
    <td width="130">Tipo de Manutenção:</td>
    <td width="130">Valor Serviços;</td>
    <td width="130">Valor Peças:</td>
	<td width="130">Valor Total:</td>
</tr>
<?php
//chama o arquivo de conexão com o bd
include("conexao_1_sysvtr.php");
?>
<?
 $opcoes = '';
   if ($_POST['viatura']<>'')
      $opcoes.= ' vtr like "%'.$_POST['viatura'].'%"';
   if ($_POST['data_inicial']<>'')
      $opcoes.= ($opcoes==''?'':' AND').' data_manutencao>="'.$_POST['data_inicial'].'"';
   if ($_POST['data_final']<>'')
      $opcoes.= ($opcoes==''?'':' AND').' data_manutencao<="'.$_POST['data_final'].'"';
   $query = mysql_query("SELECT * FROM tbl_principal".($opcoes==''?'':' WHERE'.$opcoes)." ORDER BY vtr") or die(mysql_error());
   while($array = mysql_fetch_array($query))
   {
   //mostra na tela o nome do carro e tipo de manutenção
      echo '  <tr>',chr(10);
   echo '    <td>'.$array['vtr'].'</td><td>'.date('d/m/Y',strtotime($array['data_manutencao'])).'</td><td>'.$array['tipo_manutencao'].'</td><td>'.$array['vr_unitario_servico'].'</td><td>'.$array['vr_total_pecas'].'</td><td>'.$array['vr_total_manutencao'].'</td>',chr(10);
   echo '  </tr>',chr(10);
   }
   ?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vejam o código da página que informo a data e veículo:

 

<form action="consulta_data.php" method="post" name="form" id="frm">
  <p><strong>Informe a Viatura:</strong>
    <select name="viatura" class="iNome" onFocus="this.style.backgroundColor='#AFE5FF';" onBlur="this.style.backgroundColor='';">
<?php
//chama o arquivo de conexão com o bd
include("conexao_1_sysvtr.php");
?>
              <?php 
$cidades = mysql_query("SELECT * FROM tbl_viaturas")or die(mysql_error());
if(mysql_num_rows($cidades) > 0)
{
while($ver = mysql_fetch_array($cidades))
{
?>
              <option value="<?php print $ver['vtr_descricao'];?>" selected="selected"><?php print $ver['vtr_descricao'];?></option>
              <?php
}
}else{
print 'Não há registros';
}
?>
            </select>
  <span class="style4">* Caso Queira ver todas as viaturas deixe em branco </span></p>
  <p><strong>Informe a Período</strong>:  </p>
  <p>Data Inicial
    <input type="text" name="data_inicial" id="data_1" class="iNome" onFocus="this.style.backgroundColor='#AFE5FF';" onBlur="this.style.backgroundColor='';" />
  - Formato da Data: 99/99/9999 </p>
  <p>Data Final:
    <input type="text" name="data_final" id="data_2" class="iNome" onFocus="this.style.backgroundColor='#AFE5FF';" onBlur="this.style.backgroundColor='';" />
  - Formato da Data: 99/99/9999 </p>
  <p>
    <input type="submit" name="Submit" value="Gerar Relatório" />
  </p>
</form>
<p></p>
</body>
</html>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou tentando mas ainda não consegui vejam:

 

consulta_data.PHP:

 

  <table width="900" border="1">
</p>

<tr>
    <td width="130">Viatura:</td>
    <td width="130">Data Manutenção:</td>
    <td width="130">Tipo de Manutenção:</td>
    <td width="130">Valor Serviços;</td>
    <td width="130">Valor Peças:</td>
	<td width="130">Valor Total:</td>
</tr>
<?php
//chama o arquivo de conexão com o bd
include("conexao_1_sysvtr.php");
?>
<?
 $opcoes = '';
   if ($_POST['viatura']<>'')
      $opcoes.= ' vtr like "%'.$_POST['viatura'].'%"';
   if ($_POST['data_inicial']<>'')
      $opcoes.= ($opcoes==''?'':' AND').' data_manutencao>="'.$_POST

['data_inicial'].'"';
   if ($_POST['data_final']<>'')
      $opcoes.= ($opcoes==''?'':' AND').' data_manutencao<="'.$_POST

['data_final'].'"';
	  $query = mysql_query("SELECT * FROM tbl_principal".

($opcoes==''?'':' WHERE'.$opcoes)." ORDER BY vtr"."SELECT 

DATA_FORMAT(data_manutencao, '%d/%m/%Y) FROM tbl_principal") or die

(mysql_error());
   while($array = mysql_fetch_array($query))
   {
   //mostra na tela o nome do carro e tipo de manutenção
      echo '  <tr>',chr(10);s
   echo '    <td>'.$array['vtr'].'</td><td>'.date('d/m/Y',strtotime

($array['data_manutencao'])).'</td><td>'.$array

['tipo_manutencao'].'</td><td>'.$array

['vr_unitario_servico'].'</td><td>'.$array

['vr_total_pecas'].'</td><td>'.$array

['vr_total_manutencao'].'</td>',chr(10);
   echo '  </tr>',chr(10);
   }
   ?>
</body>
</html>

Compartilhar este post


Link para o post
Compartilhar em outros sites

você nao fechou aspas simples aqui:

 

DATA_FORMAT(data_manutencao, '%d/%m/%Y') <<

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caro Douglas o problema está na sua query, veja abaixo.

$query = mysql_query("SELECT * FROM tbl_principal".($opcoes==''?'':' WHERE'.$opcoes)." ORDER BY vtr"."SELECT DATA_FORMAT(data_manutencao, '%d/%m/%Y) FROM tbl_principal") or die(mysql_error());

Você não pode colocar os SELECT´s desse jeito. Você está colocando 2 select´s seguidos. O correto seria:

$query = mysql_query("SELECT * FROM tbl_principal".($opcoes==''?'':' WHERE'.$opcoes)." ORDER BY vtr"

Outra coisa, ou você formata no select com a função date_format e não data_format, ou você formata na exibição do campo, com a função date do PHP. Você é quem define, porém, se usar uma não precisa utilizar a outra.

 

As observações acima resolvem o problema de sintaxe.

 

Vejamos agora o problema de lógica. Você disse que ao escolher um veículo e as datas não retorna nada, mas você já olhou no banco de tem informação para este veículo neste período? Se sim coloca esse comando antes do while, e posta o que apareceu aí:

echo 'Teste: '.$query.'<br>';

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim no banco tem informação sim... tanto que quando eu faço (coloco no nome do veículo) sem as datas a consulta funciona certinho, mas quando coloco as datas não retorna nada...

 

Sobre a minha query, fiz dessa maneiro pois me informaram que eu tinha que utilizar a função "date_format"..... por isso que eu fiz....

 

Porem ainda não retornou nada....

 

Código da página onde esta o formulário de pesquisa:

<form action="consulta_data.php" method="post" name="form" id="frm">
  <p><strong>Informe a Viatura:</strong>
    <select name="viatura" class="iNome" onFocus="this.style.backgroundColor='#AFE5FF';" onBlur="this.style.backgroundColor='';">
<option value="todos" selected="selected">Todos Carros</option>
<?php
//chama o arquivo de conexão com o bd
include("conexao_1_sysvtr.php");
?>
              <?php 
$cidades = mysql_query("SELECT * FROM tbl_viaturas")or die(mysql_error());
if(mysql_num_rows($cidades) > 0)
{
while($ver = mysql_fetch_array($cidades))
{
?>
              <option value="<?php print $ver['vtr_descricao'];?>" selected="selected"><?php print $ver['vtr_descricao'];?></option>
              <?php
}
}else{
print 'Não há registros';
}
?>
            </select>
  <span class="style4">* Caso Queira ver todas as viaturas deixe em branco </span></p>
  <p><strong>Informe a Período</strong>:  </p>
  <p>Data Inicial
    <input type="text" name="data_inicial" id="data_1" class="iNome" onFocus="this.style.backgroundColor='#AFE5FF';" onBlur="this.style.backgroundColor='';" />
  - Formato da Data: 99/99/9999 </p>
  <p>Data Final:
    <input type="text" name="data_final" id="data_2" class="iNome" onFocus="this.style.backgroundColor='#AFE5FF';" onBlur="this.style.backgroundColor='';" />
  - Formato da Data: 99/99/9999 </p>
  <p>
    <input type="submit" name="Submit" value="Gerar Relatório" />
  </p>
</form>

 

Agora a página da consulta PHP para onde or form envia "consulta_data.php":

 

 <table width="900" border="1">
</p>

<tr>
    <td width="130">Viatura:</td>
    <td width="130">Data Manutenção:</td>
    <td width="130">Tipo de Manutenção:</td>
    <td width="130">Valor Serviços;</td>
    <td width="130">Valor Peças:</td>
	<td width="130">Valor Total:</td>
</tr>
<?php
//chama o arquivo de conexão com o bd
include("conexao_1_sysvtr.php");
?>
<?
 $opcoes = '';
   if ($_POST['viatura']<>'')
      $opcoes.= ' vtr like "%'.$_POST['viatura'].'%"';
   if ($_POST['data_inicial']<>'')
      $opcoes.= ($opcoes==''?'':' AND').' data_manutencao>="'.$_POST['data_inicial'].'"';
   if ($_POST['data_final']<>'')
      $opcoes.= ($opcoes==''?'':' AND').' data_manutencao<="'.$_POST['data_final'].'"';
	  $query = mysql_query("SELECT * FROM tbl_principal".($opcoes==''?'':' WHERE'.$opcoes)." ORDER BY vtr") or die(mysql_error());
   while($array = mysql_fetch_array($query))
   {
   //mostra na tela o nome do carro e tipo de manutenção
      echo '  <tr>',chr(10);
   echo '    <td>'.$array['vtr'].'</td><td>'.date('d/m/Y',strtotime($array['data_manutencao'])).'</td><td>'.$array['tipo_manutencao'].'</td><td>'.$array['vr_unitario_servico'].'</td><td>'.$array['vr_total_pecas'].'</td><td>'.$array['vr_total_manutencao'].'</td>',chr(10);
   echo '  </tr>',chr(10);
   }
   ?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema está no formulário de pesquisa.

No campo Viatura no value do <option> você está colocando vtr_descricao.

Faça o seguinte, no consuta_data.php, altere para ficar assim:

  if ($_POST['viatura']<>'')
      $opcoes.= ' vtr_descricao like "%'.$_POST['viatura'].'%"';

Veja agora!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dica.

Se quiser buscar um periodo (De data 99/99/9999 à 99/99/9999) utilize o BETWEEN do mysql.

 

Assim:

<?php
$sql="SELECT * FROM tabela WHERE data BETWEEN '$data_inicio' AND '$data_fim'";
$resultado=mysql_query($sql);
$linha=mysql_num_rows($resultado);
?>
Ve se isso te ajuda em alguma coisa. No caso da formatação siga as instruçoes do Dee e do Shrek

 

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Shrek-BH quando alterei o código conforme tinha em falado apresentou o seguinte erro; Unknown column 'vtr_descricao' in 'where clause'

 

A.H.P Será que poderia me ajudar a encaixar esse código dentro do meu script,,, ?

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Há tá! Jà sei o que fiz de errado, mas tá quase no final.

Passa aí a descrição da tabela tbl_viaturas e tbl_principal, pois precisarei do código da viatura na tabela tbl_viaturas e o código do mesmo na tbl_principal. Acho que na tbl_principal o campo que você armazena o código da viatura é "viatura". Só preciso saber se é isto mesmo, mas enviando a descrição das tabelas dá para saber.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O campo que eu guardo a viatura é "vtr"

 

Então mas eu tenho que usar "BETWEEN"? onde?

 

veja:

 

tbl_principal:

CREATE TABLE /*!32312 IF NOT EXISTS*/ `tbl_principal` (
  `codigo` tinyint(30) unsigned NOT NULL AUTO_INCREMENT,
  `vtr` varchar(50) DEFAULT NULL,
  `placa` varchar(10) DEFAULT NULL,
  `marca` varchar(20) DEFAULT NULL,
  `tipo_manutencao` varchar(20) DEFAULT NULL,
  `servico_realizado` varchar(100) DEFAULT NULL,
  `pecas_utilizadas` varchar(300) DEFAULT NULL,
  `qtd_de_pecas` varchar(10) DEFAULT NULL,
  `vr_unitario_servico` varchar(10) DEFAULT NULL,
  `vr_unitario_pecas` varchar(10) DEFAULT NULL,
  `vr_total_pecas` varchar(10) DEFAULT NULL,
  `vr_total_manutencao` varchar(10) DEFAULT NULL,
  `data_manutencao` date DEFAULT NULL,
  `qtd_abastecimento_litros` tinyint(5) unsigned DEFAULT NULL,
  `usuario` varchar(50) DEFAULT NULL,
  `data_cadastro` date DEFAULT NULL,
  `observacao` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`codigo`)
) TYPE=MyISAM AUTO_INCREMENT=19;

tbl_viaturas:

 

CREATE TABLE /*!32312 IF NOT EXISTS*/ `tbl_viaturas` (
  `vtr_descricao` varchar(50) DEFAULT NULL,
  `id` tinyint(10) unsigned NOT NULL AUTO_INCREMENT,
  `marca` varchar(50) DEFAULT NULL,
  `localizacao` varchar(50) DEFAULT NULL,
  `situacao` varchar(50) DEFAULT NULL,
  `prefixo` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=12;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Peraí que eu me perdi. você quer dar um SELECT ou criar uma tabela?...rsrs...

 

O SELECT pode ficar assim:

 

$data_inicial=$_POST['data_inicial'];
$data_final=$_POST['data_final'];

if ($data_inicial!='' &&  $data_final!='') 
$opcoes.= "data_manutencao BETWEEN '$data_inicial' AND '$data_final'";

Creio que isso deve ajudar...

 

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

O correto é assim mesmo:

   if ($_POST['viatura']<>'')
      $opcoes.= ' vtr like "%'.$_POST['viatura'].'%"';
Veja se assim funciona. Se não funcionar dá um print da sua query (antes do while, dá um print "$sql<br>\n";

 

Sem querer me intrometer na sua programação, mas acho que o ideal era você rever as suas tabelas, pois, creio eu, que:

1) Placa e marca são atributos da viatura e não da tbl_principal;

2) Na tbl_principal você armazena a descrição da viatura. O ideal seria você armazenar o ID dela, pois se no futuro o usuário alterar a descrição da viatura todos os lançamentos da sua tabela tbl_principal ficarão errados, exigindo que você altere toda a sua tabela tbl_principal.

 

Dá uma olhada nessas dicas aí, pois no futuro você poderá ter problemas no seu sitema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos lá ...

 

Shrek-BH mas se eu colocar apenas com ID na minha tabela principal,,, como o usuário irá poder selecionar o veículo,,, eu coloquei o nome do veículo para ficar mais fácil para o usuário. Dá pra ele selecionar o ID e assim "mostrar" o nome do veículo?

 

Bom A.H.P ... ja estamos tanto nesse caso que eu mesmo acabo me perdendo as vezes..rs... Mas vamos lá amigo, me ajuda a encaixar o "BETWEEN" dentro do meu código por favor,, pois ja nem sei bem onde posso colocar ele:

 

<?
 $opcoes = '';
   if ($_POST['viatura']<>'')
      $opcoes.= ' vtr like "%'.$_POST['viatura'].'%"';
	  else
	  $opcoes.='';
   if ($_POST['data_inicial']<>'')
      $opcoes.= ($opcoes==''?'':' AND').' data_manutencao>="'.$_POST['data_inicial'].'"';
   if ($_POST['data_final']<>'')
      $opcoes.= ($opcoes==''?'':' AND').' data_manutencao<="'.$_POST['data_final'].'"';
	  $query = mysql_query("SELECT * FROM tbl_principal".($opcoes==''?'':' WHERE'.$opcoes)." ORDER BY vtr") or die(mysql_error());
   while($array = mysql_fetch_array($query))
   {
   //mostra na tela o nome do carro e tipo de manutenção
      echo '  <tr>',chr(10);
   echo '    <td>'.$array['vtr'].'</td><td>'.date('d/m/Y',strtotime($array['data_manutencao'])).'</td><td>'.$array['tipo_manutencao'].'</td><td>'.$array['vr_unitario_servico'].'</td><td>'.$array['vr_total_pecas'].'</td><td>'.$array['vr_total_manutencao'].'</td>',chr(10);
   echo '  </tr>',chr(10);
   }
   ?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para o caso do ID na tbl_principal basta você buscar o ID na tabela de viaturas:

   $query1 = mysql_query('SELECT * FROM tbl_principal');
   while($array = mysql_fetch_array($query1))
      {
      $query2 = 'SELECT vtr_descricao FROM tbl_viaturas WHERE id="'.$array['id_viatura'].'"';

Ou você pode fazer um join (recomendado):

   $query1 = mysql_query('SELECT a.*,b.vtr_descricao FROM tbl_principal as a, tbl_viaturas b WHERE a.id=b.id_viatura');
   while($array = mysql_fetch_array($query1))
      {

Quanto ao between se você quiser usá-lo tudo bem, mas para isso terá que ter certeza que os 2 campos estão preenchidos (data_inicial e data_final). Do jeito que te falei antes o usuário poderá preencher qualquer um dos 2 que funcionará, ou seja, se preencher somente a data_inicial pegará da data escolhida até hoje. Se preencher somente a data_final pegará do início até a data_final escolhida.

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.