powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Расчеты с переменными параметрами, в ХП или на временных таблицах?
16 сообщений из 16, страница 1 из 1
Расчеты с переменными параметрами, в ХП или на временных таблицах?
    #33426433
Kezya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем здравствуйте.
Есть таблица, в которую вносятся данные. Когда добавляется новая строка, пересчитываются частично уже существующие данные. Потом на основании внесенных данных делаются расчеты. В другую таблицу вносятся коррективы, т.е. пишется какая строка из основной таблицы и как изменилась. Корректив может быть несколько (на одну и ту же запись в основной таблице). Всегда надо хранить и оригинальные данные и коррективы (поэтому они и вносятся в отдельную таблицу). На основании корректив делаются новые расчеты.
Пересчет данных при добавлении записи в основную таблицу делается в ХП (в той же, в которой и добавляются данные, причем используются уже существующие данные в таблице).
Теперь: если делать пересчет с учетом корректив, то можно сделать 2 варианта:
1. сделать временные таблицы, в них скопировать данные из основных таблиц уже с учетом корректив. Все это дело рассчитать уже имеющимися ХП
2. Как-то ухитриться и коррективы "наложить" на основную таблицу, чтобы не пострадали уже существующие данные. Писать новую ХП для расчета.
Таблиц для расчета используется примерно 7-10, т.е. временных таблиц понадобится примерно 5.
Как лучше сделать?
Заранее спасибо!
...
Рейтинг: 0 / 0
Расчеты с переменными параметрами, в ХП или на временных таблицах?
    #33426666
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно просто парадигму корректив поменять. Храните в таблицах корректив не какие новые данные появились в основной таблице, а какое отклонение было.
Например в основной таблице лежит сумма 100. Дальше на триггере идет логика:
На изменение суммы мы берем разницу между новым значением суммы и суммарным значением основной суммы плюс сумм всех ее корректив и добавляем полученное значение, как новую запись в таблицу корректив. Т.е. если сумма первый раз поменялась на 250, то в таблицу корректив мы добавим 150, если второй раз поменялась на 200, то добавим -50.

Далее достаточно сделать представление или хранимую процедуру (зависит от СУБД), которое возвращает актуальное состояние сумм на указанную дату, примерно с таким запросом:
Код: plaintext
1.
2.
3.
SELECT PK, m.Сумма + Sum(IsNull(c.СуммаКоррекции,  0 )) AS ТекущаяСумма
FROM ОсновныеСуммы m
  LEFT JOIN Коррективы c ON c.PK = m.PK AND c.CorrectDate <= @АктуальнаяДата
GROUP BY PK, m.Сумма
Соответствующе дальше можно просто пользоваться этим запросом в расчетах, проверках, отчетах и не меняя логики легко получать состояния сумм на любую интересующую дату.

P.S. Такую методику в основном я применяю для организации сторнирования каких либо расчетов, когда задним числом изменялась входящая информация и необходимо сделать перерасчет закрытых периодов и рассчитать разницу между тем что было и тем что стало для дальнейшего ее выставления в текущий открытый период. При желании ее можно прикрутить как решение к любой задаче, где есть понятие сторнирования и ведение расчетов во времени.
...
Рейтинг: 0 / 0
Расчеты с переменными параметрами, в ХП или на временных таблицах?
    #33426808
Kezya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо!
У меня несколько иная ситуация: когда добавляются данные в основную таблицу, пересчитываются некоторые значения полей у части уже существующих данных. Пересчитываются и значения обновляются. Потом уже расчет ведется на основании новых пересчитанных данных.
Сответственно, пересчет с учетом корректив должен выглядеть примерно так:
посчитали коррективы->обновили часть полей у данных в основной таблице->произвели расчет.
Вот обновление и смущает - мне все же надо в основной таблице иметь оригинальные данные, т.е. те, которые были внесены без учета корректив. Именно для этого я и хотел создать временные таблицы, чтобы в них скопировать содержимое исходных таблиц, но уже с коррективами и пеерсчитанными колонками. А потом уже на временные таблицы "запустить" ХП, чтобы она все расчитала
...
Рейтинг: 0 / 0
Расчеты с переменными параметрами, в ХП или на временных таблицах?
    #33427247
