⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 datastore.pas

📁 内存数据库,用于与数据库操作上进行缓冲
💻 PAS
📖 第 1 页 / 共 5 页
字号:

  function SetKeyFields(const KeyFields:string;const IsKeyField:boolean=true):integer;
  function SetKeyFieldNums(const KeyFieldNums:string;const IsKeyField:boolean=true):integer;

  function IsKeyField(const ColNum:integer):boolean;overload;
  function IsKeyField(const ColName:string):boolean;overload;




  function SetRecKeyField(const ColNum:integer;const IsRecKeyField:boolean=true):integer;overload;
  function SetRecKeyField(const ColName:string;const IsRecKeyField:boolean=true):integer;overload;

  function SetRecKeyFields(const RecKeyFields:string;const IsRecKeyField:boolean=true):integer;
  function SetRecKeyFieldNums(const RecKeyFieldNums:string;const IsRecKeyField:boolean=true):integer;

  function IsRecKeyField(const ColNum:integer):boolean;overload;
  function IsRecKeyField(const ColName:string):boolean;overload;




  function SetFieldTableName(const ColNum:integer;const TableName:string):integer;overload;
  function SetFieldTableName(const ColName:string;const TableName:string):integer;overload;

  function SetFieldsTableName(const Fields:string;const TableName:string):integer;
  function SetFieldNumsTableName(const FieldNums:string;const TableName:string):integer;

  function GetFieldTableName(const ColNum:integer):string;overload;
  function GetFieldTableName(const ColName:string):string;overload;

  function SetFieldOriginName(const ColNum:integer;const OriginName:string):integer;overload;
  function SetFieldOriginName(const ColName:string;const OriginName:string):integer;overload;

  function SetFieldsOriginName(const Fields:string;const OriginNames:string):integer;overload;
  function SetFieldNumsOriginName(const FieldNums:string;const OriginNames:string):integer;overload;

  function GetFieldOriginName(const ColNum:integer):string;overload;
  function GetFieldOriginName(const ColName:string):string;overload;

  function SetFieldUpdatable(const ColNum:integer;const IsUpdatable:boolean=true):integer;overload;
  function SetFieldUpdatable(const ColName:string;const IsUpdatable:boolean=true):integer;overload;

  function SetFieldsUpdatable(const Fields:string;const IsUpdatable:boolean=true):integer;
  function SetFieldNumsUpdatable(const FieldNums:string;const IsUpdatable:boolean=true):integer;

  function IsFieldUpdatable(const ColNum:integer):boolean;overload;
  function IsFieldUpdatable(const ColName:string):boolean;overload;

  //field display Alignment property series
  function SetFieldAlignment(const ColNum:integer;const Alignment:TAlignment):integer;overload;
  function SetFieldAlignment(const ColName:string;const Alignment:TAlignment):integer;overload;

  function SetFieldsAlignment(const Fields:string;const Alignments:string):integer;overload;
  function SetFieldNumsAlignment(const FieldNums:string;const Alignments:string):integer;overload;

  function GetFieldAlignment(const ColNum:integer):TAlignment;overload;
  function GetFieldAlignment(const ColName:string):TAlignment;overload;

  function GetFieldNumsAlignment(const ColNums:string):string;
  function GetFieldsAlignment(const ColNames:string):string;

  //field display DisplayLabel property series
  function SetFieldDisplayLabel(const ColNum:integer;const DisplayLabel:string):integer;overload;
  function SetFieldDisplayLabel(const ColName:string;const DisplayLabel:string):integer;overload;

  function SetFieldsDisplayLabel(const Fields:string;const DisplayLabels:string):integer;overload;
  function SetFieldNumsDisplayLabel(const FieldNums:string;const DisplayLabels:string):integer;overload;

  function GetFieldDisplayLabel(const ColNum:integer):string;overload;
  function GetFieldDisplayLabel(const ColName:string):string;overload;

  function GetFieldNumsDisplayLabel(const ColNums:string):string;overload;
  function GetFieldsDisplayLabel(const ColNames:string):string;overload;

   //field display EditMask property series
  function SetFieldEditMask(const ColNum:integer;const EditMask:string):integer;overload;
  function SetFieldEditMask(const ColName:string;const EditMask:string):integer;overload;

  function SetFieldsEditMask(const Fields:string;const EditMasks:string):integer;overload;
  function SetFieldNumsEditMask(const FieldNums:string;const EditMasks:string):integer;overload;

  function GetFieldEditMask(const ColNum:integer):string;overload;
  function GetFieldEditMask(const ColName:string):string;overload;

  function GetFieldNumsEditMask(const ColNums:string):string;overload;
  function GetFieldsEditMask(const ColNames:string):string;overload;

   //field display DisplayWidth property series
  function SetFieldDisplayWidth(const ColNum:integer;const DisplayWidth:integer):integer;overload;
  function SetFieldDisplayWidth(const ColName:string;const DisplayWidth:integer):integer;overload;

  function SetFieldsDisplayWidth(const Fields:string;const DisplayWidths:string):integer;overload;
  function SetFieldNumsDisplayWidth(const FieldNums:string;const DisplayWidths:string):integer;overload;

  function GetFieldDisplayWidth(const ColNum:integer):integer;overload;
  function GetFieldDisplayWidth(const ColName:string):integer;overload;

  function GetFieldNumsDisplayWidth(const ColNums:string):string;overload;
  function GetFieldsDisplayWidth(const ColNames:string):string;overload;

   //field display Visible property series
  function SetFieldVisible(const ColNum:integer;const Visible:boolean):integer;overload;
  function SetFieldVisible(const ColName:string;const Visible:boolean):integer;overload;

  function SetFieldsVisible(const Fields:string;const Visibles:string):integer;overload;
  function SetFieldNumsVisible(const FieldNums:string;const Visibles:string):integer;overload;

  function GetFieldVisible(const ColNum:integer):boolean;overload;
  function GetFieldVisible(const ColName:string):boolean;overload;

  function GetFieldNumsVisible(const ColNums:string):string;overload;
  function GetFieldsVisible(const ColNames:string):string;overload;


  //update series
  function PrepareUpdateSQL(const UpdateTable:string):integer;

  function UpdatesPending:boolean;
  function ApplyUpdates:integer;

  function CancelUpdates:integer;
  function CommitUpdates:integer;


 published

 end;

 TTbcDSSortRec=record
     ds:TTbcDataStore;
     row:TTbcDwRow;
 end;

 function gFTbcDSSortCompare(const E1, E2) : Integer;
 function gFTbcIntSortCompare(const E1, E2) : Integer;
 function gFTbcInt64SortCompare(const E1, E2) : Integer;
 function gFTbcExtendedSortCompare(const E1, E2) : Integer;
