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 

Relatório Diário
Ir à página 1, 2  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: Qui Out 06, 2016 11:48 am    Assunto: Relatório Diário Responder com Citação

Bom dia pessoal...seguinte:

Preciso montar um relatório diário que mostre automaticamente a equipe que estará de plantão por 24 horas no dia, sendo equipes A, B e C. Mais um adendo, os plantões iniciam às 07h00 da manhã do dia e só encerram no próximo dia também às 07h00 da manhã...exemplo:

Hoje é 06/10/16, às 07h00 da manhã a Equipe A inicia o plantão, que se encerra no dia 07/10/16 às 07h00 da manhã. Dá-se início então ao plantão da Equipe B, que vai das 07h00 da manhã do dia 07/10/16 às 07h00 da manhã do dia 08/10/16, onde se inicia o plantão da Equipe C, que vai das 07h00 da manhã do dia 08/10/16 às 07h00 da manhã do dia 09/10/16, onde reinicia tudo e volta para a Equipe A.

Alguma ideia?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
leo_cj
Colaborador
Colaborador


Registrado: Sábado, 26 de Março de 2011
Mensagens: 1335

MensagemEnviada: Qui Out 06, 2016 11:59 am    Assunto: Responder com Citação

Você já tem a estrutura do banco?

ou é ela mesma que você está com dúvidas na montagem?
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: Qui Out 06, 2016 12:02 pm    Assunto: Responder com Citação

leo_cj....o sistema é antigo, em Delphi 7 + Access Confused , e não estou conseguindo montar nada...alguma luz?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
leo_cj
Colaborador
Colaborador


Registrado: Sábado, 26 de Março de 2011
Mensagens: 1335

MensagemEnviada: Qui Out 06, 2016 1:37 pm    Assunto: Responder com Citação

Como está feita a estrutura do banco?

alguma tabela deve armazenar o plantão de cada equipe, quais campos essa tabela possui?
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: Qui Out 06, 2016 1:59 pm    Assunto: Responder com Citação

Então leo_cj, não há tabela contendo tais equipes...a única coisa q tenho é um array do ano todo, que contém as equipes A, B e C. A partir daí consigo mostrar a equipe de plantão do dia, mas só no dia entende? Qdo pula o dia a meia-noite ele tbm muda a equipe e assim não funciona, pois o plantão vai até às 07h00 da manhã.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
leo_cj
Colaborador
Colaborador


Registrado: Sábado, 26 de Março de 2011
Mensagens: 1335

MensagemEnviada: Qui Out 06, 2016 2:03 pm    Assunto: Responder com Citação

Como você está utilizando esse array atualmente?

se possível, coloque o código aqui para podermos analisar e buscar uma solução
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: Qui Out 06, 2016 2:20 pm    Assunto: Responder com Citação

Esqueci de mencionar, existe uma função que transforma os dias do ano em números sequenciais. O número do relatório é o mesmo do número do dia. o código está assim:

Function CalcDias(DataFim:TDate) : String;
var
M, D, Y: Word;
DataIni,Temp : TDate;
Final : Integer;
begin
DecodeDate(DataFim, Y, M, D);
DataIni:= EnCodeDate(Y,01,01);
Temp:= EncodeDate(Y, M, D);
Final:= round(Temp - DataIni);
Result:= InttoStr(Final + 1);
end;

procedure TRptListaEquipe.QuickRep1StartPage(Sender: TCustomQuickRep);
const
Equipe2016: array [1..366] of String =('ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE',
'ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE',
'ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE',
'ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE',
'ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE',
'ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE',
'ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE',
'ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE',
'ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE',
'ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE',
'ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE',
'ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO','CHARLIE',
'ALFA', 'BRAVO','CHARLIE','ALFA', 'BRAVO', 'CHARLIE','ALFA', 'BRAVO','CHARLIE');


var
Presente, Amanha: TDateTime;
Year, Month, Day, DiaEq: Word;
Dia, Ano, Extenso, num : String;
Mes: Integer;

begin
Presente := Now;
Amanha := IncHour(Presente, 24);
DecodeDate(Date,Year,Month,Day);
Dia := IntToStr(Day);
Mes := (Month);
Ano := IntToStr(Year);
DiaEq := DayOfTheYear(Date);
num := CalcDias(Now);

if StrToInt(num) < 10 then
QRLabel1.Caption := '00' + CalcDias(Now)
else if StrToInt(num) < 100 then
QRLabel1.Caption := '0' + CalcDias(Now)
else QRLabel1.Caption := CalcDias(Now);

if Ano = '2016' then begin
QRLabel1.Caption := 'RELATÓRIO DIÁRIO Nº ' + QRLabel1.Caption + ' / ' + Ano + ' - EQUIPE ' + Equipe2015[diaeq];
QRLabel2.Caption := Equipe2016[diaeq];
end;

