powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Хранение истории изменений объектов
25 сообщений из 57, страница 2 из 3
Хранение истории изменений объектов
    #37671964
YuraM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, krvsa!
Может быть не совсем то, что Вам надо, но мы у себя ведем лог изменений примерно таким способом...

Код: 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.
Class DATA.CORE.Kernel Extends (%Populate, %XML.Adaptor, %ZEN.DataModel.Adaptor) [ Abstract, Inheritance = right ]
{

/// системная дата записи
Property recordDate As %Date(ZENHIDDEN = 1, ZENLABEL = "Дата зипису") [ InitialExpression = {+$H} ];

/// системная дата редактирования
Property openLog [ MultiDimensional, Private ];

/// пользователь сделавший запись
Property userID As DATA.SYSTEM.USERS(ZENHIDDEN = 1, ZENLABEL = "Користувач виконавший запис");

Method %OnOpen() As %Status [ Private, ServerOnly = 1 ]
{
 s classname = ..%ClassName(1)

 s cdef = ##class(%Dictionary.ClassDefinition).%OpenId(classname)
 s pp = $zobjclassmethod(classname, "%Open" , ..%Oid())

 // get list of properties
 s count = cdef.Properties.Count()
 For i = 1:1:count {
   s ..openLog(..%Oid(),cdef.Properties.GetAt(i).Name)= $zobjproperty(pp, cdef.Properties.GetAt(i).Name)
 }

  Quit $$$OK
}

Method %OnAfterSave(insert As %Boolean) As %Status
{
 q:insert=1 $$$OK

 s classname = ..%ClassName(1)
 s ts = $zts

 s cdef = ##class(%Dictionary.ClassDefinition).%OpenId(classname)
 s pp = $zobjclassmethod(classname, "%Open" , ..%Oid())

 // get list of properties
 s count = cdef.Properties.Count()
 For i = 1:1:count {
   s oldval = $g(..OpenLog(..%Oid(),cdef.Properties.GetAt(i).Name))
   s newval = $zobjproperty(pp, cdef.Properties.GetAt(i).Name)

   if oldval'=newval
   {
     s ^SaveLog(ts, ..%Oid(), cdef.Properties.GetAt(i).Name, "old") =  oldval 
     s ^SaveLog(ts, ..%Oid(), cdef.Properties.GetAt(i).Name, "new") =  newval 
   }

 }

 Quit $$$OK
}


}
...
Рейтинг: 0 / 0
Хранение истории изменений объектов
    #37672371
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuraM , про эти методы я в курсе...
...
Рейтинг: 0 / 0
Хранение истории изменений объектов
    #37672382
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrew_tsw Update a timestamp property on UPDATE and INSERT via SqlComputeOnChange
Не совсем понял как этим пользоваться...

andrew_tswОтличие в SqlComputeOnChange = (%%INSERT, %%UPDATE)
Т.е. мне это нужно добавить в определение свойств?

andrew_tswПри работе через объекты тоже должно обновляться.
А есть ть ли вариант, что бы через объекты эти свойства не менялись? Просто есть желание оставить и т.с. стандартный способ изменения данных...
...
Рейтинг: 0 / 0
Хранение истории изменений объектов
    #37672409
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrew_tsw , я таки понял что нужно написать. Спасибо, всё работает

Код: vbnet
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.
/// Расширение для класса с данными
Class mvr.sys.cls.data [ Abstract ]
{

/// Дата модификации
Property changeDate As %Date(FORMAT = 3) [ SqlComputeCode = { 
		Set {changeDate}=+$h 
	}, 
	SqlComputed, 
	SqlComputeOnChange = (%%INSERT, %%UPDATE)
];

/// Время модификации
Property changeTime As %Time [ SqlComputeCode = { 
		Set {changeTime}=$p($h,",",2)
	}, 
	SqlComputed, 
	SqlComputeOnChange = (%%INSERT, %%UPDATE)
];

/// Сотрудник выполневший модификацию данных
Property changeEmployee As %String [ SqlComputeCode = { 
		Set {changeEmployee}= ##class({%%CLASSNAME}).saveEmployee() 
	}, 
	SqlComputed, 
	SqlComputeOnChange = (%%INSERT, %%UPDATE)
];

/// Записать пользователя
ClassMethod saveEmployee() As %String
{
	q:'$d(%session) ""
	s val=$g(%session.Data("userId"))
	q:val="" ""
	s val=##class(mvr.data.employee).%OpenId(val).name
	q val
}

}
...
Рейтинг: 0 / 0
Хранение истории изменений объектов
    #37672415
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Осталась лишь такая модификация
Есть ть ли вариант, что бы через объекты эти свойства не менялись?
...
Рейтинг: 0 / 0
Хранение истории изменений объектов
    #37672652
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa, ReadOnly ?
...
Рейтинг: 0 / 0
Хранение истории изменений объектов
    #37672756
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
doublefintReadOnly ?
Не совсем понял про что это?