Estets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KezyaСответственно, пересчет с учетом корректив должен выглядеть примерно так:
посчитали коррективы->обновили часть полей у данных в основной таблице->произвели расчет.
На мой взляд в этом и состоит ошибка при проэктировании Вашей БД, в одной таблице содержатся как оригинальные данные, так и расчитанные с учетом коррекции (лежащей отдельно)
Соответственно если есть возможность изменить логику работы я бы:

А) Хранил в основной таблице только скорректированные данные, а историю в том числе и начальные значения выносил в отдельную таблицу.

Б) Если есть некая необходимость хранить именно начальные значения и именно в этой таблице, то при внесении записи просто задублировал бы данные по разным полям:
opre_date - текущее значени
opre_date_original - начальное значение (не изменяется исправлениями)
...

B) (Обратный А) Вынес поля, расчет которых зависит от изменяемых значений, в таблицу истории, ссответственно получив и историю вычисляемых полей.

А далее как предложил ASCRUS объединял бы две таблицы
Код: plaintext
1.
2.
...
FROM ОсновныеСуммы m
  LEFT JOIN Коррективы c ON c.PK = m.PK AND c.CorrectDate <= @АктуальнаяДата
...
Рейтинг: 0 / 0
Расчеты с переменными параметрами, в ХП или на временных таблицах?
    #33434162
Фотография Валентин К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использование временных таблиц во-первых определяется сервером БД и скоростью их создания, например в oracle неэффективно создавать временные таблицы, а в MSSQL в порядке вещей...
...
Рейтинг: 0 / 0
Расчеты с переменными параметрами, в ХП или на временных таблицах?
    #33434654
Kezya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробую на примере:
Создается деталь, заранее известно, что на каждый болт М6 должна накручиваться гайка. Соответственно, когда пользователь выбирает из справочника комплектующих болт М6, гайка в состав добавляется автоматически. Получаем в основной таблице состав изделия: болты (количество введенное пользователем) и гайки - из расчета на один болт - одна гайка. Далее - в отдельную таблицу вносятся коррективы, например, болтов взяли в 1.5 раза больше, соответственно, должно увеличиться и количество гаек (автоматически). Далее идут расчеты количества комплектующих. И надо рассчитать, сколько комплектующих понадобится на изначально заданное количество болтов и сколько - с учетом корректив. Вот во втором случае и надо изменить количество гаек на новое количество болтов.
Думаю, придется все же на временных таблицах все это считать. Т.е. создать таблицы и внести данные с учетом корректив, причем на эти коррективы и расчитывать новое количество гаек. А уже потом производить все расчеты на этих временных таблицах
...
Рейтинг: 0 / 0
Расчеты с переменными параметрами, в ХП или на временных таблицах?
    #33434905
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А чем по существу коррективы отличаются от оригиналов? Можно ли и то и другое рассматривать как версии, версии состава изделия в последнем примере?
Или версию формирует пакет корректив?

Процесс типа:
Создание корректив -> Формирование версии (пакета корректив)-> Расчет и запоминание версии -> Выполнение расчетов по выбранной версии.
...
Рейтинг: 0 / 0
Расчеты с переменными параметрами, в ХП или на временных таблицах?
    #33434927
Kezya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ModelRА чем по существу коррективы отличаются от оригиналов? Можно ли и то и другое рассматривать как версии, версии состава изделия в последнем примере?
Или версию формирует пакет корректив?

Процесс типа:
Создание корректив -> Формирование версии (пакета корректив)-> Расчет и запоминание версии -> Выполнение расчетов по выбранной версии.
В принципе, можно и так, но дело в том, что сам процесс начинается, скажем так, от сборки комплектующих. Потом уже идет само производство. И коррективы - накладываются только на комплктующие, а производство должно пересчитаться с учетом корректив.
Например:
1. Болты М6 - на производство балки
2. Болты М6 - на монтаж балки.
Так вот, коррективы могут вноситься только для производства балки. Поэтому дублировать весь процесс - можно, но пользователю это не надо, т.к. придется в данном случае запрашивать у него дополнительную информацию
...
Рейтинг: 0 / 0
Расчеты с переменными параметрами, в ХП или на временных таблицах?
    #33435121
