25.12.2006, 14:32 | #1 |
Участник
|
Уважаемые программеры, я начинающий, не хватает опыта, прошу за вопрос не пинать
Пытаюсь сделать историю изменения набора реквизитов, по жизни все меняется и порой задним числом (спасибо партии родной). Имеем таблицу вида(пусть для одного реквизита): ID_R(Реквизит) | Date_R(ДатаИзменения) | Value_R(ЗначениеРеквизита) Как эффективно выбрать набор значений за период (С .. По.. ) времени, с учетом того что в результирующий набор нужно включать предыдущее значение реквизита.. т.е. значение которое имело место быть на начало выбираемого периода? Ну типа из этого: =================== ... PODR 01.01.1990 Хоз.отдел PODR 01.01.1991 Секритариат PODR 15.08.06 Бухгалтерия PODR 01.09.06 Руководство с 01.08.06 по 31.12.06 получить: PODR 01.01.1991 Секритариат PODR 15.08.06 Бухгалтерия PODR 01.09.06 Руководство ... Конечно все намного сложнее, но поскльку важна лишь суть упрощаю. Да и таблица не 10 записей а большая.. Раньше такое делали исп. подзапросы (inner join) ну т.е. в подзапросе находили макс значение даты по реквизиту до начала периода по которому запрашиваем и включали значения попадающие в диапазон дат и значение которое равнялось макс значению даты из подзапроса. Как тут быть чтобы не тащить все записи на клиента? |
|
25.12.2006, 14:46 | #2 |
Участник
|
Установить ключ, сортируемый по дате.
Обычно, дата, в таких случах, входит в первичный ключ, поэтому даже устанавливать не надо rec.setrange(Date, 0D, <требуемая дата>); IF rec.Find('+') THEN// находит последнюю запись BEGIN //rec содержит информацию, действующую на требуемую дату. END; |
|
26.12.2006, 08:58 | #3 |
Участник
|
Цитата:
Сообщение от Kashin
Установить ключ, сортируемый по дате.
Обычно, дата, в таких случах, входит в первичный ключ, поэтому даже устанавливать не надо rec.setrange(Date, 0D, <требуемая дата>); IF rec.Find('+') THEN// находит последнюю запись BEGIN //rec содержит информацию, действующую на требуемую дату. END; |
|
26.12.2006, 16:18 | #4 |
Участник
|
Совет:
Первичный ключ в таблицах с историей лучше делать по номеру записи (Entry No.) |
|
27.12.2006, 11:42 | #5 |
Участник
|
|
|
27.12.2006, 13:29 | #6 |
Участник
|
Цитата:
Убедился сам, когда делал что-то на подобии журнала изменений, заточенного под цикл квота-заказ-отгрузка-подбор-учтенный документ. И главное: где головняк в виде ключа по дате? SETCURRENTKEY написать сложно? И еще не рекомендуется вставлять дату в первичный ключ. Это сравнительно недавно обсуждалось здесь. |
|
27.12.2006, 13:58 | #7 |
Участник
|
Цитата:
Я, как-то пропустил данный топик, и найти его не могу.. не спомните, хотябы название приблизительное |
|
27.12.2006, 15:43 | #8 |
Участник
|
|
|
27.12.2006, 16:08 | #9 |
Участник
|
Цитата:
Во-вторых, даже, еслиб мы умудрились запихать в первичный ключ дату (а с ней еще какие-то поля, чтоб идентифицировтаь запись однозначно), то это значит, что каждый раз при вставке новой записи - система будет сравнивать уникальность по сложному ключу. Так как запичей будет очень много, то могут быть тормоза... |
|
27.12.2006, 17:03 | #10 |
Участник
|
Цитата:
Цитата:
Сообщение от randrews
Во-вторых, даже, еслиб мы умудрились запихать в первичный ключ дату (а с ней еще какие-то поля, чтоб идентифицировтаь запись однозначно), то это значит, что каждый раз при вставке новой записи - система будет сравнивать уникальность по сложному ключу. Так как запичей будет очень много, то могут быть тормоза...
Никто не проверял реальное падение скорости. Собственно, проверка на уникальность по дате, в данном случае очень важна. История реквизитов, когда на одну дату будет множество значений данного реквизита, ставит дополнительную задачу на то, какой реквизит брать. Т.е. первичный ключ по дате однозначно будет определять уникальность реквизитов в эту дату. |
|
27.12.2006, 17:07 | #11 |
Участник
|
А потом какой-нибудь очень смышленый юзер сдвинет себе системную дату - и будете гадать, а что когда было. Только по номеру записи журналы изменений надо делать.
|
|