如何改变PARADOX数据日期型字段,使其可以存贮4位年份,急需缓助,谢谢!(100分)

  • 主题发起人 主题发起人 Liquanzhong
  • 开始时间 开始时间
PARADOX数据日期型字段本来就可以存贮4位年份,
只是在显示时,要将对应字段的format设为 format='yyyy-mm-dd'
 
在控制棉班中的区域设置
的日期该为YYYY-MM-DD
 
程序中把全局变量shordateformat:='yyyy-mm-dd';
 
Arm的方法有效,本人就是如是做的
 
有Y2K問題的程序員不只我一個, 以下是小經驗:

試改window設置:
控制台->區域設定->日期
 
实际上几乎任何数据库中的DATE或DATETIME类型全是通过实数类型来实现的,
1900-1-1(也可能是1899-12-31,记不清楚了)为0,以后每过一天加1。

所以,实际上数据库中的年都是4位的。关键在于程序怎么显示时间了。
有两种方法显示4位年:
1、在控制面板中设置时间格式
2、在程序中设置时间格式,在主FORM的CREATE事件中加入如下语句:
shordateformat:='yyyy-mm-dd';
我认为第一种方法跟机器环境有关,不方便,也容易忘记了做。
第二种与机器环境无关,比较好。
 
轉:计算机世界实用技巧之BBS(供參考)
在Delphi中处理数据库日期型字段的显示与输入
[请作者提供详细的邮政地址给我们]
---- 在使用Delphi进行数据库设计时,不可避免的会涉及到日期型字段的输入问题。不过与Microsoft的Access 97中文版等相比,Delphi本身提供的日期型字段的显示和输入方式并不适合中国人的习惯。因此对于日期型字段的处理,大家提出了不少解决方法,但是处理结果在显示和输入上并不统一,例如显示时可以实现“yyyy年mm月dd日”的格式,但是在输入时还是要按照国外的习惯用“yyyy-mm-dd”的形式进行输入;而使用TdateTimePicker进行选择输入总嫌麻烦;有些方法还要修改系统的一些设置属性,因而在进行软件发布时要将系统的属性进行调整;采用第三方控件的方式则还要将控件打包发布。而且对于常用到的“1999年”、“1999年11月”等日期格式,没有进行相应的处理。这里我根据自己的实践,利用TField的OnGetText和OnSetText两个事件的结合,以期达到日期型字段的显示和输入的统一,并可以处理我们常见的“1999年”、“1999年11月”等日期形式的显示和输入,全部利用Delphi提供的事件实现,不需要修改任何系统设置。进行相应的扩展后,还可以用于时间的显示和输入,如“hh点mm分”等。同时,由于是直接控制TField的事件,所以不论使用TDBGrid还是用TDBEdit,都可以正常的进行统一处理,而不必分开考虑。采用类似的方法,还可以应用于非数据库应用程序中的日期输入。

---- 1 基本思想

---- 利用TField的EditMask属性,将其同时作为显示和输入的掩码,在TField的OnGetText事件中处理日期字段的显示,而在OnSetText事件中处理输入值的有效性判断。为了重复利用代码,将OnGetText和OnSetText的事件处理过程调用的过程和函数放到一个独立的单元中。

---- 2 具体实现代码

{显示和判断单元}
unit DBDateEditMaskTrans;
interface
uses
Windows, SysUtils, Controls, Forms,Db;

{日期型字段显示过程,在OnGetText事件中调用}
procedure DateFieldGetText(Sender: TField;
var Text: String);

{日期型字段输入判断函数,在OnSetText事件中调用}
function DateFieldSetText(Sender: TField;
const Text: String):Boolean;

implementation

procedure DateFieldGetText(Sender: TField;
var Text: String);
var
dDate:TDate;
wYear,wMonth,wDay:Word;
aryTestYMD:Array [1..2] of Char
;{测试输入掩码用临时数组}
iYMD:Integer;
begin
dDate:=Sender.AsDateTime;
DecodeDate(dDate,wYear,wMonth,wDay);

{测试输入掩码所包含的格式.}
aryTestYMD:='年';
if StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nil then
iYMD:=1;
aryTestYMD:='月';
if StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nil then
iYMD:=2;
aryTestYMD:='日';
if StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nil then
iYMD:=3;

case iYMD of
1:{输入掩码为:”yyyy年”的格式.}
Text:=IntToStr(wYear)+'年';
2: {输入掩码为:”yyyy年mm月”的格式.}
Text:=IntToStr(wYear)+'年'+IntToStr(wMonth)+'月';
3: {输入掩码为:”yyyy年mm月dd日”的格式.}
Text:=IntToStr(wYear)+'年'+IntToStr(wMonth)+'月'
+IntToStr(wDay)+'日';
else {默认为:”yyyy年mm月dd日”的格式.}
Text:=IntToStr(wYear)+'年'+IntToStr(wMonth)+'月'
+IntToStr(wDay)+'日';
end;

end;

function DateFieldSetText(Sender: TField;
const Text: String):Boolean;
var
dDate:TDate;
sYear,sMonth,sDay:String;
aryTestYMD:Array [1..2] of Char;
iYMD:Integer;
begin
{获得用户输入的日期}
sYear:=Copy(Text,1,4);
sMonth:=Copy(Text,7,2);
SDay:=Copy(Text,11,2);

