Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

JoaoVM

PHP Condição para Sistema de Ponto

Mensagens Recomendadas

JoaoVM

Boas Pessoal,

Tenho um problema com o meu código PHP, o que acontece e que tenho algo parecido com um registo de ponto, nesse registo de ponto cada toque do cartão com tag RFID insere na base de dados, o meu problema é quando insere o primeiro registo de entrada ele faz tudo bem, quando passo novamente o cartão e ele insere com o registo de saída, mas quando volto a passar novamente o cartão ele insere um registo de saída novamente quando deveria inserir um registo de entrada.

Como faço para se já existir uma saída daquele colaborador na data atual para voltar a inserir uma entrada, visto que ele pode sair e entrar varias vezes na linha, que condição utilizo para isto?

Outro problema é que o campo Total Horas é calculado corretamente mas só é mostrado quando insere o novo registo de saída que vem erradamente, o que acontece é que o resultado é correto mas só aparece no novo registo como mostra a imagem...

Vejamos o código...

http://prntscr.com/21u7wu

if(isset($_POST['entrada'])) {
$rfid = $_POST['rfid'];

$query = mysql_query("select ... from transacoes_bmw where rfid=".$rfid." and data=timestamp(current_date())");
$mostra = mysql_fetch_array($query);

if ($mostra['rfid'] == 0){

	mysql_query("insert into transacoes_bmw (...,evento, total_horas,...) values (...,'$evento1','$total_horas1',...)");

}
elseif ($mostra['rfid'] >= 1 && $mostra['evento'] == 'E'){

	mysql_query("insert into transacoes_bmw (...,evento, total_horas,...) values (...,'$evento2','$total_horas2',...)");

}
elseif ($mostra['rfid'] >= 1 && $mostra['evento'] == 'S'){

	mysql_query("insert into transacoes_bmw (...,evento, total_horas,...) values (...,'$evento1','$total_horas1',...)");

}
//TER EM CONSIDERAÇÃO QUE
$evento1='E';
$evento2='S';
$total_horas1='00:00:00'
$total_horas2=($hora_saida - $hora_entrada)
//CLARO QUE O CALCULO NAO E ASSIM MAS E APENAS PARA DAR UMA IDEIA

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Como faço para se já existir uma saída daquele colaborador na data atual para voltar a inserir uma entrada, visto que ele pode sair e entrar varias vezes na linha, que condição utilizo para isto?

perguntas à base de dados se existe o registo de saída.

se sim, então tens de inserir uma entrada

quanto à diferença de tempo, tens o código SQL que te apresentei no teu outro tópico ...


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
JoaoVM

HappyHippyHippo,

Vejamos a lógica da minha condição, penso que está certa, apenas não percebo o que se está a passar com a query porque os dados da hora_saida estão na hora_entrada, realmente o ultimo registo de id_transacao é o 256 mas como vemos na imagem não é um evento de E e é um evento de S e o ultimo registo é na hora 15:12:11 com o evento de S. E não é o que aparece na minha query. o calculo to total de horas deveria ser feito no primeiro evento S e não quando ele faz erradamente o segundo evento S.

Quanto ao código SQL que me apresentaste noutro tópico está bem feito, apenas deveria calcular logo quando faz o evento de saída, porque se fizermos as contas ele mostra o valor do total de horas desse registo e não do registo em que está a ser mostrado.

Não percebo o que se está a passar aqui :(

smzb.png

id3m.png

//A MINHA QUERY SUPOSTAMENTE DEVOLVER O ULTIMO REGISTO DE UM DADO COLABORADOR ATRAVES DA LEITURA DO RFID
$queryE = mysql_query("SELECT MAX(id_transacao) AS ULTIMO, rfid, data, evento FROM transacoes_bmw WHERE rfid=".$rfid." and data=timestamp(current_date());");
$eventoE= mysql_fetch_array($queryE);
//echo $eventoE['evento'];
   echo '<img src="ok.png" width="50" height="50">';
   echo '<br>';
   echo "<font color='green' size='5'>Operação Realizada com Sucesso!!!</font>";
//SE O NUMERO RFID NAO EXISTIR ELE INSERE COMO ENTRADA
if ($eventoE['rfid'] == 0){

	mysql_query("insert into transacoes_bmw ...E");

}

//DE ACORDO COM A QUERY SE O ULTIMO EVENTO DO DADO NUMERO RFID FOR UMA ENTRADA(E) ENTAO ELE VAI INSERIR UMA SAIDA.
elseif ($eventoE['evento'] == 'E'){

	mysql_query("insert into transacoes_bmw ...S");

}
//DE ACORDO COM A QUERY SE O ULTIMO EVENTO DO DADO NUMERO RFID FOR UMA SAIDA(S) ENTAO ELE VAI INSERIR UMA ENTRADA.
elseif ($eventoE['evento'] == 'S'){

	mysql_query("insert into transacoes_bmw ...E");

}

Editado por JoaoVM

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
JoaoVM

Consegui colocar a funcionar, alterei o modo como chamo o campo do rfid, em vez de declarar a variável $rfid, coloquei diretamente $_POST['rfid'] assim passando a funcionar.

Continuo apenas com o problema de ele não me fazer o calculo no local certo do total de horas, deve ser um problema de estrutura que vou olhar mais atentamente.

//TINHA A VARIAVEL DECLARADA AQUI DO $_POST['RFID']
$rfid = $_POST['rfid'];
//RETIREI O MAX DO SELECT INICIAL E COLOQUEI COM UMA SUBQUERY,
$queryE = mysql_query("SELECT id_transacao rfid, data, evento FROM transacoes_bmw WHERE rfid=".$_POST['rfid']." and data=timestamp(current_date()) AND id_transacao=(SELECT max(id_transacao) FROM transacoes_bmw);");
$eventoE= mysql_fetch_array($queryE);
//O RFID COM A VARIAVEL $RFID NAO ESTAVA A FUNCIONAR NAO PERCEBO PORQUE MAS DIRETAMENTE COM O $_POST JÁ CONSEGUI

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
JoaoVM

Parece que ainda não e desta, quando insiro apenas um colaborador ele faz tudo certo, quando alterno entre colaboradores ele falha nos pontos que se pode ver na imagem..

cotj.png

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.