Страница 1 из 1

Как работать с периодическими реквизитами ?

Добавлено: 28 Январь 2010, 11:12
Андрей
Есть материнская таблица "Картотека" и дочерняя "История", в которой хранятся записи истории изменений некоторых атрибутов "Картотеки" (одна запись содержит значения всех период. параметров на некоторую дату).
Нужно - в картотеке показывать ПОСЛЕДНИЕ значения период. параметров (т.е. записи "Истории"" с посл. датой), лучше бы как то автоматически типа lookup и через словарь. Как это сделать ? Проблема в том что Lookup обычно делается на материнскую таблицу, а тут надо на определенную запись дочерней.
Пока попробовал реализовать след. схему:
1. В момент записи Истории проверяем самая ли это свежая запись, если да, ищем и снимаем старый флаг "свежести" FlgNew=0 и устанавливаем FlgNew=1 для этой записи. Делаю это в точке вставки "Перед записью на диск" (кстати а как эти 2 операции завернуть в транзакцию ?)
2. В таблице Картотека заводим псевдополе FlgNew которое всегда будет равно 1.
3. Делаем связь в одну сторону к таблице "История" из таблицы "Картотека" many:1 по составному полю
IdKart+FlgNew
Так то работает, но не покидает "смутное ощущение", что можно как то аккуратнее и красивше сделать. Может кто поделится мыслями ?

Re: Как работать с периодическими реквизитами ?

Добавлено: 28 Январь 2010, 14:20
StillZero
блиа! зачетное решение! респект

Re: Как работать с периодическими реквизитами ?

Добавлено: 28 Январь 2010, 18:24
kreator
Надо в таблице "История" сделать поле ID (уникальное и поставить на него автонумерацию). А потом отображать только запись с самым большим ID.

Re: Как работать с периодическими реквизитами ?

Добавлено: 28 Январь 2010, 22:50
Андрей
Ну если без той оговорки что возможен случай, когда пользователь решит добавить пропущенную запись в истории, то ....
А дальше что ? Как привязать эту запись с макс Id к родительской записи ?

Re: Как работать с периодическими реквизитами ?

Добавлено: 29 Январь 2010, 14:43
kreator
Ну, если пользователю разрешено редактировать записи истории, то надо явно привязываться к дате. "Свежая запись" - это какая? Та, которая редактировалась последней или последняя по дате изменения?

Re: Как работать с периодическими реквизитами ?

Добавлено: 29 Январь 2010, 23:06
Андрей
"Свежая" - конечно с последней датой. Наверно... можно будет запретить редактирование. Но все же я не понял, поясните,pls, как потом прицепиться на автомате к этой записи с макс ID ? Еще раз подчеркиваю проблему - не хочу нигде писать код для отображения "свежих" значений период. реквизитов - хочу автоматизацию сего процессса ! :)

Re: Как работать с периодическими реквизитами ?

Добавлено: 01 Февраль 2010, 14:08
kreator
Думаю без ручного кода не обойтись, используем set, get, если не SQL. Все равно же пишешь код для снятия и установки флага. И, по-моему, неправильно бизнес логику загонять в словарь. А если посмотреть на SQL? Там это, вообще, родит кучу проблем.

Re: Как работать с периодическими реквизитами ?

Добавлено: 01 Февраль 2010, 14:59
StillZero
Для Андрея:
твое решение самое зачетное на данный момент, хотя... неверное :) я вижу только одну проблему - это оборачивание прохода по истории и выставление/снятие флага в транзакцию - т.е. это ОБЯЗАНО быть. Иначе залепуха :) Можно показать самую последнюю запись истории в листе, но это будет ручной код... не такой уж и большой на самом деле... на каждую запись найти свежую в другой таблице и отобразить... На автомате решения не знаю.

ps
С sql как раз проблем не вижу вообще :)

Re: Как работать с периодическими реквизитами ?

Добавлено: 05 Февраль 2010, 0:59
Ал
Андрей писал(а):Есть материнская таблица "Картотека" и дочерняя "История", в которой хранятся записи истории изменений некоторых атрибутов "Картотеки" (одна запись содержит значения всех период. параметров на некоторую дату).
Нужно - в картотеке показывать ПОСЛЕДНИЕ значения период. параметров (т.е. записи "Истории"" с посл. датой), лучше бы как то автоматически типа lookup и через словарь. Как это сделать ? Проблема в том что Lookup обычно делается на материнскую таблицу, а тут надо на определенную запись дочерней.
Пока попробовал реализовать след. схему:
1. В момент записи Истории проверяем самая ли это свежая запись, если да, ищем и снимаем старый флаг "свежести" FlgNew=0 и устанавливаем FlgNew=1 для этой записи. Делаю это в точке вставки "Перед записью на диск" (кстати а как эти 2 операции завернуть в транзакцию ?)
2. В таблице Картотека заводим псевдополе FlgNew которое всегда будет равно 1.
3. Делаем связь в одну сторону к таблице "История" из таблицы "Картотека" many:1 по составному полю
IdKart+FlgNew
Так то работает, но не покидает "смутное ощущение", что можно как то аккуратнее и красивше сделать. Может кто поделится мыслями ?
Андрей писал(а):"Свежая" - конечно с последней датой. Наверно... можно будет запретить редактирование. Но все же я не понял, поясните,pls, как потом прицепиться на автомате к этой записи с макс ID ? Еще раз подчеркиваю проблему - не хочу нигде писать код для отображения "свежих" значений период. реквизитов - хочу автоматизацию сего процессса ! :)
определись - user может править"освежать" существующую "старую" запись в "истории" или если нет - при манипуляциях в картотеке и сохранении измененной записи картотеки "автоматом" в историю всегда пишем уник запись т.е. каждый раз при изменении данных записи картотеки в истории создается новая запись с датами, параметрами и проч. изз картотеки - каждый раз самый свежий новый )) уникальный ИД записи истории формируем и храним в записи картотеки и по нему "на автомате" формир поле в новую запись в истории и потом при просмотре картотеки поднимать по составному полю параметры из истории - самые последние и будут. но количество записей в истории будет тьма... сколько изм было в картотеке столько записей и в истории...

Re: Как работать с периодическими реквизитами ?

Добавлено: 05 Февраль 2010, 1:32
WadimZapara
StillZero писал(а):блиа! зачетное решение! респект
StillZero писал(а):...я вижу только одну проблему - это оборачивание прохода по истории и выставление/снятие флага в транзакцию..
ps
С sql как раз проблем не вижу вообще :)
Полностью согласен :D