Материал из Ananas
Перейти к: навигация, поиск

Структура базы сейчас в основной ветке 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)


Обсуждение