ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Adição / Subtração de horas [QUASE RESOLVIDO]
Ir à página 1, 2, 3  Próximo
 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
k713
Novato
Novato


Registrado: Quarta-Feira, 12 de Mai de 2010
Mensagens: 84

MensagemEnviada: Qua Nov 11, 2015 6:37 am    Assunto: Adição / Subtração de horas [QUASE RESOLVIDO] Responder com Citação

Bom dia a todos. Seguinte, estou tentando fazer um cadastro de banco de horas num sistema existente, com BD Access Confused, 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
Ver o perfil de Usuários Enviar Mensagem Particular
joemil
Moderador
Moderador


Registrado: Quinta-Feira, 25 de Março de 2004
Mensagens: 8982
Localização: Sinop-MT

MensagemEnviada: Qua Nov 11, 2015 7:14 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
k713
Novato
Novato


Registrado: Quarta-Feira, 12 de Mai de 2010
Mensagens: 84

MensagemEnviada: Qua Nov 11, 2015 7:59 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11453

MensagemEnviada: Qua Nov 11, 2015 9:34 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
k713
Novato
Novato


Registrado: Quarta-Feira, 12 de Mai de 2010
Mensagens: 84

MensagemEnviada: Qua Nov 11, 2015 9:47 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11453

MensagemEnviada: Qua Nov 11, 2015 10:04 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
k713
Novato
Novato


Registrado: Quarta-Feira, 12 de Mai de 2010
Mensagens: 84

MensagemEnviada: Qua Nov 11, 2015 10:31 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11453

MensagemEnviada: Qua Nov 11, 2015 10:50 am    Assunto: Responder com Citação

Que erro ocorre? É exibida alguma mensagem? Qual?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
k713
Novato
Novato


Registrado: Quarta-Feira, 12 de Mai de 2010
Mensagens: 84

MensagemEnviada: Qua Nov 11, 2015 11:34 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11453

MensagemEnviada: Qua Nov 11, 2015 1:04 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
k713
Novato
Novato


Registrado: Quarta-Feira, 12 de Mai de 2010
Mensagens: 84

MensagemEnviada: Qua Nov 11, 2015 1:19 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11453

MensagemEnviada: Qua Nov 11, 2015 1:40 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
k713
Novato
Novato


Registrado: Quarta-Feira, 12 de Mai de 2010
Mensagens: 84

MensagemEnviada: Qua Nov 11, 2015 1:41 pm    Assunto: Responder com Citação

opa...muito disposto...
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11453

MensagemEnviada: Qua Nov 11, 2015 2:25 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
k713
Novato
Novato


Registrado: Quarta-Feira, 12 de Mai de 2010
Mensagens: 84

MensagemEnviada: Qua Nov 11, 2015 2:49 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Ir à página 1, 2, 3  Próximo
Página 1 de 3

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB