|
|
|
CursorAdapter для новичка
|
|||
|---|---|---|---|
|
#18+
Прошу незлится на меня, если этот вопрос уже обуждался или есть довольно изчерпающий 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, как изменят филтры из формы? Спасибо за ответы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2006, 21:42 |
|
||
|
CursorAdapter для новичка
|
|||
|---|---|---|---|
|
#18+
[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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2006, 22:01 |
|
||
|
CursorAdapter для новичка
|
|||
|---|---|---|---|
|
#18+
4. Например, есть форма, которая создаёт новии записи в таблице. Но, перед вставлением я должен быть уверен, что данные правильно введены, если нет, то недопустить вписание таких данных в настоящую таблицу. Если я делаю UPDATE на CursorAdapter, то автоматически добавляется строка в таблицу на SQL сервер или только после TABLEUPDATE()? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2006, 22:35 |
|
||
|
CursorAdapter для новичка
|
|||
|---|---|---|---|
|
#18+
McFozzy4. Например, есть форма, которая создаёт новии записи в таблице. Но, перед вставлением я должен быть уверен, что данные правильно введены, если нет, то недопустить вписание таких данных в настоящую таблицу. Если я делаю UPDATE на CursorAdapter, то автоматически добавляется строка в таблицу на SQL сервер или только после TABLEUPDATE()? Зависит от буферизации - для 5 только после update, для 3 - при перемещении записи - идет обновление на сервере автоматом... По существу вопроса - использование Cursor Adapter - это просто помощь для начинающих или когда надо быстро создать несложное приложение... При серьезной работе - лучше применять локальные курсоры и все обновлять с помощью хранимых процедур - так дешевле и надежнее... But anyway, good luck! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2006, 23:04 |
|
||
|
CursorAdapter для новичка
|
|||
|---|---|---|---|
|
#18+
2 Sergey Ch >>При серьезной работе - лучше применять локальные курсоры и все >>обновлять с помощью хранимых процедур - так дешевле и надежнее... А можно ссылочку на литературу?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2006, 01:35 |
|
||
|
CursorAdapter для новичка
|
|||
|---|---|---|---|
|
#18+
Недоходящий2 Sergey Ch >>При серьезной работе - лучше применять локальные курсоры и все >>обновлять с помощью хранимых процедур - так дешевле и надежнее... А можно ссылочку на литературу?? Данное утверждение и совет основаны на собственном опыте разработки приложений. Несколько проектов начинал с курсора - адаптера, но постепенно везде возвращался к проверенной старой методике... Проблемы как правильно заметил автор - в неактуальности данных и постоянной проверке обновлений на сервере, что не гарантирует того, что данные уникальные... Выполнение хранимой процедуры с параметрами, механизм транзакций и блокировок самого сервера - это как раз то, что мне как правило, надо... Ну а курсорадаптер удобен, если надо что-то "быстро слепить" и не очень ответственное - например, управление не часто меняющихся справочников etc... Но это мое личное мнение, каждый должен попробовать и сделать для себя свои выводы... But anyway, good luck! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2006, 09:24 |
|
||
|
CursorAdapter для новичка
|
|||
|---|---|---|---|
|
#18+
Почитай тут я тоже затрагивал тему курсорадаптера. Решил попробовать новенького. Ну что сказать после этого присоеденяюсь к Sergey Ch - и возвращаюсь к "старой" технологии ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2006, 11:38 |
|
||
|
CursorAdapter для новичка
|
|||
|---|---|---|---|
|
#18+
>> Ну а курсорадаптер удобен, если надо что-то "быстро слепить" и не очень ответственное - например, управление не часто меняющихся справочников etc... с этим я согласен тоже. Пока использую курсоры. Но хотелось бы что нить другое попробывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2006, 20:34 |
|
||
|
CursorAdapter для новичка
|
|||
|---|---|---|---|
|
#18+
Sergey ChНу а курсорадаптер удобен, если надо что-то "быстро слепить" и не очень ответственное - например, управление не часто меняющихся справочников etc... В принципе, согласен. НО: юзаю CAD активно более полугода- сделал на его основе класс- весьма доволен. Простые формы как из пулемета можно строчить, да и непростые тоже. Нормально работают и по 10 гридов на форме. У меня правда специфика такая- транзакции при занесении/изменении строк редко использую. Они в основном у меня в хранимках и запускаются только для начислений и т.д. TO: -=AlexiS=- Пробовал я тоже вначале с фетчем работать- намаялся сильно, хорошо, что добрые с сайта люди убедили, что не надо юзеру _все_ записи. Сейчас строю интерфейс, чтобы юзеры работали с диапазонами. Как но странно, приучить их к диапазонам оказалось намного легче, чем себя самого и шефов :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2006, 10:43 |
|
||
|
CursorAdapter для новичка
|
|||
|---|---|---|---|
|
#18+
to Sergej_S Ну дык тоже работаю с диапазонами - просто натолкнулся на проблему когда отлаживался решил просто для проверки затянуть все данные. Кстати реализов идею из этого обсуждения получил интересные результаты. Для "большой" выборки делаю отдельный statement handles внутри connection handle - устанавливаю значения Fetch Size = 100 и FetchAsNeed=.t. и меня собственно не интересуют размеры выборки , поскольку тянеться -то порциями - и уже при получении первой порции даных можно работать. т.е. получаеться как-бы асинхронная работа. Загрузка происходит быстро - и собственно размеры выборки особенно и не волнуют . конечно если юзер сразу ломанется смотреть последние записи , то тормоза. Но данный вариант подойдет для "просмотровых" режимов , т.е. когда пользователь хочет сначала увидеть данные в виде списка, а потом посмотреть их детализацию. Тогда правильно подобрав порядок сортировки можно подать ему в "первых рядах" ту инфу что он хочет видеть первой , а дальнейшая загрузка будет происходить порциями причем играясь FetchAsNeed можно либо отложить получение данных либо просто "размазать по времени". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2006, 11:28 |
|
||
|
CursorAdapter для новичка
|
|||
|---|---|---|---|
|
#18+
To: -=AlexiS=- И каковы планы на будущее относительно CAD с фетчем? Я так понял, что использовав несколько стейтментов к расшаренному коннекту у тебя получтлось, что ты хотел. Я по такой схеме (фетчи и стейтменты) пробовал делать где-то полгода назад- не получилось... (fox8). Может, не до конца разобрался, но даже если так будет работать нормально, предвижу много заморочек с фетчем. Например: выкачались первых 100 записей документов(сортировка по дате). юзер делает инсерт. запись надо бы вставить в порадке даты. что будет делать CAD? перекачивать все? а без фетча, с диапазонами, я в SelectCmd "ORDER BY" вообще не указываю, а строю индекс в фоксе на курсор, тогда и при инсерте/изменении у меня строка сама визуально становится на нужное место. можнл и перекачки курсора сменить сортировку. плюс скл сервер не грузится лишней командой order by. Вот такие мои мысли по поводу фетча. Хотя, вполне возможно, что, разобравшись, можно и с ним хороше работать. Может, еще попробую, как освобожусь немного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2006, 12:35 |
|
||
|
CursorAdapter для новичка
|
|||
|---|---|---|---|
|
#18+
2 Sergej_S Можно Ваш класс по каду посмотреть?? ***** Единственное что мне не нравиться в CA-де так это то что он капризен на ошибки. если при изменении чего нить вылазит какая то ошибка, то при последующем создании этого же СА CursorFill() выдает .f.. И приходиться закрывать прогу полностью и запускать ее снова. Кто-то преодолевал это?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2006, 12:44 |
|
||
|
CursorAdapter для новичка
|
|||
|---|---|---|---|
|
#18+
Что преодолевать-то? Если CursorFill вернул .F., то надо ошибку обрабатывать, а не давить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2006, 12:57 |
|
||
|
CursorAdapter для новичка
|
|||
|---|---|---|---|
|
#18+
Sergej_SИ каковы планы на будущее относительно CAD с фетчем? Я так понял, что использовав несколько стейтментов к расшаренному коннекту у тебя получтлось, что ты хотел. Да , все получилось. Идея такова - для "больших" курсоров в BeforOpenTable DE пишу Код: plaintext 1. в Destroy DE (пока так хотя это несколько грубовато и требует доработки) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Планы в принципе я описал выше. Есть у меня парочка режимов в которых много записей даже при отборе по диапазонам.Режимы просмотровые типа вижу список - кликнул- посмотрел детальную инфу. Вот там ему и место. Sergej_SЯ по такой схеме (фетчи и стейтменты) пробовал делать где-то полгода назад- не получилось... (fox8). Может, не до конца разобрался, но даже если так будет работать нормально, предвижу много заморочек с фетчем. Например: выкачались первых 100 записей документов(сортировка по дате). юзер делает инсерт. запись надо бы вставить в порадке даты. что будет делать CAD? перекачивать все? а без фетча, с диапазонами, я в SelectCmd "ORDER BY" вообще не указываю, а строю индекс в фоксе на курсор, тогда и при инсерте/изменении у меня строка сама визуально становится на нужное место. можнл и перекачки курсора сменить сортировку. плюс скл сервер не грузится лишней командой order by. Собственно сортировки меня тоже не заботят - я тоже строю сортировки уже на полученом курсоре.Для работы кстати использую доработанный и несколько переделаный Грид от. Алексея Климова (за что ему аграмадное спасибо). Однако поскольку для сортировки используеться индекс - построение его ведет к "полной" загрузке , т.е. к тормозам. Поэтому я все-таки первоначальный порядок сортировки указываю. Насчет инсерта - тоже проблемка. Но как я говорил собираюсь использовать данный вариант в "просмотровых" целях. А для ввода все-же буду делать более узкие диапазоны. Sergej_S Вот такие мои мысли по поводу фетча. Хотя, вполне возможно, что, разобравшись, можно и с ним хороше работать. Может, еще попробую, как освобожусь немного НУ ежели-что - делись достижениями ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2006, 13:42 |
|
||
|
CursorAdapter для новичка
|
|||
|---|---|---|---|
|
#18+
TO Недоходящий можно посмотреть, скину завтра. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2006, 19:19 |
|
||
|
CursorAdapter для новичка
|
|||
|---|---|---|---|
|
#18+
У меня возникла такая ситуация. есть форма на которой есть грид с одной колонкой. При загрузке формы создаеться СА и даю гриду в ров соурс одно поле этого СА. Так вот запускаю эту форму на двух машинах одновременно. С начала нажимаю на первой машине кнопку "Создать запись". Создаеться и что-то ввожу. В этот момент на второй тоже создаю строку и в кнопке прописан рефреш СА. И получаеться что на второй машине я вижу две новых строки (пустые). Одна которая создана на первой и вторая на второй. В чем проблема: Если на второй машине ввести в первой строке что нить, которая была создана на первой машине, то при закрытии СА (на обоих машинах), эта строка на сервере (sql2000) копировалась!. т.е. введенные значения разные, но номер строки, код и. т.д. одинаковы. Есть ли способ как предотвротить копирование строки?? Надеюсь я правильно выразил проблему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2006, 21:35 |
|
||
|
CursorAdapter для новичка
|
|||
|---|---|---|---|
|
#18+
Не совсем внятно. код кнопки выложи и пример данных -что получилось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2006, 10:15 |
|
||
|
CursorAdapter для новичка
|
|||
|---|---|---|---|
|
#18+
Добрый день! Если кнопка <создать запись> будет вызывать окно ввода и затем запись вводиться последовательностью команд: insert into <имя таблицы> (поля) values (значения полей) vcommit=tableupdate() if vcommit=.f. ***разбор конфликта endif то проблемм быть при многопользовательской работе не должно до tableupdate() запись видит только пользователь ее введший - после - любой другой но только для корректировки(удаления) дублей быть уже не может!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2006, 15:02 |
|
||
|
CursorAdapter для новичка
|
|||
|---|---|---|---|
|
#18+
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() я создаю СА только с той строкой, которую нужно изменить) я применяю для больших форм, где открываеться форма для заполнения, в моем случае это маленькая форма с одним гридом и одной колонкой и с активным СА, где введя любое изменение вводиться этоже изменения в серваке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2006, 00:33 |
|
||
|
CursorAdapter для новичка
|
|||
|---|---|---|---|
|
#18+
Доброе утро! Поскольку при рефреше на второй машине видны 2 пустые!!! записи есть подозрение что пользователи видят незавершенные транзакции друг друга. Я для СА применяю АДО и для соединения oc прописываю oc.isolationlevel=4096 && уровень изолированности транзакций когода другой пользователь видит только завершенные транзакции первого может в твоей ситуации тоже попробовать поиграть с уровнем изолированности (не работал с ODBC - не знаю как!) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2006, 08:23 |
|
||
|
CursorAdapter для новичка
|
|||
|---|---|---|---|
|
#18+
кстати код кнопки: APPEND BLANK IN dolj *добавляю строку в СА replace kod WITH dolj_max_kod.kod+1,naimen WITH '',pr_delete WITH 0 IN dolj не гарантирует уникальности поля kod при многопользовательской работе! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2006, 08:34 |
|
||
|
CursorAdapter для новичка
|
|||
|---|---|---|---|
|
#18+
Похоже вся проблема в получении кода смотри 1 юзер добавил запись - пока она еще в буфере получил с сервера максимальный код - он равен 4 второй тоже добавил запись , и получил код равный 4 , поскольку первый еще запись не сохранил вот и получается, что коды одинаковы. В многопользовательских системах так делать нельзя. Нужно генерить ключевое поле на сервере либо с помощью IDENTITY либо спомощь какой -либо хранимой процедуры. Также нужно смотреть по поводу настройке на сервере уровня изоляции - похоже у вас разрешено "грязное чтение", поэтому юзера видят незавершеные транзакции друг-друга ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2006, 10:28 |
|
||
|
CursorAdapter для новичка
|
|||
|---|---|---|---|
|
#18+
-=AlexiS=- Нужно генерить ключевое поле на сервере либо с помощью IDENTITY ... Согласен. Вот этому варианту я тоже отдаю предпочтение... При добавлении записи - код будет присваиваться автоматически самим сервером после того, как запись передастся на сервер... то есть с этим то проблем как раз и нет... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2006, 12:08 |
|
||
|
CursorAdapter для новичка
|
|||
|---|---|---|---|
|
#18+
2 all Хорошо. Поле identify добавил. А где на сервере настраивать уровень изоляции?? И что там ставить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2006, 13:01 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=33875442&tid=1591117]: |
0ms |
get settings: |
8ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
146ms |
get topic data: |
7ms |
get forum data: |
1ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 235ms |
| total: | 462ms |

| 0 / 0 |
