![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поиск по базе [D7]
hgd © (2007-09-15 10:46:00)Подскажите, начал осваивать работу с базой данных и не нашел способ поиска в таблице ADOTable. Есть описание Locate, lookup но они находят только единичные записи, а мне необходимо перебрать все данные таблицы. Что надо использовать, чтобы найти все записи, где поле базы Name = Vasia?
Omi (2007-09-18 15:28:00) [1]Свирепые вы, ребята. Заниматься ПОЛЬЗОВАТЕЛЬСКИМ поиском средствами самого MS SQL, тем более, что курсор, как правило на стороне клиента. Использовать TADODataSet - согласен. Если подсмотреть в исходники VCL (там, где Locate описано), то
//-----------------------------------------------------
//Прямо из VCL
function GetFilterStr(Field: TField; Value: Variant; Partial: Boolean = False): string;
var
Operator,
FieldName,
QuoteCh: string;
begin
QuoteCh := '';
Operator := '=';
FieldName := Field.FieldName;
if Pos(' ', FieldName) > 0 then
FieldName := Format('[%s]', [FieldName]);
Value:=SQLValueVerify(Value,Field.DataType,''); //Можно опустить - это проверка на "вшивость" ввода пользователя
if Value='' then Value:='Null';
if VarIsNull(Value) or VarIsClear(Value) then
Value := 'Null'
else
case Field.DataType of
ftDate, ftTime, ftDateTime:
begin
QuoteCh := '#';
end;
ftString, ftFixedChar, ftWideString:
begin
if Partial and (Value <> '') then
begin
Value := '*' + Value + '*';
Operator := ' like ';
end;
if Pos('''', Value) > 0 then
QuoteCh := '#' else
QuoteCh := '''';
end;
end;
Result := Format('(%s%s%s%s%2:s)', [FieldName, Operator, QuoteCh, VarToStr(Value)]);
end;
//-----------------------------------------------------
{У меня ключи TGuid - с integer еще легче}
function TfFind.FunFind(mds:TADODataSet;Skip:integer):TGuid;
//mds - где ищем
//Skip - начиная с какой записи
//Sample.Text - образец для поиска
var cId:TGuid;
FLookupCursor: _Recordset;
Crit:string;
begin
cId:=NULLGUID;
try
Crit:=GetFilterStr(mds.FieldByName(mField),Sample.Text,true);
FLookupCursor := mds.Recordset.Clone(adLockReadOnly);
FLookupCursor.Find(Crit,Skip,adSearchForward,0);
if not FLookupCursor.EOF then
begin
if assigned(mds.BeforeScroll) then mds.BeforeScroll(mds);
mds.Recordset.Bookmark := FLookupCursor.Bookmark;
mds.Resync([rmExact, rmCenter]);
if assigned(mds.AfterScroll) then mds.AfterScroll(mds);
cId:=GetId(mds); //Получить значение ключевого поля из mds (собственная)
end;
except
end;
FLookupCursor:=nil;
if isEqualGuid(cId,NULLGUID) then //Для int - cId=0 <невозможное значение>
begin
self.findResult.Caption:='Ненашли';
self.Sample.SetFocus;
self.Sample.SelectAll;
end
else
begin
self.findResult.Caption:=mds.fieldByName(mField).Text;
self.butFindNext.SetFocus;
end;
Result:=cId;
end;
По идее все происходит на клиенте. Сервер отдыхает.
Интерфейс _Recordset подсмотрен в MS Access 2000 (его справка).
А вообще полезно лазить по VCL - много интересного...
sniknik (2007-09-18 13:23:00) [2]> Куда этот код вставить?
читать надо тщательней... см. [6], если бы прочитал,, и вник, вопроса бы не возникло.
а если ещё и последуешь совету и действительно выкинешь... то не возникнет ещё и некоторых проблем в будущем.
NewQuas (2007-09-18 11:26:00) [3]select id
from mybase
where name = :Pers_Name and
fam = :Pers_Fam
Куда этот код вставить?
Desdechado (2007-09-17 21:17:00) [4]> Первичный ключ - есть номер записи (счетчик)
Большое заблуждение. Если запись будет удалена, то дырка в нумерации останется. Какой тогда это нафиг номер?
engine (2007-09-17 15:17:00) [5]select id
from mybase
where name = :Pers_Name and
fam = :Pers_Fam
MyDataSet.ParamByName('Pers_Name').Value := 'Иван';
MyDataSet.ParamByName('Pers_Fam').Value := 'Иванов';
NewQuas (2007-09-17 15:11:00) [6]Первичный ключ - есть номер записи (счетчик), необходимо найти номера записей в которых Name=Ivan Fam=Ivanov. Скажите, как?
Desdechado (2007-09-17 10:32:00) [7]Забудь про номер записи. Нет такого понятия в СУБД. Это воспаленное бумагой воображение.
Номер может быть только в выборке данных и то, в основном, для печати.
А в БД нужно работать по первичным ключам.
DVM (2007-09-16 23:02:00) [8]
> hgd (15.09.07 10:46)
Во-первых, выкинь AdoTable и возьми AdoDataSet.
Во-вторых, лучше все же искать посредством SQL запросов.
Anatoly Podgoretsky (2007-09-16 22:12:00) [9]> hgd (16.09.2007 21:53:03) [3]
Какой еще такой номер записи, изыди сатана.
YurikGL (2007-09-16 22:12:00) [10]Select * from ... where Name = "Vasia"... найдет тебе все нужные записи...
hgd (2007-09-16 21:53:00) [11]А как быстро найти номер записи в которой Fam=Ivanov и Name=Vasia?
Savek (2007-09-15 11:40:00) [12]ADOTable1.Filter:='[Name]='''Vasia'''';
ADOTable1.Filtered:=true;
Anatoly Podgoretsky (2007-09-15 11:01:00) [13]> hgd (15.09.2007 10:46:00) [0]
После Locate следующие записи ищутся с помощью NEXT и проверкой на тоже условие.
Но может тебе лучше воспользоваться выборкой и в ней выбрать всех Vasia