修改 cxFilter 使之支持Oracle的日期型。

在DataControler 里有一份文件 cxFilter.pas,此文件定义了在 cxgrid 中进行 Filter 时的一些动作,此次正好我要用到,于是看了一下,发现其中的日期型有点问题。

在第863 行附近改成如下:

 1function TcxFilterOperator.GetExpressionValue(const AValue: Variant): string;
 2var
 3  AVarType: Integer;
 4begin
 5  if not PrepareExpressionValue(AValue, Result) then
 6  begin
 7    AVarType := VarType(AValue);
 8    if (AVarType = varString) or (AVarType = varOleStr) then // <- VarTypeIsStr()
 9      Result := QuotedStr(VarToStr(AValue))
10    else
11      if AVarType = varDate then
12      begin
13//         DateTimeFormat:='YYYY-MM-DD'; //临时定义日期格式
14         Result:=' TO_DATE('+QuotedStr( CriteriaItem.Criteria.ConvertDateToStr(
15           AValue))+','+Quotedstr('YYYY-MM-DD')+')';
16      end
17      // 原来的日期没有加 to_date ,Oracle 不认。
18//        Result := '''' + CriteriaItem.Criteria.ConvertDateToStr(AValue) + ''''
19      else
20        if AVarType = varBoolean then
21          Result := CriteriaItem.Criteria.ConvertBoolToStr(AValue)
22        else
23          if AVarType = varNull then
24            Result := 'NULL'
25          else
26            Result := VarToStr(AValue);
27    CriteriaItem.Criteria.FormatFilterTextValue(CriteriaItem, AValue, Result);
28  end;
29end;


于是,这个世界清静了,不过,这个日期定义太死了,没有时间。而实际上在使用时我一般都不带时间的,所以总觉得不完美,应该在外面定义的时候把这个 format 定义出来,这样比较好。

还有一处,cxFilter 在处理 为空和不为空的时候出现这种 = NULL 和 <> NULL ,而Oracle是不接受这种的,要改成 Is NULL 和 Is Not Null 。

posted on 2007-08-07 08:35  qufo  阅读(392)  评论(0编辑  收藏  举报

导航