Sign up to receive Decoded, a new monthly digest with product updates, feature release info, continuing education opportunities, and more.
Function PositionTable(Var MyDataTable : TADOQuery;{**************************}
Const MyKeyFieldStr : String;{List of Fields Seperated by ;}
const MyKeyValues : Array of String) : Boolean;
var
I, Len: Integer;
SearchValues: Variant;
Begin
Len := Length(MyKeyValues);
SearchValues := VarArrayCreate([0, Len-1], varVariant);
for I := 0 to Len -1 do
SearchValues[I] := MyKeyValues[I];
PositionTable := MyDataTable.Locate(MyKeyFieldStr, SearchValues, [loCaseInsensitive]);
End;
procedure CheckRec(ReplacementTable : TADOQuery; const ASearchText: string); overload
begin
//SetLength(IndexFieldArray,1); //no need for this if you are searching one item
//IndexFieldArray[0] := SearchChar;
If PositionTable(ReplacementTable, 'SearchChar', [ASearchText]) Then
Begin
End
end;
//you would call it like
CheckRec(Query1, 'George');
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, Grids, DBGrids, StdCtrls;
type
TForm3 = class(TForm)
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
DBGrid1: TDBGrid;
DataSource1: TDataSource;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Public declarations }
end;
var
Form3: TForm3;
implementation
{$R *.dfm}
uses
uDBSearch;
procedure ValidateSearch(const AKeyFields: string; ASearchData: Variant);
var
List: TStringList;
ErrMsg: string;
begin
ErrMsg := '';
if Trim(AKeyFields) = '' then
ErrMsg := 'No Key Fields specified'
else if VarIsNull(ASearchData) then
ErrMsg := 'Search data not specified'
else
begin
if Pos(';', AKeyFields) <= 0 then
begin
if VarIsArray(ASearchData) then
ErrMsg := 'Search data and key fields do not match';
end
else
begin
if not VarIsArray(ASearchData) then
ErrMsg := 'Search data and key fields do not match'
else
begin
List := TStringList.Create;
try
List.Delimiter := ';';
List.DelimitedText := AKeyFields;
if VarArrayHighBound(ASearchData, 1) <> List.Count -1 then
ErrMsg := 'Search data and key fields do not match'
finally
FreeAndNil(List);
end;
end;
end;
end;
if ErrMsg <> '' then
raise Exception.Create(ErrMsg);
end;
procedure TForm3.Button1Click(Sender: TObject);
begin
if TDBSearch.LocateData(ADOQuery1, 'EmployeeID;LastName;FirstName',
['1', 'Davolio', 'Nancy'], [loCaseInsensitive], @ValidateSearch) then
ShowMessage('Good')
else
ShowMessage('Bad');
end;
procedure TForm3.FormCreate(Sender: TObject);
begin
ADOConnection1.Connected := True;
ADOQuery1.Open;
end;
end.
unit uDBSearch;
interface
uses
SysUtils, Classes, Variants, DB;
type
PSearchValidate = ^TSearchValidate;
TSearchValidate = procedure(const AKeyFields: string; ASearchData: Variant);
TDBSearch = class(TObject)
public
class function LocateData(ADataset: TDataset; const AKeyFields: string;
ASearchData: array of string; AOptions: TLocateOptions = [];
PValidate: Pointer = nil): Boolean; overload;
class function LocateData(ADataset: TDataset; const AKeyFields: string;
ASearchData: Variant; AOptions: TLocateOptions = [];
PValidate: Pointer = nil): Boolean; overload;
end;
implementation
{ TDBSearch }
class function TDBSearch.LocateData(ADataset: TDataset;
const AKeyFields: string; ASearchData: array of string;
AOptions: TLocateOptions; PValidate: Pointer): Boolean;
var
I, Len: Integer;
SearchValues: Variant;
begin
Len := Length(ASearchData);
if Len = 1 then
SearchValues := ASearchData[0]
else
begin
SearchValues := VarArrayCreate([0, Len-1], varVariant);
for I := 0 to Len -1 do
SearchValues[I] := ASearchData[I];
end;
Result := LocateData(ADataset, AKeyFields, SearchValues, AOptions, PValidate);
end;
class function TDBSearch.LocateData(ADataset: TDataset;
const AKeyFields: string; ASearchData: Variant; AOptions: TLocateOptions;
PValidate: Pointer): Boolean;
begin
if Assigned(PValidate) then
TSearchValidate(PValidate)(AKeyFields, ASearchData);
Result := ADataset.Locate(AKeyFields, ASearchData, AOptions);
end;
end.
Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.
Have a better answer? Share it in a comment.
Join the community of 500,000 technology professionals and ask your questions.