Ir para conteúdo
  • Cadastre-se

dev botao

Fazer calculo restante de horas com MOD no delphi


  • Este tópico foi criado há 1519 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Pessoal
Não e possivel usar o recurso mod do delphi para pegar resto do tempo

NO execel fiz assim

 


No delphi tentei fazer DiferencaTime:= TimeA mod TimeB;
Mas o mod só recebe inteiro? Eu defini todas 3 variaveis como Time (DiferencaTime, TimeA e TimeB)

unnamed.png

Editado por johnbh3
Link para o comentário
Compartilhar em outros sites

13 minutos atrás, johnbh3 disse:

Pessoal
Não e possivel usar o recurso mod do delphi para pegar resto do tempo

NO execel fiz assim

 


No delphi tentei fazer DiferencaTime:= TimeA mod TimeB;
Mas o mod só recebe inteiro? Eu defini todas 3 variaveis como Time (DiferencaTime, TimeA e TimeB)

 

 

unnamed.png

Link para o comentário
Compartilhar em outros sites

  • Moderadores
18 horas atrás, johnbh3 disse:

No delphi tentei fazer DiferencaTime:= TimeA mod TimeB;

DiferencaTime := TimeA - TimeB;

18 horas atrás, johnbh3 disse:

Não e possivel usar o recurso mod do delphi para pegar resto do tempo

Tanto no Delphi como no Excel MOD é o resto de uma divisião, e não diferença.

Equipe ACBr BigWings
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

 

 

Link para o comentário
Compartilhar em outros sites

6 minutos atrás, BigWings disse:

DiferencaTime := TimeA - TimeB;

Infelizmente não seria este o caso também. Eu queria pegar o resto. Se eu fizer um menos o outro daria 25:52:24
Outro problema que o timeA pode ter acumulo de horas como "47:59:59" dando erro is not valid time. 

Eu queria obter um resultado semelhante ao do excel. Eu peguei 47 hrs usei o MOD com tempo pre-derminado (TimB) que vai ser sempre  menor que 24 hrs. Dai o tempo restante pegaria como uma sobra.

 

Seria tipo um estacionamento. Carro chega, fica lá, 1, 2, dias dando 48 horas. O Estacionamento cobra algo tipo R$ 30,00 reais a diaria, porem ele ficou 2 dias e 2 horas. Iria cobrar 30 reais das 2 diárias + 2 horas avulsa, a titulo de exemplo seria isto. 
 

Editado por johnbh3
Link para o comentário
Compartilhar em outros sites

  • Moderadores
1 minuto atrás, johnbh3 disse:

Infelizmente não seria este o caso também. Eu queria pegar o resto. Se eu fizer um menos o outro daria 25:52:24
Outro problema que o timeA pode ter acumulo de horas como "47:59:59" dando erro is not valid time. 
 

Com TDateTime você pode acumular as horas que se tornam dias.

Você quer a diferença entre duas horas ou o resto da divisão de uma pela outra?

Explique melhor.

Equipe ACBr BigWings
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

 

 

Link para o comentário
Compartilhar em outros sites

Então queria o resto da divisão (TimeA) acumula horas até tudo bem, usei TDateTime  para me retornar o acumulo de horas com uma função.

Veja exemplo da imagem, acumulou 49:42:53 e fiz um mod por 24:59:59 na coluna a, mas o usuario pode definir que pra ele 1 diaria seria quando atingir 20 hrs. Observe  que o resto e diferente

Quando e considerado 24 hrs o resto que sobra e 1:52:25 agora se eu considerar como 20 Hrs cobrar 1 diaria o resto seria 9:52:23
Neste caso achei o tempo excedente, quando considerado 24 hrs excedeu 1 hora e 52 min, se considerar 20 hrs uma diaria  excedeu  9 horas e 52 min

Consegui me entender?

 

unnamed.png

Link para o comentário
Compartilhar em outros sites

  • Moderadores
6 minutos atrás, johnbh3 disse:

Consegui me entender?

Pelo que entendi é o resto de divisão mesmo, e como você já percebeu o MOD só aceita inteiros.

Acho que você pode fazer algo assim:

Resto := (TimeA / TimeB) - Trunc(TimeA / TimeB);

Equipe ACBr BigWings
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

 

 

Link para o comentário
Compartilhar em outros sites

De toda forma vou ter o erro de TimeA com hora invalida "49:52:53"

procedure TForm1.BitBtn1Click(Sender: TObject);
Var
  Resto,TimeA,TimeB:TTime;
begin
  TimeA:=StrToTime(Edt_TimeA.Text);
  TimeB:=StrToTime(Edt_TimeB.Text);
  Resto := (TimeA / TimeB) - Trunc(TimeA / TimeB);
  Edit1.Text:=TimeToStr(Resto) ;

end;

Link para o comentário
Compartilhar em outros sites

Eu fiz uma conversão da hora para segundos aparentemente vai resolver. 
TimeA:=(SecondsBetween(data1,data2))
TimeB:=ScondsBetween(HoraDiaria),StrToTime('00:00:00'))

Resto:=TimeA mod TimeB;

 

Depois usei esta função

function SecondToTime( Segundos : Cardinal ) : String;
var
  Seg, Min, Hora: Cardinal;
begin
  Hora := Segundos div 3600;
  Seg := Segundos mod 3600;
  Min := Seg div 60;
  Seg := Seg mod 60;
  Result := FormatFloat(',00', Hora) + ':' +
  FormatFloat('00', Min) + ':' +
  FormatFloat('00', Seg);
end;

 

Converti o segundos por hora

Link para o comentário
Compartilhar em outros sites

  • Moderadores
1 hora atrás, johnbh3 disse:

De toda forma vou ter o erro de TimeA com hora invalida "49:52:53"

Por isso comentei que você deveria usar TDateTime e não TTime.

52 minutos atrás, johnbh3 disse:

Eu fiz uma conversão da hora para segundos aparentemente vai resolver. 

Certo, que bom que resolveu.

Equipe ACBr BigWings
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

 

 

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois ...
  • Administradores

Obrigado por reportar.

Fechando. Para novas dúvidas, criar um novo tópico.

Consultora SAC ACBr

Juliana Tamizou

Gerente de Projetos ACBr / Diretora de Marketing AFRAC
Ajude o Projeto ACBr crescer - Seja Pro

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 1519 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...