Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > [BCB6] ADOTable, ограниченный Поиск


Автор: XPyCT 21.4.2009, 15:12
В переменную cLocate заносится имя поля в котором производится поиск!

к примеру в таблице 5 записей  по названием  Васечкин! если даю найти то находит только первого из них и остновка, сколько бы не кликал результат тот же!

Код

void __fastcall TfmGlavnoe::Button1Click(TObject *Sender)
{
ADOTable1->Locate(cLocate,Edit1->Text,TLocateOptions());
}
//---------------------------------------------------------------------------


как выполнить чтоб при клике переходил к следующей записи?
за ранее сорри и спасибо!

Автор: A5uKa 21.4.2009, 15:14
TLocateOptions() ?

Автор: XPyCT 21.4.2009, 15:17
Цитата(A5uKa @ 21.4.2009,  15:14)
TLocateOptions() ?

а что вас смущает?

по событию  DBGrid1CellClick я получаю на каком столбце(имя) был клик  за тем в глобальную переменную AnsiStrin (cLocate) я заношу это имя вот так:
Код

void __fastcall TfmGlavnoe::DBGrid1CellClick(TColumn *Column)
{
int indexcell;
indexcell= DBGrid1->SelectedIndex+1;
cLocate=ADOTable1->FieldList->Strings[indexcell];
}


далее уже идет поиск как описано выше: при нажатии на кнопку
Код

void __fastcall TfmGlavnoe::Button1Click(TObject *Sender)
{
ADOTable1->Locate(cLocate,Edit1->Text,TLocateOptions());
}


Автор: Лапоть 21.4.2009, 15:19
ИМХО, конечно, но советую забыть про все эти табловые забавы, перейти на TADOQuery и освоить SQL!

Автор: mrbrooks 21.4.2009, 15:20
XPyCT, а почему бы не решить данную задачу с помощью достаточно простого SQL-запроса?

Цитата(XPyCT @  21.4.2009,  15:12 Найти цитируемый пост)
если даю найти то находит только первого из них и остновка

по логике вещей так и должно быть, то бишь метод работает только с первым вхождением записи в наборе данных

Цитата(XPyCT @  21.4.2009,  15:17 Найти цитируемый пост)
а что вас смущает?

это множество кстати обладает рядом полезных элементов

Автор: XPyCT 21.4.2009, 15:33
Цитата(mrbrooks)
--


дык есть ли возможность осуществить сие действие по средством адотабле! - дабы не воротить еще оджну форму для квери?

Автор: mrbrooks 21.4.2009, 15:41
Цитата(XPyCT @  21.4.2009,  15:33 Найти цитируемый пост)
дабы не воротить еще оджну форму для квери?

зачем?

Цитата(XPyCT @  21.4.2009,  15:33 Найти цитируемый пост)
дык есть ли возможность осуществить сие действие по средством адотабле! 

да хз. думаю, что можно конечно - но это как-то не по-людски.

Автор: vikaz 21.4.2009, 18:11
Цитата(XPyCT @  21.4.2009,  15:33 Найти цитируемый пост)
дык есть ли возможность осуществить сие действие по средством адотабле! - дабы не воротить еще оджну форму для квери?

А зачем тебе новая форма, замени Table на Query и работай. Но если тебе надо добавлять какие-то значения в базу, то желательно к этому делу подключить Command.

Автор: mrbrooks 22.4.2009, 08:35
Цитата(vikaz @  21.4.2009,  18:11 Найти цитируемый пост)
Но если тебе надо добавлять какие-то значения в базу, то желательно к этому делу подключить Command. 

А чем плох TQuery для этих целей?

Автор: Лапоть 22.4.2009, 09:21
mrbrooks,  тут - на вкус, на цвет... У меня как-то традиционно уже сложилось - создание таблиц делаю через ADOCommand, запросы на выборку - ну тут всё понятно, а запросы на модификацию - зависит от того, есть ли уже в проекте ADOCommand.

Автор: vikaz 22.4.2009, 09:24
Цитата(mrbrooks @  22.4.2009,  08:35 Найти цитируемый пост)
А чем плох TQuery для этих целей? 

Он не плох, просто при добавлении значения в базу он выдает у меня предупреждение, что нет данных для вывода. Но это сообщение появляется только при проектировании и в скомпилированном проекте оно не появляется. smile 

