Форум: "Начинающим";
Текущий архив: 2006.02.19;
Скачать: [xml.tar.bz2];
ВнизТакая вот проблемка... Найти похожие ветки
← →
dera (2006-01-31 19:17) [0]Использую метод Table.Locate для поиска записи. Но когда запись находится, надо, чтоб поиск происходил дальше (курсор не перемещался на первую запись) по нажатию на батон. Но по нажатию на батон, вызывается этот же метод и поиск начинается сначала. Как продолжить поиск?
← →
dera (2006-01-31 19:50) [1]Как пройтись в таблице по всем заданым записям? Например, надо найти в поле FAM значение "Иванов". Но программа должна найти первую запись и установить на ней курсор, по нажатию на батон, найти вторую запись, установить на ней курсор, по нажатию на батон - третью и т.д. - до последней записи.
← →
Desdechado © (2006-01-31 21:07) [2]на батоне
while not table.eof do
begin
проверить условие "иванов", если да, то break
next;
end;
locate, как в справке и написано, ищет первую подходящую запись, а не все подряд
← →
dera (2006-02-01 11:33) [3]спасибо за ответ. А как при этом проверить частичное совпадение? Например, прийтись по всем записям, что начинаются на "ИВАН".
← →
msguns © (2006-02-01 11:49) [4]
function DBServ_SearchRecordByField(Grid: TDBGrid; Option: TSearchOption; RaiseErr: boolean): boolean;
// Функция ищет запись в открытом НД, отображаемом в гриде по значению текущего поля
// (колонки грида) в напрвлении, указанном Option
var
bm: TBookMark;
val: variant;
DS: TDataSet;
begin
result := false;
if not Grid.Focused then exit;
DS := Grid.DataSource.DataSet;
if (DS=nil) or not DS.Active or (DS.RecordCount<2) then exit;
Screen.Cursor := crHourGlass;
DS.DisableControls;
DS.Tag := 1;
bm := DS.GetBookmark;
val := Grid.SelectedField.Value;
if Option=soFirst then
begin
if DS.Locate(Grid.SelectedField.FieldName,Grid.SelectedField.Value,[]) then
begin bm := DS.GetBookmark; result := true; end;
end
else
if Option in [soNext,soLast] then
begin
DS.Next;
while not DS.Eof do
begin
if Grid.SelectedField.Value=val then
begin
result := true;
bm := DS.GetBookmark; // Запомнить последнюю найденную
if Option=soNext then break;
end;
DS.Next;
end;
end
else
begin
DS.Prior;
while not DS.Bof do
begin
if Grid.SelectedField.Value=val then
begin
result := true;
bm := DS.GetBookmark; // Запомнить первую найденную
break;
end;
DS.Prior;
end;
end;
DS.Tag := 0; DS.EnableControls; DS.GotoBookmark(bm); DS.FreeBookmark(bm);
Screen.Cursor := crDefault;
if not result and RaiseErr then ShowMessage("Образец не найден");
end;
Для частичного совпадения вместо
if Grid.SelectedField.Value=val then
кодировать :
1) Чтобы найти начинающееся на <образец>
if Copy(Grid.SelectedField.Value,1,Lenght(val))=val then
2) Чтобы найти содержащее <образец> в любой части выражения
if pos(val,Grid.SelectedField.Value)>0 then
Для того, чтобы игнорировать регистр, в 1) и 2) надо доп-но использовать функцию приведения AnsiUpper|LowerCase
Это для поиска первой или очередной (вперед или назад).
Для поиска всех, удовлетворяющих заданному условию, используют динамически созданные запросы (TXXQuery), результаты которых помещают в отдельные списки (TListVeiw,TStringList,..) и показывают пользователю, который может, щелкнув на любой отобранной записи, увидеть ее полный вид в основной решетке (прграмма по клику должна найти в осн.датасете запись, соотв-ю выьбранному элементу списка, обычно методом Locate(<UID>).
В зависимости от полноты совпадения и учета регистра запрпос на выборку содержит соответствующие условия-функции языка SQL
← →
dera (2006-02-01 12:03) [5]<msguns © (01.02.06 11:49) [4] >
Хотя не все пока и понятно, но большое спасибо, за ответ!
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.02.19;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.033 c