Немного опишу свою задумку...
Есть некие данные с тем абстрактным классом докучи... Предполагается сделать некий экспорт/импорт тех данных. Поэтому не хочется чтобы в те свойства занеслись текущие значения. А хочется просто переписать что ранее экспортировали.

Пока рассматириваю вариант с неким значением
Код: vbnet
1.
%session.Data("logNoSave")=1



Но может есть и другой вариант...
...
Рейтинг: 0 / 0
Хранение истории изменений объектов
    #37672853
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa Есть ть ли вариант, что бы через объекты эти свойства не менялись?
Код: vbnet
1.
Property propName As %String [ ReadOnly ];
...
Рейтинг: 0 / 0
Хранение истории изменений объектов
    #37672872
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
doublefint , при таком варианте они вообще меняться не будут.
...
Рейтинг: 0 / 0
Хранение истории изменений объектов
    #37673114
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa, ну вообще-то, оно таки расчетное, значит так и должно быть. Но посмеемся вместе:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
///Отдельный метод для изменения ридонли свойства 
Method ChangePropNameSet (Arg as %String ) as %Status {
  s i%propName=Arg  
  Q $$$OK
 }

/// И даже класс-метод, раз пошла такая пляска
ClassMethod UpdatePropName(id as %String,val as %String) as %Status {
  &sql(Update %NOCHECK package.classname Set propName=:val Where ID=:id)
  Q:SQLCODE=0 $$$OK
  Q $$$ERROR($$$GeneralError,$system.SQL.SQLCODE(SQLCODE))
}



ISC предоставляет программисту Cache три интерфейса доступа к данным (объектный, sql, прямой). Сколько интерфейсов программист Cache предоставит пользователю?
"Каша снаружи, каша внутри".
...
Рейтинг: 0 / 0
Хранение истории изменений объектов
    #37673281
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsaЕсть ть ли вариант, что бы через объекты эти свойства не менялись?Использовать триггеры не пробовали?
...
Рейтинг: 0 / 0
Хранение истории изменений объектов
    #37673286
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
doublefint , какой-то подземный ход на чердак... Я не сторонник такого подхода.
...
Рейтинг: 0 / 0
Хранение истории изменений объектов
    #37674680
Ivan.Kokov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuraM,
cdef.Properties возвращает только верхушку айсберга, т.е. свойства, унаследованные от предков, остаются скрытыми.
Между тем, и они вполне могут быть изменены, хотя бы и неявно.
Они могут быть, как было сказано, встраиваемыми
Как вы с этим боретесь? Вызываете рекурсивно?

Почему не используете ConstructClone? Если унаследовать базовый класс от %RegisteredObject, то можно перед открытием делать копию, а затем сравнивать с ней

doublefint, совершенно согласен с krvsa, что "через подвал на чердак ходить" как то неправильно
Согласен считать i%... фичей, но это... (это я про "UpdatePropName") - как-то уж очень смело :)
В каких случаях вы этим пользуетесь? Наверняка очень осторожно и в самых крайних случаях? :)
...
Рейтинг: 0 / 0
Хранение истории изменений объектов
    #37674758
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan.Kokov, меня похоже не поняли... Совсем... Как бы донести...
Вот есть возможности (функции с документацией и т.д.), можно сделать и так и эдак.
Почему-то сразу откуда-то возникают стериотипы, что вот такое использование "правильное", а вот такое - противоречит каким-то "религиозным" убеждениям. ISC предоставляет программисту аж три слоя функций. Казалось бы, читай, выбирай, используй, комбинируй, тестируй на соответствие требованиям... Но - нет!!!
Ivan.KokovСогласен считать i%... фичей, но это... (это я про "UpdatePropName") - как-то уж очень смело :)

Смело читать документацию и использовать документированные возможности?
Где эта секретная библия "правильного" разработчика которой вы с krvsa пользуетесь?

Свойство, которое не будет обновляться через объектный интерфес - нате ReadOnly, а чтоб все равно обновлять - нате два способа. Это извращение!!! Так я еще и через Ctrl+Shift+V частенько сгенерированные программы просматриваю, представляете? Оказывается, классы и sql в программы на М компилируются! Ужас! И если мне надо будет, еще и в глобаль залезу, O_o

Чет вы меня совсем запугали, страшно Студию открывать, вдруг там код слишком борзый :)
...
Рейтинг: 0 / 0
Хранение истории изменений объектов
    #37674795
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использование синтаксиса i%Property хорошо документировано:
i%<PropertyName> Syntax

