이 들쭉날쭉 한 데이터를 모델링하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/898069

  •  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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top