Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / CursorAdapter для новичка / 25 сообщений из 30, страница 1 из 2
17.07.2006, 21:42
    #33859240
McFozzy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CursorAdapter для новичка
Прошу незлится на меня, если этот вопрос уже обуждался или есть довольно изчерпающий FAQ/Examples по этому вопросу.

Я уже около 7 лет работаю с VFP и думаю, что некоторые мои методы работы с данными уже устарели.
Раньше мои данные всегда находились в DBC (нативе) датабазе (или DBF), но уже некоторое время я храню данные в SQLServer'ере.

Для DBF варианта я делаю так:
1. В спартовом prg фаиле открываю нужную мне DBC датабазу
2. В DataEnvironment каждой формы я открываю нужные мне таблицы с помощю команды USE dabatase!table IN 0 SHARED

Для SQLServer варианта я раньше делал связь с SQLSTRINGCONNECT, потом запрос с SQLEXEC, и потом SQLDISCONNECT для каждого обращения к данным. Теперь я использую Custom объект на каждой форме, который сам установливает связь с сервером, мне только нужно зделать запрос с помощю этого объекта.

И вот недавно я наткнулся на CursorAdapter (CA) объект. Несмотря на немалую литературу на интернете по поводу CA, у меня есть такие вопросы:
1. Как извлечь IDENTITY значение самого последнего INSERTа в CA?
2. Как из формы обращатся на CA методы и установки?
3. Как зделать параметризованныи CA, как изменят филтры из формы?

Спасибо за ответы.
...
Рейтинг: 0 / 0
17.07.2006, 22:01
    #33859260
Vladimir M Sklyar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CursorAdapter для новичка
[quote]
2. Как из формы обращатся на CA методы и установки?
[/quote]

начни вот отсюда http://kodu.neti.ee/~juri4/vfp60/ca_01_ru.htm
но что-то типа thisform.dataenvironment.<название>.<св-во/метод>

[qoute]
3. Как зделать параметризованныи CA, как изменят филтры из формы?
[/quote]

http://groups.google.com/group/fido7.ru.visual.foxpro/browse_frm/thread/b2f2581aaa03f7f/a3e0e46290ec8f88?q=cursoradapter+oracle&rnum=1#a3e0e46290ec8f88

Общий смысл в том, что создаеться некое доп. св-во к объекту (лист, грид, комбо) в котором и храниться эта динамическая состовляющая WHERE для фильтра и в методе REQUERY объкета пересоздаешь команду SelectCmd у CA
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
17.07.2006, 22:35
    #33859289
McFozzy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CursorAdapter для новичка
4. Например, есть форма, которая создаёт новии записи в таблице. Но, перед вставлением я должен быть уверен, что данные правильно введены, если нет, то недопустить вписание таких данных в настоящую таблицу. Если я делаю UPDATE на CursorAdapter, то автоматически добавляется строка в таблицу на SQL сервер или только после TABLEUPDATE()?
...
Рейтинг: 0 / 0
17.07.2006, 23:04
    #33859316
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CursorAdapter для новичка
McFozzy4. Например, есть форма, которая создаёт новии записи в таблице. Но, перед вставлением я должен быть уверен, что данные правильно введены, если нет, то недопустить вписание таких данных в настоящую таблицу. Если я делаю UPDATE на CursorAdapter, то автоматически добавляется строка в таблицу на SQL сервер или только после TABLEUPDATE()?
Зависит от буферизации - для 5 только после update, для 3 - при перемещении записи - идет обновление на сервере автоматом...

По существу вопроса - использование Cursor Adapter - это просто помощь для начинающих или когда надо быстро создать несложное приложение... При серьезной работе - лучше применять локальные курсоры и все обновлять с помощью хранимых процедур - так дешевле и надежнее...

But anyway, good luck!
...
Рейтинг: 0 / 0
18.07.2006, 01:35
    #33859397
Недоходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CursorAdapter для новичка
2 Sergey Ch

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

А можно ссылочку на литературу??
...
Рейтинг: 0 / 0
18.07.2006, 09:24
    #33859631
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CursorAdapter для новичка
Недоходящий2 Sergey Ch

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

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

Ну а курсорадаптер удобен, если надо что-то "быстро слепить" и не очень ответственное - например, управление не часто меняющихся справочников etc...

Но это мое личное мнение, каждый должен попробовать и сделать для себя свои выводы...

But anyway, good luck!
...
Рейтинг: 0 / 0
18.07.2006, 11:38
    #33860101