http://docs.intersystems.com/cache20111/csp/docbook/DocBook.UI.Page.cls?KEY=ROBJ_property_readonly][ReadOnly] and i%PropertyName
...
Рейтинг: 0 / 0
Хранение истории изменений объектов
    #37674820
Ivan.Kokov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
doublefint,

Ivan.KokovСогласен считать i%... фичей, но это... (это я про "UpdatePropName") - как-то уж очень смело :)

doublefintГде эта секретная библия "правильного" разработчика которой вы с krvsa пользуетесь?


Не, мы отдельно и независимо :)
Даже не пытаюсь уравнять себя со старожилами этого форума

Вот вы пишете:
doublefintСвойство, которое не будет обновляться через объектный интерфес - нате ReadOnly, а чтоб все равно обновлять - нате два способа. Это извращение!!! Так я еще и через Ctrl+Shift+V частенько сгенерированные программы просматриваю, представляете? Оказывается, классы и sql в программы на М компилируются! Ужас! И если мне надо будет, еще и в глобаль залезу, O_o

Вы не поверите: и я грешен, бывает, залезаю смотреть инты, да еще и по глобалям шарюсь, и сеты делаю
По рукам себя бью, плачу, а делаю - уж очень хочется побыстрее...
Особенно если есть доступ в рабочую БД :)

Все наоборот!!!
Уверен что я не в курсе про что-то, вот и хочу поучиться. В частности пропнэйм - для чего его может понадобиться менять на лету? Неужто юзерам отдаете право проектировать структуры? Тады, конечно "ой"
...
Рейтинг: 0 / 0
Хранение истории изменений объектов
    #37674843
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan.Kokov, ну слава богам, разобрались! За тон, прошу прощения :(. Насчет propName, смотрите внимательней (выше), это я для примера поле так назвал (неудачно, согласен).
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
///Более типовой пример: 
Class User.Test Extends %Persistent {
 
Property Name as %String[ReadOnly];

ClassMethod UpdateName(id,value)[SqlProc]{
 &sql(Update %NOCHECK SQLUser.Test Set Name=:value Where ID=:id)
}
}
...
Рейтинг: 0 / 0
Хранение истории изменений объектов
    #37674856
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виталий, с 2003 интересует как такой вызов (s i%PropName ) будет на Cache Basic? Все никак руки не доходят, ткните носом, плиз :)
...
Рейтинг: 0 / 0
Хранение истории изменений объектов
    #37674906
Ivan.Kokov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
doublefintIvan.Kokov, ну слава богам, разобрались! За тон, прошу прощения :(. Насчет propName, смотрите внимательней (выше), это я для примера поле так назвал (неудачно, согласен).
[/src]
Не, doublefint,
Это я читать разучился
Смешалось все в кучу - обращения в классдеф - проперти, задание значений ридонли...
В следующий раз буду внимательней :)
Это вы извините,
мне самому смешно от себя
...
Рейтинг: 0 / 0
Хранение истории изменений объектов
    #37675648
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
doublefintГде эта секретная библия "правильного" разработчика которой вы с krvsa пользуетесь?
Я называю это здравым смыслом...
Зачем мне объявлять свойство "только для чтения" если я его активно собираюсь менять? А потом начинаю преодолевать трудности по его заполнению...
Это правильно?
...
Рейтинг: 0 / 0
Хранение истории изменений объектов
    #37675710
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsaЯ называю это здравым смыслом... Ну так не останавливайте себя в его использовании!
...
Рейтинг: 0 / 0
Хранение истории изменений объектов
    #37676149
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
doublefint , так я вроде и не останавливаюсь...
...
Рейтинг: 0 / 0
Хранение истории изменений объектов
    #37676462
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsa, переписка выше об этом не свидетельствует... :(
Попробуйте еще раз.
...
Рейтинг: 0 / 0
Хранение истории изменений объектов
    #37683765
Ymka2007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kolesovПотом можно просмотреть требуемую информацию и выполнить откаты в случае необходимости (простые откаты, разумеется).
Вот так примерно:

доброго времни суток
судя по вашей картинке вы как то доработали компонент tablePane
можете поделиться реализацией компонента с возможностью выгрузки в word, excel

спасибо
...
Рейтинг: 0 / 0
Хранение истории изменений объектов
    #37683858
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
doublefintВиталий, с 2003 интересует как такой вызов (s i%PropName ) будет на Cache Basic? Все никак руки не доходят, ткните носом, плиз :)Аналога синтаксису i%<PropertyName> для Caché Basic нет (Prodlog 97628).
...
Рейтинг: 0 / 0
25 сообщений из 57, страница 2 из 3
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Хранение истории изменений объектов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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