|
Модификация свойств
|
|||
---|---|---|---|
#18+
Добрый день. Возникла необходимость вести историю изменения свойств хранимого объекта. Как можно получить список всех свойст объекта, и определить какие из свойств были модифицированы ? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.08.2005, 15:55 |
|
Модификация свойств
|
|||
---|---|---|---|
#18+
Класс %Dictionary.ClassDefinition позволяет получить только список свойст, а как узнать какие из них были модифицированы ? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.08.2005, 18:09 |
|
Модификация свойств
|
|||
---|---|---|---|
#18+
"Версионность" свойств не реализована никак, придётся кое-что делать руками. Один объект физического (а не "программного") мира может иметь только ОДИН набор атрибутов, считающихся "САМЫМИ СВЕЖИМИ" на данный момент времени. И в то же время он должен иметь историю изменения этих атрибутов. Если число изменений атрибутов за единицу времени не имеет характера «ну очень большого числа», то можно сделать два класса. В первом (пусть у него будет имя propHist) будет идти "накопление версий" записей при смене хотя бы одного из версионных свойств. Даже если некоторое св-во сначала поменялось с "A" на "Б", а затем обратно с "Б" на "А" -- всё равно добавляем НОВЫЕ строки: уникальность двух строк в любом классе - наследнике %Persistent даже при полном равенстве всех столбцов обеспечивается в Cache' тем, что он автоматом присваивает им разные значения в поле ID (и даже если бы этого не было – время проведения этих изменений всё равно разное). Во втором классе (propLast) следует хранить ССЫЛКУ на самую последнюю версию атрибутов, чтобы иметь возможность быстро их пролистывать. (Начало небольшого лирического отсупления. Применительно к весьма распространённой складской задаче необходимость класса propLast «звучит» так: продавцу магазина без разницы, какое значение имело свойство "Название изделия" или «Производитель» или "Цена розничная" два дня тому назад; ему надо знать ТЕКУЩИЕ значения. Имхо, история изменений нужна всего для двух целей: 1) воспроизвести «исторически корректные» значения атрибутов при повторной распечатке какого-нибудь старого документа; 2) провести аудит с целью выявить нарушителей-злопыхателей, которые хотят в мутной воде чего-то там наловить Конец лирического отступления). Из второго класса (propLast) по вышеуказанной ссылке на первый класс (propHist) мы сможем вытаскивать всегда "самые свежие" значения атрибутов. Наконец, в классах, хранящих данные ДОКУМЕНТОВ (docData), должны быть ссылки на первый класс, но НЕ на "самые свежие" атрибуты, а именно для того момента времени, когда этот документ создавался. Т.о., можно сделать примерно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Все SQL-запросы к классам propLast и docData должны, есс-но, включать в себя JOIN-конструкции по полям propLast.VLast и docData.prop4UpdTime -- тогда мы будем иметь сответственно и "самые свежие" атрибуты, и те их значения, которые действовали, например, 5 лет назад. ПРОБЛЕМА в том, что методы, добавляющие новые строки во все эти классы и обеспечивающие «накопление» версий атрибутов и их нумерацию, а также ссылку из propLast на propHist запись с самыми актуальными атрибутами – всё это надо писать самому. Например, чтобы вытряхнуть список объектов из propLast с самыми АКТУАЛЬНЫМИ атрибутами, пишем: Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Чтобы вытащить те версии артикула, названия и места хранения изделия, которые «действовали» на момент создания некоторого документа (расходной накладной etc.), надо сделать запрос : Код: plaintext 1. 2.
значения версионных атрибутов именно на то время, когда в документ заносились соотв. записи. ЗЫ. Текст писал сначала в M$ Word'e, т.к. в "штатной" TEXTAREA этого сайта (да и других тоже) делать это крайне неудобно. Но при переносе сюда через клипборд вылезли странности с форматированием, так что прошу извинить за "корявость стиля". ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2005, 02:37 |
|
Модификация свойств
|
|||
---|---|---|---|
#18+
Большое спасибо Механизатору из Подмосковья за ответ. Но мне не нужно хранить периодические реквизиты, хотелось бы просто знать при сохранении объектов, какие из его свойств были изменены. Смотрел код, в который cache компилирут классы, там используется функция $zobjmod, для того, чтобы узнать был ли модифицирован объект или его свойства, но какие параметры ей передаются понять не смог. Если кто-нибудь знает как работать с этой функцией, расскажите пожалуйста. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.08.2005, 10:01 |
|
Модификация свойств
|
|||
---|---|---|---|
#18+
2Mr N. Я нашёл кое-что. Может, это и есть то, что ты спрашивал ? Открываем cache' documatic ( http://home:1972/apps/documatic ), далее лезем в %Library.RegisteredObject и там есть методы: Код: plaintext 1.
Код: plaintext 1. 2. 3.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
Зачем это нужно - не знаю, но метод носит имя: Код: plaintext 1.
Код: plaintext 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2005, 00:43 |
|
|
start [/forum/topic.php?fid=39&msg=33221620&tid=1559692]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
143ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 267ms |
0 / 0 |