:: Visual Foxpro, Foxpro for DOS
Re: CursorAdapter и Refresh
olegov
Автор

Сообщений: 366
Откуда: Новосибирск
Дата регистрации: 17.12.2002
Еще в довесок... данные просматриваются на форме в grid. В него выведены поля id, code, idt2, code2 есть кнопочка для эксперимента, в ней по Click

thisform.dataenvironment.ca1.recordrefresh()
thisform.grid1.refresh


Если на серваке изменить значение поля idt2 в таблице t1 (скажем с другого клиента), то по этой кнопке поле idt2 обновляется, а вот code2 так и не хочет
Ratings: 0 negative/0 positive
Re: CursorAdapter и Refresh
MichaelD

Сообщений: 7578
Дата регистрации: 14.05.2005
Hi, olegov & All!

Цитата:
Для построения курсора я использую штатный построитель. Пример....
Думаю в твоём примере очень много если... и особенно
Цитата:
Еще в довесок... данные просматриваются на форме в grid.
Хорошо, пробую показать код, в котором эта проблема проявляется...

- в одном экзепляре VFP-среды запускаем что-нить типа этого:

SET EXCLUSIVE OFF
USE (HOME(2)+"northwind\customers.dbf") SHARED
BROWSE NORMAL NOWAIT
USE (HOME(2)+"northwind\orders.dbf") SHARED IN 0
SELECT orders
BROWSE NORMAL NOWAIT
SET ORDER TO TAG customerid
GO TOP
MOVE WINDOW orders CENTER
... здесь мы в SHARED режиме можем "произвольно редактировать" две талицы: customers.dbf и orders.dbf

- в другом экзепляре VFP-среды запускаем что-нить типа этого:

*SET STEP ON
CLEAR
LOCAL loConn AS ADODB.CONNECTION, ;
loRs AS ADODB.Recordset,;
loCommand AS ADODB.COMMAND, ;
loException AS EXCEPTION, ;
loCursor AS CURSORADAPTER, ;
country, ;
laErrors[1]
loConn = CREATEOBJECT('ADODB.Connection')
WITH loConn
*!* .ConnectionString = 'provider=SQLOLEDB.1;data source=localhost;' + ;
*!* 'initial catalog=Northwind;trusted_connection=yes'
.ConnectionString = 'provider=vfpoledb;data source=' + ;
HOME(2)+'northwind\Northwind.dbc'
TRY
.OPEN()
CATCH TO loException
MESSAGEBOX(loException.MESSAGE)
CANCEL
ENDTRY
ENDWITH
loCommand = CREATEOBJECT('ADODB.Command')
loCommand.ActiveConnection = loConn
loRs = CREATEOBJECT('ADODB.Recordset')
loRs.CursorLocation = 3 && adUseClient
loRs.LockType = 3 && adLockOptimistic
loRs.CursorType = 1 && adOpenKeyset
loCursor = CREATEOBJECT('CursorAdapter')
WITH loCursor
.ALIAS = 'Custom'
.DATASOURCETYPE = 'ADO'
* 'select * from customers where country=?lcCountry'
.SELECTCMD = ;
"SELECT Customers.customerid, Customers.companyname, Orders.orderid, ";
+ " Orders.shipname ";
+ " FROM ";
+ " Customers ";
+ " INNER JOIN Orders ";
+ " ON Customers.customerid = Orders.customerid ";
+ " WHERE Orders.customerid = ?lcCustomerid"
*.KeyFieldList = "customerid,orderid"
*.UpdatableFieldList = "companyname,shipname"
.DATASOURCE = loRs
.DATASOURCE.ActiveConnection = loConn
lcCustomerid = 'ALFKI'
llReturn = .CURSORFILL(.F., .F., 0, loCommand)
IF llReturn
* Во время этого просмотра в другом приложении
* измените customers.companyname для Customers.customerid = 'ALFKI'
* и Orders.shipname для Orders.customerid = 'ALFKI'
BROWSE && <- (1) -------------------------------
lnRefreshed = .RecordRefresh() && REFRESH()
IF lnRefreshed >= 0
* Здесь смотрим результат в первой записи
BROWSE && <- (2) -------------------------------
ELSE
AERROR(laErrors)
MESSAGEBOX(laErrors[2])
ENDIF
lcCustomerid = 'ANATR'
llReturn = .CURSORREFRESH()
IF llReturn
* Во время этого просмотра в другом приложении
* измените customers.companyname для Customers.customerid = 'ANATR'
* и Orders.shipname для Orders.customerid = 'ANATR'
BROWSE && <- (3) -------------------------------
lnRefreshed = .RecordRefresh() && REFRESH()
IF lnRefreshed >= 0
* Здесь смотрим результат в первой записи
BROWSE && <- (4) -------------------------------
ELSE
AERROR(laErrors)
MESSAGEBOX(laErrors[2])
ENDIF
ENDIF llReturn
ELSE
AERROR(laErrors)
MESSAGEBOX(laErrors[2])
ENDIF llReturn
ENDWITH
это слегка изменённый первый пример из документации на CursorRefresh Method

