设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

12下一页
返回列表 发新帖
查看: 4455|回复: 13
打印 上一主题 下一主题

[其它] [讨论] 对t小宝版主的作品[主子窗体批量保存]的疑惑

[复制链接]
跳转到指定楼层
1#
发表于 2014-6-23 09:58:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 wx0000888 于 2016-6-28 22:32 编辑

一直以来,本人都是利用临时表,作为批量添加和修改这个方法来 做连续窗体或数据表窗体的 , 比如 材料的入库单,出库单 以及 商品的入库单出库单. 都是利用 临时表来完成的. 当然 access 临时表不是真正的 sqlserver 中的临时内存表啦 ,  其实就是用 select into from(select .....)创建一个物理表.    自看了 对t小宝版主的作品[主子窗体批量保存] 的大作, 尝试利用其中ADO批量更新类模块 , 但在实际使用中,还是发现有局限性, 比如 序号(不是自动编号)的问题, 添加,删除记录都要重新修正 序号, 这个我没有办法办到, 另外 主表数据, 子窗体数据 记录源和控件数据来源不是来自单个表 ,而是来自于几个表的 连接查询复杂查询, 最终无法完成,  本人感觉, 这个 批量保存好是好,但 实用性非常有限,   不知道大家是怎么看待这个的.



有附件,可下载, 如果大家有好的思路,请帮忙完善,谢谢!
利用 columnorder 和 columnhidden

贴上自定义汇总条代码

  1. Public Sub frmTotalBar(strMain As String, strDetail As String, strBar As String)  '自定义汇总行
  2. '   On Error Resume Next
  3.     Dim ctl As Control
  4.     Dim lngW As Long
  5.     Dim arrControl() As String
  6.     Dim Index As Integer
  7.     Dim Total As Integer
  8.     Dim frm As Object
  9.     Dim frmBar As Object
  10.     Dim ctlName As String
  11.     Set frmBar = Application.Forms(strMain).Controls(strBar).Form
  12.     Set frm = Application.Forms(strMain).Controls(strDetail).Form    '
  13.     ReDim arrControl(1 To frmBar.Controls.Count)   '上标1开始
  14.     For Each ctl In frm.Controls
  15.         If ctl.ControlType <> acLabel Then
  16.             ctlName = ctl.Name
  17.             If ctl.ColumnHidden = False Then
  18.                 arrControl(ctl.ColumnOrder) = ctlName '利用数组的索引,自动排序,然后再经过后面过滤无用的,截取有用的(非隐藏的).
  19.             End If
  20.         End If
  21.     Next
  22.    
  23.     frmBar.Box0.SetFocus                 '必须转移焦点,否则无法隐藏
  24.     For Index = 1 To 20                      '整理数组,有效的数组前置
  25.         frmBar.Controls("txtControl" & Index).Visible = False
  26.         If arrControl(Index) <> "" Then
  27.             Total = Total + 1
  28.             arrControl(Total) = arrControl(Index)
  29.             frmBar.Controls("txtControl" & Total).Visible = True
  30.         End If
  31.     Next
  32.     For Index = 1 To Total                       '过滤无用的,截取有用的(非隐藏的) ,  k是下标,1到k位置里面都是有用的,非隐藏的
  33.         If frm.Controls(arrControl(Index)).ColumnWidth = -1 Then            '当新建的字段,其默认屏幕显示宽度为-1,实际是1410
  34.             frmBar.Controls("txtControl" & Index).Width = 1410    '13.2095  (1410)
  35.         Else
  36.             frmBar.Controls("txtControl" & Index).Width = frm.Controls(arrControl(Index)).ColumnWidth
  37.         End If
  38.         If Index = 1 Then
  39.             frmBar.Controls("txtControl" & Index) = "汇总"               '第一列 标题一般为 "汇总"
  40.             lngW = 285                      'Box的宽度作为起点(最左)
  41.         Else
  42.             lngW = lngW + frmBar.Controls("txtControl" & (Index - 1)).Width
  43.         End If
  44.         frmBar.Controls("txtControl" & Index).Left = lngW
  45.     Next
  46.     Erase arrControl()                  '释放内存
  47.     Set ctl = Nothing
  48.     Set frm = Nothing
  49.     Set frmBar = Nothing
  50. End Sub
复制代码


本帖子中包含更多资源

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

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享分享 分享淘帖 订阅订阅
2#
发表于 2014-6-23 10:05:07 | 只看该作者
你的想法不错,很有见解,但是小宝当时做这个只是考虑通用的情况,特殊的情况需要你根据自己的需求去修改的,分享者只能分享思路和方法但是使用者需要根据各自的需求作出调整的。
3#
 楼主| 发表于 2014-6-23 12:49:28 | 只看该作者
