Ir para conteúdo
Fórum Script Brasil
  • 0

Preenchimento de form com dados de várias tabelas


jcvilanova

Pergunta

Galera, estou precisando de uma força. Estou criando uma aplicação em PHP para meu setor. Trabalho com controle e manutençao de escalas de serviço dos servidores. Criei o banco de dados com as tabelas: servidores, departamento e servicosdiarios. A escala é feita manualmente e eu gostaria de automatizar esse processo. A dieia seria criar um formulário de cadastro de escala, que seria preenchido diariamente com os dados: data, responsavel e os diversos serviços diarios. No caso dos serviços diários são varios: limpeza, portaria, motorista e outros, alguns com mais de um servidor por dia. Então eu pensei em ter um campo que seria preenchido com o nome do servidor ao clicar. Então a ideia seria, ao clicar no campo nome do servidor, que abrisse uma tela com todos os servidores e ao clicar num deles, o campo fosse preenchido automaticamente. O problema em que, como falei, alguns serviços serão prestados por mais de um servidor, então, que tipo de campo eu poderia usar que suportasse esse tipo de preenchimento comportando mais de um servidor? Como faria para abrir essa janela com a relação de todos os servidores? 

Obs: toda a parte de cadastro já está pronta e funcionando. O problema agora é só com a tela de inserção dos serviços diários. 

Não sei se fui claro

Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0

Olá! Segue sugestão:

1) Crie um input:search para autocomplete dos nomes de servidores.
2) Ao clicar num nome da lista do autocomplete, adicione-o/exiba em uma lista qualquer.
3) Quando submeter o form, acrescente tb os nomes dessa lista

Link para o comentário
Compartilhar em outros sites

  • 0

Ao invés de servidor, prefiro usar a palavra colaborador.

Acho que três tabelas resolvem o problema: colaboradores, serviços e escalas.

A tabela colaboradores só tem um id: id=1, Frank.

A tabela serviços só tem dois ids: id=1, Faxina; id=2, Programador.

Agora a tabela escala tem que ter esses campos: id, data_com_hora_inicio, data_com_hora_final, id_colaborador, id_servico.
 

Na escala de hoje, a tabela ficaria assim:

1,2023-12-18 08:00,2023-12-18 12:00,1,1 

2,2023-12-18 13:00,2023-12-18 17:00,1,2

 

O seu caso é diferente, você trabalha na Câmara Municipal, onde temos vários colaboradores que não têm o que fazer. Nesse caso, a tabela escala ficaria com essa cara:

3,2023-12-18 13:00,2023-12-18 17:00,2,2
4,2023-12-18 13:00,2023-12-18 17:00,3,2
5,2023-12-18 13:00,2023-12-18 17:00,4,2
6,2023-12-18 13:00,2023-12-18 17:00,5,2

Ou seja, são vários colaboradores fazendo o mesmo serviço no mesmo período.

Editado por Frank K Hosaka
Link para o comentário
Compartilhar em outros sites

  • 0

Bem, ignorando o comentário, pois acho inadequado, voltemos ao que interessa. 

As tabelas estão prontas: tb_servidores (id, nome, matricula, endereco ...), tb_servicos(id, nome, descricao) e tb_escaladiaria (id, data, hora_inicio, hora_final, id_servidor). 

Pensei em fazer um formulario em que teriamos o titulo (escala de serviço diário), subtitulos (Faxina, motorista, copa etc), e colocar um campo do tipo select,e que no option value dele apresentasse o resultado de uma consulta SQL na tabela tb_servidores. Ocorre que o campo que será preenchido pela opção mostrada no select só comporta um valor, e em alguns serviços temos mais de um servidor por dia, como por exemplo: motoristas. Então a minha dúvida é exatamente essa, que tipo de campo eu usaria no form de tal forma que pudesse usar a mesma funcionalidade, tipo, clicar, escolher um nome de servidor, clicar novamente e preencher, repetir o processo até que o campo estivesse com o numero necessário de servidores naquela area da escacla(motoristas), como citei. 

O que fiz até agora está conforme a figura que anexei, mas gostaria de ter uma outra forma de solucionar o problema 

 

DUVIDA.png

Link para o comentário
Compartilhar em outros sites

  • 0

Eu peço desculpas pelo comentário que realmente não ajudou em nada.

O mais importante são as tabelas tb_servidores (id), tb_serviços (id) e tbescaladiaria(id,id_servidor,id_servico), a sua tabela tbescaladiaria não contempla o serviço que será feito pelo servidor.

Vamos supor que você precisa de 5 motoristas: Maria, José, João, Mateus e Pedro.

Logo, você vai preencher 5 registros na tbescaladiaria.

Vamos supor que você pegou a Maria como motorista. Logo, a próxima vez que você selecionar os motoristas disponíveis, devem aparecer apenas José, João, Mateus e Pedro.

