|
Рвется База :)
|
|||
---|---|---|---|
#18+
НадеждаМпрошелмимо, Да мне хотя-бы пока на домашнем примере попробовать ) отдаю "слона". пример содержит скрипты script.sql для создания объектов в БД 1. на сервере создать БД mytest, выполнить скрипты 2. распаковать в папку, перенастроить пути в файликах разработка.lnk config.cfg path.prg (если не хочется это делать - создайте папки и распакуйте по такому пути c:\forum\пример_с_хп\) 3. нажать разработка.lnk он ссылается на объект "C:\Program Files\Microsoft Visual FoxPro 9\vfp9.exe" -cc:\forum\пример_с_хп\config.cfg (если пути к среде разработки отличаются - исправить) при отличающихся имени сервера, пароле и имени БД править код в классе app - метод login Код: plaintext 1. 2. 3. 4. 5. 6. 7.
пример демонстрирует спис.форму редактирования, получение курсора посредством ХП. показан пример разработки абстрактного инструмента настройки курсорадаптера, показан универсальный инструмент для сохр-я изм-й, отобр-я ошибок и т.д. ... ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2010, 11:05 |
|
Рвется База :)
|
|||
---|---|---|---|
#18+
к списочной ф-ме прикручен класс-грид с сортировкой и т.д. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2010, 11:28 |
|
Рвется База :)
|
|||
---|---|---|---|
#18+
НадеждаМКак удалить запись через CA? Как применить вот эти свойства? CursorAdapter.DeleteCmd [ = cCommand ] CursorAdapter.DeleteCmdDataSourceType [= cDataSourceType] CursorAdapter.DeleteCmdDataSource [ = cDataSource] Я попытаюсь объяснить принцип работы с удаленными данными. Думаю, тогда будет проще понять о чем вообще речь. Итак, основа основ - это запрос к серверу. Команда Select-SQL (CursorAdapter.SelectCmd), пусть и выполняемая внутри хранимой процедуры. Эта команда возвращает некую выборку. Очевидно, что выборка - это не есть исходная таблица. Это другая таблица. Физически другая. Даже расположенная в другом месте. Следовательно, модификация этой другой таблицы никак не затронет исходную таблицу, на основе которой эта выборка и делается. Необходимо предпринять ряд действий, чтобы изменения из выборки попали в исходные таблицы. Существуют стандартные команды для модификаций таблиц. Insert-SQL, Update-SQL, Delete-SQL. Следовательно, для выполнения модификации необходимо сформировать соответствующие команды и передать их на сервер. Что необходимо знать, чтобы сформировать эти команды? 1. Имя таблицы, которую будем модифицировать (CursorAdapter.Tables) 2. Поле или набор полей, по которым можно однозначно идентифицировать запись. Так называемое, ключевое поле или первичный ключ (CursorAdapter.KeyFieldList) 3. Какие поля будем модифицировать (CursorAdapter.UpdatableFieldList). Список полей через запятую. 4. Из каких полей выборки (на клиенте) брать информацию для обновления полей на сервере. Так сказать "карта соответствия" (CursorAdapter.UpdateNameList). Какое поле на клиенте какому полю на сервере соответствует. Список пар полей через запятую. Собственно, это и есть минимально необходимый набор настроек CursorAdapter, чтобы обеспечить автоматическое обновление данных на сервере. В большинстве случаев этого вполне достаточно. Есть еще ряд "тонких" настроек, но значения по-умолчанию этих "тонких" настроек, опять же, в большинстве случаев, как раз те, что нужно. Объект CursorAdapter при возникновении события сохранения внесенных изменений на основании этих 4 настроек автоматически формирует необходимые команды на модификацию (Insert-SQL, Update-SQL, Delete-SQL) и также автоматически отправляет их на сервер. Что является этим самым "событием сохранения внесенных изменений"? В FoxPro есть такое понятие как "буферизация". Если представить исходную выборку (исходную таблицу) как лист бумаги с некоторым текстом, то буферизация - это прозрачная калька, положенная поверх этого листа. Внося изменения, Вы "пишите" эти изменения не сразу на лист, а на эту самую прозрачную кальку. Затем, при возникновении определенного события, происходит перенос изменений с "кальки" на собственно лист. К чему это все? А к тому, что результат выборки в CursorAdapter всегда находится в режиме оптимистической буферизации. По умолчанию, в режиме оптимистической буферизации строк (3), но может быть переключен в режим оптимистической буферизации таблиц (5). Установить для него режим пессимистической буфериазции или отключить буферизацию совсем - невозможно. Это значит, что выполняя модификации в курсоре, полученном из CursorAdapter, фактически, Вы модифицируете буфер этого курсора. Как следствие, под событием "сохранения внесенных изменений" понимается процесс "сброса буфера" или, другими словами, переноса изменений из буфера в сам курсор Сброс буфера происходит В режиме строковой буферизации 1. При попытке перехода на другую запись 2. При попытке закрытия курсора 3. По команде TableUpdate() В режиме табличной буферизации только по команде TableUpdate() и никак иначе. Именно по этой причине, чаще всего, устанавливают режим табличной буферизации (5), чтобы исключить неконтролируемый сброс буфера. Неконтролируемый программистом. Как следствие, процесс сохранения внесенных изменений запускается командой TableUpdate() А зачем же тогда сделаны дополнительные свойства вроде CursorAdapter.DeleteCmd, CursorAdapter.InsertCmd, CursorAdapter.UpdateCmd? Ведь команды на модификацию будут сформированы автоматически. А это сделано на тот случай, если команды, автоматически формируемые CursorAdapter для обновления данных Вас не устраивают. В этом случае при сбросе буфера (по команде TableUpdate()) будут использованы команды, указанные в этих свойствах. Соответственно, выбор за Вами. Если 4-х стандартных настроек (Tables, KeyFieldList, UpdatableFieldList, UpdateNameList) достаточно для заложенной в приложении логики обновления данных, то этим и следует ограничиться. Если же этого недостаточно, то следует проанализировать насколько логика приложения отличается от логики CursorAdapter и либо полностью подменять эту логику, либо "слегка" корректировать. CursorAdapter предоставляет возможность сделать и то, и другое. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2010, 12:35 |
|
Рвется База :)
|
|||
---|---|---|---|
#18+
Добрый вечер. В поисках информации по работе с курсорадаптером натолкнулась на эту тему. Скачала пример_с_хп, стала разбираться. Вроде все получается, только вот не понятно одно: как в SQL выражение добавить условие where? Пока у меня простой запрос, для отображения данных. Но в дальнейшем понадобится и поиск по условию. Завтра приведу код. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2012, 20:22 |
|
Рвется База :)
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2012, 08:24 |
|
Рвется База :)
|
|||
---|---|---|---|
#18+
DO case CASE .combo1.LISTINDEX = 1 &&поиск по lpucode попробовала вставить tcWhere = 'where '+iif(!empty(par(2)), 'lpu = '+ltrim(str(par(2))), '') но ничего не происходит даже после .oCad.CursorRefresh() ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2012, 09:18 |
|
|
start [/forum/topic.php?fid=41&msg=36835436&tid=1583829]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
38ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
others: | 256ms |
total: | 380ms |
0 / 0 |