Форум: "Начинающим";
Текущий архив: 2007.10.14;
Скачать: [xml.tar.bz2];
ВнизПоиск по базе Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.039 c