Структура базы сейчас в основной ветке cvs примерно такая: есть таблица, похожая по структуре на таблицу информационного регистра (таблица оборотов)
id - уникальный идентификатор, idd - идентификатор документа, iddt - идентификатор табличной части документа, ln - номер строки табличной части документа, date - дата создания документа, dimfield1, dimfield2 ... dimfieldN - список полей измерений, resfield1, resfield2 ... resfieldN - список полей ресурсов
и таблица остатков
date - дата, задающаяся при закрытии периода, dimfield1, dimfield2 ... dimfieldN - список полей измерений, resfield1, resfield2 ... resfieldN - список полей ресурсов
При проведении документа в таблицу оборотов заносится строка, содержащая номер документа, номер табличной части, номер строки, дату и значения измерений и ресурсов. Дата берется из журнала документов.
При вызове функции Update регистра остатков происходит следующее:
- обновляется таблица оборотов.
- пересчитывается таблица остатков
пересчитывается она так:
- обновляются столбцы resfields таблицы остатков с датой >= заданной даты, с фильтром, собранным из значений dimfields строки таблицы оборотов.
- значение resfieldN формируется как сумма предыдущего значения поля resfieldN (+\-) значение поля resfieldN в таблице оборотов.
- знак + при добавлении строки, - при удалении
После вызова функции "закрыть период(заданная дата)", которая обычно вызывается после проведения каждого документа, происходят следующие действия:
- если существует временная таблица для этого регистра, то она удаляется
- создается временная таблица, содержащая все значения из таблицы остатков с датой последнего закрытого периода перед заданной датой + значения из таблицы оборотов, с датой > даты последнего закрытого периода перед заданной датой и <= чем заданная дата
- Из таблицы остатков удаляются строки с датой равной заданной дате.
- В таблицу остатков вставляются все строки из временной таблицы и если дата пустая, она устанавливается равной заданной дате.
Выборка остатков осуществляется после вызова функции SelectReminders(), которая задает разрезы и значения для выбора остатков. Остатки расчитываются с помощью SQL выражений sum() и group by.
Последовательность вызовов функций при работе с регистром
- Создать экземпляр объекта регистра с помощью оператора new, передав правильные параметры
- Связать регистр с документом, вызвав функцию SetDocument(aDocument*). Переданный документ должен быть удален не раньше, чем регистр!
- Связать регистр с таблицей документа, вызвав функцию SetTable(tablename).
- Вызвать фунцию New(), создающую новую строку в регистре.
- Нужное число раз вызвать функцию SetValue().
- Вызвать функцию Update().
- Вызвать функцию ClosePeriod().
Замеченные баги
Нет обновления столбцов dimfields таблицы остатков
Оценка производительности
Предполагаемая максимальная нагрузка на систему: 5 человек, работая по 8 часов в день, заносят в базу документы с табличной частью, содержащей 30 наименований, со скоростью 6 документов в час. Следоваетльно при 22 рабочих днях в месяце они заколотят примерно 63360 документов. Умножая на 3, т.к каждая строка в среднем будет приводить к 3-м проводкам, и на 30, получим около 6 000 000 записей в регистре. Скалько записей будет в таблице остатков, оценить не берусь.
Вопрос: Сколько будет открываться справочник товаров, если количество наименований в нем, скажем, 1000?
--Gr 13:03, 1 ноября 2005 (MSK)