Fórum Cálendário Corrido #363611
09/09/2008
0
Tenho que desenvolver um sitema que use tanto Calendário gregoriano como calendário corrido.
Onde o usuário pode escolher qual dos dois quer usar.
Ex:
Se o usuário obtar por usar o calendário gregoriano ele preencheria um campo provavelmente um TJvDBDateEdit ou TDBEdit da seguinte maneira
09/09/2008;
Já se ele obtar por usar o calendário corrido a data correspondente a 09/09/2008 seria o número 14497, pois a o calendário corrido que será adotado tem como dia zero o dia 31/12/1968.
Sendo assim conforme a configuração do sistema tenho que adaptar todos os campos a serem preenchidos, as listagens nas grids e os válores dos relatórios.
Gostaria da saber as opíniões de voçês, qual a melhor maneira de resolver isso:
No banco já criar os dois campos campos?
Como trocar os componentes em Run-Time;
Como ajustar a grid em run-time e os campos dos relatórios?
Toda idéia será bem vinda.
Diegotiemann
Curtir tópico
+ 0Posts
12/09/2008
Diegotiemann
Gostei + 0
12/09/2008
Álison Bissoli
escreva dateutils na uses e clique sobre ele com o control pressionado.
Tudo o que você imaginar que pode ser feito com dados tdatetime está lá,
se você me passar o seu email eu fiz um arquivo do excel listando todas
as funções da dateutils e o que a mesma faz.
Um grande abraço
Gostei + 0
12/09/2008
Diegotiemann
Gostei + 0
16/09/2008
Diegotiemann
Gostei + 0
16/09/2008
Marco Salles
Isto é so para exemplo :
var data:TDate; begin data:=strtodate(´09/09/2008´); Showmessage(´DataGregoriano : ´+datetostr(data)+#13+ ´DataCorrido : ´+datetostr(data-14497));
se esta for a lógica , a implementação se dará usando os eventos OnGetText e OnSetText do TFileds
Gostei + 0
16/09/2008
Diegotiemann
onde a data corrida inicia em 31/12/1968,
31/12/1899 -31/12/1968= 25202
data:=strtodate(´09/09/2008´); Showmessage(´DataGregoriano : ´+datetostr(data)+#13+ ´DataCorrido : ´+FloatToStr(data-25202));
Gostei + 0
16/09/2008
Marco Salles
data:=strtodate(´09/09/2008´); Showmessage(´DataGregoriano : ´+datetostr(data)+#13+ ´DataCorrido : ´+FloatToStr(data-25202));
então.. Agora é so usar o evento OnSetText e OnGetText usando um case
para diferenciar a Data Escolhida e aaplicar a diferença [u:595de0fb11]data-25202[/u:595de0fb11]
qnd necessário
Gostei + 0
16/09/2008
Diegotiemann
FloatToStr(data-25202);
isso é a data no formato milenar, só que dessa forma a data fica no formato 14589 (exatamente como presciso) e não 16/09/2008.
Sendo assim como vou conseguir exibir a data num TDBDateEdit no formato 14589, se a máscara do componente é no formato dd/mm/yyyy, isso mesmo usando os eventos onGetText e onSetText.
Nos relatórios e nas listagens desta maneira funciona, mas e nos campos onde o usuário deve preencher?
Gostei + 0
16/09/2008
Marco Salles
e qual o problema...
Mais ou menos assim :
Usando ClientDataSet Campo Data:TDate;
procedure TForm1.cdsdataGetText(Sender: TField; var Text: String; DisplayText: Boolean); begin if ckBox.Checked Then begin if sender.AsFloat <> 0 Then text:=floattostr(sender.AsFloat-25202) end else text:=sender.AsString; end;
procedure TForm1.ckBoxClick(Sender: TObject); begin with cds.FieldByName(´data´) do if ckBox.Checked then EditMask:=´´ else EditMask:=´!99/99/9999;1;_´; dbgrid1.SetFocus; end;
procedure TForm1.cdsdataSetText(Sender: TField; const Text: String); begin if ckBox.Checked Then sender.AsDateTime:=strtofloat(text)+25202 else sender.AsDateTime:=strtodate(text); end;
Outra opção , ainda mais fácil é usar o campo não no formato Data mas
[b:def3171ce0]String[/b:def3171ce0]..
Boa sorte
Gostei + 0
16/09/2008
Diegotiemann
A Gerência já decidiu não será trocado o componente mesmo que o investimento seja maior.
Gostei + 0
16/09/2008
Marco Salles
JVDBdateEdit e DBEdit são controles DataWare e eu não estou mencionando eles... So estou usando os eventos dos Tfileds
Então sendo moleza ou não , não procede sua bronca
Gostei + 0
16/09/2008
Diegotiemann
O que o Evento OnsetText e OnGeText tem a ver com os componentes???
O que você explicou a respeito dos eventos esta certo.
Quando me referi aos componentes TJVDBDateedit, quis dizer que quando a configuração estiver para ´Cálendário Corrido´ o usuário vai QUERER informar a data da maneira correspondete Ex:14589.
Dai vem o problema provavelmente vou ter que substituir todos os componentes em runtime.
Gostei + 0
16/09/2008
Marco Salles
Mas pode cara ... Pq o evento OnSetText fara a Coversão e alem do Mais
a Mascara não estar mais disponivel.
procedure TForm1.ckBoxClick(Sender: TObject); begin with cds.FieldByName(´data´) do if ckBox.Checked then //Algo selecionado pelo Cliente EditMask:=´´ //Pode digitar Numeros else EditMask:=´!99/99/9999;1;_´; //Volta com a mascar dbgrid1.SetFocus; ///Seu Componente end;
Gostei + 0
16/09/2008
Diegotiemann
Mas pode cara ... Pq o evento OnSetText fara a Coversão e alem do Mais a Mascara não estar mais disponivel.
Na grid ele fez a conversão.
Mas no JvDBDateEdit ele não fez, e não encontrei nehuma propriedade do próprio JVDBDateEdit que altere a máscara.
Gostei + 0
16/09/2008
Marco Salles
Mas ai é que tá
A mascara não esta mais no componente e sim no campo
Na propriedade [b:6dac8226ae]MaskEdit do TField[/b:6dac8226ae]
Tire a mascara se houver e parece que há do componente JvDBDateEdit
se funciona com o DbGrid , com o Dbedit não haverá pq não funcionar com outro controle , salvo que este esteja configurado de forma particular
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)