Как работать с периодическими реквизитами ?
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Как работать с периодическими реквизитами ?
Есть материнская таблица "Картотека" и дочерняя "История", в которой хранятся записи истории изменений некоторых атрибутов "Картотеки" (одна запись содержит значения всех период. параметров на некоторую дату).
Нужно - в картотеке показывать ПОСЛЕДНИЕ значения период. параметров (т.е. записи "Истории"" с посл. датой), лучше бы как то автоматически типа lookup и через словарь. Как это сделать ? Проблема в том что Lookup обычно делается на материнскую таблицу, а тут надо на определенную запись дочерней.
Пока попробовал реализовать след. схему:
1. В момент записи Истории проверяем самая ли это свежая запись, если да, ищем и снимаем старый флаг "свежести" FlgNew=0 и устанавливаем FlgNew=1 для этой записи. Делаю это в точке вставки "Перед записью на диск" (кстати а как эти 2 операции завернуть в транзакцию ?)
2. В таблице Картотека заводим псевдополе FlgNew которое всегда будет равно 1.
3. Делаем связь в одну сторону к таблице "История" из таблицы "Картотека" many:1 по составному полю
IdKart+FlgNew
Так то работает, но не покидает "смутное ощущение", что можно как то аккуратнее и красивше сделать. Может кто поделится мыслями ?
Нужно - в картотеке показывать ПОСЛЕДНИЕ значения период. параметров (т.е. записи "Истории"" с посл. датой), лучше бы как то автоматически типа lookup и через словарь. Как это сделать ? Проблема в том что Lookup обычно делается на материнскую таблицу, а тут надо на определенную запись дочерней.
Пока попробовал реализовать след. схему:
1. В момент записи Истории проверяем самая ли это свежая запись, если да, ищем и снимаем старый флаг "свежести" FlgNew=0 и устанавливаем FlgNew=1 для этой записи. Делаю это в точке вставки "Перед записью на диск" (кстати а как эти 2 операции завернуть в транзакцию ?)
2. В таблице Картотека заводим псевдополе FlgNew которое всегда будет равно 1.
3. Делаем связь в одну сторону к таблице "История" из таблицы "Картотека" many:1 по составному полю
IdKart+FlgNew
Так то работает, но не покидает "смутное ощущение", что можно как то аккуратнее и красивше сделать. Может кто поделится мыслями ?
-
- ✯ Ветеран ✯
- Сообщения: 5161
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 11 раз
- Поблагодарили: 26 раз
Re: Как работать с периодическими реквизитами ?
Надо в таблице "История" сделать поле ID (уникальное и поставить на него автонумерацию). А потом отображать только запись с самым большим ID.
We are hard at work… for you. 

Re: Как работать с периодическими реквизитами ?
Ну если без той оговорки что возможен случай, когда пользователь решит добавить пропущенную запись в истории, то ....
А дальше что ? Как привязать эту запись с макс Id к родительской записи ?
А дальше что ? Как привязать эту запись с макс Id к родительской записи ?
-
- ✯ Ветеран ✯
- Сообщения: 5161
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 11 раз
- Поблагодарили: 26 раз
Re: Как работать с периодическими реквизитами ?
Ну, если пользователю разрешено редактировать записи истории, то надо явно привязываться к дате. "Свежая запись" - это какая? Та, которая редактировалась последней или последняя по дате изменения?
We are hard at work… for you. 

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

-
- ✯ Ветеран ✯
- Сообщения: 5161
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 11 раз
- Поблагодарили: 26 раз
Re: Как работать с периодическими реквизитами ?
Думаю без ручного кода не обойтись, используем set, get, если не SQL. Все равно же пишешь код для снятия и установки флага. И, по-моему, неправильно бизнес логику загонять в словарь. А если посмотреть на SQL? Там это, вообще, родит кучу проблем.
We are hard at work… for you. 

- StillZero
- Ветеран
- Сообщения: 458
- Зарегистрирован: 06 Июль 2005, 2:17
- Откуда: Хабаровск
- Поблагодарили: 1 раз
- Контактная информация:
Re: Как работать с периодическими реквизитами ?
Для Андрея:
твое решение самое зачетное на данный момент, хотя... неверное
я вижу только одну проблему - это оборачивание прохода по истории и выставление/снятие флага в транзакцию - т.е. это ОБЯЗАНО быть. Иначе залепуха
Можно показать самую последнюю запись истории в листе, но это будет ручной код... не такой уж и большой на самом деле... на каждую запись найти свежую в другой таблице и отобразить... На автомате решения не знаю.
ps
С sql как раз проблем не вижу вообще
твое решение самое зачетное на данный момент, хотя... неверное


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

по аэродрому...
-
- ✯ Ветеран ✯
- Сообщения: 1039
- Зарегистрирован: 08 Июль 2005, 6:48
- Откуда: Россия
- Поблагодарили: 1 раз
Re: Как работать с периодическими реквизитами ?
Андрей писал(а):Есть материнская таблица "Картотека" и дочерняя "История", в которой хранятся записи истории изменений некоторых атрибутов "Картотеки" (одна запись содержит значения всех период. параметров на некоторую дату).
Нужно - в картотеке показывать ПОСЛЕДНИЕ значения период. параметров (т.е. записи "Истории"" с посл. датой), лучше бы как то автоматически типа lookup и через словарь. Как это сделать ? Проблема в том что Lookup обычно делается на материнскую таблицу, а тут надо на определенную запись дочерней.
Пока попробовал реализовать след. схему:
1. В момент записи Истории проверяем самая ли это свежая запись, если да, ищем и снимаем старый флаг "свежести" FlgNew=0 и устанавливаем FlgNew=1 для этой записи. Делаю это в точке вставки "Перед записью на диск" (кстати а как эти 2 операции завернуть в транзакцию ?)
2. В таблице Картотека заводим псевдополе FlgNew которое всегда будет равно 1.
3. Делаем связь в одну сторону к таблице "История" из таблицы "Картотека" many:1 по составному полю
IdKart+FlgNew
Так то работает, но не покидает "смутное ощущение", что можно как то аккуратнее и красивше сделать. Может кто поделится мыслями ?
определись - user может править"освежать" существующую "старую" запись в "истории" или если нет - при манипуляциях в картотеке и сохранении измененной записи картотеки "автоматом" в историю всегда пишем уник запись т.е. каждый раз при изменении данных записи картотеки в истории создается новая запись с датами, параметрами и проч. изз картотеки - каждый раз самый свежий новый )) уникальный ИД записи истории формируем и храним в записи картотеки и по нему "на автомате" формир поле в новую запись в истории и потом при просмотре картотеки поднимать по составному полю параметры из истории - самые последние и будут. но количество записей в истории будет тьма... сколько изм было в картотеке столько записей и в истории...Андрей писал(а):"Свежая" - конечно с последней датой. Наверно... можно будет запретить редактирование. Но все же я не понял, поясните,pls, как потом прицепиться на автомате к этой записи с макс ID ? Еще раз подчеркиваю проблему - не хочу нигде писать код для отображения "свежих" значений период. реквизитов - хочу автоматизацию сего процессса !
- WadimZapara
- Активист
- Сообщения: 181
- Зарегистрирован: 11 Июнь 2008, 12:11
- Откуда: Тамбов
Re: Как работать с периодическими реквизитами ?
StillZero писал(а):блиа! зачетное решение! респект
Полностью согласенStillZero писал(а):...я вижу только одну проблему - это оборачивание прохода по истории и выставление/снятие флага в транзакцию..
ps
С sql как раз проблем не вижу вообще

Компьютер имеет то преимущество перед мозгом, что им пользуются...