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

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

Как установить курсор в TTable на определенную запись ?


Страницы:   1 2 3 4 5

Kostafey ©   (2008-05-02 17:30:00) 

Сначала вопрос казался глупым...

function Locate(...
Searches the dataset for a specified record and makes that record the current record.
Попробовал - находит-то запись он находит, а курсор не устанавливает.

FindKey или EditKey & GotoKey требуют чтобы поле было индексированным,
но в моем случае это не так.

P.S.
Использование возможностей СУБД и SQL по ряду причин
нежелательно. Требуется именно установить курсор в TTable.

Как проше всего это сделать?


MsGuns   (2008-05-03 19:11:00) [21]

>Kostafey ©   (03.05.08 19:03) [71]

Вам уже было выше указано, что

- во-первых, нигде из кода неясно, был ли успешен поиск по Locate
- во-вторых, метод Locate у TTable не "датасетовский", а "бидешный" (т.е. TBDEDataSet), а посему возможно надо искать причину в нем, а именно в его затруднении однозначно идентифицировать записи, полученные из "неродного" источника. Либо перестать ездить задом наперед и использовать "родные" компоненты для доступа к серверу.
- в-третьих, ничего гнизвестно ни про типы полей вашего НД, ни про возможность наличия "пустых" (NULL) значений. Это немаловажный момент, т.к. хорошо известно что данные на сервере - одно, они же в дельфи - другое, а в интерпретации программиста - третье.


Kostafey   (2008-05-03 19:03:00) [22]

> [70] Плохиш ©   (03.05.08 18:39)

palva ©   (03.05.08 08:57) [67]

Вот что господа, не согласен я с вами.
Обратите внимание на начало ветки - фактически цитирование
хелпа.

Есть еще "пара" моментов которые я объяснить не смогу,
ибо от предыдущих объяснений уже устал.


Плохиш   (2008-05-03 18:39:00) [23]


> palva ©   (03.05.08 08:57) [67]
> Мне вот что странно. Почему VCL позиционируется как логичная
> и удобная система? Почему постоянно советуют - читайте хэлп
> - и в то же время для того, чтобы воспользоваться компонентом,
>  описанным в документации, требуется помощь и доброжелательное
> расположение духа какого-то Николая или какого-то Александра?

После прочтения хелпа, обычно ничьей помощи уже не требуется. Все вопросы возникающие здесь происходят от нежелания что-либо читать, а желания готового кода, да ещё и с описанием.


MsGuns   (2008-05-03 18:20:00) [24]

>Германн ©   (03.05.08 01:48) [64]
>Вся необходимая (и естественная для ADO функциональность) реализована в TADODstaSet и в "урезанном" его варианте TADOCommand

Во-первых, не вся. В частности, есть еще TADOConnection, у которого достаточно общирная собственная функциональность.

Во вторых, TADOCommand вовсе не "урезанный", и совсем не "вариант" TADODataSet. Это просто другой класс. Хотя во многих случаях может использоваться вместо TADODataSet, как, впрочем, и наоборот.


sniknik   (2008-05-03 11:30:00) [25]

> Мне вот что странно. Почему VCL позиционируется как логичная и удобная система?
потому, что она такая и есть, логичная и удобная, если делать все по правилам/хелпу. а если нет... машина вон тоже крайне неудобное средство передвижения если ездить на задней скорости и только по встречной полосе.

> то я уж лучше перейду на АДО НЕТ. Сдается мне, это попроще будет.
не работал пока, но уверен там тоже есть свои нюансы... и если с их помощью попробовать работать также как с BDE, с каким нибудь парадоксом... проблем не оберешься.

> приятнее, работать на логичной и прозрачной системе.
всем приятнее. проблема только в том, что сложных систем с претензией на универсальность таких не бывает... есть общая логика, но применительно к нелогичной ситуации (система то "универсальна" должна работать и с ней) начинает "хромать".

и кстати вспомнил про АДО НЕТ, был тут вопрос про его функции (функции в запросе) которые работают в нем и не работают в простом ADO. и что это значит? -> попытка универсализировать сам sql в net и не зависеть от sql-я движка... не видиш сдесь проблем? например в падении производительности. или в том что затруднится использование возможностей именно самого движка программистом, в изучении (и путанице между ними) двух моделей, прослойки (net) и движка базы (если конечно хочеш пользоваться полными возможностями).


palva   (2008-05-03 08:57:00) [26]

Мне вот что странно. Почему VCL позиционируется как логичная и удобная система? Почему постоянно советуют - читайте хэлп - и в то же время для того, чтобы воспользоваться компонентом, описанным в документации, требуется помощь и доброжелательное расположение духа какого-то Николая или какого-то Александра? А если еще учитывать связанный с этим риск подвергнуться джихаду...

Я ветку пробежал бегло, почти не понимая. И сложилось впечатление какой-то черной магии. Можно, конечно, разобраться во всем этом самому, почитать исходники, погонять примеры. И любители подобных занятий, конечно найдутся. Существуют же люди, изучающие, теорию шахматных дебютов или кубик Рубика. Но у меня даже желания разобраться во всем этом не возникло. Освоил я несколько тропинок через этот лес и хватит с меня. А если возникнет нужда с этих тропинок сойти, то я уж лучше перейду на АДО НЕТ. Сдается мне, это попроще будет. А для меня, как для математика к тому же и приятнее, работать на логичной и прозрачной системе.


Германн   (2008-05-03 03:08:00) [27]


> sniknik ©   (03.05.08 02:39) [65]
>
> > Поэтому в них много лишнего, "не родного".
>

Хм. В следущий раз в ответе ограничусь в определениях.


sniknik   (2008-05-03 02:39:00) [28]

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

а лишнего там практически ничего нет, урезано только, в TADOQuery есть минимальная вставка (SQL, ExecSql) и даже с ними, такой мелочью, путаница (в основном начинающим) и поначалу глюки в реализации были (исправили после).

кстати упоминавшиеся уже dblinks (вернее sql links. посмотрел) примерно та же самая попытка притянуть (за уши ;)) "не родную" логику только уже с "другой стороны". хотя тут, имхо, у них лучше получилось, если не пользоваться TTable при работе с "линками" то практически все нормально. то, основанием чего стала данная ветка редкость, и при правильной структуре базы даже и не возникло бы.


Германн   (2008-05-03 01:48:00) [29]


> Kostafey ©   (03.05.08 01:35) [63]
>
> > [62] Германн ©   (03.05.08 01:06)
>
> Пасибо, познавательно.
> Но вот интересно это логические выводы их собственно
> опыта или просто религиозный джихад? :)

Это логические выводы. Причём в основном не мои. И в основном это выводы Николая и других знатоков работы с базами. (Ну и я когда мне понадобилось поработать с ADO тоже кой-чего лично понял). Дело не столько в глюках, сколько в возможности их наличия. Ведь TADOQuery и TADOTable были разработаны для идиотов. Вся необходимая (и естественная для ADO функциональность) реализована в TADODstaSet и в "урезанном" его варианте TADOCommand. А TADOQuery и TADOTable, насколько я понял, были разработаны для того, чтобы перевод уже имеющейся программы с BDE на ADO можно было бы выполнить простой заменой компонент TTable и TQuery соответственно на TADOTable и TADOQuery и ни о чём более не думать. Поэтому в них много лишнего, "не родного".


Kostafey   (2008-05-03 01:35:00) [30]

> [62] Германн ©   (03.05.08 01:06)

Пасибо, познавательно.
Но вот интересно это логические выводы их собственно
опыта или просто религиозный джихад? :)

Да, ну всетретил я пару глюков в TADOQuery,
было дело, заменил TADODstaSet - все пошло...


Германн   (2008-05-03 01:06:00) [31]


> Kostafey ©   (02.05.08 18:32) [39]
>
> > [37] Palladin ©   (02.05.08 18:25)
> > это.... это sniknik... кровавый убийца, объявивший джихад
> > TADOQuery и TADOTable...
>
> Если он уж TADOQuery и TADOTable "не жалует",
> то что он сделает со мной за TTable? :)))
>

Да ничего он особого не сделает за TTable. TTable в отличие от TADOQuery и TADOTable вполне нормальный компонент. Родной для BDE. А вот два других вышеназванных - это "ублюдки" (bastards) на родном языке их авторов.


Anatoly Podgoretsky   (2008-05-02 22:01:00) [32]


> Если он уж TADOQuery и TADOTable "не жалует",
> то что он сделает со мной за TTable? :)))

Тебе лучше не знать.


Kostafey   (2008-05-02 19:50:00) [33]

> опять пробуешь у себя в проекте... в примере, смена движка
> на MSSQL-ый ничего в поведении не меняет.
> как стояло к примеру на 3-й записи, так и остается. на 1-
> ю не перескакивает. и true не возвращает.

Не-а, не в проекте. Тут же в "хеллоуворде".
При смене СУБД НА SQL Server (подключение аналогично через ODBC)
поведение Table1.Locate действительно меняется:

1 Отрабатывает TForm1.Table1AfterScroll(DataSet: TDataSet);
2 Курсор устанавливается с 1-ю запись.
3 Table1.Locate('ind1', '4', []) возвращает true


sniknik   (2008-05-02 19:42:00) [34]

> Забыл сказать TForm1.Table1AfterScroll(DataSet: TDataSet);
> в этом случае сработает Table1.Locate
> установив в 1-ю запись.
опять пробуешь у себя в проекте... в примере, смена движка на MSSQL-ый ничего в поведении не меняет.
как стояло к примеру на 3-й записи, так и остается. на 1-ю не перескакивает. и true не возвращает.


Kostafey   (2008-05-02 19:38:00) [35]

> [55] sniknik ©   (02.05.08 19:28)

Спасибо за глубокие разъяснения.

Благодарю всех участвоавших в обсуждении.

Пожалуй, вопрос закрыт.


Kostafey   (2008-05-02 19:33:00) [36]

> Далее, подключаемся к MS SQL Server 2000.

Забыл сказать TForm1.Table1AfterScroll(DataSet: TDataSet);
в этом случае сработает Table1.Locate
установив в 1-ю запись.


Kostafey   (2008-05-02 19:29:00) [37]

> [54] Kostafey ©   (02.05.08 19:17)

А!!!
Врубился.

Если подключение осуществляется к Access,
то
if Table1.Locate('ind1', '4', []) then
 ShowMessage('true')
else
 ShowMessage('false');

верет false.
TForm1.Table1AfterScroll(DataSet: TDataSet);
не отработает на Table1.Locate

если впереди добавить Table1.FetchAll;
будет работать. Правда из НД
исчезают все записи идущие ниде найденной.

Далее, подключаемся к MS SQL Server 2000.
на вопрос
if Table1.Locate('ind1', '4', []) then
 ShowMessage('true')
else
 ShowMessage('false');

отвечает true,
но курсоп на найденную запись не позиционирует.
Запись Table1.FetchAll; ничего не меняет.

вот.


sniknik   (2008-05-02 19:28:00) [38]

и правильно возвращает заметь.

без ключевого поля, dblink (или через что там работает BDE с внешними sql движками)  просто не может спозиционироваться на нужную запись, даже если ее найдет. поэтому даже не пытается...
добавь в таблицу ключевой поле (автоинкремент например) и ничего больше не меняя попробуй тот же пример... найдет. также как если поменять движок на найтивный (там где RecNo чтото значит) тоже найдет, тут уже даже без ключа. т.к. позицию может и по номеру строки установить.


Kostafey   (2008-05-02 19:17:00) [39]

> [52] sniknik ©   (02.05.08 19:14)

гм странно и так
if Table1.Locate('ind1', 4, []) then
и так
if Table1.Locate('ind1', '4', []) then
 ShowMessage('true')
else
 ShowMessage('false');

возвращает false


Kostafey   (2008-05-02 19:15:00) [40]

> [50] sniknik ©   (02.05.08 19:05)

Гм. тут действительно возвращает false...


Страницы:   1 2 3 4 5

Наверх

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