Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

[5分]关于创建选择大量数据的数据表窗体的挑战

sosopain  发表于:2012-01-25 01:01:57  
复制

背景:有一个产品表,内有几千个产品记录, 这个表结构不可更改,请注意这点

现在要做个选择窗体,在生成订单等单据时侯能大量勾选. 而不是一个一个编号录入. 环境是ADP

 

目前的解决思路是

1. 建立一个SelectBase表,内含两个字段, selected(bool) productID(long)

2. 建立一个生成表查询, 把selected字段和产品表联合起来生成一个新的临时表.

3. 建立一个符合2生成的表的数据表窗体, 做为选择的子窗体

4. 建立一个主窗体, 包含两个3生成数据表的子窗体, 一个做为选择窗体,一个做为结果查看窗体. 打开窗体的时侯建立局部临时表, 并把表指定给两个子窗体.

 

 

 

一切看上去很美,但是遭遇几个问题.

 

1. 做为结果查看子窗体的记录源如果=选择子窗体, 则无法筛选出已经选择的, 指定filter和调整主子连接属性都试过.无效

2. 建立局部临时表时,  步骤应该是

     a. 检查临时表存在不.如果存在.删除

     b. 生成表查询

     c. 添加表主键

     d. 更新selected字段为false

 

    用存储过程, b,c,d 出错..

    用VBA,,,不会做a..请老师帮忙

 

请各位老师指点一下,这种大量数据选择怎么处理数据表比较合适, 之所以要用数据表是想借助数据表强大的筛选器, 产品属性有20多个..挨着 做筛选代码太耗时..

 

 

 

 

 

 

 

Top
煮茶论道 发表于:2012-01-25 09:58:11

我的理解是结果表和选择表不应该是同一个数据源。当在选择子窗体选择后,把选择结果追加到结果表中,同时把选择子窗体的选择字段全部更新为false,结果子窗体数据源为结果表,刷新结果子窗体就可以了。



sosopain 发表于:2012-01-25 13:00:28

如果不做成同一个数据源..就要做个同步机制,,,,感觉挺麻烦啊. 我总觉得理论上是可以的..再研究一下..ado能不能在记录集上做filter?

 



煮江品茶 发表于:2012-01-25 20:02:20

很简单的问题嘛。

1、建立一个表名为产品属性表,两个字段,其一名曰属性(记录为你那20个属性名称),其二名曰属性值。

2、主窗体上两个数据表子窗体,一个以产品属性表为数据源,一个以产品表为数据源。主窗体上加以筛选按钮。

3、在按钮事件中,遍历产品数据子窗体的两个控件值(用seltop),当然也可直接用ado遍历产品属性表,以此动态产生筛选字符串对产品子窗体进行筛选。

4、代码片段:

dim i as long,num as long
dim strwh as string
strwh="true"
num=me.属性子窗体.form.recordsetclone.recordcount
for i=1 to num
     me.属性子窗体.form.seltop=1
     if isnull(me.属性值.value)=false then
         strwh=strwh & " and cstr(" & me.属性.value & ")='" & me.属性值.value & "'"
     end if
next
me.产品子窗体.form.filter=strwh
me.产品子窗体.form.filteron=true

5、可以根据实际进一步优化,比如可以在属性表中增加两个字段,一个为数据类型,另一个为逻辑符。在此基础上可以更为灵活的构造筛选字符串。



sosopain 发表于:2012-01-27 15:51:03

这个方法是不错,但是如果遇到部分字段是枚举的就有点麻烦了呀.



萧云 发表于:2012-01-28 21:31:11

你所遇到的是最常见的窗体设计。

不建议生成动态临时表,最好是预先设计好的中间表(比临时动态创建表使用时要快很多,这是我个人的意见,因为预先设计好的中间表并没有占用多少的空间)。

 

这里要弄清楚第一个问题:

就是这个中间表是提供给第二子窗体(订单明细子窗体)的数据源,当确认无误后这个中间表里的所有数据会一次性批量插入到订单明细表中。

 

* 这里要弄清楚第二个问题:

你所设计的这个窗体中还有第一个子窗体,它是用来显示产品信息的数据表子窗体(当然也可以使用列表框来实现并且实现起来更加快捷,这里暂不讨论),为了实现多项选择你想到了复选框控件(ACCESS表中对应“是否”数据类型),在这里不建议这样做,因为尽量不可更改原始表的结构。 你可以使用鼠标双击指定的产品信息子窗体中的行,并将双击产品信息子窗体那一行的数据添加到订单明细子窗体中,而显示产品信息子窗体中被双击的那一行,在使用 NOT IN 运算符查询运算后被隐藏,给操作者的感觉就是产品数据信息被添加到订单子窗体中。

 

当操作者确认所选取添加修正后的数据无误后,需要使用按钮控件的单击事件批量添加到订单及订单明细表中。 

 

--------------------

 

以上肯定是需要编写VBA来完成,不要说你不想用代码来实现复杂一点儿的功能,并且最好是使用ADO来实现,因为你的数据库环境就是ADP。

 

-------------------



t小雨 发表于:2012-02-02 11:59:50
可以不用临时表,用列表框的多选特性实现,当然要写点代码了

sosopain 发表于:2012-02-04 21:36:51

列表框不好,,一来是产品库里有几千个产品型号,多选很容易搞错.二来又需要手动代码去筛产品.

 

萧老师: 用临时表是因为,我做的是个通用的选择窗体,多用户环境下,可能有用户在订单模块选择产品,有用户在入库模块选择产品.而且产品信息可能随时添加,生成临时表会方便一些.

我目前的问题是不太理解在ADP环境下窗体连接ADO的更新和筛选机制, 非要提交到服务器上了filter才能有效吗?不能直接作用于ado对象吗? VBA倒是不怕.只要能找到在本机内存内就能过滤记录集,并且绑在窗体上刷新出来的方法 ..(因为有几个关键用户是VPN拨号进来的..可能受不了几千条记录传来传去)

 



zch 发表于:2012-02-24 15:21:00

抛砖引玉

 

点击下载此附件

高兴 发表于:2012-06-01 00:47:43

实现了楼主的部分想法。见附件。

点击下载此附件

菜鸟先飞 发表于:2012-07-26 19:22:17
高兴的巧,学习了一个追加,一个刷新搞定 学习了

dbaseIIIer 发表于:2012-08-11 18:05:09

我就建议用临时表了!

 

其实你可以在窗体里 不用 inner join 的。

 

你用 left join 就会效果很好的了,什么代码都不用写的!

 

窗体的记录源  设置 为  select 商品表.*, selectBase.selected from 商品表 left join selectBase on 商品表.productId = selectBase.productId

 

 

这个窗体,用户可以修改 商品表 的任何字段,同时

也可以 勾选 那个 selected 字段,

 

最关键的是:你根本不用任何代码,不用为每个 商品建立 selectBase里的记录,用户一勾选,自动会添加 商品表 的记录的了!

 

因为是临时表,用户断开连接就自动删除了,非常的方便的!

 

可以参考我这里 http://www.accessoft.com/article-show.asp?id=7297 面的 个附件



总记录:11篇  页次:1/1 9 1 :