Mostrando postagens com marcador mysql. Mostrar todas as postagens
Mostrando postagens com marcador mysql. Mostrar todas as postagens

sábado, 29 de outubro de 2011

Horas trabalhadas usando MySQL

  Na primeira publicação deste assunto com o título Horas trabalhadas armazenadas no MySQL eu abordei sobre um script que registra as horas trabalhadas. Passado um tempo tive que fazer alguma alterações para adequar meu sistema ao modelo usado pela empresa.
  As modificações são:
  • a substituição das colunas dia, mês e ano por data que agrupa as três informações;
  • pergunta se é um dia útil. Se a resposta for negativa, a forma como a variável saldo é calculada muda para diferenciar a quantidade de horas extras.

  A seguir está a descrição da tabela de acordo com o comando do MySQL describe ponto;

id int(11) NO PRI NULL auto_increment
in1 time YES NULL
out1 time YES NULL
in2 time YES NULL
out2 time YES NULL
tempo time YES NULL
saldo time YES NULL
data varchar(11) YES NULL
comment text YES NULL

  O script encontra-se abaixo bem como seus comentários para facilitar o entedimento das instruções.

#!/bin/bash

# Entrada dos horários
read -p "Entrada manhã: " in1
read -p "Saída almoço: " out1
read -p "Entrada tarde: " in2
read -p "Saída tarde: " out2

read -p "Data de hoje? [Y/n] " resp
# Entende que Y, y, S, s ou Enter signifiquem uma resposta a data de hoje
if [ "$resp" = Y -o "$resp" = y -o "$resp" = S -o "$resp" = s -o ! -n "$resp" ]
  then
   dia=`date +%d`
   mes=`date +%m`
   ano=`date +%Y`
   data=$dia/$mes/$ano
else
  read -p "dia " dia
  read -p "mes " mes
  read -p "ano " ano
  data=$dia/$mes/$ano
fi

# Subtrai o horário da manhã
manhaSQL=`mysql -uroot -psenha << SQL
SELECT SUBTIME('$out1','$in1');
QUIT
SQL`

# Filtra a resposta anterior ficando apenas um valor do tipo HH:MM:SS
manha=`echo $manhaSQL | awk '{printf "%s\n",$2}'`

# Subtrai o horário da tarde
tardeSQL=`mysql -uroot -psenha << SQL
SELECT SUBTIME('$out2','$in2');
QUIT
SQL`

# Filtra a resposta anterior ficando apenas um valor do tipo HH:MM:SS
tarde=`echo $tardeSQL | awk '{printf "%s\n",$2}'`

# Soma o horário da manhã e da tarde
tempoSQL=`mysql -uroot -psenha << SQL
SELECT ADDTIME('$manha','$tarde');
QUIT
SQL`

# Filtra a resposta anterior ficando apenas um valor do tipo HH:MM:SS
# Tempo total do dia (manhã + tarde)
tempo=`echo $tempoSQL | awk '{printf "%s\n",$2}'`

# Horas trabalhadas menos 9h para calcular o saldo de horas
tempo_add=`mysql -uroot -psenha << SQL
SELECT SUBTIME('$tempo','09:00:00');
QUIT
SQL`

read -p "Dia útil? [Y/n] " dia_util
if [ "$dia_util" = Y -o "$resp" = y -o "$resp" = S -o "$resp" = s -o ! -n "$dia_util" ]
  then # saldo de horas trabalhadas para dia útil
   saldo_horas=`echo $tempo_add | awk '{printf "%s\n",$2}'`
  else # saldo de horas trabalhadas para sábados, domingo e feriados
   saldo_horas="$tempo"
fi

read -p "Comentário? " comment

echo "$in1" "$out1" "$in2" "$out2" "$tempo" "$saldo_horas" "$data" "$comment"

cmd=`/usr/bin/mysql -uroot -psenha << SQL
   use imf
   insert into ponto (in1, out1, in2, out2, tempo, saldo, data, comment) values
    ("$in1", "$out1", "$in2", "$out2", "$tempo", "$saldo_horas", "$data", "$comment");
  quit
  SQL`

  Através do comando

select * from ponto where id > numero;

sendo numero o id que corresponde a uma data que procuro, o MySQL devolve a listagem de um determinado intervalo que através da ferramenta txt2tags crio as células que são facilmente portáveis para o Excel com um simples CTRL + C e CTRL + V.

sábado, 3 de setembro de 2011

Horas trabalhadas armazenadas no MySQL

  Esta publicação tem o propósito de armazenar as suas horas trabalhadas. Nada do (argh!) excel. Este script armazena as informações e executa os cálculos.
  É preciso um certo conhecimento do banco de dados MySQL. Qualquer dúvida, consulte Introdução ao banco de dados MySQL.
  Primeiro passo é criar a database:

create database industria;

  Em seguida, cria-se a tabela com as colunas:

create table horarios (id int AUTO_INCREMENT, in1 time, out1 time, in2 time, out2 time, tempo tempo, saldo tempo, dia int(20), mes int(2), ano int(2), comment TEXT, PRIMARY KEY (id));

  Explicando cada coluna:

Coluna Tipo Explicação
id PRIMARY KEY número distinto
in1 time entrada de manhã
out1 time saída de manhã
in2 time entrada à tarde
out2 time saída à tarde
tempo time horas trabalhadas no dia somando manhã e tarde
saldo time saldo de horas
dia int(20) dia trabalhado
mes int(2) mês trabalhado
ano int(2) ano trabalhado
comment TEXT espaço para anotações do tipo "consulta médica" etc

  O banco de dados está pronto.
  Justificando por separar dia, mês e ano. Uma situação comum é fazer o levamento das horas trabalhadas de um determinado mês. Um select do tipo:

