Cálendário Corrido

Delphi

09/09/2008

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

Curtidas 0

Respostas

Diegotiemann

Diegotiemann

09/09/2008

Alguém se sugere uma opinião?


GOSTEI 0
Álison Bissoli

Álison Bissoli

09/09/2008

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


GOSTEI 0
Diegotiemann

Diegotiemann

09/09/2008

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.


GOSTEI 0
Diegotiemann

Diegotiemann

09/09/2008

up


GOSTEI 0
Marco Salles

Marco Salles

09/09/2008

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


GOSTEI 0
Diegotiemann

Diegotiemann

09/09/2008

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));



GOSTEI 0
Marco Salles

Marco Salles

09/09/2008

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


GOSTEI 0
Diegotiemann

Diegotiemann

09/09/2008

 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
Marco Salles

Marco Salles

09/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?


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
Diegotiemann

Diegotiemann

09/09/2008

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.


GOSTEI 0
Marco Salles

Marco Salles

09/09/2008

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


GOSTEI 0
Diegotiemann

Diegotiemann

09/09/2008

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
Marco Salles

Marco Salles

09/09/2008

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;



GOSTEI 0
Diegotiemann

Diegotiemann

09/09/2008

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
Marco Salles

Marco Salles

09/09/2008

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


GOSTEI 0
Diegotiemann

Diegotiemann

09/09/2008

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


Mas parece que é mesmo configurado de uma gorma particular, pois já fiz vários testes e não tem jeito.


GOSTEI 0
Marco Salles

Marco Salles

09/09/2008

Tem alguma máscara neste componentes ???

Caso afirmativo , [b:e44a40b6e4]tire-as[/b:e44a40b6e4]


GOSTEI 0
Diegotiemann

Diegotiemann

09/09/2008

Não tem.


GOSTEI 0
Marco Salles

Marco Salles

09/09/2008

Deixa eu tentar entender...

No Componente vDBDateEdit ja tem uma Mascara Padrão e voce não esta
conseguindo colocar somente os Numeros CORRIDOS nele , devido a presença desses caracteres .. é isso ????


GOSTEI 0
POSTAR