Теперь во время выполнения второго кода

при останова в на первом BROWSE <- (1) -------------------------------
переключаемся на первое приложение
... и делаем там изменения:
- в orders.dbf в поле 'Ship Name' скажем на "Alfreds Futterkiste1" для Order ID = 10643
- в customers.dbf в поле 'Company Name' скажем на "Alfreds Futterkiste1" для Customer ID = 'ALFKI'
... далее, переключаемся на приложение (с CursorRefresh) и по [x] снимаем BROWSE...
после чего наблюдаем BROWSE <- (2) -------------------------------
... и здесь видим, что изменения в 'Ship Name' (дочерней таблицей) действительно не проявились, в то время как с родительской (полем 'Company Name') в первой записи всё нормально...

Да уж, проблема однако...

... далее можно прдолжить экскримент с 'Company Name'="Ana Trujillo Emparedados y helados" для Customer ID = 'ANATR', и 'Ship Name' ="Ana Trujillo Emparedados y helados" для Order ID = 10308

хм, изменённые данные в подчинённой таблице (orders.dbf ) в приложении с CursorRefresh действительно не обновляются...

Если теперь проверить это на MS SQL Server 2000 (закомментровав фоксовый конект и раскомметировать для SQL Server) правя данне скажем в Enterprise Manager MS SQL Server, то отмеченная проблема исчизает...

Я пока не нашёл чем рулить, чтоб избежать проблемы в VFP 9.0...



Отредактировано (30.08.05 19:54)


------------------
С уважением,
Михаил Дроздов, Пермь, Россия
Ratings: 0 negative/0 positive
Re: CursorAdapter и Refresh
olegov
Автор

Сообщений: 366
Откуда: Новосибирск
Дата регистрации: 17.12.2002
Да заплюнул я на это дело. Необходимость впринципе отпала. Когда-то же пользователь должен обновлять данные в курсоре.
Поэтому оставил старую технлогию - после редактирования, добавления и удаления

tekid=id
requery('table')
locate for id=tekid
.
.
.
.
ну и еще всякая дрянь на случай если запись с id уже куда-то исчезла


Нагрузки от этого на сервер особой нет (главное в курсор по полторы тысячи записей не переть)
работает быстро, и табличка обновляется периодически
Ratings: 0 negative/0 positive
Re: CursorAdapter и Refresh
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi MichaelD & olegov!

Жуть как всё запущено...
Хорошо, пойдём работать с этим примером, раз уж olegov ленится написать простенький скриптик создания базы к своему...
Сначала класс. Это чуть обрезанный, сделанный построителем класс. Только подправить переносы строк, если вдруг появятся...

DEFINE CLASS cad AS cursoradapter
SelectCmd = "select ORDERS.CUSTOMERID, ORDERS.ORDERID, CUSTOMERS.COMPANYNAME from ORDERS inner join CUSTOMERS on ORDERS.CUSTOMERID=CUSTOMERS.CUSTOMERID ORDER BY ORDERS.ORDERID"
CursorSchema = "CUSTOMERID C(5), ORDERID I, COMPANYNAME C(40)"
Alias = "csr"
DataSourceType = "Native"
KeyFieldList = "ORDERID"
Tables = "ORDERS, CUSTOMERS"
UpdatableFieldList = "CUSTOMERID"
UpdateNameList = "CUSTOMERID ORDERS.CUSTOMERID, ORDERID ORDERS.ORDERID"
RefreshCmd = "select ORDERS.CUSTOMERID,ORDERS.ORDERID, CUSTOMERS.COMPANYNAME from ORDERS inner join CUSTOMERS on ORDERS.CUSTOMERID=CUSTOMERS.CUSTOMERID WHERE ORDERS.ORDERID = csr.ORDERID"
RefreshCmdDataSourceType = "Native"
PROCEDURE Init
local lcDBC
lcDBC = HOME(2)+"NORTHWIND\NORTHWIND.DBC'
if dbused(lcDBC)
set database to (m.lcDBC)
else
open database (m.lcDBC)
endif
ENDPROC
ENDDEFINE

