powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Обновление записи через КАД
22 сообщений из 22, страница 1 из 1
Обновление записи через КАД
    #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
Обновление записи через КАД
    #35851520
antonov60,

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Если можно, буду благодарен
...
Рейтинг: 0 / 0
Обновление записи через КАД
    #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
Обновление записи через КАД
    #35853265
antonov60
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to проходящий

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

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

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

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

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

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

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

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

По КАДу:

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

По КАДу:

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

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

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

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

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

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

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


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