【问题标题】:How can I model this Jagged data?我如何建模这个锯齿状数据?
【发布时间】:2009-05-22 14:11:33
【问题描述】:

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

另外:

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

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

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

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

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

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

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

【问题讨论】:

    标签: sql jagged-arrays


    【解决方案1】:

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

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

    【讨论】:

    • 所以在输入所有组合并虚拟评估异常之后,我将如何抓住下一个可用的盒子点,或者一次屏蔽 20 个连续的空间,这样其他人就不会碰撞?我正在考虑拥有一个标识列并尝试获取单个队列的点填充为空的 min(id)。
    • 也许从spotfilled为空的框中选择前20个*,然后按id从(从spotfilled为空的框中选择前40个*)中选择后20个
    • 我没有回答,但我认为这是最好的一个
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:
      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
      

      【讨论】:

        猜你喜欢
        • 2011-02-04
        • 1970-01-01
        • 2013-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-07
        • 2015-04-23
        相关资源
        最近更新 更多