Хранение формул с переменными в базе данных - PullRequest
4 голосов
/ 27 октября 2009

Это немного сложно, поэтому терпите меня.

Мой работодатель просит построить систему, которая рассчитывает итерации задачи по набору переменных.

У каждой задачи в проекте есть специальная формула, используемая для расчета количества выполнений задачи («итераций»). Формула может опираться на константы, переменные (вводится число, поэтому задача может быть связана с количеством поставщиков, которых у нас есть, или числом сотрудников в оффшоре, и эти значения могут отличаться для каждого проекта) и / или времени (например один раз в месяц, один раз в квартал, один раз в 6 месяцев, один раз в год)

Как мне спроектировать базу данных для хранения этих формул, чтобы я мог вычислить их позже?

Пример формул:
Один раз в месяц на каждого поставщика.
Дважды в квартал на одного поставщика на каждого клиента.
Один раз в месяц на каждые шесть поставщиков.

Технический стек - C #, .NET 3.5, SQLServer 2005.

Ответы [ 5 ]

7 голосов
/ 27 октября 2009

Посмотрите на NCalc (Codeplex) Вы можете встроить этот анализатор в SQLCLR и сохранить формулы в таблицах.

4 голосов
/ 27 октября 2009

Я бы сохранил их так:

Один раз в месяц на одного поставщика.

(* month supplier)

Дважды в квартал на одного поставщика на каждого клиента.

(* 2 (* quarter (* supplier customer)))

Один раз в месяц для каждых шести поставщиков.

(* month (/ (+ supplier 5) 6))

Легко разобрать. После анализа вы выводите список найденных идентификаторов и просите пользователя указать им значения.

0 голосов
/ 27 октября 2009

Как насчет динамического SQL?

  1. Создайте таблицу с библиотекой формул (процедур или сценариев sql), достаточно общих для ваших случаев. Для параметров формулы используйте заполнители, такие как «# число итераций здесь #». Столбец формулы имеет вид nvarchar (max) - строки.

  2. Создайте таблицу шагов задачи, для каждой точки шага выполняемой функции и список используемых параметров.

  3. Динамически создавать скрипт функции (текст), заменяя заполнители фактическими параметрами (поиск и замена).

  4. Выполнение функций с использованием sp_executesql N'my_funcion_text_here '

0 голосов
/ 27 октября 2009

Что вы думаете об этой технике? (с использованием JScript)

Оценка формулы во время выполнения

using System;

namespace CodeFreezer.CodeSamples
{
    public static class ExpressionEvaluator
    {
        /// <summary>
        /// Evaluate
        /// Evaluate a math expression
        /// </summary>
        /// <param name="expression">Expression to evaluate</param>
        /// <returns>result</returns>
        public static double Evaluate(string expression)
        {
            if (String.IsNullOrEmpty(expression)) throw new ArgumentNullException("expression");

            return Convert.ToDouble(Microsoft.JScript.Eval.JScriptEvaluate(expression, Microsoft.JScript.Vsa.VsaEngine.CreateEngine()));
        }
    }
}
0 голосов
/ 27 октября 2009

Не могли бы вы создать определенный набор глаголов / заполнителей, который вы используете для обработки столбца varchar, который использует глаголы / заполнители для определения формулы?

Эти глаголы / заполнители затем используются какой-то программой для обработки формулы, выработки того, что она пытается сделать технически.

Итак:
Один раз в месяц для каждого поставщика может быть:
1 / МЕСЯЦ / ПОСТАВЩИК
Дважды в квартал на одного поставщика на одного клиента может быть:
2 / КВАРТАЛ / ПОСТАВЩИК / ЗАКАЗЧИК
и т. д.

Вам потребуется обрабатывать только ограниченное количество шаблонов формул, в противном случае это может привести к путанице.

Если вам не нужна массовая гибкость, этот подход может сработать, однако, если вы хотите быть полностью гибким, вы переходите к самосозданному типу отчета, который намного сложнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...