Programação Web
 Fatec Ipiranga
 Análise e Desenvolvimento de Sistemas


 Aula 12 – Customização de relatórios – parte I (Tabelas)




     Dalton Martins
   dmartins@gmail.com

São Paulo, Novembro, 2011
Bibliotecas de Apoio - PEAR
Há um conjunto de bibliotecas chamado PEAR (PHP
 extension and application repository) que são muito úteis
 na extensão das funcionalidades nativas do PHP;
O repositório é disponível online: http://pear.php.net/
São mais de 550 pacotes representando funcionalidades
 em mais de 37 áreas diferentes;
Normalmente, esse conjunto de bibliotecas já vem
 instalado com o XAMPP, no diretório phpPEAR...
<?php
  // Inclui a biblioteca de tratamento de tabelas
  require_once "HTML/Table.php";

  // monta os dados no vetor
  $dados = array(
  '0' => array("12309","45633","2010-12-19 01:13:42","$22.04","$5.67","$27.71"),
  '1' => array("12310","942","2010-12-19 01:15:12","$11.50","$3.40","$14.90"),
  '2' => array("12311","7879","2010-12-19 01:15:22","$95.99","$15.00","$110.99"),
  '3' => array("12312","55521","2010-12-19 01:30:45","$10.75","$3.00","$13.75")
  );

  // Cria um vetor com os atributos da tabela
  $atributos = array('border' => '1');

  // Cria o objeto tabela
  $tabela = new HTML_Table($atributos);
                                                                       Criando uma
  // configura os cabeçalhos
  $tabela->setHeaderContents(0, 0, "Pedido");
                                                                      tabela simples
  $tabela->setHeaderContents(0, 1, "Cliente");
  $tabela->setHeaderContents(0, 2, "Data do pedido");
  $tabela->setHeaderContents(0, 3, "Sub Total");
  $tabela->setHeaderContents(0, 4, "Custo de envio");
  $tabela->setHeaderContents(0, 5, "Custo total");

  // Itera pelo vetor de dados para produzir as linhas da tabela
  for($linhanum = 0; $linhanum < count($dados); $linhanum++) {
      for($colnum = 0; $colnum < 6; $colnum++) {
         $tabela->setCellContents($linhanum+1, $colnum,
                         $dados[$linhanum][$colnum]);
      }
  }

  // exibe os dados na tela
  echo $tabela->toHTML();
?>
Melhorando a visibilidade dos
               resultados
 // Itera pelo vetor de dados para produzir as linhas da tabela
 for($linhanum = 0; $linhanum < count($dados); $linhanum++) {
     for($colnum = 0; $colnum < 6; $colnum++) {
        $tabela->setCellContents($linhanum+1, $colnum,
                        $dados[$linhanum][$colnum]);
     }
 }
 $tabela->altRowAttributes(1,"bgcolor=#CCC99");

 // exibe os dados na tela
 echo $tabela->toHTML();




Obs.: tutorial de outras opções sobre como usar a biblioteca Table
http://dev.obliquid.com/docs/pear_table.html
Trabalhando com banco de dados

Criamos o banco de dados usuarios e a tabela pessoas abaixo para apoiar
os próximos passos que veremos...



 CREATE TABLE `usuarios`.`pessoas` (
 `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
 `nome` VARCHAR( 30 ) NOT NULL
 );
Tabela simples a partir do banco
<?php

  require_once "HTML/Table.php";

  $mysqli = new mysqli("localhost", "root", "", "usuarios");

  $attributes = array('border' => '1');

  $table = new HTML_Table($attributes);

  $table->setHeaderContents(0, 0, "ID");
  $table->setHeaderContents(0, 1, "Pessoas");

  $query = "SELECT id AS `Numero de chamada`, nome AS `Nome completo` FROM pessoas ORDER BY id";
  $stmt = $mysqli->prepare($query);
  $stmt->execute();
  $stmt->bind_result($ID, $nomeID);

  $rownum = 1;
  while ($stmt->fetch()) {

      $table->setCellContents($rownum, 0, $ID);
      $table->setCellContents($rownum, 1, $nomeID);

      $rownum++;
  }

  echo $table->toHTML();
  $mysqli->close();
?>
<?php
  require_once "HTML/Table.php";

  $mysqli = new mysqli("localhost", "root", "", "usuarios");

  $attributes = array('border' => '1');

  $table = new HTML_Table($attributes);

  // Montando os cabeçalhos das colunas linkáveis utilizando o método GET do HTTP!
  $IDcoluna = "<a href='".$_SERVER['PHP_SELF']."?campo=id'>ID</a>";
  $nomeIDcoluna = "<a href='".$_SERVER['PHP_SELF']."?campo=nome'>Pessoas</a>";

  $table->setHeaderContents(0, 0, $IDcoluna);
  $table->setHeaderContents(0, 1, $nomeIDcoluna);

  // selecionando o campo de indexação conforme o retorno do método GET
  $campo = (isset($_GET['campo'])) ? $_GET['campo'] : "id";

$query = "SELECT id AS `Numero de chamada`, nome AS `Nome completo` FROM pessoas ORDER BY ".$campo." ASC";

  $stmt = $mysqli->prepare($query);
  $stmt->execute();
  $stmt->bind_result($ID,$nomeID);

  $rownum = 1;
  while ($stmt->fetch()) {

      $table->setCellContents($rownum, 0, $ID);
      $table->setCellContents($rownum, 1, $nomeID);                 Ordenando o
  }
      $rownum++;
                                                                   relatório pelas
?>
  echo $table->toHTML();
  $mysqli->close();                                                    colunas
Criando relatórios paginados
O MySQL possui uma cláusula LIMIT, que permite extrairmos
 dados limitados por um valor de linha inicial e o número de linhas
 a partir desse valor que deve ser extraído.
Exemplo:
 SELECT nome FROM pessoas ORDER BY nome ASC LIMIT 0,2;
recupera apenas as duas primeiras linhas.


Para utilizarmos na criação de relatórios, precisamos determinar 3
 variáveis:
     – Número de linhas por página;
     – Faixa de linhas a extrair do banco;
     – Número de linhas totais de resultado.
Criando relatórios paginados - (i)
<?php
  require_once "HTML/Table.php";

  $mysqli = new mysqli("localhost", "root", "Dm%512p", "usuarios");
  $tamanhodapagina=2;

  $registroinicial = (int) $_GET['registroinicial'];
  $registroinicial = (isset($_GET['registroinicial'])) ? $registroinicial : 0;

  $attributes = array('border' => '1');

  $table = new HTML_Table($attributes);

  // Montando os cabeçalhos das colunas linkáveis utilizando o método GET do HTTP!
  $IDcoluna = "<a href='".$_SERVER['PHP_SELF']."?campo=id'>ID</a>";
  $nomeIDcoluna = "<a href='".$_SERVER['PHP_SELF']."?campo=nome'>Pessoas</a>";

  $table->setHeaderContents(0, 0, $IDcoluna);
  $table->setHeaderContents(0, 1, $nomeIDcoluna);

  // selecionando o campo de indexação conforme o retorno do método GET
  $campo = (isset($_GET['campo'])) ? $_GET['campo'] : "id";
Criando relatórios paginados - (ii)
// seleciona o número total de registros na tabela
   $resultado = $mysqli->query("SELECT count(id) AS id FROM pessoas");
   list($totalregistros)=$resultado->fetch_row();

  $query = "SELECT id AS `Numero de chamada`, nome AS `Nome completo` FROM
pessoas ORDER BY ".$campo." ASC LIMIT ".$registroinicial.",".$tamanhodapagina;
  $stmt = $mysqli->prepare($query);
  $stmt->execute();
  $stmt->bind_result($ID,$nomeID);

  $rownum = 1;
  while ($stmt->fetch()) {

    $table->setCellContents($rownum, 0, $ID);
    $table->setCellContents($rownum, 1, $nomeID);

    $rownum++;
  }
  echo $table->toHTML();
Criando relatórios paginados - (iii)
  // cria o link de anterior
  if ($registroinicial > 0) {
     $prev = $registroinicial - $tamanhodapagina;
     $url = $_SERVER['PHP_SELF']."?registroinicial=$prev";
     printf("<a href='%s'> Pagina anterior </a>",$url);
  }

  // cria o link posterior
  if ($totalregistros > ($registroinicial + $tamanhodapagina)) {
     $next = $registroinicial+$tamanhodapagina;
     $url = $_SERVER['PHP_SELF']."?registroinicial=$next";
     printf("<a href='%s'> Pagina posterior </a>",$url);
  }

 $mysqli->close();
?>

Aula 12 Relatório - Tabelas

  • 1.
    Programação Web FatecIpiranga Análise e Desenvolvimento de Sistemas Aula 12 – Customização de relatórios – parte I (Tabelas) Dalton Martins dmartins@gmail.com São Paulo, Novembro, 2011
  • 2.
    Bibliotecas de Apoio- PEAR Há um conjunto de bibliotecas chamado PEAR (PHP extension and application repository) que são muito úteis na extensão das funcionalidades nativas do PHP; O repositório é disponível online: http://pear.php.net/ São mais de 550 pacotes representando funcionalidades em mais de 37 áreas diferentes; Normalmente, esse conjunto de bibliotecas já vem instalado com o XAMPP, no diretório phpPEAR...
  • 3.
    <?php //Inclui a biblioteca de tratamento de tabelas require_once "HTML/Table.php"; // monta os dados no vetor $dados = array( '0' => array("12309","45633","2010-12-19 01:13:42","$22.04","$5.67","$27.71"), '1' => array("12310","942","2010-12-19 01:15:12","$11.50","$3.40","$14.90"), '2' => array("12311","7879","2010-12-19 01:15:22","$95.99","$15.00","$110.99"), '3' => array("12312","55521","2010-12-19 01:30:45","$10.75","$3.00","$13.75") ); // Cria um vetor com os atributos da tabela $atributos = array('border' => '1'); // Cria o objeto tabela $tabela = new HTML_Table($atributos); Criando uma // configura os cabeçalhos $tabela->setHeaderContents(0, 0, "Pedido"); tabela simples $tabela->setHeaderContents(0, 1, "Cliente"); $tabela->setHeaderContents(0, 2, "Data do pedido"); $tabela->setHeaderContents(0, 3, "Sub Total"); $tabela->setHeaderContents(0, 4, "Custo de envio"); $tabela->setHeaderContents(0, 5, "Custo total"); // Itera pelo vetor de dados para produzir as linhas da tabela for($linhanum = 0; $linhanum < count($dados); $linhanum++) { for($colnum = 0; $colnum < 6; $colnum++) { $tabela->setCellContents($linhanum+1, $colnum, $dados[$linhanum][$colnum]); } } // exibe os dados na tela echo $tabela->toHTML(); ?>
  • 4.
    Melhorando a visibilidadedos resultados // Itera pelo vetor de dados para produzir as linhas da tabela for($linhanum = 0; $linhanum < count($dados); $linhanum++) { for($colnum = 0; $colnum < 6; $colnum++) { $tabela->setCellContents($linhanum+1, $colnum, $dados[$linhanum][$colnum]); } } $tabela->altRowAttributes(1,"bgcolor=#CCC99"); // exibe os dados na tela echo $tabela->toHTML(); Obs.: tutorial de outras opções sobre como usar a biblioteca Table http://dev.obliquid.com/docs/pear_table.html
  • 5.
    Trabalhando com bancode dados Criamos o banco de dados usuarios e a tabela pessoas abaixo para apoiar os próximos passos que veremos... CREATE TABLE `usuarios`.`pessoas` ( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , `nome` VARCHAR( 30 ) NOT NULL );
  • 6.
    Tabela simples apartir do banco <?php require_once "HTML/Table.php"; $mysqli = new mysqli("localhost", "root", "", "usuarios"); $attributes = array('border' => '1'); $table = new HTML_Table($attributes); $table->setHeaderContents(0, 0, "ID"); $table->setHeaderContents(0, 1, "Pessoas"); $query = "SELECT id AS `Numero de chamada`, nome AS `Nome completo` FROM pessoas ORDER BY id"; $stmt = $mysqli->prepare($query); $stmt->execute(); $stmt->bind_result($ID, $nomeID); $rownum = 1; while ($stmt->fetch()) { $table->setCellContents($rownum, 0, $ID); $table->setCellContents($rownum, 1, $nomeID); $rownum++; } echo $table->toHTML(); $mysqli->close(); ?>
  • 7.
    <?php require_once"HTML/Table.php"; $mysqli = new mysqli("localhost", "root", "", "usuarios"); $attributes = array('border' => '1'); $table = new HTML_Table($attributes); // Montando os cabeçalhos das colunas linkáveis utilizando o método GET do HTTP! $IDcoluna = "<a href='".$_SERVER['PHP_SELF']."?campo=id'>ID</a>"; $nomeIDcoluna = "<a href='".$_SERVER['PHP_SELF']."?campo=nome'>Pessoas</a>"; $table->setHeaderContents(0, 0, $IDcoluna); $table->setHeaderContents(0, 1, $nomeIDcoluna); // selecionando o campo de indexação conforme o retorno do método GET $campo = (isset($_GET['campo'])) ? $_GET['campo'] : "id"; $query = "SELECT id AS `Numero de chamada`, nome AS `Nome completo` FROM pessoas ORDER BY ".$campo." ASC"; $stmt = $mysqli->prepare($query); $stmt->execute(); $stmt->bind_result($ID,$nomeID); $rownum = 1; while ($stmt->fetch()) { $table->setCellContents($rownum, 0, $ID); $table->setCellContents($rownum, 1, $nomeID); Ordenando o } $rownum++; relatório pelas ?> echo $table->toHTML(); $mysqli->close(); colunas
  • 8.
    Criando relatórios paginados OMySQL possui uma cláusula LIMIT, que permite extrairmos dados limitados por um valor de linha inicial e o número de linhas a partir desse valor que deve ser extraído. Exemplo: SELECT nome FROM pessoas ORDER BY nome ASC LIMIT 0,2; recupera apenas as duas primeiras linhas. Para utilizarmos na criação de relatórios, precisamos determinar 3 variáveis: – Número de linhas por página; – Faixa de linhas a extrair do banco; – Número de linhas totais de resultado.
  • 9.
    Criando relatórios paginados- (i) <?php require_once "HTML/Table.php"; $mysqli = new mysqli("localhost", "root", "Dm%512p", "usuarios"); $tamanhodapagina=2; $registroinicial = (int) $_GET['registroinicial']; $registroinicial = (isset($_GET['registroinicial'])) ? $registroinicial : 0; $attributes = array('border' => '1'); $table = new HTML_Table($attributes); // Montando os cabeçalhos das colunas linkáveis utilizando o método GET do HTTP! $IDcoluna = "<a href='".$_SERVER['PHP_SELF']."?campo=id'>ID</a>"; $nomeIDcoluna = "<a href='".$_SERVER['PHP_SELF']."?campo=nome'>Pessoas</a>"; $table->setHeaderContents(0, 0, $IDcoluna); $table->setHeaderContents(0, 1, $nomeIDcoluna); // selecionando o campo de indexação conforme o retorno do método GET $campo = (isset($_GET['campo'])) ? $_GET['campo'] : "id";
  • 10.
    Criando relatórios paginados- (ii) // seleciona o número total de registros na tabela $resultado = $mysqli->query("SELECT count(id) AS id FROM pessoas"); list($totalregistros)=$resultado->fetch_row(); $query = "SELECT id AS `Numero de chamada`, nome AS `Nome completo` FROM pessoas ORDER BY ".$campo." ASC LIMIT ".$registroinicial.",".$tamanhodapagina; $stmt = $mysqli->prepare($query); $stmt->execute(); $stmt->bind_result($ID,$nomeID); $rownum = 1; while ($stmt->fetch()) { $table->setCellContents($rownum, 0, $ID); $table->setCellContents($rownum, 1, $nomeID); $rownum++; } echo $table->toHTML();
  • 11.
    Criando relatórios paginados- (iii) // cria o link de anterior if ($registroinicial > 0) { $prev = $registroinicial - $tamanhodapagina; $url = $_SERVER['PHP_SELF']."?registroinicial=$prev"; printf("<a href='%s'> Pagina anterior </a>",$url); } // cria o link posterior if ($totalregistros > ($registroinicial + $tamanhodapagina)) { $next = $registroinicial+$tamanhodapagina; $url = $_SERVER['PHP_SELF']."?registroinicial=$next"; printf("<a href='%s'> Pagina posterior </a>",$url); } $mysqli->close(); ?>