2012-01-12 7 views
0

나는 내 자신 만의 문제를 풀어 봤지만 멀리 가지 않았습니다. (다른 접근법을 시도했지만 모두 큰 코드 벽에서 끝났습니다. 내가 필요한 것). 그래서 저는 조언, 해결책, 당신이 제공 할 수있는 코드 스 니펫을 요구합니다. 미리 감사드립니다!제안이 필요합니다 - SQL 및 ASP.NET

나는 PARTS, ASSEMBLIES 및 FORMULA 테이블이있는 SQL DB를 가지고 있습니다. 이름에서 알 수 있듯이 조립품은 부품으로 만들어 지지만 다른 조립품으로도 만들 수 있습니다. 어셈블리의 작성 방법은 표 형식으로 작성됩니다. 신청서에는 얼마나 많은 어셈블리가 만들어 졌는지 입력 할 수 있습니다 (재고 증가). 그러나 조립품의 재고를 늘리면 해당 부품 및 (하위) 조립품의 재고를 줄여야합니다. 이해를 돕기 위해 예를 들어 설명해 보겠습니다.

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 + 배 p2 + 1X ass2 (조립되고) 및 ass2은 2x에서 조립됩니다 p3

따라서 ass1의 재고를 10으로 늘릴 때 (이것은 문제가 아니므로 가능합니다), p1 (10), p2 (20), ass2 (10). 그리고 ass2에 대한 주식이 < 인 경우, 나머지 수에 대해 p3의 재고를 줄여야합니다.

내가 여기에서하고 싶은 것을 누군가도 이해합니까? : D

모든 의견을 환영합니다. 대단히 감사합니다! 아, 그리고 C#으로 웹 앱을 작성하고 있습니다. :)

편집 : 의견에서 지적했듯이, 나는 이것을 달성하기위한 아이디어 (디자인 패턴)를 먼저 찾는다. 실제 SQL 쿼리 및 코딩 같은 큰 문제가되지 않습니다 .. 만약 누군가가 도움이 코드를, 그 보너스. ;)

+1

나는 당신이 말하는 것을 이해하지만 당신은 분명한 질문을하지 않고 있다고 생각합니다. 당신은 ASP.net과 SQL을 할 수 있습니다. 이 응용 프로그램에 사용할 디자인 패턴을 찾고 계십니까? – user1231231412

+1

존 (Jon)이 말한대로 ... 디자인 후 두 가지 방법을 묻거나 재고 조정을 쿼리하고 처리하는 방법을 묻고 있습니까? 나는 이해하고 실제 조립/서브 어셈블리 시스템을 다루는 제조업체와 작업을 실제로 마쳤다 ... BTW, 축약 된 테이블 이름/컬럼 이름 별칭을 좋아한다 :) – DRapp

+0

예, 어디서부터 시작해야할지 모르겠다. :) 나는 프로그래밍에있어 초보자입니다. 나는 코드를 작성해 줄 누군가를 요구하지 않고있다. (나는 약간의 코드 스 니펫에 대해 감사하지 않을 것이다.) ... 단지 몇 가지 아이디어, 어떻게 그것을 성취 할 수 있는가? – user1080533

답변

2

개인적으로 파트와 어셈블리 테이블을 병합하는 것으로 시작하므로 모델과 계산을 더 쉽게 이해할 수 있습니다. 특히 조립품은 다른 조립품의 일부가 될 수 있기 때문에 특히 그렇습니다. 아마 재고 개요 같은 다른 것들도 훨씬 쉽게 만들 수 있습니다.다음과 같이 할 수

귀하의 테이블 :

부품 : 부품 테이블에서 'isAssembly'필드가 필요하지 않습니다

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

공식

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

기술적 파트가 수식이있을 때 어셈블리이기 때문입니다.

부품을 조립할 때 재고를 업데이트하려면 빌드해야하는 추가 부품의 재고를 재귀 적으로 업데이트 할 수 있습니다.

'건물'어셈블리에 대한 의사 코드는 대략 다음과 같이 될 것입니다 :

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를 호출 할 때 "시간 초과가 만료되었습니다"예외입니다. 어떤 연결이 열린 채로 남아 있는지 확인해야합니다. 너무 오래 걸리지 말아야합니다. :) – user1080533

0

내가 읽고있는 내용과 시간 제약으로 인해 저장 프로 시저가 가장 적합 할 수 있습니다. 어떻게 접근 할 것인가는 어셈블리의 첫 번째 레벨에있는 모든 요소의 저장 프로 시저에 임시 테이블을 만드는 것입니다 (실제 항목의 유형과 하위 어셈블리의 유형과 함께). 그런 다음 모든 하위 하위 어셈블리를 얻을 때까지 수동으로 모든 재귀를 수행해야합니다. 더 복잡한 어셈블리 중 하나를 사용하여이 루틴을 시도하여 개별 파트와 여러 하위 어셈블리 및 하위 하위 어셈블리가있는 어셈블리를 얻을 수 있습니다.

테스트 버전을 실제 테이블 그래서 모든 인벤토리를 적절하게 줄이거 나 늘릴 필요가있을 때까지 결과를 볼 수 있습니다. 그런 다음 모든 것이 좋게 보이면이 한 테이블에 조인 된 업데이트를 적용하여 단 하나의 전화가 아니라 중첩 된 "죄송합니다 ... 그 중 하나를 놓친"인벤토리를 엉망으로 만들었습니다.

0

나는 당신이 무엇을하는지 완전히 이해하고 있는지 확신하지 못합니다. CTE를 사용하면 모든 "PARTS"를 재귀 적으로 가져올 수 있으며 DbTransaction에서 증가 및 감소 작업을 수행 할 수 있습니다.

관련 문제