2012-01-12 114 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中進行增加和減少操作。