Ir para conteúdo

POWERED BY:

Arquivado

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

RValentim

Montando uma tabela Dinâmica de acordo com o numero da semana

Recommended Posts

Como posso montar uma tabela usando o número da semana atual e as próximas 15 Semanas, a semana em que estamos é a 29 então teremos 29+15 = 44, então a tabela ficaria assim...

Coluna1 | Coluna2 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44

Já tenho a query que pode me retornar as informações necessárias para essa tabela da seguinte forma...

 

eHMEG.png

Uma outra questão é se também é possível fazer com o que o numero de semanas volte a ser 1 quando houver a mudança de ano...

Coluna1 | Coluna2 | 42| 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 1 | 2 | 3 | 4 | 5

52 é o numero máximo de semanas que temos durante o ano...

 

Desde já agradeço a atenção de todos. Obrigado.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

A função date(); do PHP pode retornar o número da semana em que estamos, além de inúmeras outras coisas. É bem simples, o que você quer: monte uma função na qual sejam adicionadas 15 semanas à semana atual e, a partir de então, monte uma tabela para amostragem.

 

Por exemplo, poderia fazer algo assim:

<?php
function listaSemanas($proximas = 15){
	$semana = date("W");
	$totalSemanas = $semana + $proximas;
	$tabela = "<table><tr><td style='border-right:1px solid black;padding:5px;'> Coluna 1 </td><td style='border-right:1px solid black;padding:5px;'> Coluna 2 </td>";
	for($i=$semana;$i<=$totalSemanas;$i++){
		$tabela .= "<td style='border-right:1px solid black;padding:5px;'> ".$i." </td>";
	}
	$tabela .= "</tr></table>";
	return $tabela;
}
echo listaSemanas();
?>

Essa função vai exibir exatamente o que você colocou ali em cima:

 

 

Coluna1 | Coluna2 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44

Compartilhar este post


Link para o post
Compartilhar em outros sites

até ai tudo bem, eu já tinha conseguido fazer sem função mesmo.... o problema é imprimir cada resultado em sua respectiva coluna certinha.... isso que não estou conseguindo....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ponto 1 - Trabalhando com datas

 

Acredito que a melhor forma de trabalhar com datas no PHP é usando a classe DateTime.

A primeira coisa, seria identificar as datas de início e fim de cada semana.

Considerando que a semana útil começa nas segundas e termina aos sábados, teríamos:

$date = new DateTime('first monday this week');

Assim, já temos um objeto que inicia na semana atual, a partir de segunda feira.

Agora ficou fácil. Basta iterar pelo número de semanas que queremos.

Abaixo um teste simples, para sabermos se os resultados são os esperados:

// volta para segunda
$date = new DateTime('first monday this week');
// numero de semanas desejadas
$semanas = 15;

// enquanto tiver semanas
while($semanas > 0) {
	// clonamos a data
	$fim = clone $date;
	// adicionamos 6 dias, para chegar no 'sabado'.
	$fim->modify('+6 day');

	// exibimos o periodo, para fazermos uma checagem
	printf('Periodo: %s ate %s, semana %s<br>', $date->format('d/m/Y'), $fim->format('d/m/Y'), $date->format('W'));

	// movemos a data principal para a próxima segunda
	$date->modify('+7 day');

	// diminui o número de semanas
	$semanas--;
}

Este código exibe o resultado (com base na data de postagem desta resposta):

Periodo: 13/07/2015 ate 19/07/2015, semana 29
Periodo: 20/07/2015 ate 26/07/2015, semana 30
Periodo: 27/07/2015 ate 02/08/2015, semana 31
Periodo: 03/08/2015 ate 09/08/2015, semana 32
Periodo: 10/08/2015 ate 16/08/2015, semana 33
Periodo: 17/08/2015 ate 23/08/2015, semana 34
Periodo: 24/08/2015 ate 30/08/2015, semana 35
Periodo: 31/08/2015 ate 06/09/2015, semana 36
Periodo: 07/09/2015 ate 13/09/2015, semana 37
Periodo: 14/09/2015 ate 20/09/2015, semana 38
Periodo: 21/09/2015 ate 27/09/2015, semana 39
Periodo: 28/09/2015 ate 04/10/2015, semana 40
Periodo: 05/10/2015 ate 11/10/2015, semana 41
Periodo: 12/10/2015 ate 18/10/2015, semana 42
Periodo: 19/10/2015 ate 25/10/2015, semana 43

