设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 2707|回复: 3
打印 上一主题 下一主题

[窗体] 从“自动牙刷”谈起——浅谈自动数据表窗体

[复制链接]
跳转到指定楼层
1#
发表于 2018-10-27 17:43:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
      记得很久以前,看过一个笑话,说有人卖牙刷,“自动牙刷,三块钱一支”。大家买了之后,发现是普通牙刷,第二天在隔壁村子围堵他,“你这明明不是自动牙刷,我把它放嘴里,根本不会刷牙。”他淡定地说,“你们的使用方法有问题呀。把它放进嘴里,紧贴着牙齿,然后你的脑袋左右晃动,它就能自动刷牙了。”       这不就是明显在欺负大家读书少,没学过相对运动的概念吗?
       当然,我们接下来说的自动数据表窗体,也是这么一回事。之所以说是自动,只不过一切运行都在后台,你没来得及感知罢了。

      七八年前,曾经写过一个帖子懒人有懒计——浅谈自动报表,为版友解决根据所选字段创建报表的问题。这次写这个帖子,同样是为另一个版友解决类似的问题:能否根据交叉表查询来自动更新数据表窗体
      我们知道,Excel是可以用数据透视表来实现这个功能的,只需要设置好行列字段和数据,刷新数据源,即可自动更新。Access的交叉表查询不是做不到类似的功能,但是,如果要把它显示在窗体或者报表上就有些问题了。对于报表而言,由于涉及到页面打印尺寸,因此不太可能完全自动化,毕竟它不会自动调整打印尺寸,也不会自动调整控件尺寸,甚至字体大小。不过对于窗体而言,不存在页面尺寸问题(会根据控件布局而调整主体尺寸),这就有了继续往下思考的前提:

       a、能否允许在设计模式下根据需求创建控件并绑定数据?这个问题我没测试过,估计可能不行。有兴趣的版友可以试试。
       b、是否可以预设一定量的控件(例如,对于月报,可以预设31个控件作为容器),最后根据数据源的数量进行绑定并处理显示标签(label.caption)呢?这个方法应该是可行的(请参考:关于有参数条件的交叉表查询生成报表)。
       c、是否可以删除已有的子窗体,然后根据数据源的变化,重新生成子窗体?是的。这个是可行的。

       考虑到显示模式下,删除子窗体可能不是那么方便(当然,有兴趣的版友也可以试试,在点击事件中加入deleteObject·的语句)。所以我这里用child(子窗体/子报表控件)来实现。思路上是加载时,用child控件通过SourceObject绑定已有的子窗体控件,以便显示数据。然后更新数据源时,则取消绑定,删除子窗体,打开交叉表查询,重新创建数据表窗体,再进行绑定,从而达到更新的目的。理清思路之后,接下来就是写代码了。很简单的几句:
  1. Private Sub Command0_Click()
  2.     On Error Resume Next
  3.     Me.Child1.SourceObject = ""
  4.     '删除窗体,打开查询并创建窗体
  5.     DoCmd.DeleteObject acForm, "生产_工单_按日期查询"
  6.     DoCmd.OpenQuery "生产_工单_按日期查询"
  7.     DoCmd.RunCommand acCmdNewObjectAutoForm
  8.     DoCmd.Save acForm, "生产_工单_按日期查询"
  9.     '默认情况下,会生成单个窗体,因此这里需要在设计模式下修改默认视图
  10.     DoCmd.OpenForm "生产_工单_按日期查询", acDesign
  11.     Forms("生产_工单_按日期查询").Visible = False
  12.     Forms("生产_工单_按日期查询").DefaultView = 2
  13.     '设置数据集类型为快照(禁止用户修改)
  14.     Forms("生产_工单_按日期查询").RecordsetType = 2
  15.     '关闭各个组件,重新绑定窗体控件
  16.     DoCmd.Close acForm, "生产_工单_按日期查询", acSaveYes
  17.     DoCmd.Close acQuery, "生产_工单_按日期查询", acSaveNo
  18.     Me.Child1.SourceObject = "窗体.生产_工单_按日期查询"
  19. End Sub
复制代码
      如果喜欢的话,就下载附件看看吧。
      

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

参与人数 1经验 +8 收起 理由
ardu95 + 8 (其它)优秀教程、原创内容、以资鼓励、其.

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅

点击这里给我发消息

2#
发表于 2018-10-27 20:33:48 | 只看该作者
赞一个,先坐个沙发
3#
发表于 2018-10-29 08:22:30 | 只看该作者
谢谢roych ! 你能帮我解答非常感谢!其实我是想通过另一个工单查询窗体点击文本框显示筛选后的交叉查询子窗体!因交叉查询子窗有动态多列无法完全显示,才造成困扰!
   我的解决办法:多建一个窗体+子窗体:在窗体加载事件中写入:Me.生产_工单.SourceObject = "Query.生产_工单_日期查询",达到时实更新!
但是,点击工单查询窗体文本框(产品料号/工单编号)无法达到精确筛选!
因access+VB只是个人爱好!无法达到精通!有很多想法,但实际操作会遇到很多阻力!多谢各位帮助!
4#
发表于 2018-11-6 12:11:01 | 只看该作者
学习了,感谢大侠!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-6-11 23:55 , Processed in 0.143041 second(s), 29 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表