lazarus/components/lazreport/source/lr_dbrel.pas
2012-05-29 04:42:31 +00:00

140 lines
3.2 KiB
ObjectPascal

{*****************************************}
{ }
{ FastReport v2.3 }
{ DB related stuff }
{ }
{ Copyright (c) 1998-99 by Tzyganenko A. }
{ }
{*****************************************}
unit LR_DBRel;
interface
{$I LR_Vers.inc}
uses
SysUtils, Classes, DB;
const
frEmptyBookmark = nil;
type
TfrBookmark = TBookmark;
TfrTDataSet =class(TDataSet);
TfrTField = class(TField);
TfrTBlobField = class(TBlobField);
function frIsBlob(Field: TfrTField): Boolean;
function frIsBookmarksEqual(DataSet: TfrTDataSet; b1, b2: TfrBookmark): Boolean;
procedure frGetFieldNames(DataSet: TfrTDataSet; List: TStrings);
function frGetBookmark(DataSet: TfrTDataSet): TfrBookmark;
procedure frFreeBookmark(DataSet: TfrTDataSet; Bookmark: TfrBookmark);
procedure frGotoBookmark(DataSet: TfrTDataSet; Bookmark: TfrBookmark);
function frGetDataSource(Owner: TComponent; d: TDataSet): TDataSource;
function lrGetFieldValue(F:TField):Variant;
const
TypeStringField = [ftString, ftMemo, ftFmtMemo, ftFixedChar, ftWideString,
ftFixedWideChar, ftWideMemo];
TypeNumericField = [ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime,
ftTimeStamp];
TypeIntegerField = [ftSmallint, ftInteger, ftWord, ftAutoInc, ftLargeint];
TypeBooleanField = [ftBoolean];
implementation
uses LR_Utils;
function frIsBlob(Field: TfrTField): Boolean;
begin
Result := (Field <> nil) and (Field.DataType in [ftBlob..ftTypedBinary]);
end;
procedure frGetFieldNames(DataSet: TfrTDataSet; List: TStrings);
begin
if not Assigned(DataSet) then exit;
if DataSet.FieldCount > 0 then
DataSet.GetFieldNames(List)
else
begin
DataSet.Open;
DataSet.GetFieldNames(List);
DataSet.Close;
end;
end;
function frGetBookmark(DataSet: TfrTDataSet): TfrBookmark;
begin
Result := DataSet.GetBookmark;
end;
procedure frGotoBookmark(DataSet: TfrTDataSet; Bookmark: TfrBookmark);
begin
DataSet.GotoBookmark(BookMark);
end;
function frGetDataSource(Owner: TComponent; d: TDataSet): TDataSource;
var
i: Integer;
sl: TStringList;
ds: TDataSource;
begin
sl := TStringList.Create;
Result := nil;
frGetComponents(Owner, TDataSource, sl, nil);
for i := 0 to sl.Count - 1 do
begin
ds := frFindComponent(Owner, sl[i]) as TDataSource;
if (ds <> nil) and (ds.DataSet = d) then
begin
Result := ds;
break;
end;
end;
sl.Free;
end;
function lrGetFieldValue(F: TField): Variant;
begin
if Assigned(F) then
begin
if F.IsNull then
begin
if F.DataType in TypeStringField then
Result:=''
else
if F.DataType in (TypeIntegerField + TypeNumericField) then
Result:=0
else
if F.DataType in TypeBooleanField then
Result:=false
else
Result:=null
end
else
Result:=F.Value;
end
else
Result:=null;
end;
procedure frFreeBookmark(DataSet: TfrTDataSet; Bookmark: TfrBookmark);
begin
DataSet.FreeBookmark(BookMark);
end;
function frIsBookmarksEqual(DataSet: TfrTDataSet; b1, b2: TfrBookmark): Boolean;
begin
Result := DataSet.CompareBookmarks(b1, b2) = 0;
end;
end.