Фотография Валентин К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько я понял, проблема в том, что в программе нет понятия комплектов и комплектации.
Вообще непонятно, зачем при внесении значения в таблицу менять в ней же значения за предыдущий период....
Такие потребности могут возникнуть от непонимания, как это должно работать.
...
Рейтинг: 0 / 0
Расчеты с переменными параметрами, в ХП или на временных таблицах?
    #33435185
Kezya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валентин КВообще непонятно, зачем при внесении значения в таблицу менять в ней же значения за предыдущий период....
Такие потребности могут возникнуть от непонимания, как это должно работать.
Здесь нет понятия - период. Есть - исходный набор и есть коррективы. В итоге надо получить расчетные данные с учетом корректив. В один день может создаваться несколько корректив. Всего их на каждый исходный набор - ну максимум 10-15. И постоянно они не добавляются. Создали исходный набор - рассчитали, добавили коррективы - рассчитали. Один из исходных наборов+коррективы будет считаться основным. Рассчетные данные в базе не хранятся.
...
Рейтинг: 0 / 0
Расчеты с переменными параметрами, в ХП или на временных таблицах?
    #33435198
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KezyaТак вот, коррективы могут вноситься только для производства балки. Поэтому дублировать весь процесс - можно, но пользователю это не надо, т.к. придется в данном случае запрашивать у него дополнительную информациюВ чем проблема?
Версия №5 балки = Версия N4 балки, с коррективами {Болтов 6, Винтов 10}
отсюда выводится сколько гаек.

Далее план производства: 10 балок по версии №5 и 20 по версии №4.
...
Рейтинг: 0 / 0
Расчеты с переменными параметрами, в ХП или на временных таблицах?
    #33435233
Фотография Валентин К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если задача - обеспечение производства правильным количеством болтов, гаек, балки решается все обратной калькуляциев пакетов, а не извращением над одной таблицей.
У меня богатый опыт работы со всяческими извращениями юзверей, но такого я никогда не допускал, чтобы от внесения новой записи корректировались старые...

Вобщем ответ в постановке задачи, нормально сформулируйте задачу и решение будет не настолько извращеным.
...
Рейтинг: 0 / 0
Расчеты с переменными параметрами, в ХП или на временных таблицах?
    #33435421
Kezya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что такое обратная калькуляция пакетов?
Есть у меня таблицы, в которых хранится примерно следующее:
1. Балка
-На производство балки требуется 5 болтов М6.
Когда пользователь добавлял 5 болтов, я автоматически добавляю в таблицу 5 гаек.
Теперь коррективы: как, например, изменится количество комплектующих в балке, если болтов будет 10? Это означает, что надо пересчитать и количество гаек в таблице тоже на 10. В исходной таблице ни болты ни гайки не обновляются. Коррективы хранятся в отдельной таблице. Вот я хочу узнать - как считать с учетом корректив (т.е. мне надо пересчитывать количество гаек) - или в ХП это все реализовывать, или создать временные таблицы, в которые вносить информацию из исходных, но с учетом корректив, т.е. сразу количество болтов - 10, гаек - тоже 10. И на временных таблицах сделать все расчеты
...
Рейтинг: 0 / 0
Расчеты с переменными параметрами, в ХП или на временных таблицах?
    #33436857
Если болтов будет 10, а не 5, то это будет уже ДРУГАЯ балка. Или Ваша задача, Kezya, заключается в обмане потребителя балки ?
...
Рейтинг: 0 / 0
Расчеты с переменными параметрами, в ХП или на временных таблицах?
    #33436989
Kezya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прежде чем решить, что будет изготовляться другая балка, с 10-ю болтами, надо сделать расчеты. Т.е. "подойдет ли нам балка, если болтов будет 10". Для этого и необходимо сделать предварительные расчеты. А изначально балка с 5-ю болтами - это что-то наподобие заготовки, т.е. некий стандартный вариант.
...
Рейтинг: 0 / 0
Расчеты с переменными параметрами, в ХП или на временных таблицах?
    #33440710
Kezya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может, тогда не хранить отдельно коррективы, а, как уже говорилось выше - создавать новую "версию" и все? Т.е. будет получаться несколько вариантов одного и того же изделия?
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Расчеты с переменными параметрами, в ХП или на временных таблицах?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]