有这样一个需求。
要求有一个表格。其中行肯定是可变的了。然后是列。列也要求用户可以定制(添加、删除、修改)。
用户可以对表格中的任意单元格的内容进行修改。
然后入库。可查询。
   请问用什么方式比较好呢?
   1、用一个表存储。动态添加列。(性能会不会下降?会不会稳定)
   2、用两个表存储(一个存行,一个存列)(Sql语句是不是很麻烦。)
   3、其他

解决方案 »

  1.   

    我原来使用两个表来存储,结果写的把行转换成列的sql语句自己都迷惑。(可能是sql水平太差了吧!)
    不知道有没有什么简单的方法。
      

  2.   

    希望大家能找到一个最简单实用的方法。
    我现在倾向于一个表的方式。
    毕竟理解和维护起来方便。写sql几乎一行就都可以搞定。
    两个表看似正规。但是存储操作太麻烦。
    矛盾呀。
      

  3.   

    建议楼主去MS SQL 版发一个贴,应该会有人遇到过这样的需求。同时在这里贴一个链接。
      

  4.   

    如果要用一个表的话,用户维护表的列的时候,就直接将数据库中表的结构交给客户维护,然后用alter table来实现列的增加删除修改。
      

  5.   

    动态的生成个HTML表格绑定数据试试
      

  6.   

    8楼的不现实...SQL的操作一般只给数据操作权给客户..怎么能给表结构操作权给客户..如果是动态的改变列,只能在客户端构建虚拟表,这个虚拟表的行和列在实际SQL表中都只做为行表示..这才是正解,用存储过程解决好些.我也建议LZ将此贴贴到SQL版块中去,类似用存储过程解决树一样..关键还是在SQL的存储过程上面..
      

  7.   

    我有一个与你这个相差不大的.但那个是VB写的代码.还有我是这样做的.一张表存要显示例.一张表存数据的.然后在通过判断来做的.我给你代码你看一下了.
    Private Sub GridShow() '表格显示
    'On Error GoTo ErrHend
    '***********************************表头************
       MSFlexGrid1.Clear '清空表格内容
        Dim M As Integer
        M = 2
        SumMoney = 0
        MSFlexGrid1.Rows = 2
        If BaseDataType = "A" Then 'Access2000/2003
            Rs.Open "select * From T_Dish Where Dish_State='1'", DataConn, 3, 2
        Else 'SqlServer2000/2005
            Rs.Open "select * From T_Dish Where Dish_State='1'", Conn, 3, 2
        End If
        If Rs.EOF <> True Then
             MSFlexGrid1.Cols = 3 + Rs.RecordCount
             MSFlexGrid1.TextMatrix(0, 0) = "序号"
             MSFlexGrid1.TextMatrix(0, 1) = "读者证号"
             MSFlexGrid1.ColWidth(0) = 800
             MSFlexGrid1.ColWidth(1) = 1000
        Do While Rs.EOF <> True
           MSFlexGrid1.TextMatrix(0, M) = Rs.Fields(2)
           MSFlexGrid1.ColWidth(M) = 1000
           Rs.MoveNext
           M = M + 1
       Loop
          MSFlexGrid1.TextMatrix(0, M) = "收款员"
          MSFlexGrid1.ColWidth(M) = 2000
     End If
       Rs.Close
    '***************************表头结束****************
    '***************************表体内容****************
    Dim X As Integer, Y As Integer
    X = 1
    If BaseDataType = "A" Then 'Access2000/2003
       Rs.Open Sql, DataConn, adOpenKeyset, adLockOptimistic
       Ds.Open SQL1, DataConn, 1, 3
    Else 'SqlServer2000/2005/其它
       Rs.Open SqlServer, Conn, adOpenKeyset, adLockOptimistic
       Ds.Open SqlServer1, Conn, 1, 3
    End If
    If Ds.EOF <> True Then
       MSFlexGrid1.Rows = Ds.RecordCount + 3
    Else
       MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 0) = "合计:"
       MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 1) = Format(SumMoney, "0.00")
    End If
    If Rs.EOF <> True Then
    Do While Ds.EOF <> True
       With MSFlexGrid1
              .TextMatrix(X, 0) = X
              .TextMatrix(X, 1) = Trim(Ds.Fields(0))
              X = X + 1
       End With
       Ds.MoveNext
    Loop
    Else
    MSFlexGrid1.Rows = 3
    MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 0) = "合计:"
    MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 4) = Format(SumMoney, "0.00")
    End If
      Do While Rs.EOF <> True
        For Y = 1 To Ds.RecordCount
        With MSFlexGrid1
         For M = 2 To .Cols - 1
           If Trim(Rs.Fields(5)) = .TextMatrix(Y, 1) Then
              If .TextMatrix(Y, M) <> "" Then
                 If Rs.Fields(2) = .TextMatrix(0, M) Then
                   If CDbl(Rs.Fields("Quantity")) < 0 Then
                      .TextMatrix(Y, M) = Format(CDbl(Rs.Fields(0) * -1) + CDbl(.TextMatrix(Y, M)), "0.00")
                   Else
                      .TextMatrix(Y, M) = Format(CDbl(Rs.Fields(0) * 1) + CDbl(.TextMatrix(Y, M)), "0.00")
                   End If
                  '.TextMatrix(Y, M) = Format(CDbl(Rs.Fields(0)) + CDbl(.TextMatrix(Y, M)), "0.00")
                 End If
              Else
                  If Rs.Fields(2) = .TextMatrix(0, M) Then
                     If CDbl(Rs.Fields("Quantity")) < 0 Then
                      .TextMatrix(Y, M) = Format(CDbl(Rs.Fields(0) * -1), "0.00")
                     Else
                      .TextMatrix(Y, M) = Format(CDbl(Rs.Fields(0) * 1), "0.00")
                     End If
                      '.TextMatrix(Y, M) = Format(CDbl(Rs.Fields(0)), "0.00")
                  End If
                 End If
              .TextMatrix(Y, .Cols - 1) = "(" & Trim(Rs.Fields(1)) & ")" & Trim(Rs.Fields(7))
          End If
         Next M
        End With
        Next Y
         Rs.MoveNext
      Loop
      '处理各项合计
      Dim SumMoney1(32767) As Double, SumMoney2 As Double
      For j = 2 To MSFlexGrid1.Cols - 2
        For Y = 1 To Ds.RecordCount
         If MSFlexGrid1.TextMatrix(Y, j) <> "" Then
          SumMoney1(j) = SumMoney1(j) + CDbl(MSFlexGrid1.TextMatrix(Y, j))
         Else
          SumMoney1(j) = SumMoney1(j) + 0
         End If
         Next Y
      Next j
      MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 2, 0) = "合计:"
      For j = 2 To MSFlexGrid1.Cols - 2
        MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 2, j) = Format(SumMoney1(j), "0.00")
      Next j
      For j = 2 To MSFlexGrid1.Cols - 2
         SumMoney2 = SumMoney1(j) + SumMoney2
      Next j
      MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 0) = "总合计:"
      MSFlexGrid1.TextMatrix(MSFlexGrid1.Rows - 1, 4) = Format(SumMoney2, "0.00")
    '***************************表体内容结束************
      Rs.Close
      Ds.Close
    Exit Sub
    'ErrHend:
     ' MsgBox "查询收款日报错误" & Chr$(13) & "" & Chr$(10) & "错误代码-" & Err.Number & "", 32, Me.Caption ', Err.Source, Err.Description
      'End
    End Sub