找控件就像找爱人:小评几个可用于显示交叉表数据的控件

2024-01-09 15:32

本文主要是介绍找控件就像找爱人:小评几个可用于显示交叉表数据的控件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

版权声明:可以任意转载,转载时请务必以超链接形式标明如下文章原始出处和作者信息及本声明

作者:xixi

出处:http://blog.csdn.net/slowgrace/archive/2008/10/02/3009557.aspx

 

所谓交叉表是一种常用的分类汇总表格。使用交叉表查询,显示源于表中某个字段的汇总值,并将它们分组,其中一组列在数据表的左侧,另一组列在数据表的上部。行和列的交叉处可以对数据进行多种汇总计算,如:求和、平均值、记数、最大值、最小值等。 

比如我现在要做的这种一周食谱这样的交叉表。

在数据库里其实是基于下面这样的表:

其中bytMealtype字段和lngrecipeid字段其实都不是文本型字段,但是因为设置为组合框,所以ACCESS自动把这些数字对应的文本显示出来了。在第一张图显示的交叉表中,bytmealtype字段被用作行标题、也就是行字段;dateMeal字段被用作列标题,也就是列字段;lngrecipeid则是值字段,可以看到主要内容是被值字段的值表示的,有时值字段也叫明细字段。 

具体到我们现在要处理的问题,对这个交叉表显示的要求如下:

1. 显示:能方便地从数据库的表中获得数据并显示出来。这是最基本的要求。

2. 定位:能方便地定位单元格。

3. 配色:能方便地设置单元格的颜色。这是为了方便用户编制、分析每周食谱。

4. 明细:能展示多于1个的明细数据。这一点是因为每个菜谱既有ID也有NAME,显示ID对用户不友好;显示NAME在保存数据时可能会导致混乱,因为NAME可能是不唯一的。

5. 删改:能删改显示的数据,以便用户边调整边看结果。

6. 保存:能把改过的数据,方便的存回数据库。以便以后调阅。 

可以选择的控件很多,我试了下面几个:

(1)基于交叉表查询的自动窗体:这是最简单的显示交叉表数据的办法。在ACCESS中用可视化工具设计一个交叉表查询,然后基于这个查询自动生成窗体。

    a)显示:基本是比较简单的。不过生产自动窗体之后,还要写一些代码以便在在程序运行期间根据用户的选择动态更改列标题(改为当前选定时间区间内的相应日期)。

    b)定位:行就是当前记录的mealtype值;列就是当前获得焦点的控件的name。

        Me.txtRow = Me.交叉表查询自动窗体.Form.bytMealType
        Me.txtCol = Me.交叉表查询自动窗体.Form.ActiveControl.Name

    c)配色:这个比较麻烦。设置一列的颜色比较简单,就是把那列对应的combo控件的背景色改掉就行。设置某个单元格的颜色比较麻烦,好在我也不是要求设置任意单元格的颜色,只是要把菜谱资料不齐的单元格变色,所以可以用各combobox的formatcondions写:

  1.     Dim FCs As Access.FormatConditions
  2.     Set FCs = Me.交叉表查询自动窗体.Form.Ctl2008_9_25.FormatConditions
  3.    
  4.     FCs(0).BackColor = RGB(255, 255, 0)
  5.     FCs(0).Modify Type:=acExpression, Expression1:= “SetYellowOrNot([cbo5])”
  6.     Set FCs = Nothing

    d)明细:方便。只要手工把这几个combo控件的行来源设置为基于tblrecipe的查询就行了

    e)删改:不允许改。可以代码改之后让窗体requery,还比较快。

    f)保存:得自己写代码。

 (2)比较容易想到的办法是用pivottable控件

    a)显示:只要在程序里设置好列字段、行字段和值字段就可以了。

    b)定位:支持。

    c)配色:不支持。很郁闷。貌似它只能按字段设置颜色。

    d)明细:可以显示多个字段。也可以直接得到和一个字段相关的其他字段(即使不显示)。这一点比较吸引我。因为我需要显示的只是菜名,但需要得到的相关数据却比较多,这样写代码时可以省些事。

    e)删改:不允许改。可以先在后台该了,然后刷新显示,还算简单。

    f)保存:得自己写代码。

   小结:它的致命伤是无法设置单个单元格的颜色,没有变通办法。 

 

(3)另外还可以用datagrid控件。这个的用法,其实是把交叉表查询生成的记录集作为它的数据源来做显示。它的缺点是不能设置单个单元格颜色;不能显示多于一个的细节。所以,放弃。

 

