2012-01-12 115 views
0

我有一个问题,我试着自己解决,但没有得到很远(尝试不同的方法,但他们都结束了代码的大墙,最终没有做我需要什么)。所以我在这里要求您提供任何建议,解决方案和代码片段。提前致谢!需要建议 - SQL和ASP.NET

我有一个SQL数据库与表部分,汇编和公式。正如名字所暗示的,组件是由零件组成的,但也可以由其他组件组成。组件的制作方法写在表格FORMULA中。在我的应用程序中,我可以输入多少个组件(增加库存)。但是当我增加装配的库存时,我需要减少相应零件和(子)装配的库存。为了更好地理解,我将以一个例子来说明这一点。

PARTS

partID partStock 
    p1  100 
    p2  100 
    p3  100 

ASSEMBLIES

assID assStock 
ass1  10 
ass2  10 

FORMULA表中的

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

说明:ass1从1X p1 + 2×p2 + 1X ass2(这是另一种组件组装)和ass2由2x组装而成

所以当我增加ass1的库存10(这不是问题,我可以做到),我还需要减少p1(10),p2(20)的库存, ass2(10)。如果ass2的股票是< 10,我需要减少p3的股票(对于剩下的数量)。

有没有人甚至明白我想在这里做什么? :D

欢迎任何建议,非常感谢!哦,我正在用C#编写我的网络应用程序。 :)

编辑:正如它已在评论中指出,我首先寻找一个想法(设计模式)如何实现这一点。实际的SQL查询和编码不是一个很大的问题。如果任何人有一些有用的代码,它是一个奖金。 ;)

+1

我相信我明白你在说什么,但你并没有提出明确的问题。你可以做到这一点是ASP.net和SQL。你在寻找一个设计模式用于这个应用程序? – user1231231412 2012-01-12 11:47:03

+1

正如Jon所说的......你是在问设计模式,还是如何查询和处理库存调整。我确实了解并且实际上已经和一个制造商一起处理这样的组装/子组装系统...顺便说一句,爱缩写的表名/列名别名:) – DRapp 2012-01-12 11:51:28

+0

是的,我真的不知道从哪里开始:)我在编程方面是一个新手。我并不是要求某人为我编写代码(并非我不会对某些代码片断感到满意:P)......只是一些想法,我怎么能够实现它。 – user1080533 2012-01-12 11:52:50

回答

2

就我个人而言,我将开始合并零件和装配表,这使得您的模型和计算更容易理解。特别是因为装配也可以是其他装配的一部分。它也可能使库存概览等其他事情变得更容易。

你的表看起来是这样的:

部分:

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

我合并了表格,并且正在努力使您的伪代码适用于我的问题。我想我会管理。剩下的问题是第二次致电UpdateStock时发生的“Timeout Expired”异常。需要看到,哪些连接处于打开状态并关闭它们......不应该花太长时间:) – user1080533 2012-01-14 12:52:02

0

从我正在阅读,和你的时间限制,存储过程可能是最好的。我将如何处理它是在程序集第一级的所有元素的存储过程中创建一个临时表(以及实际项目与子组件的类型)。然后,您将不得不继续手动进行所有递归,直到获得所有子子组件。我会用更复杂的装配之一来尝试这个例程,以确保获得单个零件和多个子装配的组合,以及任何具有子子装配的组合等。

将测试版本保存到实际的表格,以便您可以查看结果,直到您完成了需要减少或适当增加的库存量的所有调整为止......然后,一旦所有表面看起来不错,然后将更新加入到这张表中,一个电话,而不是嵌套的“哎呀......错过了那个”,并搞砸了库存。

0

我不知道我完全明白你的心情。 我认为使用CTE可以递归地获得所有的“部分”,并在DbTransaction中进行增加和减少操作。