powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / CursorAdapter для новичка
30 сообщений из 30, показаны все 2 страниц
CursorAdapter для новичка
    #33859240
McFozzy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу незлится на меня, если этот вопрос уже обуждался или есть довольно изчерпающий 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
CursorAdapter для новичка
    #33859260
Фотография Vladimir M Sklyar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[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
CursorAdapter для новичка
    #33859289
McFozzy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
4. Например, есть форма, которая создаёт новии записи в таблице. Но, перед вставлением я должен быть уверен, что данные правильно введены, если нет, то недопустить вписание таких данных в настоящую таблицу. Если я делаю UPDATE на CursorAdapter, то автоматически добавляется строка в таблицу на SQL сервер или только после TABLEUPDATE()?
...
Рейтинг: 0 / 0
CursorAdapter для новичка
    #33859316
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
McFozzy4. Например, есть форма, которая создаёт новии записи в таблице. Но, перед вставлением я должен быть уверен, что данные правильно введены, если нет, то недопустить вписание таких данных в настоящую таблицу. Если я делаю UPDATE на CursorAdapter, то автоматически добавляется строка в таблицу на SQL сервер или только после TABLEUPDATE()?
Зависит от буферизации - для 5 только после update, для 3 - при перемещении записи - идет обновление на сервере автоматом...

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

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

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

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

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

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

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

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

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

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

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

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

*****
Единственное что мне не нравиться в CA-де так это то что он капризен на ошибки. если при изменении чего нить вылазит какая то ошибка, то при последующем создании этого же СА CursorFill() выдает .f.. И приходиться закрывать прогу полностью и запускать ее снова. Кто-то преодолевал это??
...
Рейтинг: 0 / 0
CursorAdapter для новичка
    #33863587
Проходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что преодолевать-то? Если CursorFill вернул .F., то надо ошибку обрабатывать, а не давить.
...
Рейтинг: 0 / 0
CursorAdapter для новичка
    #33863791
-=AlexiS=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
CursorAdapter для новичка
    #33865218
Sergej_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TO Недоходящий
можно посмотреть, скину завтра.
...
Рейтинг: 0 / 0
CursorAdapter для новичка
    #33872566
Недоходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня возникла такая ситуация.

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

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

дублей быть уже не может!!!
...
Рейтинг: 0 / 0
CursorAdapter для новичка
    #33875301
Недоходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
CursorAdapter для новичка
    #33875429
sar99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе утро!
Поскольку при рефреше на второй машине видны 2 пустые!!! записи
есть подозрение что пользователи видят незавершенные транзакции
друг друга.
Я для СА применяю АДО и для соединения oc прописываю
oc.isolationlevel=4096 && уровень изолированности транзакций
когода другой пользователь видит только завершенные транзакции
первого

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

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

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

Хорошо. Поле identify добавил. А где на сервере настраивать уровень изоляции?? И что там ставить?
...
Рейтинг: 0 / 0
CursorAdapter для новичка
    #33880691
-=AlexiS=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну это зависит от сервера - для MSSQL читайте Isolation Levels в BOL
...
Рейтинг: 0 / 0
CursorAdapter для новичка
    #33882594
Недоходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 -=AlexiS=-

Не совсем понял как этот уровень через фокс запускать. Где надо прописать команду выставления уровня?
...
Рейтинг: 0 / 0
CursorAdapter для новичка
    #33883000
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Недоходящий2 -=AlexiS=-

Не совсем понял как этот уровень через фокс запускать. Где надо прописать команду выставления уровня?
Не надо этого делать (хотя и возможно). Таким вещами должен "рулить" системный администратор. Пользователя уровни изоляции вообще не должны касаться. Тем более в такой простой задаче.
...
Рейтинг: 0 / 0
CursorAdapter для новичка
    #33883185
-=AlexiS=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообще-то согласен с ВладимирМ но если все-же надо , то через sqlexec даете команду серверу
Код: plaintext
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
или при составление запроса пишете его с соответствующим хинтом
...
Рейтинг: 0 / 0
CursorAdapter для новичка
    #33883421
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ Таким вещами должен "рулить" системный администратор. Пользователя уровни изоляции вообще не должны касаться. Тем более в такой простой задаче.
Каким это образом системный администратор "рулит" уровнями изоляции транзакции?!!! Он что влезает в приложение и устанавливает на уровне сессии SET TRANSACTION ISOLATION LEVEL.... или правит запросы и расставляет хинты оптимизатора. Категорически не согласен! Этим занимается ТОЛЬКО разработчик.
С уважением, Алексей.
...
Рейтинг: 0 / 0
CursorAdapter для новичка
    #33883508
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksey-K ВладимирМ Таким вещами должен "рулить" системный администратор. Пользователя уровни изоляции вообще не должны касаться. Тем более в такой простой задаче.
Каким это образом системный администратор "рулит" уровнями изоляции транзакции?!!! Он что влезает в приложение и устанавливает на уровне сессии SET TRANSACTION ISOLATION LEVEL.... или правит запросы и расставляет хинты оптимизатора. Категорически не согласен! Этим занимается ТОЛЬКО разработчик.
С уважением, Алексей.

Я отвечаю не "вообще", а в контексте конкретного вопроса. Вопрос стоит так: Как прочитать значение поля со свойством IDENTITY ?

Ну, и при чем здесь уровни изоляции? Зачем в лезать в те области, которые не касаются данной конкретной задачи?

Согласен, с фразой "рулит системный администратор" погорячился. В данном вопросе это должно быть отдано самому SQL-серверу. Нет смысла лезть в те настройки, которые напрямую не касаются поставленной задачи.

Только пожалуйста, не надо придумывать ситуации, когда это может понадобиться. Я и сам могу. Человек и так мало что понимает. Не стоит его "грузить" еще больше.
...
Рейтинг: 0 / 0
30 сообщений из 30, показаны все 2 страниц
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / CursorAdapter для новичка
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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