另外我还看了下其他data bound的控件。主要是看了datarepeater, datacombo。本想试试,但在VBA里好像用不了,折腾许久也不行。看了些资料,datarepeater大约是像ACCESS连续窗体的效果,是其他控件的容器,同时自己又是数据绑定的;datacombo基本上就是我用惯了的combo,只不过好像不用编程就可以设置它的列表啥的,可以绑定字段好像。我感觉这两个控件结合在一起能满足我的需要。只可惜它们属于VB power packs,我下载了却装不上,貌似必须先装了VB才行,光拷OCX和注册不灵。另外,我觉得这个和第一种方案的工作量和实质都基本一致,就不继续朝这个方向努力了。 

(4)spreadsheet控件。这个基本上就是把excel嵌进来。本文的第一张图就是用spreadsheet控件做的。

    a)显示:数据需要自己从DB中逐条读出来显示。

    b)定位:可以方便地定位单元格。

    c)配色:可以方便地设置单元格的颜色。

    d)明细:只能显示1个明细。变通的办法有两个,1个是把两个细节合在一起并在一个单元格里显示;一个是做两个worksheet,相应的细节单元格,一个显示ID,一个显示name。

    e)删改:可以删改。

    f)保存:需要自己写代码存盘。 

(5)再有listview控件。用它的report view模式。这个我不是很满意,比较早的否了。因为它一选就是选一行,不支持单元格的点选。 

这么折腾下来,其实我可以用的只有自动窗体和spreadsheet两种选择。我比较倾向于用自动窗体,因为感觉工作量稍小点。试这些控件花了2天多,还可以无穷尽的try下去,比如flexgrid控件、crystalreport、各种扩展的datagrid和pivottable等,但我决定打住了。这找控件就像买东西。你是选择把所有货物都穷尽以便找到最好的那一个,还是在满足你的性价比要求下找到一个就下单?估计一般人想也不想会说选后者。问题是,很多时候我们不太明白自己的底线,也就是自己的性价比要求。比如,我选这个控件,一开始我并没有太清楚我有哪些必须完成的需求,比如设置颜色的需求、比如对明细数据的需求等等。 

或者不如说,找控件就像找爱人。在你年轻的时候你并不知道你需要什么样的伴,你既不明确知道当前自己的需求、更无从知道未来的你的需求,而且你也无从判断你将要相伴一生的这个人性价比如何,你只能根据不靠谱的爱情感觉或者其他一些什么因素圈定一个,从此踏上充满风险的婚姻之旅。这以后如果发现这个控件不能满足你的需求,你只能见招拆招,能将就着用就用吧,实在绕不过去,那只好壮士断腕,从头来过。 

唉。这么一说,还有点凄凉了。控件真是不靠谱的东西,标准的、简单的、人所共知的控件还行;稍复杂点的,即使是微软出品的,它的性能、它的易用性、它的不出错率你就别寄予太高期望了。(而且,该死的微软,它们挣了那么多钱,就不能花九牛一毛的钱雇个人好好地写一份言简意赅的控件说明书么?)很多时候,你也许会发现你最初因为采用了控件而省出的编代码的时间,远远抵不过你跟这该死的控件较劲的时间。这和人类社会又很像了,你能控制的、完全依靠的永远都只有你自己。 

在用别人的控件和自己动手这两者中选择哪个,是个难题。实在没时间调研明白的时候,咱扔硬币吧。不管怎样,我得记住,别穷尽!  

另外,也有点明白了在ACCESS里用VBA和直接用VB6的区别,那就是微软针对ACCESS的常见需要提供了许多方便,省去了编程的麻烦,许多功能不需要太多的代码就可以实现了。比如,自动窗体。比如,我一行代码没编就得到的复合框……所以,我想以后能用ACCESS自己提供的功能就少用外边的。针对相同的功能,我猜ACCESS自己提供的八成还是比外边的好用。 

注:以上讨论只是本人基于浅显经验的粗浅认识,结论未必正确,仅供参考。

 

参考文献:http://msdn.microsoft.com/zh-cn/library/bx2998ay(VS.71).aspx

这篇关于找控件就像找爱人:小评几个可用于显示交叉表数据的控件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/587592

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

每天认识几个maven依赖(ActiveMQ+activemq-jaxb+activesoap+activespace+adarwin)

八、ActiveMQ 1、是什么? ActiveMQ 是一个开源的消息中间件(Message Broker),由 Apache 软件基金会开发和维护。它实现了 Java 消息服务(Java Message Service, JMS)规范,并支持多种消息传递协议,包括 AMQP、MQTT 和 OpenWire 等。 2、有什么用? 可靠性:ActiveMQ 提供了消息持久性和事务支持,确保消

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问