热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

奉献出几天心血写的通用代码,大家共享.目前自认比较好了,想请大家挑毛病,谁挑出来用分数感谢.分不够再加

以下程序用于用记录集填充msflexgrid表格,参数一为表格控件名,参数二为ado记录集名.PublicFunctiondatatogrid(pGridAsMSHFlexGrid,

以下程序用于用记录集填充msflexgrid表格,参数一为表格控件名,参数二为ado记录集名.

Public Function datatogrid(pGrid As MSHFlexGrid, rs As ADODB.Recordset) As Boolean
    '本函数特别要求,对于含的小数点的数值型数据,要补足小数点后两位
    '功能:将记录添充到表格中
    '接收参数:表格名称和记录集
    '表头内容全部居中,其余单元格根据类型居左或居右
    
    Dim i As Integer, j As Integer, str As String       'str用于存放字段内容
    Dim rscol As Integer                                '字段的序号,不是表格列的序号
    On Error GoTo gherr
    
    '首先判断记录集是否有内容[如果无内容则不做任何操作就直接返回]
    If rs.RecordCount < 1 Then
        datatogrid = 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 + 1                 '设定表格列数,统计字段数量,列数要比字段数多一个,第一列为空列,当记录指示器用
        .Rows = rs.RecordCount + 1                  '该设定决定表格有多少行显示数据,很重要

        .TextMatrix(0, 0) = ""                      '设定第0列表头,为空
        
        '添加各个字段的名称[添加表头]
        For i = 1 To rs.Fields.Count                '循环显示字段名称,有多少个字段则循环多少次
        
            'i就是表格的当前列,第0列是记录指示器,不在本循环中处理
            rscol = i - 1                                           '比如第1列存放的是rs(0)的内容,故有i-1的关系
            .Row = 0
            .Col = i
            .CellAlignment = 4                                     '表头都设成居中对齐
            .TextMatrix(0, i) = rs.Fields(rscol).Name               '显示字段名称
        Next
        
        '第一行放字段名,再加上记录数,就是表格应有的总行数
        For i = 1 To rs.RecordCount                     '循环显示记录,有多少条记录则循环多少次
                .Row = i                                '当前行随着添充数据走
                
                '第0列做记录指示器用,不填充数据,所以每一行都从第一列开始填
                For j = 1 To rs.Fields.Count            '循环处理各个列
                    
                    .Col = j                            '表格定位到相应的列
                    rscol = j - 1                       '字段的序号,第一列对应rs的第0列字段,故有j-1的关系
                    
                    '根据不同的类型,设置不同的格式
                    Select Case rs.Fields(rscol).Type
                        
                        Case adDecimal, adDouble, adSingle, adNumeric
                            
                            '设定为右对齐
                            .CellAlignment = 7
                            
                           If Val(rs.Fields(rscol).Value & "") = 0 Then    '为0要不显示
                                str = ""
                            Else
                            
                                '根据数据库中的字段小数位数的定义设置格式
                                Select Case rs.Fields(rscol).NumericScale
                                    Case 1
                                        str = Format(Trim(rs.Fields(rscol) & ""), "#0.0")
                                    Case 2
                                        str = Format(Trim(rs.Fields(rscol) & ""), "#0.00")
                                    Case 3
                                        str = Format(Trim(rs.Fields(rscol) & ""), "#0.000")
                                    Case Else
                                        str = Format(Trim(rs.Fields(rscol) & ""), "#0.0#")
                                End Select
                            End If
                            
                        Case adBigInt, adInteger, adTinyInt, adSmallInt
                            
                            '设定为右对齐
                            .CellAlignment = 7
                           If Val(rs.Fields(rscol).Value & "") = 0 Then    '为0要不显示
                                str = ""
                            Else
                                str = Trim(rs.Fields(rscol).Value & "")
                            End If
                            
                        Case Else
                        
                            '设定为左对齐
                            .CellAlignment = 1
                            str = Trim(rs.Fields(rscol).Value & "")
                    End Select
                    
                    .TextMatrix(i, j) = str
                
                Next
                rs.MoveNext                             '显示下一条记录
        Next
        '设定第几行显示在最前面(用toprow属性)
        .TopRow = 1
        datatogrid = True                               '返回true
    End With
    pGrid.Redraw = True              '填完数据后,充许重绘
    Exit Function
gherr:
    datatogrid = False
End Function

21 个解决方案

#1


粗看了一下:
1。循环加载数据过程中使用doevents比较好一些
2。现实使用中经常是不能从数据库读去数据就直接显示的,所以写成过程通用性不够
3。从过程的分割来看,建议分成三个过程 一。加载Title  二。加载数据 三。数据格式化 
   这样维护可能会方便些

以上意见不知道对不对,仅供参考

#2


在结果集过大的情况下,这种捆绑模式效率会很低,所以作为通用的rs与msh的捆绑函数,应该考虑到是采用先期绑定还是后期绑定

#3


在结果集过大的情况下,这种捆绑模式效率会很低,所以作为通用的rs与msh的捆绑函数,应该考虑到是采用先期绑定还是后期绑定
-------------
谢谢您的指教,不过这个函数只是完成填充单元格的作用.也就是将一个记录集内容显示在mshflexgrid中,我不太清楚您说的捆绑函数是什么意思,请指教.
还有:先期绑定还是后期绑定是指的什么呀?

#4


可以填充,但大记录集的情况下速度肯定一般

#5


效率非常低,如果有1万条纪录非常慢

而采用另一种分式会提高 10-20倍的速度

#6


效率非常低,如果有1万条纪录非常慢

而采用另一种分式会提高 10-20倍的速度
-----------------------------------------
谢谢您的指教,能说说另一种方式是哪种方式吗?
在此多谢了。

#7


這控件不是可以直接綁定嗎?
為何還要一格格浪費時間去填?

#8


For i = 1 To rs.RecordCount                   
     For j = 1 To rs.Fields.Count                               
          Select Case rs.Fields(rscol).Type


rs.Fields.Count ,rs.Fields(rscol).Type 可在循环体外部算好,不应多次计算。

'根据不同的类型,设置不同的格式
建议分出去单独做为一个函数,速度会变慢,但维护性、通用性会更好

#9


直接用msflexgrid绑定ADO控件,adodc1.Refresh刷新数据库就可以将ADO控件所连接的数据库里的记录显示出来了~~何必写得这么麻烦呢?~~想不通~..

#10


奉献出几天心血写的通用代码,大家共享.目前自认比较好了,想请大家挑毛病,谁挑出来用分数感谢.分不够再加 
----------------------------------------------------------------------------
给我的感觉就是写这样的代码没什么用~~最起码我不会用这方法~~速度慢而且浪费时间~~
说到挑毛病~~你用这方法本身就是毛病~~最起码我是这样想的~~我说得不对的话请大家指出来~~学习中~~

#11


楼上各位兄弟给予楼主给的代码提了不少好意见,我在开发过程中也经常碰到一些重复的操作,在此也谈一下自己的看法,做一个通用的函数,首先要求函数的入口参数精简灵活,达到函数通用性最大化,函数体一能要保证正确,输出结果正确,当然在做完上述过程,效率是下一步要考虑的问题。 :P

#12


说的有道理

#13


首先谢谢以上诸位老师的指教,我发贴的目的就是争求意见的。以找出问题。
对于以下几个问题,还请各位回贴老师再次请教,谢谢:
---------------------------
您说:
這控件不是可以直接綁定嗎?
為何還要一格格浪費時間去填?

直接用msflexgrid绑定ADO控件,adodc1.Refresh刷新数据库就可以将ADO控件所连接的数据库里的记录显示出来了~~何必写得这么麻烦呢?~~想不通~..
我说:
我也想用直接绑定,可是发现绑定的方法无法设置单元格的格式,比如小数型字段,我要求右对齐,而且保留两位小数。可是这个需要用绑定的方法可以实现吗?
你说:
给我的感觉就是写这样的代码没什么用~~最起码我不会用这方法~~速度慢而且浪费时间~~
说到挑毛病~~你用这方法本身就是毛病~~最起码我是这样想的~~我说得不对的话请大家指出来~~学习中~~
我说:
请问您用哪种方法呢?能指教一下吗?

#14


开发本身就是一个学习的过程,LZ的开发我暂时看不懂,但我顶

#15


你的效率不高 你的记录集肯定必须是 rs.open sql,cn,3,3 
如果是1,1
Rows = rs.RecordCount + 1 
就会出错 通用性不行 
我就不明白了  set msh.datasouse=rs不行吗 格式可以单独调的 写一个通用的调试格式的函数不行吗 不用这样吧

#16


我就不明白了 set msh.datasouse=rs不行吗 格式可以单独调的 写一个通用的调试格式的函数不行吗 不用这样吧
-----------------
谢谢,我正要问的,如何在执行了set msh.datasouse=rs之后再设置格式呀?
还有,设置datasource的方法一定快吗?我以前认为填充表格在最底层的操作也是一个格子一个格子的填充呀!

#17


不错!!不错!!!

#18


我也想说,不错。顶个。我想在实际运用中,有谁会把几万条记录直接列出来给用户看呢??即使用系统提供的绑定方式,要显示1万条以上记录也是比较慢的。

#19


楼主,恕我冒昧,我把您的代码发到这个网站了,请去看看。

http://www.mndsoft.com  (枕善居---国内知名vb中文网站 :)

#20


楼主,恕我冒昧,我把您的代码发到这个网站了,请去看看。

http://www.mndsoft.com  (枕善居---国内知名vb中文网站 :)
-------------------
谢谢鼓励!
我会按照几位老师的指教修改一下,结贴后再发一次代码。

#21


不可能
SQL中 先格式化每个字段的数据格式
然后用 set Grid.DataSource= rs
再重新写一下Grid的表头就OK了

推荐阅读
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • MySQL多表数据库操作方法及子查询详解
    本文详细介绍了MySQL数据库的多表操作方法,包括增删改和单表查询,同时还解释了子查询的概念和用法。文章通过示例和步骤说明了如何进行数据的插入、删除和更新操作,以及如何执行单表查询和使用聚合函数进行统计。对于需要对MySQL数据库进行操作的读者来说,本文是一个非常实用的参考资料。 ... [详细]
  • 使用人|方开源_通过SCCM数据库获取计算机硬件报告
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了通过SCCM数据库获取计算机硬件报告相关的知识,希望对你有一定的参考价值。需求 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
author-avatar
邪恶尽头是纯洁
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有