end;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
leo_cj
Colaborador
Colaborador


Registrado: Sábado, 26 de Março de 2011
Mensagens: 1335

MensagemEnviada: Qui Out 06, 2016 3:06 pm    Assunto: Responder com Citação

Tente assim:

Código:

var
Presente, Amanha: TDateTime;
Year, Month, Day, DiaEq, Hour: Word;
Dia, Ano, Extenso, num : String;
Mes: Integer;

begin
Presente := Now;
Amanha := IncHour(Presente, 24);
DecodeDate(Date,Year,Month,Day);
Dia := IntToStr(Day);
Mes := (Month);
Ano := IntToStr(Year);
Hour:= HourOfTheDay(Date);
DiaEq := DayOfTheYear(Date);
num := CalcDias(Now);

if (Hour < 7) then
  DiaEq := DiaEq - 1;

if StrToInt(num) < 10 then
QRLabel1.Caption := '00' + CalcDias(Now)
else if StrToInt(num) < 100 then
QRLabel1.Caption := '0' + CalcDias(Now)
else QRLabel1.Caption := CalcDias(Now);

if Ano = '2016' then begin
QRLabel1.Caption := 'RELATÓRIO DIÁRIO Nº ' + QRLabel1.Caption + ' / ' + Ano + ' - EQUIPE ' + Equipe2015[diaeq];
QRLabel2.Caption := Equipe2016[diaeq];
end;

end;


Nó código, verificamos se a hora é inferior as 7am, se for, subtraímos um dia, pois o turno ainda não virou
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Qui Out 06, 2016 3:56 pm    Assunto: Responder com Citação

E para reduzir um pouco o código retirando a repetição (366 vezes) do nome das equipes, você pode usar loops para preencher o Array.

Teste:

Código:
procedure TRptListaEquipe.QuickRep1StartPage(Sender: TCustomQuickRep);
const
  Equipe: array [1 .. 3] of String = ('ALFA', 'BRAVO', 'CHARLIE');
var
  Equipe2016: array [1 .. 366] of String;
  i, j, cont: Integer;
  Presente, Amanha: TDateTime;
  Year, Month, Day, DiaEq, Hour: Word;
  Dia, Ano, Extenso, num: String;
  Mes: Integer;
begin
  cont := 0;

  for i := 1 to 122 do
    for j := 1 to 3 do
    begin
      inc(cont);
      Equipe2016[cont] := Equipe[j];
    end;

  Presente := Now;
  Amanha := IncHour(Presente, 24);
  DecodeDate(Date, Year, Month, Day);
  Dia := InttoStr(Day);
  Mes := (Month);
  Ano := InttoStr(Year);
  Hour := HourOfTheDay(Date);
  DiaEq := DayOfTheYear(Date);
  num := CalcDias(Now);

  if (Hour < 7) then
  begin
    DiaEq := DiaEq - 1;
    num := InttoStr(StrToInt(CalcDias(Now)) - 1);
  end;

  QRLabel1.Caption := Format('%3.3d', [StrToInt(num)]);

  if Ano = '2016' then
  begin
    QRLabel1.Caption := 'RELATÓRIO DIÁRIO Nº ' + QRLabel1.Caption + ' / ' + Ano + ' - EQUIPE ' +
      Equipe2016[DiaEq];
    QRLabel2.Caption := Equipe2016[DiaEq];
  end;
end;

_________________
''A persistência é o caminho para o êxito.''
Charlie Chaplin
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
k713
Novato
Novato


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

MensagemEnviada: Qui Out 06, 2016 4:06 pm    Assunto: Responder com Citação

leo_cj...

acho q tá quase, show de bola tua ajuda...


rodei o sistema agora (06/10/2016 16h05) e ele tá puxando o número do relatório e da equipe de ontem....

qual será?
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: Qui Out 06, 2016 4:09 pm    Assunto: Responder com Citação

natahnbh1,

muito grato pela ajuda tbm...uma pergunta:

esse loop abrange os anos bissextos?

e outra:

como disse há pouco, rodei o sistema agora (06/10/2016 16h05) e ele tá puxando o número do relatório e da equipe de ontem...
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
leo_cj
Colaborador
Colaborador


Registrado: Sábado, 26 de Março de 2011
Mensagens: 1335

MensagemEnviada: Qui Out 06, 2016 4:23 pm    Assunto: Responder com Citação

O loop que o natanbh1 fez abrange 366 dias

o primeiro for roda 122 vezes e o segundo roda 3, assim temos que o resultado de cont ao final dos dois sera de 122 x 3 = 366 dias

quanto ao problema de pegar a equipe de ontem, o seu computador está configurado para utilizar a hora no formato de 12h ou 24h?

pois pelo formato de 12h, 16h41 é mostrado como 4h41, que por sua vez é inferior a 7

faz o seguinte:
Código:

procedure TRptListaEquipe.QuickRep1StartPage(Sender: TCustomQuickRep);
const
  Equipe: array [1 .. 3] of String = ('ALFA', 'BRAVO', 'CHARLIE');
var
  Equipe2016: array [1 .. 366] of String;
  i, j, cont: Integer;
  Presente, Amanha: TDateTime;
  Year, Month, Day, DiaEq, Hour: Word;
  Dia, Ano, Extenso, num: String;
  Mes: Integer;
begin
  cont := 0;

  for i := 1 to 122 do
    for j := 1 to 3 do
    begin
      inc(cont);
      Equipe2016[cont] := Equipe[j];
    end;

  Presente := Now;
  Amanha := IncHour(Presente, 24);
  DecodeDate(Date, Year, Month, Day);
  Dia := InttoStr(Day);
  Mes := (Month);
  Ano := InttoStr(Year);
  Hour := HourOfTheDay(Date);

  ShowMessage('Hora: ' + IntToStr(Hour)); // Verificamos a hora informada

  DiaEq := DayOfTheYear(Date);
  num := CalcDias(Now);

  if (Hour < 7) then
  begin
    DiaEq := DiaEq - 1;
    num := InttoStr(StrToInt(CalcDias(Now)) - 1);
  end;

  QRLabel1.Caption := Format('%3.3d', [StrToInt(num)]);

  if Ano = '2016' then
  begin
    QRLabel1.Caption := 'RELATÓRIO DIÁRIO Nº ' + QRLabel1.Caption + ' / ' + Ano + ' - EQUIPE ' +
      Equipe2016[DiaEq];
    QRLabel2.Caption := Equipe2016[DiaEq];
  end;
end;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Qui Out 06, 2016 4:29 pm    Assunto: Responder com Citação

k713 escreveu:
como disse há pouco, rodei o sistema agora (06/10/2016 16h05) e ele tá puxando o número do relatório e da equipe de ontem...


Troque:
Código:
Hour := HourOfTheDay(Date);


Por:
Código:
Hour := HourOfTheDay(Now);


Date busca a data apenas e a hora fica zerada. Diferente de Now que busca a Data e a hora atual.

Vai ficar assim:

Código:
procedure TForm1.Button2Click(Sender: TObject);
const
  Equipe: array [1 .. 3] of String = ('ALFA', 'BRAVO', 'CHARLIE');
var
  Equipe2016: array [1 .. 366] of String;
  i, j, cont: Integer;
  Presente, Amanha: TDateTime;
  Year, Month, Day, DiaEq, Hour: Word;
  Dia, Ano, Extenso, num: String;
  Mes: Integer;
begin
  cont := 0;

  for i := 1 to 122 do
    for j := 1 to 3 do
    begin
      inc(cont);
      Equipe2016[cont] := Equipe[j];
    end;

  Presente := Now;
  Amanha := IncHour(Presente, 24);
  DecodeDate(Date, Year, Month, Day);
  Dia := InttoStr(Day);
  Mes := (Month);
  Ano := InttoStr(Year);
  Hour := HourOfTheDay(Now);
  DiaEq := DayOfTheYear(Date);
  num := CalcDias(Now);

  if (Hour < 7) then
  begin
    DiaEq := DiaEq - 1;
    num := InttoStr(StrToInt(CalcDias(Now)) - 1);
  end;

  QRLabel1.Caption := Format('%3.3d', [StrToInt(num)]);

  if Ano = '2016' then
  begin
    QRLabel1.Caption := 'RELATÓRIO DIÁRIO Nº ' + QRLabel1.Caption + ' / ' + Ano + ' - EQUIPE ' +
      Equipe2016[DiaEq];
    QRLabel2.Caption := Equipe2016[DiaEq];
  end;
end;

_________________
''A persistência é o caminho para o êxito.''
Charlie Chaplin
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
k713
Novato
Novato


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

MensagemEnviada: Qui Out 06, 2016 4:45 pm    Assunto: Responder com Citação

natanbh1,

era isso mesmo...perfeito!!

só uma última dúvida, meio bestial, mas vai lá: os relatórios sairão com o respectivo número e nome de equipe independente do ano futuro, correto?

No mais, sem palavras para agradecer a sua ajuda e a do leo_cj...
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
natanbh1
Colaborador
Colaborador


Registrado: Terça-Feira, 15 de Março de 2011
Mensagens: 3093
Localização: Belo Horizonte - MG

MensagemEnviada: Qui Out 06, 2016 4:50 pm    Assunto: Responder com Citação

Em termos, sim.

Cabe observar que na virada de um ano para outro, pode haver alguma divergência, pois de acordo com o código sempre o primeiro dia do ano começará com a equipe Alfa.
_________________
''A persistência é o caminho para o êxito.''
Charlie Chaplin
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
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  Próximo
Página 1 de 2

 
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