Nesse caso, precisamos de mais um campo na tb_servidores, assim (id,escalado), e assim podemos fazer uma consulta para popular o formulário dos motoristas que ainda não foram escalados.

Outro problema é a tbescaladiaria, como ele vai saber que só podem ser convocados 5 motoristas?

Nesse caso, temos mais uma alteração na tbserviços (id, maximo_necessario).

Antes de quebrar a cabeça com o formulário, veja se o banco de dados tem informações suficientes para resolver o seu problema.

Agora, se a tabela é imexível, aí o escopo é outro. Você tem o escopo do projeto? Escopo é algo do tipo: eu não tenho o privilégio de administrador, não posso mexer na estrutura do banco de dados que é composto dessa tabela (id,nome) e outra tabela (id,descricao), e com essas informações gostaria de saber se é possível fazer um controle de escalas.

Editado por Frank K Hosaka
Link para o comentário
Compartilhar em outros sites

  • 0
1 hora atrás, Frank K Hosaka disse:

Eu peço desculpas pelo comentário que realmente não ajudou em nada.

O mais importante são as tabelas tb_servidores (id), tb_serviços (id) e tbescaladiaria(id,id_servidor,id_servico), a sua tabela tbescaladiaria não contempla o serviço que será feito pelo servidor.

Vamos supor que você precisa de 5 motoristas: Maria, José, João, Mateus e Pedro.

Logo, você vai preencher 5 registros na tbescaladiaria.

Vamos supor que você pegou a Maria como motorista. Logo, a próxima vez que você selecionar os motoristas disponíveis, devem aparecer apenas José, João, Mateus e Pedro.

Nesse caso, precisamos de mais um campo na tb_servidores, assim (id,escalado), e assim podemos fazer uma consulta para popular o formulário dos motoristas que ainda não foram escalados.

Outro problema é a tbescaladiaria, como ele vai saber que só podem ser convocados 5 motoristas?

Nesse caso, temos mais uma alteração na tbserviços (id, maximo_necessario).

Antes de quebrar a cabeça com o formulário, veja se o banco de dados tem informações suficientes para resolver o seu problema.

Agora, se a tabela é imexível, aí o escopo é outro. Você tem o escopo do projeto? Escopo é algo do tipo: eu não tenho o privilégio de administrador, não posso mexer na estrutura do banco de dados que é composto dessa tabela (id,nome) e outra tabela (id,descricao), e com essas informações gostaria de saber se é possível fazer um controle de escalas.

 

Excelente sua observação. Muito boas mesmo. Mas vamos lá, vamos considerar como você citou. Criei o campo ‘escalado’ na tabela tb_servidores.
Ao escolher um dos colaboradores no combobox será marcado escalado na escala correspondente. Blza ? Na consulta que preencherá o combobox colocarei a cláusula where com a condição ‘1’, que significa ‘escalado’.  Então presumo que o combobox agora só vá mostrar os nomes dos não escaldados. Mas o meu problema continua lá na questão que falei,  é que eu não sei que tipo de campo comportaria dois, três ou mais nomes escolhidos. Quanto ao número limite, posso pensar em filtrar pela função, já que cada servidor tem uma função específica. 
Outra coisa que me veio em mente agora é que, já que vou ter que fazer várias consultas em várias tabelas ao mesmo tempo, como vou apresentar tudo isso em uma só tabela? Porque na hora de imprimir preciso de algo compreensivo para todos, concorda ? 
enfim, estou enrolado nessa questão do campo, por enquanto kkkkkk

a parte de consulta SQL consigo desenrolar 

Link para o comentário
Compartilhar em outros sites

  • 0

A minha ideia é mostrar toda a tabela escaladiaria, onde vão aparecer os servidores e suas funções.

Como você não quer escrever na mão essa tabela, vamos precisar de dois formulários.

O primeiro vai ter uma combo com os serviços.

O segundo vai ter uma combo os servidores que fazem aquele serviço. Assim que ele for selecionado, a tabela escaladiaria será atualizada. A minha ideia é criar uma linha para cada escala assim:

18/12/23 Maria, motorista
18/12/23 João, motorista
18/12/23 Pedro, motorista

e não 18/12/23 [Maria, João, Pedro], motorista. Nesse caso, ao invés de um id_servidor (int) teríamos que mudar para ids_servidores (varchar(45)), onde teríamos um array de vários de ids, o que eu acho bem difícil de trabalhar.
Aconselho a não fazer isso, a menos que isso seja mais útil para você.
Em seguida, um rascunho do que estava fazendo, ele está incompleto, mas preciso abandonar porque tenho que fazer a janta. Boa sorte para você.