{测试输入掩码所包含的格式.}
aryTestYMD:='年';
if StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nil then
iYMD:=1;
aryTestYMD:='月';
if StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nil then
iYMD:=2;
aryTestYMD:='日';
if StrScan(PChar(Sender.EditMask),
aryTestYMD[1])< >nil then
iYMD:=3;

{利用Try…Except进行输入的日期转换}
try
begin
case iYMD of
1: {输入掩码为:”yyyy年”的格式.}
begin
dDate:=StrToDate(sYear+'-01-01')
;{中文Windows默认的日期格式为:yyyy-mm-dd.下同}
Sender.AsDateTime:=dDate;
end;
2: {输入掩码为:”yyyy年mm月”的格式.}
begin
dDate:=StrToDate(sYear+'-'+sMonth+'-01');
Sender.AsDateTime:=dDate;
end;
3: {输入掩码为:”yyyy年mm月dd日”的格式.}
begin
dDate:=StrToDate(sYear+'-'+sMonth+'-'+sDay);
Sender.AsDateTime:=dDate;
end;
else {默认为:”yyyy年mm月dd日”的格式.}
begin
dDate:=StrToDate(sYear+'-'+sMonth+'-'+sDay);
Sender.AsDateTime:=dDate;
end;
end;
DateFieldSetText:=True;
end;
except
{日期转换出错}
begin
Application.MessageBox(PChar(Text+'不是有效的日期!'),
'错误',mb_Ok+mb_IconError);
DateFieldSetText:=False;
end;
end;

end;

end.

{主窗口单元}
unit Main;

interface

uses
……{略去其他内容}
procedure Table1BirthdayGetText(Sender: TField;
var Text: String;DisplayText: Boolean);
procedure Table1BirthdaySetText(Sender: TField;
const Text: String);
private
{ Private declarations }
public
{ Public declarations }
……{略}
implementation

{将自定义的单元包含进来}
uses DBDateEditMaskTrans;

{$R *.DFM}
……{其他过程略}
procedure TForm1.FormActivate(Sender: TObject);
{设置一个日期型字段的输入掩码,
可以放到TField字段定义中。}
begin
Table1.FieldByName('Birthday').EditMask:=
'9999/年99/月99/日;1;_';
end;

procedure TForm1.Table1BirthdayGetText(Sender:
TField; var Text: String;DisplayText: Boolean);
begin
DateFieldGetText(Sender,Text);
end;

procedure TForm1.Table1BirthdaySetText(Sender:
TField; const Text: String);
begin
if DateFieldSetText(Sender,Text)=False then
Abort; {转换不成功,日期非法}
end;

end.


---- 以上代码在中文Windows95 + Delphi3 + Paradox7环境下测试通过。  免 费 订 阅
实用技巧分类

Office应用
CAD
C、C++
数据库应用
Delphi
Internet应用
Java
Notes应用
操作系统应用
PowerBuilder
VB
Visual Foxpro
其他类
上周 排行榜
如 何 投 稿 ?



在日常的工作生活中,我们对计算机软硬件技术的应用开发肯定有许多的心得体会,拿来和众人分享:让别人得到他们想要的,使自己找到苦苦寻觅的;小的点点滴滴,大的工程系统,这里都需要。投稿 的关键在“技巧”二字,知他人所不知,这样的稿件本栏最最欢迎! 大家公认的 好文章自然会有好的奖励。希望每个人在这里都有所收获...



中国惠普
3Com中国
Motorola中国
联想科技
CA中国
Cabletron
Sony在中国




--------------------------------------------------------------------------------

 
formatdatetime('yyyy-mm-dd')
 
dbgrid中需用displayformat设置。paradox库不可能有y2k问题,只不过是显示位数
问题,就象现在的大富翁一样。
:)
 
PARADOX日期型字段本来就可以存贮4位年份。
在程序中只需要设置全局变量shordateformat:='yyyy.mm.dd',
就可以显示出来。
 
分给的有点冤
 

只要在 BDE 中正确设置就可以达到。 在 Date 页中:

FOURDIGITYEAR 项:(用于区别表示年份的数字个数,可以为2或4。)
当值为TRUE时,年份用4个数字表示,如1999。
如果值为FALSE,年份用两个数字表示,如99。

如果该值设为:True;还要注意 YEARBIASED 项的设置。

YEARBIASED (通知Paradox是否在所输入的两数字年份中加上1900。)
当值为 True 时:输入的“1/18/99”会被 Paradox解释为“7/21/1996”,
当值为 False 时:它接受原输入值并解释为“7/21/0096”。
缺省值为 True!

 

BTW:同时,要在控制面板中作如下修改:
控制面板 --> 区域设置 --> 日期 -->

短日期样式:“YYYY/MM/DD”,
日期分隔符可用:“.”、“/”、“-”……
 
shordateformat:='yyyy/mm/dd'
 
PARADOX数据库可以存贮4位年份,只要在显示时将对应字段的format设为shordateformat:='yyyy/mm/dd'
 
急需缓助???问题已经说明了。为何不结束?或者还不明白?
 
将Table的Fields的Display Format 设置为yyyy-mm-dd就OK
 
在程序中适当的地方加入下列语句就可以了:
dateseparator:='-';
shortdateformat:='yyyy-mm-dd';
twodigityearcenturywindow:=70;
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部