-=AlexiS=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CursorAdapter для новичка
Почитай тут я тоже затрагивал тему курсорадаптера.
Решил попробовать новенького.
Ну что сказать после этого присоеденяюсь к Sergey Ch - и возвращаюсь к "старой" технологии
...
Рейтинг: 0 / 0
18.07.2006, 20:34
    #33862237
Недоходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CursorAdapter для новичка
>> Ну а курсорадаптер удобен, если надо что-то "быстро слепить" и не очень ответственное - например, управление не часто меняющихся справочников etc...

с этим я согласен тоже. Пока использую курсоры. Но хотелось бы что нить другое попробывать.
...
Рейтинг: 0 / 0
19.07.2006, 10:43
    #33863016
Sergej_S
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CursorAdapter для новичка
Sergey ChНу а курсорадаптер удобен, если надо что-то "быстро слепить" и не очень ответственное - например, управление не часто меняющихся справочников etc...
В принципе, согласен. НО: юзаю CAD активно более полугода- сделал на его основе класс- весьма доволен. Простые формы как из пулемета можно строчить, да и непростые тоже. Нормально работают и по 10 гридов на форме. У меня правда специфика такая- транзакции при занесении/изменении строк редко использую. Они в основном у меня в хранимках и запускаются только для начислений и т.д.

TO: -=AlexiS=-
Пробовал я тоже вначале с фетчем работать- намаялся сильно, хорошо, что добрые с сайта люди убедили, что не надо юзеру _все_ записи. Сейчас строю интерфейс, чтобы юзеры работали с диапазонами. Как но странно, приучить их к диапазонам оказалось намного легче, чем себя самого и шефов :)
...
Рейтинг: 0 / 0
19.07.2006, 11:28
    #33863180
-=AlexiS=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CursorAdapter для новичка
to Sergej_S
Ну дык тоже работаю с диапазонами - просто натолкнулся на проблему когда отлаживался решил просто для проверки затянуть все данные.
Кстати реализов идею из этого обсуждения получил интересные результаты.
Для "большой" выборки делаю отдельный statement handles внутри connection handle - устанавливаю значения Fetch Size = 100 и FetchAsNeed=.t. и меня собственно не интересуют размеры выборки , поскольку тянеться -то порциями - и уже при получении первой порции даных можно работать.
т.е. получаеться как-бы асинхронная работа.
Загрузка происходит быстро - и собственно размеры выборки особенно и не волнуют . конечно если юзер сразу ломанется смотреть последние записи , то тормоза.
Но данный вариант подойдет для "просмотровых" режимов , т.е. когда пользователь хочет сначала увидеть данные в виде списка, а потом посмотреть их детализацию. Тогда правильно подобрав порядок сортировки можно подать ему в "первых рядах" ту инфу что он хочет видеть первой , а дальнейшая загрузка будет происходить порциями причем играясь FetchAsNeed можно либо отложить получение данных либо просто "размазать по времени".
...
Рейтинг: 0 / 0
19.07.2006, 12:35
    #33863492
Sergej_S
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CursorAdapter для новичка
To: -=AlexiS=-
И каковы планы на будущее относительно CAD с фетчем? Я так понял, что использовав несколько стейтментов к расшаренному коннекту у тебя получтлось, что ты хотел.
Я по такой схеме (фетчи и стейтменты) пробовал делать где-то полгода назад- не получилось... (fox8). Может, не до конца разобрался, но даже если так будет работать нормально, предвижу много заморочек с фетчем. Например:
выкачались первых 100 записей документов(сортировка по дате). юзер делает инсерт. запись надо бы вставить в порадке даты. что будет делать CAD? перекачивать все? а без фетча, с диапазонами, я в SelectCmd "ORDER BY" вообще не указываю, а строю индекс в фоксе на курсор, тогда и при инсерте/изменении у меня строка сама визуально становится на нужное место. можнл и перекачки курсора сменить сортировку. плюс скл сервер не грузится лишней командой order by.
Вот такие мои мысли по поводу фетча. Хотя, вполне возможно, что, разобравшись, можно и с ним хороше работать. Может, еще попробую, как освобожусь немного.
...
Рейтинг: 0 / 0
19.07.2006, 12:44
    #33863531
Недоходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CursorAdapter для новичка
2 Sergej_S

Можно Ваш класс по каду посмотреть??

*****
Единственное что мне не нравиться в CA-де так это то что он капризен на ошибки. если при изменении чего нить вылазит какая то ошибка, то при последующем создании этого же СА CursorFill() выдает .f.. И приходиться закрывать прогу полностью и запускать ее снова. Кто-то преодолевал это??
...
Рейтинг: 0 / 0
19.07.2006, 12:57
    #33863587
Проходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CursorAdapter для новичка
Что преодолевать-то? Если CursorFill вернул .F., то надо ошибку обрабатывать, а не давить.
...
Рейтинг: 0 / 0
19.07.2006, 13:42
    #33863791
-=AlexiS=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CursorAdapter для новичка
Sergej_SИ каковы планы на будущее относительно CAD с фетчем? Я так понял, что использовав несколько стейтментов к расшаренному коннекту у тебя получтлось, что ты хотел.

Да , все получилось.
Идея такова -
для "больших" курсоров в BeforOpenTable DE
пишу
Код: plaintext
1.
this.s_CON=SQLCONNECT(SQL_CON)
This.account.DataSource=this.s_CON
т.е. получаю новый statement handles
в Destroy DE (пока так хотя это несколько грубовато и требует доработки)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Local i
i= 100 

Do While .T.
	If SQLIdleDisconnect(This.s_con)= 1 
		SQLDisconnect(This.s_con)
		Exit
	Endif
	i=i- 1 
	If i<= 0 
		SQLCancel(This.s_con)
		Exit
	Endif
Enddo
Это нужно для того чтобы освободить конект если данные еще не дотянулись до конца

Планы в принципе я описал выше.
Есть у меня парочка режимов в которых много записей даже при отборе по диапазонам.Режимы просмотровые типа вижу список - кликнул- посмотрел детальную инфу.
Вот там ему и место.


Sergej_SЯ по такой схеме (фетчи и стейтменты) пробовал делать где-то полгода назад- не получилось... (fox8). Может, не до конца разобрался, но даже если так будет работать нормально, предвижу много заморочек с фетчем. Например:
выкачались первых 100 записей документов(сортировка по дате). юзер делает инсерт. запись надо бы вставить в порадке даты. что будет делать CAD? перекачивать все? а без фетча, с диапазонами, я в SelectCmd "ORDER BY" вообще не указываю, а строю индекс в фоксе на курсор, тогда и при инсерте/изменении у меня строка сама визуально становится на нужное место. можнл и перекачки курсора сменить сортировку. плюс скл сервер не грузится лишней командой order by.

Собственно сортировки меня тоже не заботят - я тоже строю сортировки уже на полученом курсоре.Для работы кстати использую доработанный и несколько переделаный Грид от. Алексея Климова (за что ему аграмадное спасибо).
Однако поскольку для сортировки используеться индекс - построение его ведет к "полной" загрузке , т.е. к тормозам. Поэтому я все-таки первоначальный порядок сортировки указываю.
Насчет инсерта - тоже проблемка.
Но как я говорил собираюсь использовать данный вариант в "просмотровых" целях.
А для ввода все-же буду делать более узкие диапазоны.
Sergej_S
Вот такие мои мысли по поводу фетча. Хотя, вполне возможно, что, разобравшись, можно и с ним хороше работать. Может, еще попробую, как освобожусь немного

НУ ежели-что - делись достижениями ...
...
Рейтинг: 0 / 0
19.07.2006, 19:19
    #33865218
Sergej_S
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CursorAdapter для новичка
TO Недоходящий
можно посмотреть, скину завтра.
...
Рейтинг: 0 / 0
23.07.2006, 21:35
    #33872566
Недоходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CursorAdapter для новичка
У меня возникла такая ситуация.

есть форма на которой есть грид с одной колонкой. При загрузке формы создаеться СА и даю гриду в ров соурс одно поле этого СА. Так вот запускаю эту форму на двух машинах одновременно. С начала нажимаю на первой машине кнопку "Создать запись". Создаеться и что-то ввожу. В этот момент на второй тоже создаю строку и в кнопке прописан рефреш СА. И получаеться что на второй машине я вижу две новых строки (пустые). Одна которая создана на первой и вторая на второй. В чем проблема: Если на второй машине ввести в первой строке что нить, которая была создана на первой машине, то при закрытии СА (на обоих машинах), эта строка на сервере (sql2000) копировалась!. т.е. введенные значения разные, но номер строки, код и. т.д. одинаковы. Есть ли способ как предотвротить копирование строки??

Надеюсь я правильно выразил проблему?
...
Рейтинг: 0 / 0
24.07.2006, 10:15
    #33872953
-=AlexiS=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CursorAdapter для новичка
Не совсем внятно.
код кнопки выложи
и пример данных -что получилось.
...
Рейтинг: 0 / 0
24.07.2006, 15:02
    #33874106
