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

📄 datastore.pas

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

  FSQLSrv.Free;
  FTmpSQLSrv.Free;

  FTmpStrList.Free;
  FTmpStrList2.Free;

  inherited;
end;

function TTbcDataStore.Filter: integer;
var i:integer;
    FilterExpr:string;
    RowObj:TTbcDwRow;
    IsSatisfied:boolean;
begin
 result:=-1;
 try
  DecomposeDwExpr(FFilterExpr,FFilterElemList);
 except
   raise;
   exit;
 end;

 if (FFilterElemList.Count = 0) then
 begin
    //move FilterBuf Row to Primary Buf
    for i:=0 to FFilterBuf.Count - 1 do
     FPrimaryBuf.Add(FFilterBuf[i]);
    FFilterBuf.Clear;
    result:=1;
    exit;
 end;
 if (FPrimaryBuf.Count + FFilterBuf.Count) = 0 then //nothing to do
 begin
   result:=1;
   exit;
 end;

 if FPrimaryBuf.Count > 0 then
    RowObj:=TTbcDwRow(FPrimaryBuf[0])
  else
    RowObj:=TTbcDwRow(FFilterBuf[0]);

 try
    if InternalValidateExpr(FFilterElemList) <> 1 then
    begin
     raise ETbcDwError.Create(FFilterExpr+'  不是有效的过滤表达式');
     exit;
    end;
 except
    raise ETbcDwError.Create(FFilterExpr+'  不是有效的过滤表达式');
    exit;
 end;

 {

  ShowMessage('FilterExpr='+FilterExpr);
  DebugCount:=0;
 }
 //move FilterBuf Row to Primary Buf
 for i:=0 to FFilterBuf.Count - 1 do
   FPrimaryBuf.Add(FFilterBuf[i]);
 FFilterBuf.Clear;
 i:=0;
 while i< FPrimaryBuf.Count do
 begin
   RowObj:=TTbcDwRow(FPrimaryBuf[i]);
   try
     IsSatisfied:=EvalRow(RowObj,FFilterElemList);
   except
    raise;
    exit;
   end;
   if not IsSatisfied then //move to Filter Buffer
   begin
     FFilterBuf.Add(RowObj);
     FPrimaryBuf.Delete(i);                 //笔记:把不满足条件的记录挪到FFilterBuft中,满足条件的继续留在FPrimaryBuf中endstart
   end
   else
   begin
     Inc(i);
   end;
 end;
 result:=1;
end;



function TTbcDataStore.FilteredCount: integer;
begin
  result:=FFilterBuf.Count;
end;

{
  TTbcDataStore.Find
在 FPrimaryBuf 指向的缓冲区中按FindExpr 查找满足条件的第一行
查找范围为 StartRow to EndRow

如果找到满足条件的记录,则返回相应的行号,
否则返回0
如果参数有错,则返回 -5
如果发生错误,则返回 -1
}


function TTbcDataStore.Find(FindExpr: string;StartRow,
  EndRow: integer): integer;
var i:integer;
    ResultRow:integer;
begin

 FindExpr:=Trim(FindExpr);
 if (StartRow <= 0) or (EndRow <= 0) or (StartRow > EndRow) or (Length(FindExpr)=0)then//非法参数
 begin
   result:=-5;
   exit;
 end;

 result:=0;

 if FPrimaryBuf.Count <= 0 then  exit; //no row to find

 if StartRow > FPrimaryBuf.Count then exit;//no row to find

 if EndRow > FPrimaryBuf.Count then EndRow:=FPrimaryBuf.Count;

 result:=-1;
 try
  DecomposeDwExpr(FindExpr,FTmpFindElemList);
 except
   raise;
   exit;
 end;

 try
  ResultRow:=InternalFind(FPrimaryBuf,FTmpFindElemList,StartRow - 1,EndRow -1,FindExpr);
 except
    raise;
    exit;
 end;
 result:=ResultRow+1;

end;

{
  TTbcDataStore.FindFirst
在 FPrimaryBuf 指向的缓冲区中按FFindExpr 查找满足条件的第一行
查找范围为 0 to FPrimaryBuf.Count - 1

如果找到满足条件的记录,则返回相应的行号,
否则返回0
如果查找表达式有错,则raise error 并且返回 -1

}

function TTbcDataStore.FindFirst: integer;
var i:integer;
    iStartRow,iEndRow,ResultRow:integer;//internal StartRow,EndRow
    FindExpr:string;
begin

 iStartRow:=0;iEndRow:=FPrimaryBuf.Count - 1;

 FFindExpr:=Trim(FFindExpr);
 if Length(FFindExpr)=0 then
 begin
   result:=-1;
   exit;
 end;

 if FPrimaryBuf.Count = 0 then //no row to find
 begin
   FFindCurPos:=FPrimaryBuf.Count;
   result:=0;
   exit;
 end;


 result:=-1;
 try
  DecomposeDwExpr(FFindExpr,FFindElemList);
 except
   raise;
   exit;
 end;

 try
  ResultRow:=InternalFind(FPrimaryBuf,FFindElemList,iStartRow,iEndRow,FFindExpr);
 except
    raise;
    exit;
 end;

 if ResultRow >= 0 then   FFindCurPos:=ResultRow //found
 else  FFindCurPos:=FPrimaryBuf.Count;

 result:=ResultRow+1;