本帖最后由 wx0000888 于 2014-6-23 12:55 编辑

嗯,没有这样简单,首先序号就不好弄, 子窗体的记录源如果变为 复杂查询,是无法进行绑定更新的。  多次测试,其实 t版主 只能适用于 直接绑定数据表。 其实t版主的类模块就是利用 ACCESS内置 的 添加更新机制 完成一些处理。无法复杂化。   

虽然有些不可用,如复杂查询。但是有些是可以的,例如:员工信息库,产品库,材料库,供应商库,客户库等等。 所以大点的数据库软件 我采用添加 临时表的方法以及这个类模块方法都采用的方法(谢谢t版主)。 我现在编的 是 ACCESS + SQLSERVER ,里面很多代码有 红尘如烟版主的 也有其他高手的(感谢他们),
4#
发表于 2014-6-23 16:15:15 | 只看该作者
你更新的话可以试试ado
5#
发表于 2014-6-23 16:27:01 | 只看该作者
主要还是学习思路和方法,具体情况要具体分析
6#
发表于 2014-6-23 16:29:30 | 只看该作者
楼主说的对,用于基础数据录入还是挺好用的
7#
发表于 2015-10-19 22:09:28 | 只看该作者
新增|修改|保存
8#
 楼主| 发表于 2016-6-27 12:53:06 | 只看该作者
本帖最后由 wx0000888 于 2016-6-27 12:56 编辑

对t小宝版主的作品[主子窗体批量保存]的ACCESS2010版本的新的一点使用经验

不是DAO,也不是 ADO批处理  .是在 ADOTransform  (是ADO) 的那个类中的,
currentproject.accessconnection 改成  currentproject.connection 即可添加新记录.

但是还有两个新的缺点
1  不能像DAO可添加有效的汇总合计行, 即使添加了汇总, 数据表窗体上也无法显示合计.
2  主子窗体的数据源是复杂的查询语句,那么就变成只读的了.  

本人为什么不用DAOTransForm  ?  是因为 经常会崩溃,溢出.   
9#
发表于 2016-6-27 13:44:41 | 只看该作者
wx0000888 发表于 2016-6-27 12:53
对t小宝版主的作品[主子窗体批量保存]的ACCESS2010版本的新的一点使用经验

不是DAO,也不是 ADO批处理   ...

谢谢分享
10#
发表于 2016-6-27 14:02:40 | 只看该作者
LZ这穿越回贴啊。。。。。
没见过t小宝的作品,但可以讨论一下,
1.序号的问题,
   (1)添加时,我们可以在Form_BeforeInsert事件中,写入me.序号字段=me.seltop
        关于seltop,可以去看一下系统帮助解释

   (2)删除,分两种情况
      一种是最后一条记录删除,结合上面(1)的做法,这里不用做处理
      另一种是非最后一条记录删除时,会引起序号重排,方法呢,可以在Form_AfterDelConfirm事件中,做更新的过程,
            比如用ADO重新把剩余记录重排序
     对于删除,我不太喜欢这类方式,因为降低了效率,比较占资源,特别记录多的时候,我一般使用的是,号码删除了就不出现了,也就不补位,但可以在最终保存更新时,再重新计算一次序号

2.关于汇总栏位
在2003时,采用了一个方式,比如只读时,用了一个联合查询,连接了一句汇总查询记录在最底部,这样也达到了效果
但时修改时,在这里我采用了一个方法,可修改时最后一行,是一个空行,但是,我们设置默认时,这个值显示出来,
所以我们只要把汇总计算值,做成默认值,在相关事件中,进行改写,就达到了我们最终有个有模有样的汇总栏位了。
但注意,在Form_BeforeInsert事,要把这个栏位控件改成0哦,否则默认值就带出来了。
效果还是不错的,但只有一点,没有解决好,就是批量添加时,事件会不起作用,呵。。。

3.多表保存的问题,一般我采用的是本地临时表方式,不会直接在主数据表中去写入,那么这就好办了,你想设什么栏位都可以,只明保存时,
根据代码要求,分别去存在不同的数据表中就行了。并且不要去做类模块

4.用ACC+MSSQL方式,我也用本地临时表,通过本地组成字符串语句,一次性提交MSSQL,结合存储过程处理,一般很少用服务器的临时表,除非更理较大或复杂的报表时,才会使用
      
   
        
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-22 12:41 , Processed in 0.094733 second(s), 34 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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