<?php
$pdo=new PDO('mysql:host=localhost;dbname=diario','root','');
$stmt=$pdo->query("select * from tb_escaladiaria join tb_servidores
        on id_servidor=tb_servidores.id");
    $escalas=$stmt->fetchAll(PDO::FETCH_OBJ);
if(isset($_GET['servidor'])){
    $dia=date('Y-m-d');
    $id=$_GET['servidor'];
    $stmt=$pdo->query("insert into tb_escaladiaria (dia,id_servidor,id_servico)
        values('$dia','$id',1)");}
$stmt=$pdo->query("select * from tb_servicos");
$servicos=$stmt->fetchAll(PDO::FETCH_OBJ); ?>
<form>
    <select name=servico id=servico onchange=submit()>
        <option>Selecione o serviço
        <?php foreach($servicos as $servico): ?>
        <option value=<?=[$servico->id,$servico->descricao]?>><?=$servico->descricao?>
        <?php endforeach; ?>
    </select>
</form>
<?php
if(isset($_GET['servico'])):
    $idServico=$_GET['servico'][0];
    $descricaoServico=$_GET['servico'][1];
    $stmt=$pdo->query("select * from tb_servidores where id_servico=$idServico");
    $servidores=$stmt->fetchAll(PDO::FETCH_OBJ); ?>
    <form>
    <select name=servidor onchange=submit()>
        <option>Selecione o colaborador
        <?php foreach($servidores as $servidor): ?>
        <option value=<?=$servidor->id?>><?=$servidor->nome?>
        <?php endforeach; ?>
    </select>
    </form>
    <?php endif; ?>
<table border=1><th>Data<th>Colaborador<th>Função
<?php foreach($escalas as $escala): ?>
<tr><td><?=$escala->data?><td><?=$escola->nome?><td><?=$escala->funcao?>
<?php endforeach; ?>

 

Link para o comentário
Compartilhar em outros sites

  • 0

Finalmente terminei o rascunho (ele só faz o básico, ele não contempla nenhum controle dos que já foram selecionados e nem a quantidade necessária de cada serviço, e como ele trabalha com data precisa definir o local, coisa que também não fiz). Espero que você goste:

Mysql
CREATE TABLE `tb_escaladiaria` (
  `id` int NOT NULL AUTO_INCREMENT,
  `data` date DEFAULT NULL,
  `id_servidor` int DEFAULT NULL,
  `id_servico` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
CREATE TABLE `tb_servicos` (
  `id` int NOT NULL AUTO_INCREMENT,
  `descricao` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=innoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
CREATE TABLE `tb_servidores` (
  `id` int NOT NULL AUTO_INCREMENT,
  `nome` varchar(45) DEFAULT NULL,
  `id_servico` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

arquivo Index.php
<body style='width:1200px;margin:0 auto;margin-top:50px'>
<?php
$pdo=new PDO('mysql:host=localhost;dbname=diario','root','');
$stmt=$pdo->query("select * from tb_escaladiaria 
        join tb_servidores on id_servidor = tb_servidores.id 
        join tb_servicos on tb_servidores.id_servico = tb_servicos.id");
    $escalas=$stmt->fetchAll(PDO::FETCH_OBJ);
if(isset($_GET['servidor'])){
    $dia=date('Y-m-d');
    $id_servidor=$_GET['servidor'];
    $id_servico=$_GET['idServico'];
    $stmt=$pdo->query("insert into tb_escaladiaria (data,id_servidor,id_servico)
        values('$dia',$id_servidor,$id_servico)");
    header("location:index.php?servico=$id_servico");}
$stmt=$pdo->query("select * from tb_servicos");
$servicos=$stmt->fetchAll(PDO::FETCH_OBJ); 
if(isset($_GET['servico'])):
    $idServico=$_GET['servico'];
    $stmt=$pdo->query("select descricao from tb_servicos where id=$idServico");
    $descricaoServico=$stmt->fetchAll(PDO::FETCH_ASSOC)[0]['descricao'];
    echo "<input type=submit value='$descricaoServico' onclick=location.replace('index.php')>
    <i> Clique nesse botão para mudar o serviço</i><p>";
    $stmt=$pdo->query("select * from tb_servidores where id_servico=$idServico");
    $servidores=$stmt->fetchAll(PDO::FETCH_OBJ); ?>
    <form>
    <select name=servidor onchange=submit()>
        <option>Selecione o colaborador
        <?php foreach($servidores as $servidor): ?>
        <option value=<?=$servidor->id?>><?=$servidor->nome?>
        <?php endforeach; ?>
    </select>
    <input type=hidden name=idServico value=<?=$idServico?>>
    </form>
    <?php else: ?>
        <form>
    <select name=servico id=servico onchange=submit()>
        <option>Selecione o serviço
        <?php foreach($servicos as $servico): ?>
        <option value=<?=$servico->id?>><?=$servico->descricao?>
        <?php endforeach; ?>
    </select>
    </form>
    <?php endif; ?>
<table border=1><th>Data<th>Colaborador<th>Função
<?php foreach($escalas as $escala): ?>
<tr><td><?=$escala->data?><td><?=$escala->nome?><td><?=$escala->descricao?>
<?php endforeach; ?>

 

Captura de tela 2023-12-18 232314.png

Editado por Frank K Hosaka
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...