Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.10.14;
Скачать: CL | DM;

Вниз

Поиск по базе   Найти похожие ветки 

 
hgd   (2007-09-15 10:46) [0]

Подскажите, начал осваивать работу с базой данных и не нашел способ поиска в таблице ADOTable. Есть описание Locate, lookup но они находят только единичные записи, а мне необходимо перебрать все данные таблицы. Что надо использовать, чтобы найти все записи, где поле базы Name = Vasia?


 
Anatoly Podgoretsky ©   (2007-09-15 11:01) [1]

> hgd  (15.09.2007 10:46:00)  [0]

После Locate следующие записи ищутся с помощью NEXT и проверкой на тоже условие.
Но может тебе лучше воспользоваться выборкой и в ней выбрать всех Vasia


 
Savek   (2007-09-15 11:40) [2]

ADOTable1.Filter:="[Name]="""Vasia"""";
ADOTable1.Filtered:=true;


 
hgd   (2007-09-16 21:53) [3]

А как быстро найти номер записи в которой Fam=Ivanov и Name=Vasia?


 
Anatoly Podgoretsky ©   (2007-09-16 22:12) [4]

> hgd  (16.09.2007 21:53:03)  [3]

Какой еще такой номер записи, изыди сатана.


 
YurikGL ©   (2007-09-16 22:12) [5]

Select * from ... where Name = "Vasia"... найдет тебе все нужные записи...


 
DVM ©   (2007-09-16 23:02) [6]


> hgd   (15.09.07 10:46)  

Во-первых, выкинь AdoTable и возьми AdoDataSet.
Во-вторых, лучше все же искать посредством SQL запросов.


 
Desdechado ©   (2007-09-17 10:32) [7]

Забудь про номер записи. Нет такого понятия в СУБД. Это воспаленное бумагой воображение.
Номер может быть только в выборке данных и то, в основном, для печати.
А в БД нужно работать по первичным ключам.


 
NewQuas   (2007-09-17 15:11) [8]

Первичный ключ - есть номер записи (счетчик), необходимо найти номера записей в которых Name=Ivan Fam=Ivanov. Скажите, как?


 
engine ©   (2007-09-17 15:17) [9]

select id
from mybase
where name = :Pers_Name and
     fam = :Pers_Fam

MyDataSet.ParamByName("Pers_Name").Value := "Иван";
MyDataSet.ParamByName("Pers_Fam").Value :=  "Иванов";


 
Desdechado ©   (2007-09-17 21:17) [10]

> Первичный ключ - есть номер записи (счетчик)
Большое заблуждение. Если запись будет удалена, то дырка в нумерации останется. Какой тогда это нафиг номер?


 
NewQuas   (2007-09-18 11:26) [11]

select id
from mybase
where name = :Pers_Name and
    fam = :Pers_Fam

Куда этот код вставить?


 
sniknik ©   (2007-09-18 13:23) [12]

> Куда этот код вставить?
читать надо тщательней... см. [6], если бы прочитал,, и вник, вопроса бы не возникло.
а если ещё и последуешь совету и действительно выкинешь... то не возникнет ещё и некоторых проблем в будущем.


 
Omi ©   (2007-09-18 15:28) [13]

Свирепые вы, ребята. Заниматься ПОЛЬЗОВАТЕЛЬСКИМ поиском средствами самого 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 - много интересного...



Страницы: 1 вся ветка

Текущий архив: 2007.10.14;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.029 c
2-1190029186
bss
2007-09-17 15:39
2007.10.14
Сохранение рисунка в BLOB-поле


15-1190039441
Azize
2007-09-17 18:30
2007.10.14
Задача на сообразительность


1-1185656188
B. C.
2007-07-29 00:56
2007.10.14
Инсталляция Дельфи приложения использующего Oracle БД


2-1189951828
Serega99
2007-09-16 18:10
2007.10.14
sleep( )


3-1181379653
Девушка
2007-06-09 13:00
2007.10.14
странное поведение interbase?