Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Обновление записи через КАД / 22 сообщений из 22, страница 1 из 1
04.03.2009, 16:50
    #35851400
antonov60
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление записи через КАД
Уважаемые ГУРУ

Помогоите разобоаться с обновлением таблиц через КАД

This.PayICADPtr = CreateObject('CursorAdapter') && PayI

With This.PayICADPtr
.DataSource = CAdSourceHdr && Указатель на источник данных
.DataSourceType = CAdSourceType && Тип источника данных
.Tables = "PayI"
.Alias = "cPayI"
.BufferModeOverride = 5
.SelectCmd = "Select * from PayI where RecIdent=?RecID"
EndWith


if !This.PayICADPtr.CursorFill() && Заполнение курсора (1 запись)
AError(laErrors)
MessageBox(laErrors[2])
return(.F.)
endif

Scatter memo NAME ThisForm.PayIDataPtr && Считать поля записи в об"ект Scatter


* Редактирование полей записи в об"екте PayIDataPtr на форме


* обновление таблицы

Select cPayI && Курсор от PayI

With ThisForm.PayICADPtr
.UpdateType = 1
.KeyFieldList = 'RecIdent'

m.NameList = Field(1) +Space(1) + .Tables + "." + Field(1)
m.FieldList = Field(1)

for i=2 to FCount()
m.NameList = m.NameList + "," + Field(i) +Space(1) + .Tables + "." + Field(i)
m.FieldList = m.FieldList + "," + Field(i)
endfor

.UpdateNameList = m.NameList && Список изменяемых полей
.UpdatableFieldList = m.FieldList
EndWith


UPDATE cPayI where RecIdent = ThisForm.DocID SET;
PayDocNum = ThisForm.PayIDataPtr.PayDocNum


Дает ошибку Alias PAYDATAPTR not found

хотя вариант

m.aaa = ThisForm.PayIDataPtr.PayDocNum

UPDATE cPayI where RecIdent = ThisForm.RecID SET;
PayDocNum = m.aaa

проходит без проблем.


Получается , что все поля из об'екта придется перенести в локальные переменные,
а потом запускать Update ?

Или есть другое решение ?
...
Рейтинг: 0 / 0
04.03.2009, 17:31
    #35851520
Обновление записи через КАД
antonov60,

1. Настройки КАД обычно делаются один раз при начале работы с ним, а не динамичски в коде переписывается один и тот же список полей. Фоксу и Вам делать нечего?
2. Команда select в первую очередь работает с таблицами. Аесли это еще и на сервере, то только с таблицами. ThisForm.PayIDataPtr для нее - таблица ThisForm с полем PayIDataPtr.
3. Зачем перегонять scatter'ом данные в свойства объекта? Их нельзя/трудно редактировать прямо в курсоре? Кстати, и п.2 тогда сразу отпадет.
...
Рейтинг: 0 / 0
05.03.2009, 08:54
    #35852278
прошелмимо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление записи через КАД
авторИли есть другое решение ?

вот пример для родных таблиц
...
Рейтинг: 0 / 0
05.03.2009, 13:01
    #35853083
antonov60
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление записи через КАД
to проходящий

Редактировать прямо в курсоре не трудно, если это существующая запись,

а как редактировать добавляемую запись -

добавить в курсор пустую запись и встать на нее ?

и чем добавлять: append blank или Insert SQL ?
...
Рейтинг: 0 / 0
05.03.2009, 13:03
    #35853088
Обновление записи через КАД
antonov60to проходящий

Редактировать прямо в курсоре не трудно, если это существующая запись,

а как редактировать добавляемую запись -

добавить в курсор пустую запись и встать на нее ?
Да. А это настолько неочевидно?
и чем добавлять: append blank или Insert SQL ?
Чем удобнее, тем и вставлять.
...
Рейтинг: 0 / 0
05.03.2009, 13:29
    #35853171
antonov60
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление записи через КАД
to проходящий

А если User в дальнейшем отказался от добавления записи в форме,
что делать с курсором ? Пустая запись уже не нужна.

Обновить курсор? И чем ?
...
Рейтинг: 0 / 0
05.03.2009, 13:32
    #35853184
Обновление записи через КАД
antonov60to проходящий

А если User в дальнейшем отказался от добавления записи в форме,
что делать с курсором ? Пустая запись уже не нужна.

Обновить курсор? И чем ?
Tablerevert()
...
Рейтинг: 0 / 0
05.03.2009, 13:42
    #35853214
antonov60
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление записи через КАД
to проходящий

Еще один вопрос

В записи есть поля, которые непосредственно не редактируются,
например номер (ID) организации, а находятся в свойстве формы.

Чем их перенести в запись - через Replace ?
...
Рейтинг: 0 / 0
05.03.2009, 13:43
    #35853222
прошелмимо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление записи через КАД
авторЧем их перенести в запись - через Replace ?

да, можно автоматом, создать функцию - могу показать
...
Рейтинг: 0 / 0
05.03.2009, 13:45
    #35853227
antonov60
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление записи через КАД
to проходящий

Если можно, буду благодарен
...
Рейтинг: 0 / 0
05.03.2009, 13:50
    #35853247
прошелмимо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление записи через КАД
Код: plaintext
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.
create cursor tt (id i autoinc, cvalue c( 10 ), uuu i null)
local i
for i= 1  to  100 
	insert into tt (cvalue) values (ltrim(str(i)))
endfor

local loMyCad
loMyCad = createobject('mycad')
with loMyCad
	.SelectCmdSet('1=1')
	select mycursor
	update mycursor set cvalue=cvalue, ;
	                    uuu=null
	if tableupdate(.t.,.t.,"mycursor")
		select * from tt
	else
		local lArr[ 1 ]
		aerror(lArr)
		messagebox('не шмогла tableupdate  '+lArr[ 2 ])
	endif