Теперь собственно тестовый код - рекомендуется исполнять из командного окна.

PUBLIC goCad
goCad = CREATEOBJECT("cad")
? m.goCad.CursorFill()
BROWSE
* Смотрим данные - скажем возьмём первый заказ # 10248 - там заказчик был VINET
* Т. е. станем на эту строчку и запомним значения полей CUSTOMERID и COMPANYNAME
* В первой копии VFP (где напрямую открыты исходные таблицы)
* поменяем в ORDERS в этой записи код заказчика на скажем HANAR
* (для чего стоит заранее сменить индекс на ORDERID - чтоб не искать долго запись)
? m.goCad.RecordRefresh()
* Смотрим снова на данную запись - всё обновилось как и должно
* Далее - меняем уже исключительно из второй сессии - пользуясь нашим CAD-ом
REPLACE CustomerID WITH "CHOPS"
? TABLEUPDATE(0)
? m.goCad.RecordRefresh()
* Наблюдаем новое значение
REPLACE CustomerID WITH "VINET"
? TABLEUPDATE(0)
? m.goCad.RecordRefresh()
* Вернули старое значение
Ну а теперь, если есть конкретные вопросы - можно и пообсуждать
P.S. Я думал что без упоминания ключевого поля таблицы CUSTOMERS работать не станет, но оно однако работает и так...
P.P.S. Вот если нужно авто-рефреш при вставках сделать (InsertCmdRefreshCmd придётся очевидно руками делать) - то совсем другое дело - там значительно сложнее всё - учитывая что OrderID это нездоровый AUTOINC




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: CursorAdapter и Refresh
Aleksey Tsingauz [MSFT]
Igor Korolyov писал(а):
Цитата:
RefreshCmd = "select ORDERS.CUSTOMERID,ORDERS.ORDERID, CUSTOMERS.COMPANYNAME from ORDERS inner join CUSTOMERS on ORDERS.CUSTOMERID=CUSTOMERS.CUSTOMERID WHERE ORDERS.ORDERID = csr.ORDERID"

P.S. Я думал что без упоминания ключевого поля таблицы CUSTOMERS работать не станет, но оно однако работает и так...

Здравствуйте, Игорь!

Дело в том, что вы сами задали RefreshCmd. Если бы вы оставили его пустым, то CursorAdapter использовал бы KeyFieldList чтобы сгенерировать refresh команду.

Алексей.

Ratings: 0 negative/0 positive
Re: CursorAdapter и Refresh
Aleksey Tsingauz [MSFT]
MichaelD писал(а):
Цитата:
Да уж, проблема однако...

Здравствуйте, Михаил!

Поскольку вы не задали RefreshCmdDataSource, CursorAdapter выполняет refresh через RecordSet, вызывая RecordSet.Resync метод. И если Resync не обновляет поля из Orders, а именно это происходит, то и RecordRefresh не сможет их обновить. Можно пойти двумя путями:

1) Настроить RecordSet, чтобы Resync обновлял поля. Например, вот так:
loRs.Properties("Unique Table").Value="Orders"
loRs.Properties("Resync Command").Value="SELECT Customers.customerid, Customers.companyname, Orders.orderid, ";
+ " Orders.shipname ";
+ " FROM ";
+ " Orders ";
+ " INNER JOIN Customers ";
+ " ON Orders.orderid=? AND Customers.customerid = Orders.customerid "
loCursor.SELECTCMD = ;
"SELECT Customers.customerid, Customers.companyname, Orders.orderid, ";
+ " Orders.shipname ";
+ " FROM ";
+ " Orders ";
+ " INNER JOIN Customers ";
+ " ON Customers.customerid = Orders.customerid ";
+ " WHERE Orders.customerid = ?lcCustomerid"
Пока я не поменял порядок таблиц в SELECTCMD, ADO "ругалось". После CURSORREFRESH "Unique Table" и "Resync Command" нужно задать снова.

2) Настроить CursorAdapter, чтобы refresh выполнялся с помощью ADODB.Command:
loCursor.KeyFieldList = "customerid,orderid"
loCursor.UpdateNameList = "customerid Customers.customerid, companyname Customers.companyname,orderid Orders.orderid, shipname Orders.shipname"
loCursor.Tables = "Customers, Orders"
loCursor.RefreshCmdDataSource=loCommand
loCursor.RefreshCmdDataSourceType="ADO"

