Office中国论坛/Access中国论坛

标题: 【求助】请教要如何优化代码:数据表窗体输入产品后 单价自动填充客户最近购买价格 [打印本页]

作者: 5574916    时间: 2013-2-22 11:45
标题: 【求助】请教要如何优化代码:数据表窗体输入产品后 单价自动填充客户最近购买价格
本帖最后由 5574916 于 2013-2-24 15:48 编辑

[attach]51315[/attach]

这个是已经实现效果后的例子,就是如果数据多的话,输入后会有停顿现象,不知道要怎样写代码才能解决这个问题,麻烦哪位大侠有空的话帮忙修改下代码!谢谢!


[attach]51305[/attach]

内有表:[产品表]  [订单]  [订单明细]  [客户表]
查询: [历史价格查询]

【现已实现功能】 例如:新建一张单,主窗体 输入客户名称 小A 》 子窗体 输入产品1 》 单价会从[历史价格查询]中 根据(产品名称=" & "'" & Me.产品名称 & "' And 客户名称=" & "'" & Forms![主窗体]![客户名称] & "'")  自动填充。


【意图】需要再 已有的 客户名称条件,产品名称条件 基础上 再增添一个条件:筛选出订单ID最大的 那条单价记录,并且筛选出来的单价记录不为0

------------------【需要实现的最终效果】 示例:------------------
1、新建一张单
2、主窗体中 客户名称 输入  小A
3、子窗体中 产品名称 输入 产品1
单价 自动填充  111 即为正确
-----------------------------------------------------------------------------

找了很多资料都不知道该如何实现, 源文件已经上传,不知道我这样表述,大家能否明白,可否帮忙修改下代码呢?先谢谢各位了!{:soso_e154:}  

[attach]51306[/attach]


Private Sub 产品名称_AfterUpdate()
Dim StrTemp As String
Dim rs As New ADODB.Recordset
StrTemp = "Select * From 历史价格查询 Where 产品名称=" & "'" & Me.产品名称 & "' And 客户名称=" & "'" & Forms![主窗体]![客户名称] & "'"
rs.Open StrTemp, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
If rs.EOF = False Then
Me.单价 = rs("单价")
End If
End Sub


作者: 5574916    时间: 2013-2-22 11:52
另外要如何实现,当自动填充单价后,如果 填充的单价 不等于 产品表中的单价 就更改当前单价字体颜色为 红色 呢
作者: roych    时间: 2013-2-22 13:39
本帖最后由 roych 于 2013-2-22 14:41 编辑

用DLast试试看(应该不是DMax吧?)或者MoveLast,读取recordset的单价字段,再传给变量。
你的意图我看得不是很懂,所以就不改代码了。
作者: 5574916    时间: 2013-2-22 17:08
本帖最后由 5574916 于 2013-2-22 21:47 编辑
roych 发表于 2013-2-22 13:39
用DLast试试看(应该不是DMax吧?)或者MoveLast,读取recordset的单价字段,再传给变量。
你的意图我看得 ...

谢谢版主的回复,我重新整理了下我想实现的意图:

【意图】需要再 已有的 客户名称条件,产品名称条件 基础上 再增添一个条件:筛选出订单ID最大的 那条单价记录,并且筛选出来的单价记录不为0

【需要实现的最终效果】 示例:
1、新建一张单
2、主窗体中 客户名称 输入  小A
3、子窗体中 产品名称 输入 产品1
单价 自动填充  111 即为正确

不知道我这样表述,大家能否明白,请教用DLast要如何实现这个功能呢?可否帮忙修改下代码呢?谢谢
[/table]
[tr][/tr]
[table]


作者: 5574916    时间: 2013-2-22 23:01
本帖最后由 5574916 于 2013-2-23 11:48 编辑
roych 发表于 2013-2-22 13:39
用DLast试试看(应该不是DMax吧?)或者MoveLast,读取recordset的单价字段,再传给变量。
你的意图我看得 ...

问题解决了,我在
rs.Open StrTemp, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
If rs.EOF = False Then
的下一行加上 rs.movelast 就得出订单最大的那条记录了。
价格不为零的问题, 直接在查询表中 设置 条件不为0 就可以了。

大家如果有更好的方法还请多多指教 {:soso_e176:}[/table]
[table]


作者: 5574916    时间: 2013-2-23 11:36
本帖最后由 5574916 于 2013-2-23 11:46 编辑
5574916 发表于 2013-2-22 23:01
问题解决了,我在
rs.Open StrTemp, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
If r ...

{:soso_e159:}用这种方法虽然可以实现我要的效果,但是输入后有时候会出现卡顿的现象。有大侠知道有什么更好的方法,或是要怎么优化呢!?

作者: 5574916    时间: 2013-2-23 11:52
roych 发表于 2013-2-22 13:39
用DLast试试看(应该不是DMax吧?)或者MoveLast,读取recordset的单价字段,再传给变量。
你的意图我看得 ...

我用 MoveLast 这种方法虽然可以实现我要的效果,但是输入后有时候会出现卡顿的现象(数据多时)。请教大侠知道可以用什么方法优化呢?
作者: roych    时间: 2013-2-23 14:36
创建另一个记录集,MoveLast后读取完相关信息,传递好变量后即关闭。
作者: 5574916    时间: 2013-2-24 00:14
roych 发表于 2013-2-23 14:36
创建另一个记录集,MoveLast后读取完相关信息,传递好变量后即关闭。

具体代码要怎么写呢,我对access还不太了解,可否麻烦版主有空的时候帮忙修改下呢?
这个是已经实现效果后的例子,只差优化速度了{:soso_e154:}  [attach]51314[/attach]


作者: roych    时间: 2013-2-25 13:39
5574916 发表于 2013-2-24 00:14
具体代码要怎么写呢,我对access还不太了解,可否麻烦版主有空的时候帮忙修改下呢?
这个是已经实现效果 ...

速度上并不见得很糟糕啊。这是修改后的代码,供参考:
  1. Private Sub 产品名称_AfterUpdate()
  2. Dim StrTemp As String
  3. Dim rs As New ADODB.Recordset
  4. Dim LngPrice As Long
  5. StrTemp = "Select Last([单价])  From 历史价格查询 Where 产品名称=" & "'" & Me.产品名称 & "' And 客户名称=" & "'" & Forms![主窗体]![客户名称] & "'"
  6. rs.Open StrTemp, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
  7. 'rs.MoveLast
  8. LngPrice = rs(0)
  9. If rs.EOF = False Then

  10. Me.单价 = LngPrice

  11. End If
  12. '这两行用于关闭记录集和清空内存,视具体情况处理。
  13. rs.Close
  14. Set rs = Nothing
  15. End Sub
复制代码

作者: 你是坏蛋    时间: 2013-2-25 19:45
记录集如果不需要修改,该用只读模式,应该会快一些吧。
作者: 5574916    时间: 2013-2-26 00:17
你是坏蛋 发表于 2013-2-25 19:45
记录集如果不需要修改,该用只读模式,应该会快一些吧。

记录集是不要修改的,只是获取数据,如果用只读模式,请问要如何修改代码呢?
作者: 5574916    时间: 2013-2-26 00:23
roych 发表于 2013-2-25 13:39
速度上并不见得很糟糕啊。这是修改后的代码,供参考:

谢谢斑竹的指点,我试试看效果怎么样!
作者: 高高    时间: 2013-3-21 22:17
楼主,如果是新客户的话,价格会出现错误,该怎么解决呢??




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3