이 들쭉날쭉 한 데이터를 모델링하려면 어떻게해야합니까?
-
23-08-2019 - |
문제
문서 상자가 저장 될 3 층 창고를 모델링하고 있습니다. 방정식에는 행, 열 및 선반이 있습니다.
게다가:
일부 바닥/행/열/선반 조합은 2 개의 상자를 저장합니다.
일부 행에는 일반적인 열이 없습니다.
그들은 사용자가 스캔 할 때 상자가 어디로 가는지 알려주는 라벨 (한 번에 20 씩)을 인쇄하기 위해 내 응용 프로그램을 자동 증가시키기를 원합니다. 따라서 박스 1은 스캔됩니다.
MSSQL 데이터베이스를 구축하여 가능한 모든 콤보로 채우고 예외 데이터를 빼기를 생각했습니다. (루프가 채우기 위해 vb.net2005를 사용) 그런 다음 작은dateTime 또는 테이블의 타임 스탬프 열을 기준으로 스팟 컬럼 세트가없는 다음 단계를 잡으십시오.
이것이 효과가 있습니까? 더 좋은 방법이 있습니까?
(다음 단계는 한 번에 20을 차단하는 것입니다. 따라서 2 명의 사용자가 동일한 바닥/행/열에서 서로 충돌하지 않고 상자를 스캔 할 수 있습니다. OK. 또한 그들은 상자를 거의 같은 순서로 받고 싶습니다)
MSSQL Server 및 VS2005는 이미 작업 환경에 존재하므로 가장 친숙한 도구입니다.
해결책
사소한 스키마가 없어 전체 위치 벡터를 간단한 정수 인덱스에 매핑 할 수 있다고 가정하고 있습니까? 예를 들어, 항상 3 개의 상자를 허용하는 첫 번째 열인 경우 여전히 F3R26C26S1B3 벡터를 정수에 매핑 할 수 있습니다.
그렇지 않으면 최상의 솔루션은 아마도 모든 조합을 저장하지 않을 것입니다. 대신, 실제로 각 선반이 실제로 3 개의 상자를 저장하고 세 번째 상자의 "Spotfilled"를 더미 값 (-1 정도; NULL = FILLED)로 설정한다고 가정합니다. 이것은 이것을 정상적인 직사각형 배열로 취급 할 것입니다. 배열이 거의 규칙적이기 때문에 작동하지만, 실제 세계는 예외에 대한 예외를 인식하는 것입니다.
다른 팁
마치 정글이없는 것처럼 일반 테이블을 가지고 있지 않습니까 (열 : 바닥, 행, 열, 선반, 상자); DB가 얼마나 큰지 최소화하는 데이터에 적절한 경계를 넣은 다음 가짜 상자를 가짜 지점에 보관하십시오.
Public Function SecondFloor() As List(Of List(Of bDatafield))
Dim result As New List(Of List(Of bDatafield))
For Aisle As Short = 1 To MaxAisle
For Column As Short = 1 To MaxColumn
If Not SecondFloorExceptions(Aisle, Column) Then
For shelf As Short = 1 To MaxShelf
For Position As Short = 1 To MaxPositions
Dim Location As New List(Of bDatafield)
Location.Add(MakeNewField("Floor", Floor2))
Location.Add(MakeNewField("Aisle", Aisle.ToString))
Location.Add(MakeNewField("Column", Column.ToString))
Location.Add(MakeNewField("Shelf", shelf.ToString))
Location.Add(MakeNewField("Position", Position.ToString))
result.Add(Location)
Next
Next
End If
Next
Next
Return result
End Function
Public Function MakeNewField(ByVal column As String, ByVal value As String) As bDatafield
MakeNewField = New bDatafield(column, New Nullable(Of Integer))
MakeNewField.SqlColumnTransformer = New TransformField(AddressOf MapSqlColumn)
MakeNewField.Value = value
End Function
Public Function SecondFloorExceptions(ByVal Aisle As Short, ByVal column As Short) As Boolean
If column > MinAisleLength Then
ElseIf column > MaxColumn Then
SecondFloorExceptions = True
Else
Select Case Aisle
Case 2 ''//Items with 39
If column > 39 Then SecondFloorExceptions = True
Case 3 To 10, 26 To 30, 32 To 38 ''//Items with 41
If column > 41 Then SecondFloorExceptions = True
Case 11 ''//Items with 32
If column > 32 Then SecondFloorExceptions = True
Case 12, 13 ''//Items with 38
If column > 38 Then SecondFloorExceptions = True
Case 14 To 24 ''//Items with 36
If column > 36 Then SecondFloorExceptions = True
Case 25, 31 ''//Item with 35
If column > 35 Then SecondFloorExceptions = True
End Select
End If
End Function
그런 다음 다음과 같이 데이터베이스에 버렸습니다.
Public Sub InsertLocationRow(ByVal cn As bInheritance.bCnNativeMs _
, ByVal data As List(Of bDatafield))
Dim leftSide As String = "insert into " + My.Settings.ProjectSchema + "." + My.Settings.tblLocations + "("
Dim rightSide As String = " values ("
Dim first As Boolean = True
For index As Integer = 0 To data.Count - 1
If data(index).isValid Then
If Not first Then
leftSide += ","
rightSide += ","
End If
leftSide += data(index).SqlColumn()
rightSide += BLib.AddQSafe(data(index).Value, True)
first = False
End If
Next
leftSide += ")"
rightSide += ")"
cn.ExeNonQuery(leftSide + rightSide)
End Sub