2

我负责为一个 3 楼的仓库建模,将存放成箱的文件。方程式中有行、列和架子。

此外:

一些地板/行/列/货架组合存储 2 个盒子,一些 3。

有些行没有正常数量的列。

他们希望我的应用程序自动增加打印标签(一次 20 个),告诉用户扫描它们时盒子的去向。所以扫描框 1 将打印 f1r1c1s1b1 框 2 将打印 f1r1c1s1b2 ... f3r26c26b3

我正在考虑构建一个 MSSql 数据库,用所有可能的组合填充它并减去异常数据。(使用 vb.net2005 for 循环进行填充)然后基于 smalldatetime 或者可能是表上的时间戳列,只需获取下一个没有设置 spotFilled 列的列。

这行得通吗?有没有更好的办法?

(下一步是一次屏蔽 20 个,因此 2 个用户可以扫描盒子而不会在同一楼层/行/列上相互碰撞,大多数地板/行/列/货架组合存储 21 个盒子,1 个碰撞可能是好的。他们也希望按照收到的顺序大致相同的盒子)

MSSQL 服务器和 VS2005 已经存在于我的工作环境中,所以这些是我最熟悉的工具。

4

3 回答 3

1

我假设没有简单的模式,所以你可以将整个位置向量映射到一个简单的整数索引?例如,如果它始终是允许 3 个框的第一列,您仍然可以将 f3r26c26s1b3 向量映射为整数。

否则,最好的解决方案可能不是存储每个组合。相反,假设每个架子实际上确实存储了 3 个盒子,并将第三个盒子的“spotFilled”设置为一个虚拟值(-1 左右;除了 NULL=unfill 之外的任何值)。这将使您将其视为正常的矩形阵列。它之所以有效,是因为您的阵列几乎是规则的,但是嘿 - 现实世界的 IT 就是要识别异常的异常

于 2009-05-22T15:17:08.437 回答
1

为什么不只是有一个普通的桌子,就好像它是非锯齿状的(列:Floor, Row, Column, Shelf, Box);对数据设置适当的界限,以最大限度地减少 db 需要的大小,然后将假盒子存储在假点中。

于 2009-05-22T15:19:21.803 回答
0
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
于 2009-05-23T13:50:20.793 回答