//find,sort filter中表达式的书写方法以及规范
//1,表达式逻辑表达式
//2. 列名必须以[]括起

implementation

const iCstRowBufReserved:integer=350;

const iCstItemStatus:array[0..4] of TTbcDwItemStatus=(isUnknown,isDataModified,isNew,isNewModified,isNotModified);

const iCstFieldClass:array[0..25] of string=(
'TADTField',
'TAggregateField',
'TArrayField',
'TAutoIncField',
'TBCDField',
'TBlobField',
'TBooleanField',
'TBytesField',
'TCurrencyField',
'TDateField',
'TDateTimeField',
'TFloatField',
'TGraphicField',
'TGuidField',
'TIDispatchField',
'TIntegerField',
'TLargeIntField',
'TMemoField',
'TReferenceField',
'TSmallIntField',
'TStringField',
'TTimeField',
'TVarBytesField',
'TVariantField',
'TWideStringField',
'TWordField'
);

const iCstFieldType:array[0..25] of TFieldType=(
ftADT,
ftUnknown,//'TAggregateField',
ftArray,
ftAutoInc,
ftBCD,
ftBlob,
ftBoolean,
ftBytes,
ftCurrency,
ftDate,
ftDateTime,
ftFloat,
ftGraphic,
ftGuid,
ftIDispatch,
ftInteger,
ftLargeInt,
ftMemo,
ftReference,
ftSmallInt,
ftString,
ftTime,
ftVarBytes,
ftVariant,
ftWideString,
ftWord
);

{ TTbcDataStore }

function TTbcDataStore.AcceptText: integer;
begin
  result:=1;
end;

function TTbcDataStore.ClearValues(Column: string): integer;
begin
  result:=1;
end;

function TTbcDataStore.ClearValues(Column: integer): integer;
begin
  result:=1;
end;