Алексей.

Ratings: 0 negative/0 positive
Re: CursorAdapter и Refresh
olegov
Автор

Сообщений: 366
Откуда: Новосибирск
Дата регистрации: 17.12.2002
Эт сегодня ночью у меня уже получилось. Просто я же говорю, что после того как получилось, понял что незачем. Заказчик уже раскритиковал сие новшество. Так хоть во время редактирования данных таблица обновляется, а здесь придется пользователю на монитор бумагу клеить "ОБНОВЛЯЙ ИНОГДА ДАННЫЕ В ТАБЛИЦЕ !".
Ratings: 0 negative/0 positive
Re: CursorAdapter и Refresh
Влад Колосов

Сообщений: 22664
Откуда: Ростов-на-Дону
Дата регистрации: 05.05.2005
По таймеру обновлять.
Ratings: 0 negative/0 positive
Re: CursorAdapter и Refresh
MichaelD

Сообщений: 7578
Дата регистрации: 14.05.2005
Здравствуйте, Алексей!

Спасибо за разъяснения! Во истину - дело мастера боится!

MichaelD
Я пока не нашёл чем рулить, чтоб избежать проблемы в VFP 9.0...

Aleksey Tsingauz
Поскольку вы не задали RefreshCmdDataSource, CursorAdapter выполняет refresh через RecordSet, вызывая RecordSet.Resync метод. И если Resync не обновляет поля из Orders, а именно это происходит, то и RecordRefresh не сможет их обновить. Можно пойти двумя путями:
1) Настроить RecordSet, чтобы Resync обновлял поля. Например, вот так:

[sorry skiped]

Пока я не поменял порядок таблиц в SELECTCMD, ADO "ругалось"...
Да, это я т.с. изначально промахнулся, извиняюсь... Видимо переутомлённый был....

Aleksey Tsingauz
... После CURSORREFRESH "Unique Table" и "Resync Command" нужно задать снова.
Ну это быстро утомит...

Aleksey Tsingauz
2) Настроить CursorAdapter, чтобы refresh выполнялся с помощью ADODB.Command:
loCursor.KeyFieldList = "customerid,orderid"
loCursor.UpdateNameList = "customerid Customers.customerid, companyname Customers.companyname,orderid Orders.orderid, shipname Orders.shipname"
loCursor.Tables = "Customers, Orders"
loCursor.RefreshCmdDataSource=loCommand
loCursor.RefreshCmdDataSourceType="ADO"
Да, это "работает"!... А мне видимо, надо было сначала код builder-а поизучать, прежде чем пытаться "врукопашную" с CursorAdapter-ом воевать...

Ещё раз спасибо!

Только вот разглядывание работы SQL Server 2000 в этом (изначально недоделанном) случае, не привели к пониманию того: как же он всё-таки работает? ... Видимо, всё скрыто в недрах provider=SQLOLEDB.1...



Отредактировано (31.08.05 19:06)


------------------
С уважением,
Михаил Дроздов, Пермь, Россия
Ratings: 0 negative/0 positive
Re: CursorAdapter и Refresh
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi Влад!

Цитата:
По таймеру обновлять
Не нужно
Он чаёк пойдёт пить этак на пол-дня, а комп как дурной тянет и тянет данные с сервера... Потом dba (если он не совсем уж зелёный новичок) за такие художества по шапке даст - и будет прав
Вот если ты разработаешь систему "оповещений об изменениях" - при этом отсеивая их по уровню важности для конкретного пользователя - тогда ещё "автообновление" можно как-то по нормальному сделать...




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: CursorAdapter и Refresh
Aleksey Tsingauz [MSFT]
MichaelD писал(а):
Цитата:
Aleksey Tsingauz
... После CURSORREFRESH "Unique Table" и "Resync Command" нужно задать снова.
Ну это быстро утомит...

В таком случае имеет смысл сделать подкласс CursorAdapter-а, переопределить CursorFill, CursorRefresh и спрятать эти установки внутрь.

Алексей.

Ratings: 0 negative/0 positive
Re: CursorAdapter и Refresh
MichaelD

Сообщений: 7578
Дата регистрации: 14.05.2005
Здравствуйте, Алексей!

MichaelD
Ну это быстро утомит...
Aleksey Tsingauz
В таком случае имеет смысл сделать подкласс CursorAdapter-а, переопределить CursorFill, CursorRefresh и спрятать эти установки внутрь.
Да, это я неудачно пытался пошутить, наверное...




