Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Поиск по базе [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


Наверх

Титульная страница Поиск, карта сайта Написать письмо