| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
k713 Novato

Registrado: Quarta-Feira, 12 de Mai de 2010 Mensagens: 84
|
Enviada: Qua Nov 11, 2015 6:37 am Assunto: Adição / Subtração de horas [QUASE RESOLVIDO] |
|
|
Bom dia a todos. Seguinte, estou tentando fazer um cadastro de banco de horas num sistema existente, com BD Access , mas enfrento dificuldades...como no banco de horas os funcionários poderão ter saldo positivo ou negativo de muitas horas (alguns com mais de 200h ou -100h) optei por sair das "horas convencionais" e fazer a coisa numeralmente. Assim, no form de adição de horas, tenho um dbedit HORAP e outro dbedit MINUTOP. No form de subtração de horas, tenho um dbedit HORAN e outro dbedit MINUTON. A dificuldade na adição está quando o MINUTOP for >=60 que acrescenta 1 no HORAP. Quando o saldo é positivo tudo certo, mas quando o saldo do funcionário é negativo dá erro. Alguém tem uma ideia melhor pra realizar essas adições e subtrações? Grato.
Editado pela última vez por k713 em Ter Nov 17, 2015 11:31 am, num total de 2 vezes |
|
| Voltar ao Topo |
|
 |
joemil Moderador

Registrado: Quinta-Feira, 25 de Março de 2004 Mensagens: 9100 Localização: Sinop-MT
|
Enviada: Qua Nov 11, 2015 7:14 am Assunto: |
|
|
os funcionarios nao terao mais q 24hrs/dia de saldo, entao vc pode criar sua tabela de saldo diario. depois vc converte essas horas em minutos, pra facilitar o calculo. veja algumas funcoes q uso:
| Código: | // retorna horas no formato: hhh:mm:ss
function CalculaTempo(Hora1, Hora2: TDateTime): string;
var valor, horas, minutos, segundos: Integer;
begin
valor := (SecondsBetween(Hora1, Hora2));
horas := valor div 3600;
minutos := valor div 60 - horas * 60;
segundos := (valor - (horas * 3600 + minutos * 60)) + 1;
Result := Format('%0.3d:%0.2d:%0.2d', [horas, minutos, segundos]);
end;
// converte campo horas em minutos
function TdmDados.HorasParaMinutos(Hora: TTime): Integer;
var iHora, iMinutos, iSegundos, mSec: Word;
begin
DecodeTime(Hora, iHora, iMinutos, iSegundos, mSec);
Result := (iHora * 60) + iMinutos;
end;
// converte minutos para horas
function TdmDados.MinutosParaHoras(Minutos: Integer): string;
var iHora, iMinutos: Integer;
begin
iHora := 0;
iMinutos := Minutos;
while iMinutos >= 60 do
begin
Dec(iMinutos, 60);
Inc(iHora);
end;
Result := IntToStr(iHora) + ':' + Format('%.2d', [iMinutos])
end; |
_________________ <b>SEMPRE COLOQUE [RESOLVIDO] NO SEU POST</b>
Enviar imagens: http://tinypic.com/ |
|
| Voltar ao Topo |
|
 |
k713 Novato

Registrado: Quarta-Feira, 12 de Mai de 2010 Mensagens: 84
|
Enviada: Qua Nov 11, 2015 7:59 am Assunto: |
|
|
| Grato pela resposta Joemil. No BD existe a tabela de cadastro dos funcionários (CADASTRO) e mais uma tabela de registro de horas (HORAS). A tabela CADASTRO possui os campos saldohora e saldominuto, alimentados conforme informei no primeiro post. Na tabela HORAS, os registros vão sendo adicionados conforme a adição/subtração de horas executada pelo rh. Então o rh lança a hora (positiva ou negativa) e essa hora lançada debita do saldo existente da tabela CADASTRO. Como aplicar sua sugestão? |
|
| Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qua Nov 11, 2015 9:34 am Assunto: |
|
|
Bom dia,
Que erro está ocorrendo? Qual mensagem é exibida?
Acho que uma alternativa mais simples seria ter apenas o campo saldo em minutos na tabela Cadastro, sendo que nesse caso você teria que converter a quantidade de horas para minutos antes de adicionar ou subtrair.
Espero que ajude.
_________________
Assinatura: http://www.imoveisemexposicao.com.br/imoveis-alugar-guarulhos-residencial-casa |
|
| Voltar ao Topo |
|
 |
k713 Novato

Registrado: Quarta-Feira, 12 de Mai de 2010 Mensagens: 84
|
Enviada: Qua Nov 11, 2015 9:47 am Assunto: |
|
|
Bom dia Imex,
então, ocorre o erro da seguinte maneira:
João tem um saldo negativo de -71 horas e 30 minutos. Se o RH lançar 2 horas positivas, ele teria q mostrar -69 horas e 30 minutos negativos. Já qdo o saldo é positivo dá certo. |
|
| Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qua Nov 11, 2015 10:04 am Assunto: |
|
|
Você pode postar a mensagem de erro que é exibida e o trecho do código onde ocorre o erro?
Acho que se o valor do campo é -71 e você soma 2 deveria ficar -69 sem nenhum problema. |
|
| Voltar ao Topo |
|
 |
k713 Novato

Registrado: Quarta-Feira, 12 de Mai de 2010 Mensagens: 84
|
Enviada: Qua Nov 11, 2015 10:31 am Assunto: |
|
|
Está assim:
procedure TFrmHoras.SpeedButton1Click(Sender: TObject);
var horap, minutop: integer;
begin
with tabelas do
begin
dsvisao2.dataset.edit;
dsvisao.dataset.edit;
horap := StrToInt(DBEdit1.Text);
minutop := StrToInt(DBEdit2.Text);
Tabelas.TbCadastrohoras.Value := Tabelas.TbCadastrohoras.Value + horap;
Tabelas.TbCadastrominutos.Value := Tabelas.TbCadastrominutos.Value + minutop;
if Tabelas.TbCadastrominutos.Value >= 60 then begin
Tabelas.TbCadastrohoras.Value := Tabelas.TbCadastrohoras.Value + 1;
Tabelas.TbCadastrominutos.Value := Tabelas.TbCadastrominutos.Value - 60;
end;
dsvisao.dataset.Post;
dsvisao2.dataset.Post;
end;
end; |
|
| Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qua Nov 11, 2015 10:50 am Assunto: |
|
|
| Que erro ocorre? É exibida alguma mensagem? Qual? |
|
| Voltar ao Topo |
|
 |
k713 Novato

Registrado: Quarta-Feira, 12 de Mai de 2010 Mensagens: 84
|
Enviada: Qua Nov 11, 2015 11:34 am Assunto: |
|
|
Não aparece nada...somente qdo o saldo do funça é negativo...exemplo:
Tem um funça com saldo de -71horas e 00 minutos...qdo adiciono 2h30min positivas, o resultado sai -69h30min...sendo q deveria ser -68h30min...devo estar fazendo errado, mas ñ consigo enxergar... |
|
| Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qua Nov 11, 2015 1:04 pm Assunto: |
|
|
Acredito que o problema está no trecho onde você verifica se o campo Minutos é maior ou igual a 60. Mas confirma algumas coisas...
Os campos onde você grava o saldo são de que tipo?
Como os valores são gravados quando o saldo é negativo? Supondo que o saldo seja -10h20min, são gravados -10 e -20? Ou -10 e 20? Ou outro? |
|
| Voltar ao Topo |
|
 |
k713 Novato

Registrado: Quarta-Feira, 12 de Mai de 2010 Mensagens: 84
|
Enviada: Qua Nov 11, 2015 1:19 pm Assunto: |
|
|
Os campos de saldo na tabela Cadastro são tipo número, um campo HORAS e outro campo MINUTOS...
Percebi que em alguns registros ficam gravados, por exemplo, -10 e -20. Em outros, -10 e 20.... |
|
| Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qua Nov 11, 2015 1:40 pm Assunto: |
|
|
Você pode e está disposto a alterar essa tabela para utilizar apenas um campo para o saldo (no caso em minutos)?
Ou não é possível alterar essa tabela? |
|
| Voltar ao Topo |
|
 |
k713 Novato

Registrado: Quarta-Feira, 12 de Mai de 2010 Mensagens: 84
|
Enviada: Qua Nov 11, 2015 1:41 pm Assunto: |
|
|
| opa...muito disposto... |
|
| Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qua Nov 11, 2015 2:25 pm Assunto: |
|
|
Existem outras alternativas, mas a sugestão seria utilizar apenas um campo para o saldo onde seria gravado o total em minutos.
Então, supondo que o saldo seja de 1h45min, seria gravado no campo 105 (1 x 60 + 45 = 105).
Se depois é lançado -1h30min, seria descontado 90 (1 x 60 + 30) de 105, ficando o saldo de 15 (minutos).
Exemplo de código para acumular os lançamentos:
| Código: | Tabelas.TbCadastroSaldo.Value := Tabelas.TbCadastroSaldo.Value +
horap * 60 + minutop -
horan * 60 - minuton; |
Exemplo de código para exibir o saldo em horas e minutos:
| Código: | ShowMessage( IfThen(Tabelas.TbCadastroSaldo.Value < 0, '-', '') +
IntToStr(abs(Tabelas.TbCadastroSaldo.Value) div 60) +
':' +
Format('%2.2d', [abs(Tabelas.TbCadastroSaldo.Value) mod 60]) ); |
obs: é necessário adicionar a unit StrUtils a uses para utilizar a função IfThen
Espero que ajude. |
|
| Voltar ao Topo |
|
 |
k713 Novato

Registrado: Quarta-Feira, 12 de Mai de 2010 Mensagens: 84
|
Enviada: Qua Nov 11, 2015 2:49 pm Assunto: |
|
|
| Imex...qdo insiro um novo registro de horas, o valor q aparece no TbCadastroSaldo é de -4771290. Esse campo deve ser d q tipo? |
|
| Voltar ao Topo |
|
 |
|