|
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
k713 Novato
Registrado: Quarta-Feira, 12 de Mai de 2010 Mensagens: 84
|
Enviada: Qui Out 06, 2016 11:48 am Assunto: Relatório Diário |
|
|
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 |
|
|
leo_cj Colaborador
Registrado: Sábado, 26 de Março de 2011 Mensagens: 1335
|
Enviada: Qui Out 06, 2016 11:59 am Assunto: |
|
|
Você já tem a estrutura do banco?
ou é ela mesma que você está com dúvidas na montagem? |
|
Voltar ao Topo |
|
|
k713 Novato
Registrado: Quarta-Feira, 12 de Mai de 2010 Mensagens: 84
|
Enviada: Qui Out 06, 2016 12:02 pm Assunto: |
|
|
leo_cj....o sistema é antigo, em Delphi 7 + Access , e não estou conseguindo montar nada...alguma luz? |
|
Voltar ao Topo |
|
|
leo_cj Colaborador
Registrado: Sábado, 26 de Março de 2011 Mensagens: 1335
|
Enviada: Qui Out 06, 2016 1:37 pm Assunto: |
|
|
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 |
|
|
k713 Novato
Registrado: Quarta-Feira, 12 de Mai de 2010 Mensagens: 84
|
Enviada: Qui Out 06, 2016 1:59 pm Assunto: |
|
|
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 |
|
|
leo_cj Colaborador
Registrado: Sábado, 26 de Março de 2011 Mensagens: 1335
|
Enviada: Qui Out 06, 2016 2:03 pm Assunto: |
|
|
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 |
|
|
k713 Novato
Registrado: Quarta-Feira, 12 de Mai de 2010 Mensagens: 84
|
Enviada: Qui Out 06, 2016 2:20 pm Assunto: |
|
|
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 |
|
|
leo_cj Colaborador
Registrado: Sábado, 26 de Março de 2011 Mensagens: 1335
|
Enviada: Qui Out 06, 2016 3:06 pm Assunto: |
|
|
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 |
|
|
natanbh1 Colaborador
Registrado: Terça-Feira, 15 de Março de 2011 Mensagens: 3093 Localização: Belo Horizonte - MG
|
Enviada: Qui Out 06, 2016 3:56 pm Assunto: |
|
|
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 |
|
|
k713 Novato
Registrado: Quarta-Feira, 12 de Mai de 2010 Mensagens: 84
|
Enviada: Qui Out 06, 2016 4:06 pm Assunto: |
|
|
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 |
|
|
k713 Novato
Registrado: Quarta-Feira, 12 de Mai de 2010 Mensagens: 84
|
Enviada: Qui Out 06, 2016 4:09 pm Assunto: |
|
|
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 |
|
|
leo_cj Colaborador
Registrado: Sábado, 26 de Março de 2011 Mensagens: 1335
|
Enviada: Qui Out 06, 2016 4:23 pm Assunto: |
|
|
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 |
|
|
natanbh1 Colaborador
Registrado: Terça-Feira, 15 de Março de 2011 Mensagens: 3093 Localização: Belo Horizonte - MG
|
Enviada: Qui Out 06, 2016 4:29 pm Assunto: |
|
|
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 |
|
|
k713 Novato
Registrado: Quarta-Feira, 12 de Mai de 2010 Mensagens: 84
|
Enviada: Qui Out 06, 2016 4:45 pm Assunto: |
|
|
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 |
|
|
natanbh1 Colaborador
Registrado: Terça-Feira, 15 de Março de 2011 Mensagens: 3093 Localização: Belo Horizonte - MG
|
Enviada: Qui Out 06, 2016 4:50 pm Assunto: |
|
|
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 |
|
|
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|