constructor TTbcDataStore.Create(ADSType:TTbcDataStoreType);
var i:integer;
begin
    FDSType:=ADSType;
    FUpdateMode:=dwuWhereKeyAndUpdatable;

    FSaveOriginValue:=false;

    FRetrieveArgs:=TTbcRetrieveArgs.Create;

    FQuery:=TSDQuery.Create(nil);
    FRowsAffected:=0;

    FEnableUpdateKinds:=[ukModify, ukInsert, ukDelete];

    FUpdateSQL:=TSDUpdateSQL.Create(nil);
    FQuery.UpdateObject:=FUpdateSQL;

    FFieldDefs:=TTbcDwFieldDefs.Create;//各列描述
    FFieldDefsSave:=TTbcDwFieldDefs.Create;//各列描述保存

    FFieldNames:=TStringList.Create;//各列名称
    FFieldNames.Sorted:=false;


    FHashFieldNames:=TStringHashTrie.Create;
    FHashFieldNames.AutoFreeObjects:=false;
    FHashFieldNames.CaseSensitive:=true;

    FFieldSrv:=TTbcTFieldSrv.Create;
    FExternalFieldSrv:=TTbcExternalFieldSrv.Create;

    FNextRowID:=1;

    FPrimaryBuf:=TObjectList.Create(false); //primary buffer 数据
    FDeleteBuf:=TObjectList.Create(false); //delete buffer 数据
    FFilterBuf:=TObjectList.Create(false); //filter buffer 数据
    FDiscardBuf:=TObjectList.Create(false); //discard row buffer


    FCurRow:=0;FCurCol:=0;

    FRowCount:=0;FColCount:=0;


    FSortExpr:='';//sort 表达式
    FSortColList:=TStringList.Create;
    FSortColList.Sorted:=false;
    FSortOrderList:=TStringList.Create;
    FSortOrderList.Sorted:=false;

    FFilterExpr:=''; //Filter 表达式
    FFilterElemList:=TObjectList.Create(false);

    FFindExpr:=''; //查找表达式
    FFindCurPos:=-1; //存放下一个开始查找记录位置

    FFindElemList:=TObjectList.Create(false);//为FindFirst,FindLast,FindNext,FindPrior 函数服务
    FTmpFindElemList:=TObjectList.Create(false);//为Find 函数服务

    FHashFindList:=TObjectList.Create(false);
    FHashFindName:=TStringList.Create;
    FHashFindName.Sorted:=false;

    FEnableTime:=false;

    FItemData1:=TTbcDwItemData.Create;
    FItemData2:=TTbcDwItemData.Create;

    FStringSrv:=TTbcStringSrv.Create;
    FExprEval:=TTbcExprEval.Create;

    FSQLSrv:=TTbcSQLSrv.Create;
    FTmpSQLSrv:=TTbcSQLSrv.Create;

    FTmpStrList:=TStringList.Create;
    FTmpStrList.sorted:=false;

    FTmpStrList2:=TStringList.Create;
    FTmpStrList2.sorted:=false;

    for i:=0 to MaxTbcDwColumn - 1 do
    begin
      FFieldTypes[i]:=ftUnknown;//各列数据类型
    //drop down datawindow or drop down codetable object
      FDropDownList[i]:=nil;
    end;
   
end;

function TTbcDataStore.DeletedCount: integer;
begin
  result:=FDeleteBuf.Count;
end;

function TTbcDataStore.DeleteRow(row: integer): integer;
var RowObj:TTbcDwRow;
begin
 result:=-1;
  //endstart Add  2007-11-2
  CheckQueryActive;
  //endstart Add/End
 //if row=0 then row:=FCurRow;
 try
  ChkRowParams(FPrimaryBuf,row);
 except
  raise;
  exit;
 end;

 RowObj:=TTbcDwRow(FPrimaryBuf[row - 1]);
 if DbDS then
 begin
   try
    FQuery.GotoBookmark(RowObj.Bookmark);
    FQuery.Delete;
   except
    raise;
    exit;
   end;
 end;
 FPrimaryBuf.Delete(row - 1);
 FDeleteBuf.Add(RowObj);
 result:=1;
 FQuery.UpdateRecordTypes:=[rtModified, rtInserted, rtDeleted, rtUnmodified]; 
end;

destructor TTbcDataStore.Destroy;
begin
  RetrieveReset;
  InternalResetHashFind;
  InternalResetDropDownList;

  FRetrieveArgs.Free;

  FQuery.CloseDatabase(Self.FDatabase);
  FQuery.Close;
  FUpdateSQL.Free;
  FQuery.Free;

  FFieldDefs.Free;
  FFieldDefsSave.Free;
  FFieldNames.Free;
  FHashFieldNames.Free;

  FFieldSrv.Free;
  FExternalFieldSrv.Free;

  FPrimaryBuf.Free;
  FDeleteBuf.Free;
  FFilterBuf.Free;
  FDiscardBuf.Free;

  FSortColList.Free;
  FSortOrderList.Free;

  ExprElemListFree(FFilterElemList);
  FFilterElemList.Free;

  ExprElemListFree(FFindElemList);
  ExprElemListFree(FTmpFindElemList);
  FFindElemList.Free;//为FindFirst,FindLast,FindNext,FindPrior 函数服务
  FTmpFindElemList.Free;//为Find 函数服务

  FHashFindList.Free;
  FHashFindName.Free;

  FItemData1.Free;
  FItemData2.Free;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -