Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.25;
Скачать: [xml.tar.bz2];




Вниз

ADO Problem 


Sam   (2002-04-03 16:31) [0]

Привет уважаемый All. Есть такой вопрос: необхоимо отсортировать TADOTable, подключенный к файлу *.mdb через Microsoft Jet OLEDB 4.0 со свойством CursorLocation=clUseServer. Установка свойства IndexName на порядок записей не влияет.



sniknik   (2002-04-03 16:34) [1]

У ADODataSet есть свойство Sort. (и не только у него). ADOTable не рекомендуют к использованию (типа морально устарел), почему для меня загадка.



roottim   (2002-04-03 16:42) [2]

>CursorLocation=clUseServer
нет тут сервера и НД формируется только на клиенте... с эти свящзаны и все другие пораждаемые этой оацией баги!..
измени!, и думаю все вылечится



Delirium   (2002-04-03 16:44) [3]

Использовать SQL и TADOQuery, ибо TADOTable - компонент, созданный, на мой взгляд, для облегчения прехода с BDE (TTable) на ADO.



sniknik   (2002-04-03 16:52) [4]

для информации у ADOTable тоже есть свойство Sort .....



Delirium   (2002-04-03 17:01) [5]

ADO-шный Sort - это, в конечном счёте, метод COM-объекта "ADODB.RecordSet", который работает вкупе с OLE DB провайдером и сортирует уже полученную, локальную (CursorLocation=clUseClient) выборку (_RecordSet). Таким образом использование Sort - не есть order by. Следоватьельно, если CursorLocation=clUseServer, то Sort не подходит по определению :)



sniknik   (2002-04-03 18:03) [6]

само собой не одно и тоже. но если ему нужен видимый результат то почему нет. очень удобно и довольно быстро 6000 записей не успеваю заметить как по другому столбцу пересортируется.
на ADOConnection CursorLocation=clUseServer на ADODataSet CursorLocation=clUseClient стоит.



Sam   (2002-04-03 19:34) [7]

Дело в том, что метод Sort для ADOTable с CursorLocation = clUseServer not supported provider, а мне необходим именно ADOTable для редактирования полей прямо из DBGrid"а и именно clUseServer, т.к.
1. clUseClient не работает с полями типа "Счетчик"
2. ADOTable работает с таблицей, изменения в которой должны быть видны сразу же для другого ADOTable, ссылающегося на эту же таблицу (объеденить обоих тэйблов в один нельзя)



sniknik   (2002-04-03 20:20) [8]

вот что в голову пришло. может у тебя изза clUseServer не сразу изменения видны после изменения IndexName (у ADODataSet принудительное обновление - Requery кстати у ADOTable тоже есть. 8-) можно еще Refresh попробовать.
но если это изза этого то и для другой таблици надо будет делать чтобы она эти изменения тоже схватила.

и еще я видел в Delphi пример связывающий два ADODataSet-а
и вроде бы там все менялось одновременно.
(Delphi шестой)



Sam   (2002-04-03 21:32) [9]

Фишка в том, что Refresh и Requery перечитывает записи с сервера и если CursorLocation=clUseClient, то пока ты не закроешь набор данных он не обновится на сервере (я пока еще не нашел как это сделать иным способом). При clUseServer обновление происходит сразу в двух наборах, ссылающихся на одну таблицу, но один из них надо отсортировать, что я ну никак не могу сделать.
IndexName я задаю до открытия набора данных, а открывая набор обнаруживаю, что он совсем не отсортирован.



sniknik   (2002-04-04 10:35) [10]

ясно. попытался воспроизвести ситуацию (поставил Table вместо DataSet) и выставил clUseServer. открыл таблицу в mdb и попытался изменить индекс (в десигн тайме), первый поставился но изменений не произошло как ты и говорил при изменении на второй (на открытой таблице) выдало следующее

Current provider does not support the necessary interface for Index functionality.



sniknik   (2002-04-04 10:47) [11]

посмотри пример ShapeDemo в дельфийской директории demos\ado\shape. там два датасета из mdb связываются может это тебе пойдет. (если в пятом этого примера нет могу выслать, без гарантий на работоспособность :-)



wicked   (2002-04-04 12:20) [12]

2 Sam ©

> Фишка в том, что Refresh и Requery перечитывает записи с
> сервера и если CursorLocation=clUseClient, то пока ты не
> закроешь набор данных он не обновится на сервере

никогда в жизни... это забота ADO - синхронизировать записи в локальном курсоре и на сервере...



Sam   (2002-04-04 12:33) [13]

Поставлю сегодня Delphi 6. Пора уже посмотреть, что это за чудо Borland"а. Заодно и ADO-шные exampl-ы гляну. Но мне уже кажется, что отсортировать набор со стороны Delphi с clUseServer просто логически невозможно.



sniknik   (2002-04-04 13:23) [14]

поставиш обязательно апдейт сделай файл D6_upd1_ent.exe 28mg(откудато скачал не помню). избавишся от многих гемороев с ADO (Delphi меняются они остаются :-).



aus   (2002-04-04 15:10) [15]

2 Sam
Так и не понял, почему тебе не заменить Table на Query.
CursorLocation = clUseServer, CursorType = ctKeySet, отсортируй с помощью SQL, все изменения видны сразу после перехода на другую запись.



kig   (2002-04-04 15:52) [16]

2Sam © (03.04.02 21:32)

Фишка в том, что Refresh и Requery перечитывает записи с сервера и если CursorLocation=clUseClient, то пока ты не закроешь набор данных он не обновится на сервере (я пока еще не нашел как это сделать иным способом). При clUseServer обновление происходит сразу в двух наборах, ссылающихся на одну таблицу, но один из них надо отсортировать, что я ну никак не могу сделать...

Как Вам ранее заметил Delirium © (03.04.02 17:01) - сортировка адошного набора данных возможна только при при клинтском курсоре (как в прочем, и фильтрация) (MSDN):

Remarks
This property requires the CursorLocation property to be set to adUseClient. A temporary index will be created for each field specified in the Sort property if an index does not already exist.


Если Вы будете работать с серверным курсором, то Вы не сможете получить ту функциональность, которая Вам нужна, без переоткрытия соритируемого нд с необходимым условием Order By в select.

Если Вы будете работать с клиентским курсором, то в этом случае:

1. (Sam © (03.04.02 21:32) Фишка в том, что Refresh и Requery перечитывает записи с сервера и если CursorLocation=clUseClient, то пока ты не закроешь набор данных он не обновится на сервере (я пока еще не нашел как это сделать иным способом).) - у адошного рекодсета есть метод UpdateBatch - он отправляет изменения в провайдер OLE DB...

2. Посмотрите в MSDN метод Resync - возможно он поможет Вам с полями-счетчиками при клиентском рекодсете.

3. Если у Вас уже есть один клиентский адо-рекодсет, а Вы хотите получить такой-же, но с возможностью другой сортировки и/или фильтации - используйте клонирование (MSDN):

Clone Method
Creates a duplicate Recordset object from an existing Recordset object. Optionally, specifies that the clone be read-only.

Syntax
Set rstDuplicate = rstOriginal.Clone (LockType)
Return Value
Returns a Recordset object reference.

Parameters
rstDuplicate
An object variable that identifies the duplicate Recordset object to be created.
rstOriginal
An object variable that identifies the Recordset object to be duplicated.
LockType
Optional. A LockTypeEnum value that specifies either the lock type of the original Recordset, or a read-only Recordset. Valid values are adLockUnspecified or adLockReadOnly.
Remarks
Use the Clone method to create multiple, duplicate Recordset objects, particularly if you want to maintain more than one current record in a given set of records. Using the Clone method is more efficient than creating and opening a new Recordset object with the same definition as the original.

The Filter property of the original Recordset, if any, will not be applied to the clone. Set the Filter property of the new Recordset in order to filter the results. The simplest way to copy any existing Filter value is to assign it directly, like this: rsNew.Filter = rsOriginal.Filter

The current record of a newly created clone is set to the first record.

Changes you make to one Recordset object are visible in all of its clones regardless of cursor type. However, after you execute Requery on the original Recordset, the clones will no longer be synchronized to the original.

Closing the original Recordset does not close its copies, nor does closing a copy close the original or any of the other copies.


Советую Вам посмотреть в MSDN описание ADODB - будет проще понять, что там делает дельфийская обертка вокруг этих объектов.



Sam   (2002-04-04 16:14) [17]

Спасибо всем за дискуссию. Поговорил сегодня с заказчиком и кое-что поменяю в логике работы программы, вообщем проблема исчезла на данном этапе. Но вообще то обязательно загляну в MSDN и поэкспериментирую, когда бут побольше свободного времени.




Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.25;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.76 MB
Время: 0.023 c
6-81015           Eraser                2002-02-12 13:01  2002.04.25  
Как лучше сделать


14-81058          Somebody_             2002-03-20 11:31  2002.04.25  
новый трейд ПРО ЭТО.....


1-80962           pls                   2002-04-12 10:50  2002.04.25  
TControl.Hint???


1-80848           Ник                   2002-04-12 22:00  2002.04.25  
Не могу разобраться


14-81065          Ajax                  2002-03-19 19:28  2002.04.25  
Delphi 5 и WinXP