From: <md...@us...> - 2003-06-10 09:21:50
|
Update of /cvsroot/tdbf/tdbf In directory sc8-pr-cvs1:/tmp/cvs-serv12514 Modified Files: Dbf.pas Log Message: new lookup method Index: Dbf.pas =================================================================== RCS file: /cvsroot/tdbf/tdbf/Dbf.pas,v retrieving revision 1.28 retrieving revision 1.29 diff -C2 -d -r1.28 -r1.29 *** Dbf.pas 8 Jun 2003 18:46:49 -0000 1.28 --- Dbf.pas 10 Jun 2003 09:21:47 -0000 1.29 *************** *** 249,252 **** --- 249,254 ---- procedure SetIndexFieldNames(const Value: string); {virtual;} + function LocateRecord(const KeyFields: String; const KeyValues: Variant; Options: TLocateOptions): Boolean; + procedure DoFilterRecord(var Acceptable: Boolean); public *************** *** 305,312 **** {$IFDEF USE_BUGGY_LOOKUP} ! function Lookup(const KeyFields: string; const KeyValues: Variant; const ResultFields: string): Variant; {$ENDIF} function Locate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean; override; - function LocateRecord(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions; bSyncCursor: Boolean): Boolean; function IsDeleted: Boolean; --- 307,313 ---- {$IFDEF USE_BUGGY_LOOKUP} ! function Lookup(const KeyFields: string; const KeyValues: Variant; const ResultFields: string): Variant; override; {$ENDIF} function Locate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean; override; function IsDeleted: Boolean; *************** *** 813,817 **** if FBlobStreams[I] <> nil then FBlobStreams[I].Free; ! FreeMemAndNil(FBlobStreams); end; // disconnect field objects --- 814,818 ---- if FBlobStreams[I] <> nil then FBlobStreams[I].Free; ! FreeMemAndNil(Pointer(FBlobStreams)); end; // disconnect field objects *************** *** 1454,1477 **** const ResultFields: string): Variant; var ! OldState: TDataSetState; begin Result := Null; ! If VarIsNull(KeyValues) then exit; ! if LocateRecord(KeyFields, KeyValues, [], False) then ! begin ! // OldState := SetTempState(dsCalcFields); ! OldState := SetTempState(dsInternalCalc); ! // disable Calculated fields - otherwise were heavy AVs ! // and buffer troubles below ! try ! // CalculateFields(PChar(@FDbfCalcBuffer)); ! CalculateFields(TempBuffer); ! // CalculateFields(GetCurrentBuffer); ! if KeyValues = FieldValues[KeyFields] then // there was bug in TDbf.SearchKey ! Result := FieldValues[ResultFields]; // also there may be buffer troubles from above ! finally ! (* else *) RestoreState(OldState); end; end; end; --- 1455,1490 ---- const ResultFields: string): Variant; var ! // OldState: TDataSetState; ! retBookmark: TBookmarkStr; begin Result := Null; ! if VarIsNull(KeyValues) then exit; ! retBookmark := Bookmark; ! DisableControls; ! try ! if LocateRecord(KeyFields, KeyValues, []) then ! begin ! { ! OldState := SetTempState(dsCalcFields); ! // OldState := SetTempState(dsInternalCalc); ! // disable Calculated fields - otherwise were heavy AVs ! // and buffer troubles below ! try ! // CalculateFields(PChar(@FDbfCalcBuffer)); ! CalculateFields(TempBuffer); ! // CalculateFields(GetCurrentBuffer); ! if KeyValues = FieldValues[KeyFields] then // there was bug in TDbf.SearchKey ! } ! Result := FieldValues[ResultFields]; // also there may be buffer troubles from above ! { ! finally ! (* else *) RestoreState(OldState); ! end; ! } end; + finally + Bookmark := retBookmark; + EnableControls; end; end; *************** *** 1479,1488 **** {$ENDIF} function TDbf.LocateRecord(const KeyFields: String; const KeyValues: Variant; ! Options: TLocateOptions; bSyncCursor: Boolean): Boolean; var lstKeys : TList; iIndex : Integer; - ReturnBookMark : TBookMarkStr; Field : TField; bMatchedData : Boolean; --- 1492,1518 ---- {$ENDIF} + function TDbf.Locate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean; + var + retBookmark: TBookmarkStr; + begin + DoBeforeScroll; + try + DisableControls; + retBookmark := Bookmark; + Result := LocateRecord(KeyFields, KeyValues, Options); + if Result then + DoAfterScroll + else + Bookmark := retBookmark; + finally + EnableControls; + end; + end; + function TDbf.LocateRecord(const KeyFields: String; const KeyValues: Variant; ! Options: TLocateOptions): Boolean; var lstKeys : TList; iIndex : Integer; Field : TField; bMatchedData : Boolean; *************** *** 1559,1588 **** if bMatchedData then begin ! ReturnBookMark := BookMark; ! DisableControls; ! try ! First; ! while not Eof and not Result Do begin ! Result := true; ! iIndex := 0; ! while Result and (iIndex < lstKeys.Count) Do ! begin ! Field := TField (lstKeys [iIndex]); ! if bVarIsArray then ! varCompare := KeyValues [iIndex] ! else ! varCompare := KeyValues; ! Result := CompareValues; ! iIndex := iIndex + 1; ! end; ! if not Result then ! Next; end; - if not Result then ! BookMark := ReturnBookMark; ! finally ! EnableControls; end; end; --- 1589,1609 ---- if bMatchedData then begin ! First; ! while not Eof and not Result Do ! begin ! Result := true; ! iIndex := 0; ! while Result and (iIndex < lstKeys.Count) Do begin ! Field := TField (lstKeys [iIndex]); ! if bVarIsArray then ! varCompare := KeyValues [iIndex] ! else ! varCompare := KeyValues; ! Result := CompareValues; ! iIndex := iIndex + 1; end; if not Result then ! Next; end; end; *************** *** 1623,1634 **** FExclusive := false; end; - end; - - function TDbf.Locate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean; - begin - DoBeforeScroll; - Result := LocateRecord(KeyFields, KeyValues, Options, true); - if Result then - DoAfterScroll; end; --- 1644,1647 ---- |