Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Horas


Eder

Pergunta

Ola..pessoal

Tenho que montar um relatorio no quick.....e nele tenho que diminuir a Dta e hora final - Data e hora inicial da ultima viagem.

assim deve ser:

Dta Saida----Hra Saida---Dta Chegada----Hra Chegada---Repouso Motorista(em horas)
----------------------------------------------------------------------------------
15.10.2007      20:00    16.10.2007      16:00      
16.10.2007      18:00    17.10.2007      15:00           02:00
17.10.2007      19:00    18.10.2007      16:00           04:00
18.10.2007      17:00    19.10.2007      15:00           01:00

eu teria que mostra no relatorio o total de REPOUSO DO MOTORISTA

o repouso compreende a data e hora inicio da viagem - data e hora final da ultima viagem.

não sei se fui claro....se alguém não entender por favor ......

eu já montei o relatorio só falta mostrar aquela continha do REPOUSO DO MOTORISTA...não sei montar....

paradox campo da tabela tipo (t)timer + delphi 4.

muito Grato :(

Editado por Micheus
Para desenhar tabelas, a dica é utilizar a tag CODE e previsualizar o post antes de enviar. ;-)
Link para o comentário
Compartilhar em outros sites

10 respostass a esta questão

Posts Recomendados

  • 0

Eder, a sugestão é que você calcule na mão.

- Crie uma variável do tipo datetime (vamos chamar DtAnterior) na seção private do seu form (o do relatório).

- No BeforePrint da banda que você iniciar o motorista (talvez você liste vários motoristas, então pode ter um groupband) voce inicializa esta variável com o valor do campo (será o primeiro valor, no seu exemplo 16/10/2007 16:00).

procedure Form1.group1BeforePrint(....);
begin
 // como você tem os campos data e hora separados, iremos concatená-los para facilitar as coisas
  DtAnterior := <dataset>DatSaida.value +<dataset>HraSaida.value;
end;
- Coloca um QRLabel na banda em que a hora será impressa e, depois, no before print você faz a continha e atribui o valor:
procedure Form1.band1BeforePrint(....);
var
  QtdHora :TDateTime;
begin
  QtdHora := (<dataset>DatSaida.value +<dataset>HraSaida.value) - DtAnterior;
  if QtdHora = 0 then
    QRLabel1.Caption := ''  // na primeira linha não há diferença
  else
    QRLabel1.Caption := TimeToStr(QtdHora);
 // guarda campo atual para próxima interação
  DtAnterior := (<dataset>DatChegada.value +<dataset>HraChegada.value);
end;

Algo assim. Resta uma pergunta: Há a possibilidade de este intervalo de tempo ser maior que 23:59h?

Link para o comentário
Compartilhar em outros sites

  • 0

ola..Micheus.....quanto tempo heimmm!!

Carinha primeiro vou responder este pergunta:

Algo assim. Resta uma pergunta: Há a possibilidade de este intervalo de tempo ser maior que 23:59h?

R.: bom infelizmente pode ocorrer sim......por exemplo se a viagem foi dia 10 e depois somente dia 15 ele viajou denovo neste caso da um monte de horas...

neste mesmo relatorio eu uso estas duas funções pra converter horas pra segundo e depois voltar de segundo pra horas....

//Função converter Hora para Segundos

function Hora_Seg( Horas:string ):LongInt;
Var Hor,Min,Seg:LongInt;
begin
Horas[Pos(':',Horas)]:= '[';
Horas[Pos(':',Horas)]:= ']';
Hor := StrToInt(Copy(Horas,1,Pos('[',Horas)-1));
Min := StrToInt(Copy(Horas,Pos('[',Horas)+1,(Pos(']',Horas)-Pos('[',Horas)-1)));
if Pos(':',Horas) > 0 then
    Seg := StrToInt(Copy(Horas,Pos(']',Horas)+1,(Pos(':',Horas)-Pos(']',Horas)-1)))
else
    Seg := StrToInt(Copy(Horas,Pos(']',Horas)+1,2));
Result := Seg + (Hor*3600) + (Min*60);
end;
//Função converter Segundos para Horas
function Seg_Hora( Seg:LongInt ):string;
Var Hora,Min:LongInt;
  Tmp : Double;
begin
Tmp := Seg / 3600;
Hora := Round(Int(Tmp));
Seg :=  Round(Seg - (Hora*3600));
Tmp := Seg / 60;
Min := Round(Int(Tmp));
Seg :=  Round(Seg - (Min*60));
Result := FormatFloat( '00', Hora )+ ':' + FormatFloat( '00', Min ) + ':' + FormatFloat( '00', Seg );
end;

Será que não teria uma maneira de trabalhar com estas duas funções pra solucionar o problema??

Nota: não testei a sua idéia ainda.......tou esperando a sua dica... ;)

valeu...muito Grato :)

Link para o comentário
Compartilhar em outros sites

  • 0
Resta uma pergunta: Há a possibilidade de este intervalo de tempo ser maior que 23:59h?

R.: bom infelizmente pode ocorrer sim......por exemplo se a viagem foi dia 10 e depois somente dia 15 ele viajou denovo neste caso da um monte de horas...

Então, provavelmente será interessante olha lá em Tutoriais & Dicas um tópico que fiz para a formatação de horas com mais de 23:59:59hs.

neste mesmo relatorio eu uso estas duas funções pra converter horas pra segundo e depois voltar de segundo pra horas....

Será que não teria uma maneira de trabalhar com estas duas funções pra solucionar o problema??

primeiro devo perguntar: porque você faz este tipo de conversão?

e segundo, você realmente está armazenando Data separado da Hora, como eu imaginei no post anterior?

Link para o comentário
Compartilhar em outros sites

  • 0
