📄 datastore.pas
字号:
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 + -