Автор: A5uKa 22.4.2009, 09:56
Цитата(vikaz @ 22.4.2009,  09:24)
Цитата(mrbrooks @  22.4.2009,  08:35 Найти цитируемый пост)
А чем плох TQuery для этих целей? 

Он не плох, просто при добавлении значения в базу он выдает у меня предупреждение, что нет данных для вывода. Но это сообщение появляется только при проектировании и в скомпилированном проекте оно не появляется. smile

такой же баг в 2009 ... не понимаю кстати почему.

Автор: vikaz 22.4.2009, 10:08
Цитата(A5uKa @  22.4.2009,  09:56 Найти цитируемый пост)
такой же баг в 2009 ... не понимаю кстати почему. 

Мне кажется это не баг. Просто это компонента рассчитана на то, чтобы в основном выполнять команды которые возвращают какое-то значение из базы (select). Может быть он таким предупреждением просто дает понять, нечего отображать и думает, наверное, что это ошибка.

Автор: Лапоть 22.4.2009, 10:47
А у него нет некоего свойства типа - Предупреждать о...?
ЗЫ - речь о чём - о TQuery, или о TADOQuery?

Автор: vikaz 22.4.2009, 11:27
не знаю, не находил, может и нет такого, а может плохо искал  smile 

Автор: Palladin 23.4.2009, 15:02
А можно ли посмотреть код Locate???? Если можно, то вырываем код, создаем массив типа инт, туда при первом клике заносим индекс строки, и просто при втором нажатии пропускаем!?
Если нет и нехочешь менять компоненты и т.д. придется поднапрячся и написать самому собственную функцию ХрустLocate.
Ток кажется это скажется на скорости поиска. 
код что-то типа:
Код

ищем первую подходящую;
i=номер найденной строки;
L=флаг;
for(int t:=1;t<=k;t++)
if(a[t]=i) L=1;

if(L!=1)
{
ADOTable1.RecNo=i;
a[k]=i; k++;
}
когда поиск начинается по новому критерию, обнуляешь массив и переменные
}
 

Бред походу написал, но идея была smile 

Автор: XPyCT 23.4.2009, 19:26
Всем конечно спс! - но всетаки пришлось добавить на форму адоквери

и методом исключения уже работать! к сожалению цикл не подойдет! цикл хорош для не большик таблиц а если 10 тыщ записей это скоко ждать пока он обработает!
в общем решил так

Вот так находим нужных перцов! по клику на кнопке
а глобальную переменую- счетчик ClickButtonSearch инкремнтипую
Код


void __fastcall TfmGlavnoe::Button1Click(TObject *Sender)
{
ClickButtonSearch++;
String   SQL,textEdit;

textEdit=Edit1->Text;
ADOTable1->Active=false;
DataSource1->DataSet=Query;
Query->Active=false;
SQL = "Select id_abonament AS Абоенемент, fam as Фамилия, name as Имя, date_r As Дата_раждения,operator As Оператор,date_start As Начало _посещенияé from Abonament where fam='"+textEdit+"' or id_abonament='"+textEdit+"'";
 Query->SQL->Text = SQL;
 Query->Open();


}
//---------------------------------------------------------------------------





далее  уже когда найден наш персонаж можем и открыть форму с его данными вот так


опять же  смотрим в каком состоянии   ClickButtonSearch
Код

if(ClickButtonSearch== 0)
{
 idAbonament=ADOTable1->FieldByName("id_abonament")->AsString;
 imea=ADOTable1->FieldByName("name")->AsString;
 fam=ADOTable1->FieldByName("fam")->AsString;
 fmGlavnoe->Hide();
 fmVisit->ShowModal();
 }

 else
    {
 idAbonament=Query->Fields->FieldByNumber(1)->AsString;// ;  //Query->FieldByName("id_abonament")->AsString;
 imea=Query->Fields->FieldByNumber(2)->AsString;
 fam=Query->Fields->FieldByNumber(3)->AsString;
 fmGlavnoe->Hide();
 fmVisit->ShowModal();
    }


таким образом я отработал и адотабле  и адоквери



на закрытии формы все возвращаю на место к адотабле!



Код

 fmGlavnoe->Query->Active=false;
 fmGlavnoe->DataSource1->DataSet=fmGlavnoe->ADOTable1;
 fmGlavnoe->ADOTable1->Active=true;
 ClickButtonSearch=0;
 fmGlavnoe->Show();



всем огромный респект!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)