primeiro devo perguntar: porque você faz este tipo de conversão?

e segundo, você realmente está armazenando Data separado da Hora, como eu imaginei no post anterior?

R.: bom....como o campo é timer e ultrapassa as 23:59 horas então é convertido os dias+horas em segundos....visto quando da os segundos...ai volta de segundos pra horas..pelo menos um colega meu me disse que seria uma solução mais correta pra resolver o problema.

vou tentar fazer a sua dica que você exemplicou acima...pra ver...no que da.

se tiveres mais alguma dica mais simples...por favor me mostra....infelizmente foi o presente que ganhei hoje no meu primeiro dia após as feiras hehehe... tenho que montar este relatorio até sexta...é mole? ;)

Grato

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

  • 0
se tiveres mais alguma dica mais simples...por favor me mostra....infelizmente foi o presente que ganhei hoje no meu primeiro dia após as feiras hehehe... tenho que montar este relatorio até sexta...é mole? ;)
veja bem, desde que você tem dois campos: um Date e um Time, não vejo nada de complicado você somar os dois.

Nos posts abaixo, já comentei um pouco sobre esta questão de data e hora em campos TDateTime:

http://scriptbrasil.com.br/forum/index.php...st&p=450082

http://scriptbrasil.com.br/forum/index.php...st&p=373041

e neste post está a explicação de como formatar um texto para mostrar um campo TDateTime que contém dias (ou seja, mais que 23:59:59.999hs).

Link para o comentário
Compartilhar em outros sites

  • 0

Ola...Micheus....fiz o exemplo como me mostrou...funcionou legal...exceto pela questão de ultrapassar a 23:59, tipo como exemplo abaixo:

Dta Saida----Hra Saida---Dta Chegada----Hra Chegada---Repouso Motorista(em horas)

---------------------------------------------------------------------------------------

02.08.2007 23:40 03.08.2007 08:20

05.08.2007 09:00 05.08.2007 19:35 00:40

06.08.2007 22:00 07.07.2007 09:40 02:47

ai tentei ler o tópico que você me mostrou:

e neste post está a explicação de como formatar um texto para mostrar um campo TDateTime que contém dias (ou seja, mais que 23:59:59.999hs).

só que este tópico não ta abrindo pra mim. :(

Grato

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

  • 0
ai tentei ler o tópico que você me mostrou:

só que este tópico não ta abrindo pra mim. :(

eu testei e abriu, mas segue a função aqui (fica faltando a explicação que está lá):

function FullTimeToStr(SUMTime: TDateTime): string;
var
  StrHor,
  StrMin :string;
  TotHor :double;
begin
  TotHor := SUMTime *24;
  if (TotHor -Trunc(TotHor)) > 0.9999 then
    TotHor := Round(TotHor);
  StrHor := FormatFloat('##0:', Int(TotHor));
  StrMin := FormatDateTime('nn:ss', Frac(TotHor)/24);
  Result := StrHor +StrMin;
end;
então, ao invés de utilizar TimeToStr naquela parte do exemplo que postei:
if QtdHora = 0 then
    QRLabel1.Caption := ''  // na primeira linha não há diferença
  else
    QRLabel1.Caption := TimeToStr(QtdHora);
voce altera para:
if QtdHora = 0 then
    QRLabel1.Caption := ''  // na primeira linha não há diferença
  else
    QRLabel1.Caption := FullTimeToStr(QtdHora);

Confira aí.

Link para o comentário
Compartilhar em outros sites

  • 0
ai tentei ler o tópico que você me mostrou:

só que este tópico não ta abrindo pra mim.

eu testei e abriu, mas segue a função aqui (fica faltando a explicação que está lá):

R.: opa agora abriu também.....e li a sua explicação..

quanto ao resultado deu certo. :D

só achei um coisinha esquisitinha no relatorio(parece falha).....no caso o primeiro registro do motorista..

Pois como não tenho a data_saida e hora_saida não tem como fazer a conta...mas beleza....se precisar saber é só tirar o relatorio uns dias antes.

Dta Saida----Hra Saida---Dta Chegada----Hra Chegada---Repouso Motorista(em horas)

---------------------------------------------------------------------------------------

02.08.2007 23:40 03.08.2007 08:20 XX:XX

05.08.2007 09:00 05.08.2007 19:35 00:40

06.08.2007 22:00 07.07.2007 09:40 02:47

Mas Beleza....Micheus....muito grato pela ajuda mais uma vez..

Forte Abraço ;)

Link para o comentário
Compartilhar em outros sites

  • 0
só achei um coisinha esquisitinha no relatorio(parece falha).....no caso o primeiro registro do motorista..

Pois como não tenho a data_saida e hora_saida não tem como fazer a conta...mas beleza....se precisar saber é só tirar o relatorio uns dias antes.

certo, mas o lance de testar "QtdHora = 0" e deixar o QRLabel.Caption = '' - não funcionou?

Link para o comentário
Compartilhar em outros sites

  • 0

certo, mas o lance de testar "QtdHora = 0" e deixar o QRLabel.Caption = '' - não funcionou?
funcionou......

porem como ele não tem o valor fora da data que pedi o relatorio...ai não faz conta.

?????????????????

02.08.2007 23:40 03.08.2007 08:20 ?????

05.08.2007 09:00 05.08.2007 19:35 00:40

06.08.2007 22:00 07.07.2007 09:40 02:47

COMO mostra acima....ele não tem o valor e por isto não tem valor como mostra a sua explicação:

If QtdHora = 0 then
    QRRepouso.Caption := ''  // na primeira linha não há diferença
  else

mas beleza...sem problemas...alias não é problema....

valeu...muito grato

t+

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

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...