endwith




DEFINE CLASS mycad AS CursorAdapter

	BufferModeOverride =  5 
	DataSourceType = "Native"
	WhereType =  4 
	ConflictCheckType =  1 
	Alias = "mycursor"
	KeyFieldList = "Id"
	Tables = "tt"
	Name = "mycad"
	UpdatableFieldList = "cvalue, uuu"
	UpdateNameList = "Id tt.Id, cvalue tt.cvalue, uuu tt.uuu"
	ConversionFunc = "uuu checkUUU"
	
	procedure SelectCmdSet
		lparameters tcWhere
		text to this.SelectCmd noshow textmerge pretext  15 
			select *
				from <<this.Tables>>
					where <<tcWhere>>
		endtext
		if this.cursorfill()
			return .t.
		else
			messagebox('не шмогла cursorfill')
		endif
enddefine

procedure checkUUU
	lparameters ttt
	return id+ 10 
endproc

пока уехал за вином и конфетами
...
Рейтинг: 0 / 0
05.03.2009, 13:55
    #35853265
antonov60
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление записи через КАД
to проходящий

Спасибо, попробую разобраться
...
Рейтинг: 0 / 0
05.03.2009, 15:00
    #35853480
antonov60
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление записи через КАД
to проходящий

Есть еще одна проблема.

В каждой записи есть вычисляемое поле RecIdent - идентификатор записи

Для его получения и наращивания на +1 используется процедура, которая
напрямую через Use открывает таблицу идентификаторов, блокирует ее по FLock(),
находит тек. значение RecIdent для нужной таблицы,
увеличивает его на 1 и возвращает новое значение.

Таблицы от FoxPro for DOS, т.е. Identity не поддерживают, поменять на новый формат
не могу - их FPD не открывает.

Напрямую я, как понимаю, через КАД заблокировать таблицу идентификаторов
на время поиска и вычисления след. идентификатора не смогу.

Из тех вариантов, которые нашел - хранимая процедура в DBC файле,
но при добавлении в DBC таблиц от FPD VFOX 9.0 сразу пытается
их конвертировать в новый формат - засада для FPD

Есть ли еще варианты решения этой проблемы ?
...
Рейтинг: 0 / 0
05.03.2009, 15:14
    #35853541
Обновление записи через КАД
antonov60Напрямую я, как понимаю, через КАД заблокировать таблицу идентификаторов
на время поиска и вычисления след. идентификатора не смогу.
А каким боком тут КАД? Вы не умеете получать значения из процудур/функций?
...
Рейтинг: 0 / 0
05.03.2009, 15:26
    #35853586
antonov60
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление записи через КАД
Мне хотелось все сделать однообразно через ODBC
...
Рейтинг: 0 / 0
05.03.2009, 15:49
    #35853669
Обновление записи через КАД
antonov60Мне хотелось все сделать однообразно через ODBC
И что это изменило?
...
Рейтинг: 0 / 0
05.03.2009, 16:04
    #35853734
-=AlexiS=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление записи через КАД
КАД - это обьект имеющий Befor и After методы для добавления и модификации.
Все свои танцы с бубном вы можете вынести туда.
Ну и для чего включать таблицы в DBC ?
Если вам нужно написать хранимку - создайте себе базу , но таблицы в нее не включайте - используйте как хранилище хранимок.
...
Рейтинг: 0 / 0
05.03.2009, 16:47
    #35853913
antonov60
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление записи через КАД
AlexiS, за идею хранилища хранимок спасибо. Обязательно попробую

По КАДу:

неужели возможно, используя события Befor и After, четко гарантировать
что между созданием курсора из таблицы идентификаторов, его модификацией и
сбросом на сервер
туда не вклинится еще кто-нибудь и не получит старое значение идентификатора
и получим 2 записи с одним ID соответственно
...
Рейтинг: 0 / 0
05.03.2009, 16:58
    #35853963
Обновление записи через КАД
antonov60AlexiS, за идею хранилища хранимок спасибо. Обязательно попробую

По КАДу:

неужели возможно, используя события Befor и After, четко гарантировать
что между созданием курсора из таблицы идентификаторов, его модификацией и
сбросом на сервер
туда не вклинится еще кто-нибудь и не получит старое значение идентификатора
и получим 2 записи с одним ID соответственно
Указанные события тут совершенно не причем. Гарантии должна обеспечивать процедура получения нового идентификатора.
...
Рейтинг: 0 / 0
05.03.2009, 17:17
    #35854026
antonov60
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление записи через КАД
А есть какой-либо рабочий вариант процедуры расчета и получения ID

Можно его сделать достоянием публики ?
...
Рейтинг: 0 / 0
05.03.2009, 17:28
    #35854056
Обновление записи через КАД
antonov60А есть какой-либо рабочий вариант процедуры расчета и получения ID

Можно его сделать достоянием публики ?
А это кто писал?
Для его получения и наращивания на +1 используется процедура, которая
напрямую через Use открывает таблицу идентификаторов, блокирует ее по FLock(),
находит тек. значение RecIdent для нужной таблицы,
увеличивает его на 1 и возвращает новое значение.
Что еще Вы хотите?
...
Рейтинг: 0 / 0
05.03.2009, 17:57
    #35854149
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление записи через КАД
antonov60А есть какой-либо рабочий вариант процедуры расчета и получения ID

Можно его сделать достоянием публики ?

1. В приведенном коде

Код: plaintext
create cursor tt (id i autoinc, cvalue c( 10 ), uuu i null)

2. Поиск со словом NewID (масса примеров)
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Обновление записи через КАД / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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