Fórum Cálendário Corrido #363611

09/09/2008

0

Pessoal estõu com um problemão:
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

Diegotiemann

Responder

Posts

12/09/2008

Diegotiemann

Alguém se sugere uma opinião?


Responder

Gostei + 0

12/09/2008

Álison Bissoli

Se não me engano tudo o que você quer aí o delphi tem na unit DateUtils,
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


Responder

Gostei + 0

12/09/2008

Diegotiemann

Meu problema não é como fazer as conversões, mas sim como ajustar o programa em runtime, conforme a configuração, sendo que todos os campos data e listagem do relatório devem se adaptar.


Responder

Gostei + 0

16/09/2008

Diegotiemann

up


Responder

Gostei + 0

16/09/2008

Marco Salles

Vamos ver se entendi...

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


Responder

Gostei + 0

16/09/2008

Diegotiemann

A Lógica não é bem como você entendeu, a maneira que presciso é essa
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));



Responder

Gostei + 0

16/09/2008

Marco Salles

A Lógica não é bem como você entendeu, a maneira que presciso é essa onde a data corrida inicia em 31/12/1968, 31/12/1899 -31/12/1968= 25202 Código:
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


Responder

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?


Responder

Gostei + 0

16/09/2008

Marco Salles

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?


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


Responder

Gostei + 0

16/09/2008

Diegotiemann

O problema é que em todo sistema tem o Componente JVDBdateEdit e isso tem que funcionar com este componente, com um DBEdit normal seria moleza.
A Gerência já decidiu não será trocado o componente mesmo que o investimento seja maior.


Responder

Gostei + 0

16/09/2008

Marco Salles

O que o Evento OnsetText e OnGeText tem a ver com os componentes???

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


Responder

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.


Responder

Gostei + 0

16/09/2008

Marco Salles

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.


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;



Responder

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.


Responder

Gostei + 0

16/09/2008

Marco Salles

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.


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


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar