如何查询ado记录集中的数值型字段的小数位数是几位呀?我想根据小数点的位数用format(函数设置msflexgrid单元格的格式),谢谢.
是这样,因为后台sql server中数据表中,有的字段是3位小数,而有的字段是2位小数,比如金额必须只能是两位小数才行.这样就存在一个问题,填充表格mshflexgrid时,要进行format设置,比如金额字段,要保留两位小数,不足补0,而对于那些3位小数的字段则要保留三位小数,不足三位也要用0补齐.
关键是我不知道如何通过程序判断一个字段的小数是几位的.(我是指在后台sql中定义的是几位的)
故求教大家.
或者实现我的需求还有什么好办法.谢谢先.

解决方案 »

  1.   

    实际上,对于浮点数 Single 和 Double 类型,可表示的小数位数远大于 3 位。如果是 Currency 类型,则可以表达 4 位小数。因此数据库表的数据,实际上无法确定你的问题。只能根据实际应用来判断。另外,Single 和 Double 实际上无法精确表示所有 10 进制小数,所以最好用 Currency,它是用 10 字节整数的方式来表示金额的,单位是基本货币的 10000 分之一,所以实际显示时自动除以 10000。
      

  2.   

    我个人认为的思路如下:
    1. 先填充表格,写入数据
    2. len(单元格内容)-instr(单元格内容,"."),得到小数点后的小数位数
    3. 根据小数位数,定义一个format的偏移值字符串,如"0.00","0.000"
    4. 然后某一个列或某个单元格的format可以写成format(单元格内容,定义的偏移量)当然第3,4步可以合并,用select case语句即可。希望对楼主有帮助。
      

  3.   

    我是要写一个通用的msflexgrid表格的填充程序,所以要通过ado记录集得到后对数据库中对字段定义的信息,如果数据库中定义的字段小数点保留三位,则在这个程序中使用format(xxx,"#0.000"),同理两位使用format(xxx,"#0.00"),
    关键是无法判断这个字段定义的信息,我只能用type属性取到这个字段是什么类型的,
    如何取到小数点后定义的是几位呢?
    我的通用填充程序如下:
    Public Function fillgrid(pGrid As MSHFlexGrid, rs As ADODB.Recordset) As Boolean
        '小数型数值保留两位小数
        '注:目前填充表格主要使用该函数
        '功能:将记录添充到表格中
        '接收参数:表格名称和记录集
        '表格没有第一列空行,即第一列填实际数据,不做记录指示器使
        '表头内容全部居中,其余单元格根据类型居左或居右
        
        Dim i As Integer, j As Integer, str As String       'str用于存放字段内容    On Error GoTo gherr
        
        '判断表格是否在记录
        If rs.RecordCount < 1 Then
            fillgrid = False
            Exit Function
        End If
        
        pGrid.Redraw = False                                '不重绘,目的是提高速度
        
        With pGrid
            .Clear
            .FixedRows = 1                                  '固定行
            .Row = 1                                        '活动单元行
            .Col = 1                                        '活动单元列
            rs.MoveLast
            rs.MoveFirst                                '移动记录,如果不移动,有时候RecordCount会统计不准确
            
            .Cols = rs.Fields.Count                     '确定表格列数
            .Rows = rs.RecordCount + 1                  '该设定决定表格有多少行显示数据,很重要[因为有表头,故总行数为记录数加一]
            
            
            '添加各个字段的名称[添加表头]
            For i = 0 To rs.Fields.Count - 1              '循环显示字段名称,有多少个字段则循环多少次
                .Row = 0
                .Col = i
                .CellAlignment = 4                                     '表头都设成居中对齐
                .TextMatrix(0, i) = rs.Fields(i).Name               '显示字段名称
            Next
            
            '第一行放字段名,再加上记录数,就是表格应有的总行数
            For i = 1 To rs.RecordCount                     '循环显示记录,有多少条记录则循环多少次
                    .Row = i                                '当前行随着添充数据走
                    For j = 0 To rs.Fields.Count - 1         '循环处理各个列
                        
                        .Col = j        '使第j列成为当前列
                        
                        '根据不同的类型,设置不同的格式
                        Select Case rs.Fields(j).Type
                            
                            Case adDecimal, adDouble, adSingle, adNumeric
                            
                                .CellAlignment = 7
                                If Val(rs.Fields(j).Value & "") = 0 Then    '为0要不显示
                                    str = ""
                                Else
                                '设定至少保留两位小数
                                    str = Format(Trim(rs.Fields(j) & ""), "#0.00#")
                                End If
                                
                            Case adBigInt, adInteger, adTinyInt, adSmallInt
                            
                                .CellAlignment = 7
                                If Val(rs.Fields(j).Value & "") = 0 Then    '为0要不显示
                                    str = ""
                                Else
                                    str = Trim(rs.Fields(j).Value & "")
                                End If
                                
                            Case Else
                            
                                .CellAlignment = 1
                                str = Trim(rs.Fields(j).Value & "")
                        End Select                    .TextMatrix(i, j) = str
                    Next
                    rs.MoveNext                             '显示下一条记录
            Next
            '设定第几行显示在最前面(用toprow属性)
            .TopRow = 1
            fillgrid = True                               '返回true    End With
        
        pGrid.Redraw = True              '填完数据后,充许重绘
        Exit Function
    gherr:
        fillgrid = False
    End Function