Нужны предложения - SQL и ASP.NET - PullRequest
0 голосов
/ 12 января 2012

У меня есть проблема, которую я пытался решить самостоятельно, но не добился большого успеха (пробовал разные подходы, но все они оказались в большой стенке кода, которая в конечном итоге не сделала то, что мне нужно). Поэтому я здесь прошу любой совет, решение, фрагменты кода, которые вы можете предложить. Заранее спасибо!

У меня есть база данных SQL с таблицами PARTS, ASSEMBLIES и FORMULA. Как следует из названия, сборки состоят из деталей, но также могут быть изготовлены из других сборок. Как производятся сборки написано в таблице FORMULA. В моем приложении я могу указать, сколько сборок было сделано (увеличить запас). Но когда я увеличиваю запас для сборки, мне нужно уменьшить запас для соответствующих деталей и (под) сборок. Для лучшего понимания я проиллюстрирую это на примере;

ЧАСТИ

partID   partStock
  p1       100
  p2       100
  p3       100

ASSEMBLIES

assID    assStock
ass1        10
ass2        10

ФОРМУЛА

assID   parts   isAssembly  quantity
ass1     p1         no          1
ass1     p2         no          2
ass1     ass2       yes         1 
ass2     p3         no          2

Пояснения к таблице: ass1 собран из 1x p1 + 2x p2 + 1x ass2 (это другая сборка), а ass2 собран из 2x p3

Поэтому, когда я увеличиваю запас ass1 на 10 (это не проблема, я могу это сделать), мне также необходимо уменьшить запас для p1 (10), p2 (20), ass2 (10). И если бы запас для ass2 был <10, мне нужно было бы уменьшить запас p3 (для оставшегося числа). </p>

Кто-нибудь вообще понимает, что я хочу здесь делать? : D

Любые предложения приветствуются, большое спасибо! О, и я пишу свое веб-приложение на C #. :)

РЕДАКТИРОВАТЬ: Как было отмечено в комментариях, я сначала ищу идею (шаблон дизайна), как это сделать. Реальные SQL-запросы и кодирование не такая уж большая проблема. Если у кого-то есть полезный код, это бонус. ;)

Ответы [ 3 ]

2 голосов
/ 12 января 2012

Лично я бы начал с объединения таблиц деталей и сборок, это облегчит понимание вашей модели и расчетов.Тем более что сборка может быть частью другой сборки.Это, вероятно, также облегчит другие вещи, такие как обзор инвентаря.

Ваши таблицы могут выглядеть так:

PARTS:

partID, partStock, isAssembly
p1      100        false
p2      100        false
p3      100        false
ass1    10         true
ass2    10         true

FORMULA

partID, part, quantity
ass1    p1    1
ass1    p2    2
ass1    ass2  1
ass2    p3    2

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

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

Псевдокод для сборочных сборок будет примерно таким:

void UpdateStock(string partID, int count)
{
    formulas = "select * from FORMULA where partID = " + partID;
    foreach(formula in formulas)
    {
        subPart = "select * from PARTS where partID = " + formula.partID;
        subCount = count * formula.quantity;

        // Check for sufficient stock of this part
        shortage = (subPart.partStock - subCount) * -1;
        if(shortage > 0)
        {
            // When this part is an assembly we can try to 'build' more.
            if(subPart.isAssembly)
            {
                UpdateStock(formula.partID, shortage);
                // Note that when making more isn't possible
                // this will throw an error.
            }
            else
            {
                // Otherwise there simple isn't enough.
                throw Error("Not enough stock");
            }
        }
        // Once we get here there should be enough stock, 
        // either because there was enough in the first place
        // or because we made more. 
        subPart.partStock = subPart.partStock - subCount;
    }

    // Lastly increase the actual stock.
    part = "select * from PARTS where partID = " + partID;
    part.partStock = part.partStock + count;
}

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

0 голосов
/ 12 января 2012

Я не уверен, что полностью понял, что ты имеешь в виду. Я думаю, что с помощью CTE вы можете рекурсивно получить все «ЧАСТИ» и выполнять операции увеличения и уменьшения в транзакции DbTransaction.

0 голосов
/ 12 января 2012

Из того, что я читаю, и ваших временных ограничений, хранимая процедура может быть лучшей. Как бы я подошел к этому, чтобы создать временную таблицу в хранимой процедуре всех элементов на первом уровне сборки (наряду с типом фактического элемента против подсборки). Затем вам придется продолжать делать всю рекурсию вручную, пока вы не получите все сборки sub-sub-sub. Я бы попробовал эту процедуру с одной из более сложных сборок, чтобы убедиться, что вы получаете комбинацию отдельных деталей и нескольких сборочных узлов, а также тех, которые имеют подсборки и т. Д.

Сохраните тестовую версию в реальной таблице, чтобы вы могли смотреть на результаты, пока не закончите всю настройку с тем, сколько инвентаря нужно уменьшить или увеличить соответствующим образом ... ТОГДА, как только все выглядит хорошо, затем примените обновление присоединился к этой единой таблице, так что это делается как один вызов, а не как вложенный «упс ... пропустил тот» и испортил инвентарь.

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