:: Архив конференции по VFP до 2005 года
tablerevert в CursorAdapter
kuru
Автор
когда в beforeupdate возвращаешь .f. или в afterupdate lReturn приравниваешь .f., то foxpro ругается: "execution was canceled by the user" - как можно сделать молчаливый tablerevert?
Ratings: 0 negative/0 positive
Re: tablerevert в CursorAdapter
JS

Сообщений: 12264
Откуда: Эстония
Дата регистрации: 04.09.2000
А можно чуть поподробнее... Как создан СА - как отдельный объект, как объект в DataEnvironment классе и так далее.




------------------
Knowledge is better than ignorance!
Website: juri.foxhelp.eu
Ratings: 0 negative/0 positive
Re: tablerevert в CursorAdapter
kuru
Автор
CA создан как объект и используется как триггер (изменения делаются в grid)
Ratings: 0 negative/0 positive
Re: tablerevert в CursorAdapter
Igor Korolyov

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

Ты только всё ещё больше запутал Приведи простой пример (грид не
обязателен, простым Replace-ом над курсором обойдись). Что-то в этом духе.
И pls не поленись расписать какова конечная цель - что ты пытаешься решить
(может быть нужно просто с другой стороны пойти?)
Вот тебе даже шаблон:
PUBLIC goCad
goCad = CREATEOBJECT("cadTest")
goCad.CursorFill()
REPLACE Field WITH ... ALL
lnRes = TABLEUPDATE(...) && что наблюдаем, и что нужно
DEFINE CLASS cadTest AS CursorAdapter
...
ENDDEFINE




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: tablerevert в CursorAdapter
kuru
Автор
суть такая: использовать CA, как замена триггерам. замена потому что CA позволяет в after(i/u/d) сделать изменения в таблице, например: по первым заведенным 2ум полям, идет обращение на сервер, где в результате неких колькуляций возвращается значение в 3ье (нередактируемое) поле - как раз путем replace в afterinsert. вообщем нужно делать изменения таблицы в триггере для чего и хочу юзать CA

procedure afterinsert
sqlquery ("calc_value @f1 = " + trans(@f1) + " ,@f2=" + trans(@f2), "CALC")
replace (f3, CALC.value)
endprod

а проблема в том что я не могу сделать tablerevert() в after(i/u/d), если что-то меня не устраивает в первых двух полях:

procedure afterinsert

sqlquery ("calc_value @f1 = " + trans(@f1) + " ,@f2=" + trans(@f2), "CALC")

if (reccount() = 0)
tablerevert (.f.) && здесь будет ругаться
&& если lReturn установить в .f. будет ругаться тоже.
else
replace (f3, CALC.value)
end

endprod

хочу чтоб не ругался! (метод Error переопределять для подавления ошибки - не хочу - а то потом другие ошибки не найду)
Ratings: 0 negative/0 positive
Re: tablerevert в CursorAdapter
Igor Korolyov

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

Из хелпа к TableUpdate()

Цитата:
You can also modify data in the cursor. This functionality supports
scenarios such as retrieving the autoincrement value from the base table and
inserting it into the cursor. When this scenario occurs, the CursorAdapter
object should automatically return to the record whose changes are about to
be committed after the event has occurred and commit the changes.

In Visual FoxPro 9.0, you cannot issue the TABLEREVERT( ) Function when a
TABLEUPDATE( ) is in operation.


Typically, the CursorAdapter object uses the transaction management
functionality provided by the ADO or ODBC API's and Visual FoxPro closes
transactions when the TABLEUPDATE( ) function completes successfully.
However, if you want to send transaction management commands directly to the
backend, you can set the UseTransactions property of the CursorAdaptor
object to False (.F.) and the CursorAdapter does not use transactions to
send Insert, Update, or Delete commands.
IMHO всё очень логично - это как если бы ты вносил изменения (без CA) в
курсор, а он и НЕ СОХРАНЯЛ и ОТКАТЫВАЛ К СТАРОМУ одновременно! Это нелогично
и IMHO даже вредно - если случилась ошибка сохранения, буфер должен
оставаться неизменным! Чтобы можно было поправить скажем одно из полей и
снова попытаться сохранить данные - а не потерять разом всё что там
вводилось.

P.S. Всё-же пример неполный - убери TableRevert() и потом посмотрим.
P.P.S. для примера сделай всё на локальной таблице и без вызова ХП - просто
по какому-нить условию меняй признак, причём не в After* обработчике, если
это поле ДОЛЖНО попадать в итоге в базовую таблицу. Ибо в After имеет смысл
трогать лишь те поля, которые не являются обновляемыми.




------------------
WBR, Igor
Ratings: 0 negative/0 positive


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

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

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