powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Рвется База :)
7 сообщений из 57, страница 3 из 3
Рвется База :)
    #36835352
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НадеждаМпрошелмимо,

Да мне хотя-бы пока на домашнем примере попробовать )

отдаю "слона".

пример содержит скрипты 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.
With oServer

	.ServerName      = ".\SQLSERVER2005"
	.DBName           = "myTest"
	.User_name       = "sa"
	.User_PassWord = "as"
...

пример демонстрирует спис.форму редактирования,
получение курсора посредством ХП.
показан пример разработки абстрактного инструмента
настройки курсорадаптера,
показан универсальный инструмент для
сохр-я изм-й, отобр-я ошибок и т.д. ...
...
Рейтинг: 0 / 0
Рвется База :)
    #36835436
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
к списочной ф-ме прикручен класс-грид с сортировкой и т.д.
...
Рейтинг: 0 / 0
Рвется База :)
    #36835633
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НадеждаМКак удалить запись через 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 предоставляет возможность сделать и то, и другое.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Рвется База :)
    #37666089
L.Lisichka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый вечер. В поисках информации по работе с курсорадаптером натолкнулась на эту тему. Скачала пример_с_хп, стала разбираться. Вроде все получается, только вот не понятно одно: как в SQL выражение добавить условие where? Пока у меня простой запрос, для отображения данных. Но в дальнейшем понадобится и поиск по условию.

Завтра приведу код.
...
Рейтинг: 0 / 0
Рвется База :)
    #37666506
L.Lisichka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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.
Клас курсорадаптер взят из приведенного выше примера "пример_с_хп"
&& в лоаде формы
PUBLIC  tcSql_updateTableName, 	;  	&& таблица на сервере	
	        tcCADkeyFieldList, 		;	&& ключь-линк в таблице
		tcCADupdatableFieldList,;	&& обновляемые поля в таблице  (список через запятую)
		tcCADcursorSchema, 		;	&& схема - преобразов-е типов  (список через зяпятую)
		tcWhere, 				;	&& условие в запросе (выражение после WHERE)
		tcSelectedFieldsList,   ;	&& поля в строке запроса (необяз-й параметр)
		tcGroupBy,				;	&& строка - список через запятую
		tcOrderBy,				;	&& строка - список через запятую
		tcSelectCmdADD,			;	&& добавчик к SelectCmd
		tcSelectCmd,			;   && если уж совсем нестандартный запрос
		tcAliasName,			;	&& имя алиаза
		tlLockCursorFill,		;	&& T - не произойдет загрузка данных в курсор
		tcTimeStampFieldsList       && && список полей TimeStamp

WITH THIS
	SET TALK OFF
	SET OPTIMIZE ON

	.combo1.LISTINDEX = 1 
	.combo1.VALID
	.grid1.RECORDSOURCE = ''

	tcAliasName='fin'
	tcSelectCmd='exec count.dbo.mn_fin;2'
	tcSql_updateTableName='mnfin'
	tcCADkeyFieldList='fin_id'
	tcCADUpdateNamelist='lpucode mnfin.lpucode, date mnfin.date, sum mnfin.sum, prim mnfin.prim, skind mnfin.skind, ndoc mnfin.ndoc, rf mnfin.rf, god mnfin.god, priz mnfin.priz, paydate mnfin.paydate, paynum mnfin.paynum, ostatok mnfin.ostatok'
	tcCADupdatableFieldList='lpucode, date, sum, prim, skind, ndoc, rf, god, priz, paydate, paynum, ostatok'
	tcCADcursorSchema=''
						
	.ocad = CREATEOBJECT("cad_test2") 
		
	select (tcAliasName)		
		
	COUNT TO cnt1
	GO TOP
		
	IF cnt1 > 0

                .grid1.recordsource=tcAliasName   	
  			
  		.grid1.Refresh()	
	ENDIF
	
ENDWITH

&& в кнопке поиска
WITH this.parent

	IF empty(.text1.value)
		 = MESSAGEBOX("Введите критерии поиска!", 0 + 64 + 0, _SCREEN.CAPTION)
		.text1.setfocus
		RETURN .f.
	else
		
                par(2)=.text1.value

		DO case
			CASE .combo1.LISTINDEX = 1 &&поиск по lpucode 
			&& что сюда вставить?
			      
			CASE .combo1.LISTINDEX = 2
				
			
			CASE .combo1.LISTINDEX = 3
				
		ENDCASE			

	if .oCad.CursorRefresh()
		IF USED(tcAliasName)
  			SELECT (tcAliasName)
			COUNT TO cnt1
			GO TOP
    		        IF cnt1 > 0

                                .grid1.recordsource=tcAliasName   	
  			
  		                .grid1.Refresh()	

		        ELSE
			        = MESSAGEBOX("Не найдено!", 0 + 64 + 0, _SCREEN.CAPTION)
			ENDIF				
		ENDIF
	else
	
	messagebox('Ошибка')	
endif

endwith 
...
Рейтинг: 0 / 0
Рвется База :)
    #37666546
L.Lisichka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DO case
CASE .combo1.LISTINDEX = 1 &&поиск по lpucode
попробовала вставить
tcWhere = 'where '+iif(!empty(par(2)), 'lpu = '+ltrim(str(par(2))), '')

но ничего не происходит
даже после .oCad.CursorRefresh()
...
Рейтинг: 0 / 0
Рвется База :)
    #37666759
L.Lisichka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите пожалуйста разобраться с этим классом. Как сделать поиск по условию.
...
Рейтинг: 0 / 0
7 сообщений из 57, страница 3 из 3
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Рвется База :)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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