------------------
С уважением,
Михаил Дроздов, Пермь, Россия
Ratings: 0 negative/0 positive
Re: CursorAdapter и Refresh
Grisha

Сообщений: 160
Дата регистрации: 07.07.2005
Добрый день

Я не большой специалист в работе
с CURSORADAPTER поэтому и
вопросы может быть ...

Как узнать что
llReturn = .CURSORFILL(.F., .F., 0, loCommand)
закончил заполнение курсора если
это занимает некоторое время и как сохранить курсор чтобы он автоматически не закрывался
Eсли ставить его источником для GRIDA и переходить в другой метод
этой формы то у меня он исчезает
Гриша
Ratings: 0 negative/0 positive
Re: CursorAdapter и Refresh
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi Grisha!

Надо знать ЧТО это за курсор - локальные данные или удалённые, как настроен
FetchSize и другие параметры...
Вообще гриду совершенно без разницы заполнен курсор полностью или не
заполнен вообще. "Исчезает" он исключительно из-за пересоздания самого
курсора - а пересоздаёт его команда CursorFill - поскольку она закрывает то
что было и открывает новый курсор. Методы борьбы описаны неоднократно.




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: CursorAdapter и Refresh
Grisha

Сообщений: 160
Дата регистрации: 07.07.2005
Hi Igor

Даные с SQL SERVER
в форме
в одном методе код


gCurADO = CREATEOBJECT('caADO')
gCurADO. Alias = 'CurLogFileTest'
gCurADO.SelectCmd = 'EXECUTE GetTB_LogeventsData'
gCurADO.GetSQLData

Без строчки

SELECT * FROM CurLogFileTest INTO CURSOR CurLogFile

где CurLogFile RECORDSOURE Для GRIDA нельзя работать


Отдельнный PRG

DEFINE CLASS caADO AS CursorAdapter
oConn = NULL
oRS = NULL
lFilled = .F.
Dimension aErrorInfo(1)
Dimension aUpdateInfo(1)
nError = 0
lSaved = .F.
Alias = ""
DataSourceType = "ADO"
lUseCursorSchema = .F.
FUNCTION Init()
THIS.ADDPROPERTY('oCommand', NEWOBJECT('ADODB.Command'))
This.DataSource = This.oRS
This.DataSource.ActiveConnection = This.oConn
This.oCommand.ActiveConnection = This.oConn
ENDFUNC
FUNCTION GetConnectToServer
Local cConString As String ,;
cFileXml As String ,;
cFileAndPath As String ,;
CurrentProcedure As String ,;
gcCurrentDir As String
Local nPathStart As Number , nLenOfPath As Number
gnHandle = 0
cConString = ""
cFileXml = "conn.xml"
cCurrentProcedure = Sys(16,1)
nPathStart = At(":",cCurrentProcedure)- 1
nLenOfPath = Rat("\", cCurrentProcedure,2) - (nPathStart)
gcCurrentDir = Substr(cCurrentProcedure, nPathStart, nLenOfPath)
gcCurrentDir = Addbs(gcCurrentDir)
cFileAndPath = Alltrim(gcCurrentDir) + cFileXml
= Xmltocursor(cFileAndPath,"conn",512)
cConString = conn.SqlDatabaseADO
Use In "conn"
RETURN (cConString)
ENDFUNC
Procedure GetSQLData
This.ResetError()
This.lFilled = This.CursorFill(This.lUseCursorSchema, .F., 0, This.oCommand)
If Not This.lFilled
This.nError = Aerror(This.aErrorInfo)
Endif
Endproc
Procedure SaveData
Local laInfo(1), lnRecord
This.ResetError()
This.lSaved = .T.
This.lSaved = Tableupdate(2, .F., This.Alias , This.aUpdateInfo)
If Not This.lSaved
This.nError = Aerror(This.aErrorInfo)
Endif
Endproc
Procedure NewData
This.lFilled = This.CursorRefresh()
If Not This.lFilled
This.nError = Aerror(This.aErrorInfo)
Endif
Endproc
PROTECTED Procedure ResetError
This.nError = 0
This.aErrorInfo = []
Endproc
Protected Procedure Destroy
This.oRS = .Null.
This.oCommand = .Null.
Endproc
FUNCTION oConn_Access() as ADODB.Connection
LOCAL loConn as ADODB.Connection
IF VARTYPE(this.oConn)<>"O" THEN
this.oConn = NULL
loConn = NEWOBJECT("ADODB.Connection")
IF VARTYPE(loConn)="O" THEN
loConn.CursorLocation = 3
loConn.ConnectionString = THIS.GetConnectToServer()
loConn.OPEN()
This.oConn = loConn
ENDIF
ENDIF
RETURN this.oConn
ENDFUNC
FUNCTION oRS_Access() as ADODB.RecordSet
LOCAL loRS as ADODB.RecordSet
IF VARTYPE(this.oRS)<>"O" THEN
this.oRS = NULL
loRS = NEWOBJECT("ADODB.Recordset")
IF VARTYPE(loRS)="O" THEN
loRS.MaxRecords = 0
this.oRS = loRS
ENDIF
ENDIF
RETURN this.oRS
ENDFUNC
ENDDEFINE
Ratings: 0 negative/0 positive
Re: CursorAdapter и Refresh
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi Grisha!

1) Ты полагаешь что отсутствующую часть примера, скрипты, файлы и т.п. я за
тебя сделаю? Очень зря.
2)
Цитата:
в форме в одном методе код
В каком методе? Существует к тому моменту грид или нет? Как настроен грид и
форма? Наследуется ли он от какого класса или основан на базовых классах?

