Cálendário Corrido
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.
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
Curtidas 0
Respostas
Diegotiemann
09/09/2008
Alguém se sugere uma opinião?
GOSTEI 0
Á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
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
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
09/09/2008
up
GOSTEI 0
Marco Salles
09/09/2008
Vamos ver se entendi...
Isto é so para exemplo :
se esta for a lógica , a implementação se dará usando os eventos OnGetText e OnSetText do TFileds
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
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
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
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
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
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
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.
A Gerência já decidiu não será trocado o componente mesmo que o investimento seja maior.
GOSTEI 0
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
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
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
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
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
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
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
09/09/2008
Tem alguma máscara neste componentes ???
Caso afirmativo , [b:e44a40b6e4]tire-as[/b:e44a40b6e4]
Caso afirmativo , [b:e44a40b6e4]tire-as[/b:e44a40b6e4]
GOSTEI 0
Diegotiemann
09/09/2008
Não tem.
GOSTEI 0
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 ????
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