select * from horarios where mes=9 and ano=2011;

devolve todas as informações sobre o mês de setembro de 2011.
  A seguir disponibilizo o script que lê as informações introduzidas pelo usuário, executa somas e subtrações de horários e armazena no banco de dados.

#!/bin/bash

# Entrada dos horários
read -p "Entrada manhã: " in1
read -p "Saída almoço: " out1
read -p "Entrada tarde: " in2
read -p "Saída tarde: " out2

read -p "Data de hoje? [Y/n] " resp
# Entende que Y, y, S, s ou Enter signifiquem uma resposta a data de hoje
if [ "$resp" = Y -o "$resp" = y -o "$resp" = S -o "$resp" = s -o ! -n "$resp" ]
  then
   dia=`date +%d`
   mes=`date +%m`
   ano=`date +%Y`
else
  read -p "dia " dia
  read -p "mes " mes
  read -p "ano " ano
fi

read -p "Comentário? " comment

# Subtrai o horário da manhã
manhaSQL=`mysql -uroot -psenha << SQL
SELECT SUBTIME('$out1','$in1');
QUIT
SQL`

# Filtra a resposta anterior ficando apenas um valor do tipo HH:MM:SS
manha=`echo $manhaSQL | awk '{printf "%s\n",$2}'`

# Subtrai o horário da tarde
tardeSQL=`mysql -uroot -psenha << SQL
SELECT SUBTIME('$out2','$in2');
QUIT
SQL`

# Filtra a resposta anterior ficando apenas um valor do tipo HH:MM:SS
tarde=`echo $tardeSQL | awk '{printf "%s\n",$2}'`


# Soma o horário da manhã e da tarde
tempoSQL=`mysql -uroot -psenha << SQL
SELECT ADDTIME('$manha','$tarde');
QUIT
SQL`

# Filtra a resposta anterior ficando apenas um valor do tipo HH:MM:SS
# Tempo total do dia (manhã + tarde)
tempo=`echo $tempoSQL | awk '{printf "%s\n",$2}'`

# Horas trabalhadas menos 9h para calcular o saldo de horas
tempo_add=`mysql -uroot -psenha << SQL
SELECT SUBTIME('$tempo','09:00:00');
QUIT
SQL`

# saldo de horas trabalhadas
saldo_horas=`echo $tempo_add | awk '{printf "%s\n",$2}'`

# insere no banco de dados os valores armazenados nas variaveis
cmd=`/usr/bin/mysql -uroot -psenha << SQL
  use industria
  insert into horarios (in1, out1, in2, out2, tempo, saldo, dia, mes, ano, comment) values
    ("$in1", "$out1", "$in2", "$out2", "$tempo", "$saldo_horas", "$dia", "$mes", "$ano", "$comment");
  quit
  SQL`

sábado, 27 de agosto de 2011

Introdução ao banco de dados MySQL

  Vamos ao primeiro contato com o banco de dados MySQL. Depois desta introdução sobre as funcionalidades básicas do banco de dados, vamos unir com Shell Script nas futuras publicações.
  Para saber se o banco de dados já está instalado, digite:

dpkg -l mysql*

  Eu estou usando a versão 5.1.49-1ubuntu8.1
  Caso não esteja instalado, digite:

apt-get install mysql-server

  Para se autenticar, utilize o comando:

mysql -u user -p password

  Substitua o nome do user e a senha password pela combinação que autentica no sistema.
  Antes de sair digitando comando, entenda conceitos essenciais:

  • database: conjunto de tabelas.
  • table: depois de determinada a database a ser usada, é a vez de criar a tabela contendo os nomes das variáveis dispostas em colunas. Cada variável tem um tipo: varchar, int, time etc. Mais detalhes veja Data Types.
  Para os comandos a seguir, mostro anotações que fiz sobre meu estudo sobre C++. A medida que via informações da mais alta importância, fui armazenando num banco de dados.

  Para listar as databases:

show databases;

  Para criar uma database:

create database deitel;

  Para utilizar a database:

use deitel;

  Para listar as tabelas existentes na database, digite:

show tables;

  Para criar a tabela com 3 variáves sendo página, seção e texto:

create table livro ( pagina INT, secao INT, texto TEXT);

  Se quiser que a cada linha o contador incremente o número do registro, observe o tipo AUTO_INCREMENT e PRIMARY KEY que são usadas para a variável id.

create table livro ( id int AUTO_INCREMENT, pagina varchar(5), secao varchar(8), texto TEXT, PRIMARY KEY (id));

  Para o caso que um valor não poder aceito como vazio, digite o nome da variável, o tipo e a palavra NOT NULL.
  Exemplo:

create table livro ( id int AUTO_INCREMENT, pagina varchar(5) NOT NULL, secao varchar(8), texto TEXT, PRIMARY KEY (id));

  O comando a seguir descreve o nome, o tipo, se é permitido ou não preencher um valor e informações adicionais.

describe livro;

  Para inserir valores na tabela, observe:

insert into livro (pagina, secao, texto) values ('78', '3.9', 'A série Dive-Into mostra como compilar múltiplos arquivos.');

  Para alterar um dado, a sintaxe é:
update nome_da_tabela set Nome_da_variável='NOVO VALOR' where id='numero_unico';
  Exemplificando:

update livro set secao='4.6' where id=4;

  Caso queria descartar uma tabela, o comando é:

drop table nome_da_tabela;

  Exemplificando:

drop table livro;

  Com estes comandos já é possível criar databases e tabelas que atendam necessidades elementares. Na próxima publicação utilizaremos o Shell Script para manipular o MySQL.