В общем пока не будет полного примера сказать ничего невозможно. Ну разве
что повториться - если грид привязан к курсору, а курсор ПЕРЕСОЗДАЁТСЯ (а
CAD.CursorFill() именно пересоздаёт курсор) то ничего удивительного в
разрушении грида нету.




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: CursorAdapter и Refresh
Grisha

Сообщений: 160
Дата регистрации: 07.07.2005
Hi Igor

Нашел ответ здесь

www.code-magazine.com

One special behavior that comes with the CursorAdapter is that the cursor is coupled to the
object instance; therefore, if you destroy the object reference to the CursorAdapter class,
you will also lose the cursor and its contents. This means that you'll have to ensure that any
CursorAdapter object variables stay within scope for as long as you intend to access the associated cursor.

1) Вместо gCurADO = CREATEOBJECT('caADO') надо
thisfor.gCurADO = CREATEOBJECT('caADO') и все заработало

2) Grid не разрушается он у меня пересоздается из VCX что
практически не заметно

3)Как узнать что
llReturn = .CURSORFILL(.F., .F., 0, loCommand)
закончил заполнение курсора

Ответа не получил

Grisha




------------------
Ratings: 0 negative/0 positive
Re: CursorAdapter и Refresh
Aleksey Tsingauz [MSFT]
Grisha писал(а):
Цитата:
3)Как узнать что
llReturn = .CURSORFILL(.F., .F., 0, loCommand)
закончил заполнение курсора


CURSORGETPROP("RecordsFetched")
CURSORGETPROP("FetchIsComplete")

Алексей.

Ratings: 0 negative/0 positive
Re: CursorAdapter и Refresh
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi Grisha!

Вот и поди пойми тебя - что значит g... - я думал что это глобальная
переменная - как рекомендует MS А то что курсор закрывается при
уничтожении объекта - так то IMHO известный факт - и для того и придуман
метод CursorDetach() - чтобы "отсоединить" курсор от объекта.
Цитата:
Grid не разрушается он у меня пересоздается из VCX что практически
не заметно
Противоречие - если он ПЕРЕСОЗДАЁТСЯ - то уж 100% что при этом он
разрушается Ну да не в этом дело...
Цитата:
Ответа не получил
А ты всё что я спрашивал указал?
И вообще ЗАЧЕМ тебе это нужно?
Ну сделай например настройку FetchSize = -1, или банально вызови
RECCOUNT() - прога будет висеть пока все записи не затянутся из ADO RS в
фоксовый курсор... Хотя я лично не вижу особого смысла в подобном "знании" -
ну не заполнился он до конца - но работать то с ним уже можно - если будет
обращение к той части что ещё не "вытянулась" - ошибки не будет - просто
будем висеть и ждать... Грид/Browse ведёт себя аналогично - т.е. пока не
залезем на "невынутые" будет бегать - если залезем - будет висеть и ждать
пока они не подтянуться... Причём по умолчанию вывесится окошко что дескать
"выполняю я чего-то! Дави ESC если надоело ждать". По ESC тоже ничего
страшного не произойдёт - процесс заполнения прервётся, что вынули то и
будет доступно...




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: CursorAdapter и Refresh
Grisha

Сообщений: 160
Дата регистрации: 07.07.2005
Всем спасибо
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 27 (Гостей: 27)

© 2000-2024 Fox Club 
Яндекс.Метрика