sar99
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CursorAdapter для новичка
Добрый день!
Если кнопка <создать запись> будет вызывать окно ввода
и затем запись вводиться последовательностью команд:
insert into <имя таблицы> (поля) values (значения полей)
vcommit=tableupdate()
if vcommit=.f.
***разбор конфликта
endif
то проблемм быть при многопользовательской работе не должно
до tableupdate() запись видит только пользователь ее введший -
после - любой другой но только для корректировки(удаления)

дублей быть уже не может!!!
...
Рейтинг: 0 / 0
25.07.2006, 00:33
    #33875301
Недоходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CursorAdapter для новичка
2 -=AlexiS=-
**создан СА , имя курсора dolj, гриду присвоен ровсоурс dolj.naimen
**получаеться так если что-то изменить в гриде на какой нить строке, то на сервере тоже происходит изменение (сразу)
close_curs('dolj_max_kod')&& закрытие курсора
IF SQLEXEC(sql_con,"select MAX(kod) as kod from dolj","dolj_max_kod")>0 then
GO TOP IN dolj_max_kod
IF ISNULL(dolj_max_kod.kod) THEN
replace kod WITH 0 IN dolj_max_kod
ENDIF

APPEND BLANK IN dolj *добавляю строку в СА
replace kod WITH dolj_max_kod.kod+1,naimen WITH '',pr_delete WITH 0 IN dolj
refresh_cad(dolj_ed_cad.naimen) *refresh CA
GO BOTTOM in dolj
thisform.grid1.Refresh
ThisForm.Grid1.column1.TEXT1.SetFocus()
ELSE
=MESSAGEBOX('сервер не отвечает')
ENDIF

**********
Результат в файле

2 sar99

этот способ(немного измененный, в конце всего вместо tableupdate() я создаю СА только с той строкой, которую нужно изменить) я применяю для больших форм, где открываеться форма для заполнения, в моем случае это маленькая форма с одним гридом и одной колонкой и с активным СА, где введя любое изменение вводиться этоже изменения в серваке.
...
Рейтинг: 0 / 0
25.07.2006, 08:23
    #33875429
sar99
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CursorAdapter для новичка
Доброе утро!
Поскольку при рефреше на второй машине видны 2 пустые!!! записи
есть подозрение что пользователи видят незавершенные транзакции
друг друга.
Я для СА применяю АДО и для соединения oc прописываю
oc.isolationlevel=4096 && уровень изолированности транзакций
когода другой пользователь видит только завершенные транзакции
первого

может в твоей ситуации тоже попробовать поиграть с уровнем
изолированности (не работал с ODBC - не знаю как!)
...
Рейтинг: 0 / 0
25.07.2006, 08:34
    #33875442
sar99
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CursorAdapter для новичка
кстати код кнопки:
APPEND BLANK IN dolj *добавляю строку в СА
replace kod WITH dolj_max_kod.kod+1,naimen WITH '',pr_delete WITH 0 IN dolj

не гарантирует уникальности поля kod при многопользовательской
работе!
...
Рейтинг: 0 / 0
25.07.2006, 10:28
    #33875738
-=AlexiS=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CursorAdapter для новичка
Похоже вся проблема в получении кода
смотри
1 юзер добавил запись - пока она еще в буфере
получил с сервера максимальный код - он равен 4
второй тоже добавил запись , и получил код равный 4 , поскольку первый еще запись не сохранил
вот и получается, что коды одинаковы.
В многопользовательских системах так делать нельзя.
Нужно генерить ключевое поле на сервере либо с помощью IDENTITY либо спомощь какой -либо хранимой процедуры.
Также нужно смотреть по поводу настройке на сервере уровня изоляции - похоже у вас разрешено "грязное чтение", поэтому юзера видят незавершеные транзакции друг-друга
...
Рейтинг: 0 / 0
25.07.2006, 12:08
    #33876193
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CursorAdapter для новичка
-=AlexiS=- Нужно генерить ключевое поле на сервере либо с помощью IDENTITY ... Согласен.

Вот этому варианту я тоже отдаю предпочтение... При добавлении записи - код будет присваиваться автоматически самим сервером после того, как запись передастся на сервер... то есть с этим то проблем как раз и нет...
...
Рейтинг: 0 / 0
26.07.2006, 13:01
    #33879324
Недоходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CursorAdapter для новичка
2 all

Хорошо. Поле identify добавил. А где на сервере настраивать уровень изоляции?? И что там ставить?
...
Рейтинг: 0 / 0
26.07.2006, 19:09
    #33880691
-=AlexiS=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CursorAdapter для новичка
ну это зависит от сервера - для MSSQL читайте Isolation Levels в BOL
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / CursorAdapter для новичка / 25 сообщений из 30, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]