end;

function TTbcDataStore.FindGroupChange(row, level: integer): integer;
begin
  result:=1;
end;

{
  TTbcDataStore.FindLast
在 FPrimaryBuf 指向的缓冲区中按FFindExpr 查找满足条件的最后一行
查找范围为 0 to FPrimaryBuf.Count - 1

如果找到满足条件的记录,则返回相应的行号,
否则返回0
如果查找表达式有错,则raise error 并且返回 -1

}

function TTbcDataStore.FindLast: integer;
var i:integer;
    iStartRow,iEndRow,ResultRow:integer;//internal StartRow,EndRow
    FindExpr:string;
begin

 iStartRow:=FPrimaryBuf.Count - 1;iEndRow:=0;

 FFindExpr:=Trim(FFindExpr);


 if Length(FFindExpr)=0 then
 begin
   result:=-1;
   exit;
 end;

 if FPrimaryBuf.Count <= 0 then //no row to find
 begin
   FFindCurPos:=-1;
   result:=0;
   exit;
 end;


 result:=-1;
 try
  DecomposeDwExpr(FFindExpr,FFindElemList);
 except
   raise;
   exit;
 end;

 try
  ResultRow:=InternalFind(FPrimaryBuf,FFindElemList,iStartRow,iEndRow,FFindExpr);
 except
    raise;
    exit;
 end;

 if ResultRow >= 0 then   FFindCurPos:=ResultRow //found
 else  FFindCurPos:=-1;

 result:=ResultRow+1;

end;

{
  TTbcDataStore.FindNext
在 FPrimaryBuf 指向的缓冲区中按FFindExpr 查找满足条件的下一行
查找范围为 FFindCurPos+1 to FPrimaryBuf.Count - 1

如果找到满足条件的记录,则返回相应的行号,
否则返回0
如果查找表达式有错,则raise error 并且返回 -1

}

function TTbcDataStore.FindNext: integer;
var i:integer;
    iStartRow,iEndRow,ResultRow:integer;//internal StartRow,EndRow
    FindExpr:string;
begin

 if FFindCurPos< -1 then FFindCurPos:=-1;

 iStartRow:=FFindCurPos+1;iEndRow:=FPrimaryBuf.Count - 1;

 FFindExpr:=Trim(FFindExpr);
 if Length(FFindExpr)=0 then
 begin
   result:=-1;
   exit;
 end;

 if iStartRow > iEndRow then //no row to find
 begin
   FFindCurPos:=FPrimaryBuf.Count;
   result:=0;
   exit;
 end;


 result:=-1;
 try
  DecomposeDwExpr(FFindExpr,FFindElemList);
 except
   raise;
   exit;
 end;

 try
  ResultRow:=InternalFind(FPrimaryBuf,FFindElemList,iStartRow,iEndRow,FFindExpr);
 except
    raise;
    exit;
 end;

 if ResultRow >= 0 then   FFindCurPos:=ResultRow //found
 else  FFindCurPos:=FPrimaryBuf.Count;

 result:=ResultRow+1;

end;

function TTbcDataStore.FindRequired(dwbuffer: TTbcDwBuffer; row,
  colnbr: integer; colname: string; updateonly: boolean): integer;
begin
  result:=1;
end;


function TTbcDataStore.GetColumn: integer;
begin
  result:=FCurCol;
end;

function TTbcDataStore.GetColumnName: string;
begin
  result:=GetColNameFromColNum(FCurCol);
end;

function TTbcDataStore.GetDatabase: TSDDatabase;
begin
  result:=FDatabase;
end;

function TTbcDataStore.GetFormat(Column: integer): string;
begin
  result:='';
end;

function TTbcDataStore.GetFormat(Column: string): string;
begin
  result:='';
end;

function TTbcDataStore.GetItemDate(row, Column: integer;
  var IsNull:boolean;dwBuffer: TTbcDwBuffer; OriginalValue: boolean): TDate;
var RowObj:TTbcDwRow;
    Buf:TObjectList;
begin
  result:=EncodeDate(1900,1,1);
  //endstart Add  2007-11-2
  CheckQueryActive;
  //endstart Add/End
  try
    Buf:=ChkGetParamsAndGetBuf(row,column,dwBuffer,OriginalValue);
  except
    raise;
    exit;
  end;
  RowObj:=TTbcDwRow(Buf[row - 1]);
  if Dbds then
  begin
   FQuery.GotoBookmark(RowObj.Bookmark);

   try
    result:=FFieldSrv.GetDate(FQuery.Fields[Column -1],IsNull,OriginalValue);
   except
    result:=EncodeDate(1900,1,1);
    raise;
    exit;
   end;
   if RowObj.RowStatus=rsNewRow then   result:=EncodeDate(1900,1,1);
  end;

  if ExternalDs then
  begin
    try
     result:=FExternalFieldSrv.GetDate(TTbcExternalField(RowObj.Values[Column -1]),IsNull,OriginalValue);
    except
     result:=EncodeDate(1900,1,1);

⌨️ 快捷键说明

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