Pronto. Agora sabemos que nossa lógica esta certa.

 

Ponto 2 - Trabalhando com a SQL

 

Agora que sabemos como pegar os períodos desejados, podemos fazer com que o agrupamento dos valores seja feito de duas formas:

  • criar uma SQL e já trazer os resultados certinhos do banco;
  • trazer os resultados para o PHP e criar um array agrupando por semanas no PHP.

Vou exemplificar a primeira sugestão, levando em consideração o banco MySQL:

Supondo que você tem uma tabela chamada produtos e outra vendas.

 

 

Produtos

- codproduto (integer notnull auto_increment)

- nome (varchar not null)

- cor (varchar not null)

- preco_venda (decimal not null)

- preco_custo (decimal not null)

 

 

Vendas

- codvenda (integer notnull auto_increment)

- codproduto (integer not null)

- codcliente (integer not null)

- data_venda (datetime)

- preco_venda (decimal not null)

 

Agora está fácil.

Pelo PHP, montamos uma query, com base no exemplo das datas acima, onde cada coluna é a soma de vendas daquele período para o produto.

// volta para segunda
$date = new DateTime('first monday this week');
// numero de semanas desejadas
$semanas = 15;
// array de queries
$query_semanal = array();

// enquanto tiver semanas
while($semanas > 0) {
    // clonamos a data
    $fim = clone $date;
    // adicionamos 6 dias, para chegar no 'sabado'.
    $fim->modify('+6 day');

    // adicionando a query
    $query_semanal[] = sprintf("(SELECT COUNT(*) FROM vendas WHERE vendas.data_venda BETWEEN '%s' AND '%s' AND vendas.codproduto = produtos.codproduto) as semana_%s", $date->format('Y-m-d'), $fim->format('Y-m-d'), $date->format('W'));

    // movemos a data principal para a próxima segunda
    $date->modify('+7 day');

    // diminui o número de semanas
    $semanas--;
}

// montando a query final
$query_final = sprintf('
    SELECT produtos.codproduto,
           produtos.nome,
           produtos.cor,
           %s
      FROM produtos', implode(', ' . PHP_EOL, $query_semanal));

echo '<pre>';
echo $query_final;

Praticamente igual ao primeiro exemplo, exceto que estamos criando uma query e colocando no array.

O resultado será:

    SELECT produtos.codproduto,
           produtos.nome,
           produtos.cor,
           (SELECT COUNT(*) FROM vendas WHERE vendas.data_venda BETWEEN '2015-07-13' AND '2015-07-19' AND vendas.codproduto = produtos.codproduto) as semana_29, 
(SELECT COUNT(*) FROM vendas WHERE vendas.data_venda BETWEEN '2015-07-20' AND '2015-07-26' AND vendas.codproduto = produtos.codproduto) as semana_30, 
(SELECT COUNT(*) FROM vendas WHERE vendas.data_venda BETWEEN '2015-07-27' AND '2015-08-02' AND vendas.codproduto = produtos.codproduto) as semana_31, 
(SELECT COUNT(*) FROM vendas WHERE vendas.data_venda BETWEEN '2015-08-03' AND '2015-08-09' AND vendas.codproduto = produtos.codproduto) as semana_32, 
(SELECT COUNT(*) FROM vendas WHERE vendas.data_venda BETWEEN '2015-08-10' AND '2015-08-16' AND vendas.codproduto = produtos.codproduto) as semana_33, 
(SELECT COUNT(*) FROM vendas WHERE vendas.data_venda BETWEEN '2015-08-17' AND '2015-08-23' AND vendas.codproduto = produtos.codproduto) as semana_34, 
(SELECT COUNT(*) FROM vendas WHERE vendas.data_venda BETWEEN '2015-08-24' AND '2015-08-30' AND vendas.codproduto = produtos.codproduto) as semana_35, 
(SELECT COUNT(*) FROM vendas WHERE vendas.data_venda BETWEEN '2015-08-31' AND '2015-09-06' AND vendas.codproduto = produtos.codproduto) as semana_36, 
(SELECT COUNT(*) FROM vendas WHERE vendas.data_venda BETWEEN '2015-09-07' AND '2015-09-13' AND vendas.codproduto = produtos.codproduto) as semana_37, 
(SELECT COUNT(*) FROM vendas WHERE vendas.data_venda BETWEEN '2015-09-14' AND '2015-09-20' AND vendas.codproduto = produtos.codproduto) as semana_38, 
(SELECT COUNT(*) FROM vendas WHERE vendas.data_venda BETWEEN '2015-09-21' AND '2015-09-27' AND vendas.codproduto = produtos.codproduto) as semana_39, 
(SELECT COUNT(*) FROM vendas WHERE vendas.data_venda BETWEEN '2015-09-28' AND '2015-10-04' AND vendas.codproduto = produtos.codproduto) as semana_40, 
(SELECT COUNT(*) FROM vendas WHERE vendas.data_venda BETWEEN '2015-10-05' AND '2015-10-11' AND vendas.codproduto = produtos.codproduto) as semana_41, 
(SELECT COUNT(*) FROM vendas WHERE vendas.data_venda BETWEEN '2015-10-12' AND '2015-10-18' AND vendas.codproduto = produtos.codproduto) as semana_42, 
(SELECT COUNT(*) FROM vendas WHERE vendas.data_venda BETWEEN '2015-10-19' AND '2015-10-25' AND vendas.codproduto = produtos.codproduto) as semana_43
      FROM produtos

Executando esta query no banco, cada coluna já representa a soma de vendas em cada semana ;) .

 

O melhor: viradas de ano e mês já são tratadas pela classe DateTime ;)

 

A parte de colocar o agrupamento pelo PHP, deixo para você estudar B)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde, hufersil

 

Como você pode observar no meu 1º post, obter o resultado eu já consigo de varias formas diferentes, o problema é justamente montar a tabela com essas informações, é nesse ponto que estou me perdendo...

 

Obs: tenho certeza que é algo extremamente fácil, porém por algum curto no cérebro não estou conseguindo resolver esse ponto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se você fizer com a consulta que eu te mandei, fica fácil.

Presumindo que você consegue montar o cabeçalho, o resto é fácil.

Abaixo o exemplo de como montar as linhas (reforçando, com base no resultset da consulta exemplicada anteriormente).

$semanas = 15;

$result = $pdo->query(/* aquela consulta */);

while( $row = $result->fetch(PDO::FETCH_ASSOC)) {
    echo '<tr>
        <td>', $row['codproduto'], '</td>',
        '<td>', $row['nome'], '</td>';

    for($i=0; $i<$semanas; $i++) {
        echo '<td>', $row['semana_'.$i], '</td>';
    }
    echo '</tr>';
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado hufersil, eu peguei a sua ideia e adaptei no meu projeto e funcionou.

 

Obs: Eu sabia que a solução para isso era uma besteira, era eu quem estava complicando...

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por daemon
      Boa tarde,
       
      Eu tenho uma rotina que faz uma leitura do arquivo .xml de vários sites.

      Eu consigo pegar o tópico e a descrição, e mostrar a imagem que esta na pagina do link.
      Para isso utilizo esta função:
      function getPreviewImage($url) { // Obter o conteúdo da página $html = file_get_contents($url); // Criar um novo objeto DOMDocument $doc = new DOMDocument(); @$doc->loadHTML($html); // Procurar pela tag meta og:image $tags = $doc->getElementsByTagName('meta'); foreach ($tags as $tag) { if ($tag->getAttribute('property') == 'og:image') { return $tag->getAttribute('content'); } } // Se não encontrar og:image, procurar pela primeira imagem na página $tags = $doc->getElementsByTagName('img'); if ($tags->length > 0) { return $tags->item(0)->getAttribute('src'); } // Se não encontrar nenhuma imagem, retornar null return null; } // Uso: $url = "https://example.com/article"; $imageUrl = getPreviewImage($url); if ($imageUrl) { echo "<img src='$imageUrl' alt='Preview'>"; } else { echo "Nenhuma imagem encontrada"; }  
      Mas estou com um problema, esta funcão funciona quando coloco em uma pagina de teste.php. Preciso mostrar em uma página inicial diversas fotos de todos os links. (No caso acima só funciona 1).
    • Por violin101
      Caros amigos, saudações.
       
      Por favor, me permita tirar uma dúvida com os amigos.

      Tenho um Formulário onde o Usuário digita todos os Dados necessários.

      Minha dúvida:
      --> como faço após o usuário digitar os dados e salvar, o Sistema chamar uma Modal ou mensagem perguntando se deseja imprimir agora ?

      Grato,
       
      Cesar
    • Por Carcleo
      Tenho uma abela de usuarios e uma tabela de administradores e clientes.
      Gostaria de uma ajuda para implementar um cadastro
       
      users -> name, login, passord (pronta) admins -> user_id, registratiom, etc.. client -> user_id, registratiom, etc...
      Queria ajuda para extender de user as classes Admin e Client
      Olhem como estáAdmin
      <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Admin extends User {     use HasFactory;            protected $fillable = [         'name',         'email',         'password',         'registration'     ];      private string $registration;     public function create(         string $name,          string $email,          string $password,         string $registration     )     {         //parent::create(['name'=>$name, 'email'=>$email, 'password'=>$password]);         parent::$name = $name;         parent::$email = $email;         parent::$password = $password;         $this->registration = $registration;     } } User
      <?php namespace App\Models; // use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Illuminate\Database\Eloquent\Relations\BelongsToMany; class User extends Authenticatable {     /** @use HasFactory<\Database\Factories\UserFactory> */     use HasFactory, Notifiable;     static string $name;     static string $email;     static string $password;     /**      * The attributes that are mass assignable.      *      * @var list<string>      */     protected $fillable = [         'name',         'email',         'password',     ];          /**      * The attributes that should be hidden for serialization.      *      * @var list<string>      */     protected $hidden = [         'remember_token',     ];     /**      * Get the attributes that should be cast.      *      * @return array<string, string>      */     protected function casts(): array     {         return [             'email_verified_at' => 'datetime',             'password' => 'hashed',         ];     }          public function roles() : BelongsToMany {         return $this->belongsToMany(Role::class);     }       public function hasHole(Array $roleName): bool     {                 foreach ($this->roles as $role) {             if ($role->name === $roleName) {                 return true;             }         }         return false;     }         public function hasHoles(Array $rolesName): bool     {                 foreach ($this->roles as $role) {             foreach ($rolesName as $rolee) {             if ($role->name === $rolee) {                 return true;             }          }         }         return false;     }         public function hasAbility(string $ability): bool     {         foreach ($this->roles as $role) {             if ($role->abilities->contains('name', $ability)) {                 return true;             }         }         return false;     }     } Como gravar um Admin na tabela admins sendo que ele é um User por extensão?
      Tentei assim mas é claro que está errado...
      public function store(Request $request, Admin $adminModel) {         $dados = $request->validate([             "name" => "required",             "email" => "required|email",             "password" => "required",             "registration" => "required"         ]);         $dados["password"] =  Hash::make($dados["password"]);                  $admin = Admin::where("registration",  $dados["registration"])->first();                  if ($admin)              return                    redirect()->route("admin.new")                             ->withErrors([                                 'fail' => 'Administrador já cadastrados<br>, favor verificar!'                   ]);                            $newAdmin = $adminModel->create(                                    $dados['name'],                                    $dados['email'],                                    $dados['password'],                                    $dados['registration']                                 );         dd($newAdmin);         $adminModel->save();         //$adminModel::create($admin);                  return redirect()->route("admin.new")->with("success",'Cadastrado com sucesso');     }  
    • Por violin101
      Caros amigos, saudações.
       
      Gostaria de tirar uma dúvida com os amigos, referente a PDV.
       
      Estou escrevendo um Sistema com Ponto de Vendas, a minha dúvida é o seguinte, referente ao procedimento mais correto.

      Conforme o caixa vai efetuando a venda, o Sistema de PDV já realiza:
      a baixa direto dos produtos no estoque
      ou
      somente após concretizar a venda o sistema baixa os produtos do estoque ?
       
      Grato,
       
      Cesar
       
    • Por violin101
      Caros amigos do grupo, saudações e um feliz 2025.
       
      Estou com uma pequena dúvida referente a Teclas de Atalho.

      Quando o Caps Lock está ativado o Comando da Tecla de Atalho não funciona.
      ou seja:
      se estiver para letra minúscula ====> funciona
      se estiver para letra maiúscula ====> não funciona
       
      Como consigo evitar essa falha, tanto para Letra Maiúscula quanto Minúscula ?

      o Código está assim:
      document.addEventListener( 'keydown', evt => { if (!evt.ctrlKey || evt.key !== 'r' ) return;// Não é Ctrl+r, portanto interrompemos o script evt.preventDefault(); });  
      Grato,
       
      Cesar
×

Informação importante

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