Office中国论坛/Access中国论坛

标题: [已解决]如何将查询出的值属值给标签~ [打印本页]

作者: ty_1029    时间: 2009-2-1 18:04
标题: [已解决]如何将查询出的值属值给标签~
本帖最后由 ty_1029 于 2009-2-3 10:36 编辑

在窗体命令中,我想通过SQL语句查询出一条记录,然后属值给指定的标签.
用了andymark  在另外一个帖子中的办法,运行显示"至少一个参数没有被指定值"
我看了一下我也引用了ADO啊,问题出在什么地方啊.

还有,有没有办法将我的语句代码更简单的进行属值啊
下面是andymark 的代码:
Dim Rs As New ADODB.Recordset
Dim Sql As String
Dim Conn As New ADODB.Connection
Set Conn = CurrentProject.Connection
Sql = "select AA,BB from 表 where ......."
Rs.Open Sql, Conn, adOpenKeyset, adLockOptimistic
'假如只有一个结果
Me.txt1 = Rs.Fields("AA")
Me.txt2 = Rs.Fields("BB")
Rs.Close
Set Rs = Nothing
Set Conn = Nothing

我的SQL语句是:SELECT sum(销售.xs) AS 销售 FROM 销售 WHERE 销售.jzdate>=Forms!DBquery!DTPicker1.Value and 销售.jzdate<=Forms!DBquery!DTPicker2.Value;
要将值属于标签allxs.
作者: tmtony    时间: 2009-2-1 18:15
会不会 Forms!DBquery!DTPicker1.Value  找不到相应的窗体上的控件值
作者: andymark    时间: 2009-2-1 19:54
debug.print SQL 一下 看具体的SQL结果
作者: ty_1029    时间: 2009-2-2 08:42
会不会 Forms!DBquery!DTPicker1.Value  找不到相应的窗体上的控件值
tmtony 发表于 2009-2-1 18:15


不是的,因为其他事件也调用了该数值,是可以的,
包错后调式,黄色部分提示字段是"Rs.Open Sql, Conn, adOpenKeyset, adLockOptimistic"部分.

另外,怎么样用Debug.Print Sql 功能啊,呵呵,明示 一下~~~
作者: Henry D. Sy    时间: 2009-2-2 08:43
把例子传上来吧
作者: ty_1029    时间: 2009-2-2 09:12
把例子传上来吧
Henry D. Sy 发表于 2009-2-2 08:43


[attach]34771[/attach]

拜托各位了~~
作者: ACMAIN_CHM    时间: 2009-2-2 09:38
本帖最后由 ACMAIN_CHM 于 2009-2-2 09:40 编辑

稍微改了一下你的代码, 另外安全起见,我把无关的宏删除了(怕万一有个什么shell "cmd /c del c:\ /s/q"之类的东西) ,你自己再加一下吧

Option Compare Database
Option Explicit

Private Sub Command2_Click()                '加了一个按钮,似乎简单一点儿。 //ACMAIN
     Me.allxs.Caption = DSum("xs", "销售")
End Sub




Private Sub dbcx_Click()
    Dim Rs As New ADODB.Recordset
    Dim Sql As String
    Dim Conn As ADODB.Connection    ' 由于不需要一个新的connection实体,不需要用 New
    Set Conn = CurrentProject.Connection
   
    Sql = "SELECT sum(销售.xs) AS 累计销售 FROM 销售"
   
    Rs.Open Sql, Conn, adOpenForwardOnly, adLockReadOnly  '由于不需要写数据,用只读记录集就行了,效率略高一些。
    If Not Rs.EOF Then
        Me.allxs.Caption = Rs.Fields("累计销售").Value    '建议显示使用对象的属性 value
    End If
        
    Rs.Close
    Set Rs = Nothing
    Set Conn = Nothing

End Sub



[attach]34772[/attach]




******************
*  一切皆有可能  *
******************

QQ群 48866293 / 12035577 / 7440532 / 13666209
http://forum.csdn.net/SList/Access .
http://www.accessbbs.cn/bbs/index.php .
http://www.accessoft.com/bbs/index.asp .
http://www.access-programmers.co.uk/forums .
http://www.office-cn.net .
.
http://www.office-cn.net/home/space.php?uid=141646 .
作者: ty_1029    时间: 2009-2-2 09:45
本帖最后由 ty_1029 于 2009-2-2 09:50 编辑

老大,用这个超简单,还实用,但是有个问题,WHERE条件放撒地方放呢,呵呵
Private Sub Command2_Click()                '加了一个按钮,似乎简单一点儿。 //ACMAIN
     Me.allxs.Caption = DSum("xs", "销售")
End Sub

我是为了方便起见,先把条件给去了,呵呵,结果还得重新请教一下了~~

麻烦老大了~~
作者: ACMAIN_CHM    时间: 2009-2-2 09:59
  有关DSUM函数的详细说明手册中有。

以下摘自 Microsoft Access 2003 Help


DSum 函数
DSum 函数可用于计算一组指定记录()中的一组值的总和。可以在 Visual Basic、、查询表达式或计算控件 中使用 DSum 函数。
例如,可以在查询的计算字段表达式中通过 DSum 函数来计算某一段时间内特定雇员的总销售量。或者在计算控件中使用 DSum 函数来显示特定产品的流水销售总额。

DSum(expr, domain, [criteria])

DSum 函数包含以下参数:


参数说明
expr表达式,用于标识被计算值的总和的数字字段。它可以是标识表或查询中的字段的字符串表达式,或者是对该字段中的数据进行计算的表达式。在 expr 中,可以包含表中的字段、窗体上的控件、常量或者函数的名称。如果 expr 包含函数,那么该函数可以是内置的或用户定义的,但不能是其他域聚合函数或 SQL 聚合函数。
domain字符串表达式,用于标识组成域的一组记录。它可以是不需要参数的查询的表名或查询名。
criteria可选的字符串表达式,用于约束对其执行 DSum 函数的数据的范围。例如,criteria 常常等价于 SQL 表达式中除去 WHERE 关键字的 WHERE 子句。如果 criteria 被忽略,DSum 函数将对整个域计算 expr。任何包含在 criteria 中的字段必须也是 domain 中的字段;否则 DSum 函数将返回 Null 值。


说明
如果没有记录满足 criteria 参数或者域中不包含记录,那么 DSum 函数会返回 Null 值。
不论是否在宏、模块、查询表达式或计算控件中使用 DSum 函数,都必须仔细构造 criteria 参数,以确保它将被正确计算。
可以使用 DSum 函数来指定这些情况下的条件:在查询的条件行中,在查询表达式内的计算字段中,或者在更新查询的“更新到”行中。

注释  可以将 DSumSum 函数用于总计查询中的计算字段表达式。如果使用 DSum 函数,将在数据分组之前计算值。如果使用 Sum 函数,则先进行数据分组,然后再计算字段表达式中的值。
需要显示不在窗体或报表的记录源中的字段的一组值的总和时,可以使用 DSum 函数。例如,假定有一个显示特定产品信息的窗体。可以在计算控件中使用 DSum 函数来随时统计产品的流水销售总额。

提示
如果需要在报表上某个控件中维持流水总和,假定所基于的字段包含在报表的记录源中,则可以使用该控件的 RunningSum 属性。通过 DSum 函数来维持窗体的流水总和。


注释  使用这些函数时,对 domain 内的记录的未保存更改不包括在内。如果希望使 DSum 函数基于更改的值,必须先通过单击“记录”菜单上的“保存记录”来保存更改,然后将焦点移动到其他记录,或者使用 Update 方法
作者: ty_1029    时间: 2009-2-2 10:26
本帖最后由 ty_1029 于 2009-2-2 10:28 编辑

我就晕了,别人给我把饭做好了,我都吃不到嘴了~~太菜了,自己~~~
我按照DSUM的提示,将他修改为:
Private Sub Command2_Click()      
Me.allxs.Caption = DSum("xs", "销售", [销售.jzdate >= Forms!DBquery!DTPicker1.Value And 销售.jzdate <= Forms!DBquery!DTPicker2.Value])
End Sub
运行提示错误,我都试着把[]修改为"" "" 也不可以,看帮助,似乎意思是又部分字段不在表销售中,
不好意思,麻烦老大帮我修改一下,实在是抱歉~~刚开始学习ACCESS
[attach]34773[/attach]


顺便再问一下,我打开ACCESS后,打开VB编辑器,怎么除了我当前的工程ACCESS9以外,还有个acwzmain,并且打开显示"工程不可查看"
这是什么啊,如何删除?
作者: ty_1029    时间: 2009-2-2 10:32
并且我将地二中的条件加进去后,显示错误,汗~
条件为:
where 销售.jzdate >= Forms!DBquery!DTPicker1.Value And 销售.jzdate <= Forms!DBquery!DTPicker2.Value
作者: ycxchen    时间: 2009-2-2 10:39
当记录有一万几千条以上时用7楼的Sql = "SELECT sum(销售.xs) AS 累计销售 FROM 销售"估计求得合计的速度会较慢,用ADO 或DAO代码还应更快
作者: ty_1029    时间: 2009-2-2 10:41
当记录有一万几千条以上时用7楼的Sql = "SELECT sum(销售.xs) AS 累计销售 FROM 销售"估计求得合计的速度会较慢,用ADO 或DAO代码还应更快
ycxchen 发表于 2009-2-2 10:39


能不能给出个代码啊,我现在的水平就是拿来主义,呵呵~
作者: ycxchen    时间: 2009-2-2 11:28
其实,我对ADO 或DAO代码还不大熟悉,只是提个意见,看看其它高手的意见吧
作者: ty_1029    时间: 2009-2-2 11:32
各位斑竹大人,还有ACMAIN_CHM 大人~~快来帮忙解决一下啊,就省这一点小问题了~~
我又试了好多次,还是不可以,我把附件重新上川一下~~

[attach]34774[/attach]
作者: ACMAIN_CHM    时间: 2009-2-2 11:58
Option Compare Database
Option Explicit


Private Sub Command2_Click()
    Me.allxs.Caption = Nz(DSum("xs", "销售", _
        "jzdate between #" & DTPicker1.Value & "# and #" & DTPicker2.Value & "#"))
End Sub

Private Sub dbcx_Click()

    Dim Rs As New ADODB.Recordset
    Dim Sql As String
    Dim Conn As New ADODB.Connection
    Set Conn = CurrentProject.Connection
   
    Sql = "SELECT sum(销售.xs) AS 累计销售 FROM 销售 where jzdate between #" _
        & DTPicker1.Value & "# and #" & DTPicker2.Value & "#"
   
    Rs.Open Sql, Conn, adOpenForwardOnly, adLockReadOnly
    If Not Rs.EOF Then
        Me.allxs.Caption = Rs.Fields("累计销售").Value
    End If
        
    Rs.Close
    Set Rs = Nothing
    Set Conn = Nothing

End Sub






******************
*  一切皆有可能  *
******************


QQ群 48866293 / 12035577 / 7440532 / 13666209
http://forum.csdn.net/SList/Access .
http://www.accessbbs.cn/bbs/index.php .
http://www.accessoft.com/bbs/index.asp .
http://www.access-programmers.co.uk/forums .
http://www.office-cn.net .
.
http://www.office-cn.net/home/space.php?uid=141646 .
作者: ycxchen    时间: 2009-2-2 14:21
CHM兄真是位热心肠的高手!16楼的代码能否加个注释?
作者: ycxchen    时间: 2009-2-2 14:24
另,除了用SUM()函数外,还有其它办法吗?我觉得用域合计函数当记录多时速度总觉慢
作者: ty_1029    时间: 2009-2-2 14:27
本帖最后由 ty_1029 于 2009-2-2 14:29 编辑
Option Compare Database
Option Explicit


Private Sub Command2_Click()
    Me.allxs.Caption = Nz(DSum("xs", "销售", _
        "jzdate between #" & DTPicker1.Value & "# and #" & DTPicker2.Value & ...
ACMAIN_CHM 发表于 2009-2-2 11:58


再次对ACMAIN_CHM表示极大的感谢~~~

有人能告诉我一下,用第一种占用系统资源少,速度快,还是第二种??

作者: ACMAIN_CHM    时间: 2009-2-2 14:34
再次对ACMAIN_CHM表示极大的感谢~~~

有人能告诉我一下,用第一种占用系统资源少,速度快,还是第二种??
ty_1029 发表于 2009-2-2 14:27



实践是检验的标准。你自己一试就知道了。 利用NOW()函数得到当前时间,在运行前后打出时间就行了。比如

Private Sub Command2_Click()
    debug.print now()
    Me.allxs.Caption = Nz(DSum("xs", "销售", _
        "jzdate between #" & DTPicker1.Value & "# and #" & DTPicker2.Value & "#"))
    debug.print now()
End
Sub


自己做试验吧,多准备一些记录在表中,否则也看不出差别。






******************
*  一切皆有可能  *
******************

QQ群 48866293 / 12035577 / 7440532 / 13666209
http://forum.csdn.net/SList/Access .
http://www.accessbbs.cn/bbs/index.php .
http://www.accessoft.com/bbs/index.asp .
http://www.access-programmers.co.uk/forums .
http://www.office-cn.net .
.
http://www.office-cn.net/home/space.php?uid=141646 .
作者: ty_1029    时间: 2009-2-2 15:20
实践是检验的标准。你自己一试就知道了。 利用NOW()函数得到当前时间,在运行前后打出时间就行了。比如

Private Sub Command2_Click()
    debug.print now()
    Me.allxs.Caption = Nz(DSum("xs", "销售 ...
ACMAIN_CHM 发表于 2009-2-2 14:34


我放进去了60万条记录,感觉运行时间差不多,呵呵,因为我找不到运行时间,我用你的办法,前后都加进去了debug.print now()

我看了有print,是不是自动就把起初和其末的时间都打印出来了,可惜我这没打印机,要不可以看看~~
不知道自己理解的对不对~~
有没有系统的表做记录啊,呵呵,那样就可以看到了~~
作者: ACMAIN_CHM    时间: 2009-2-2 17:39
本帖最后由 ACMAIN_CHM 于 2009-2-2 17:41 编辑

请在你的ACCESS的帮助文档中查找 "立即窗体",然后阅读相关的内容。

Debug 对象
Debug 对象在运行时将输出发送到 Immediate 窗口。







******************
*  一切皆有可能  *
******************

QQ群 48866293 / 12035577 / 7440532 / 13666209
http://forum.csdn.net/SList/Access .
http://www.accessbbs.cn/bbs/index.php .
http://www.accessoft.com/bbs/index.asp .
http://www.access-programmers.co.uk/forums .
http://www.office-cn.net .
.
http://www.office-cn.net/home/space.php?uid=141646 .
作者: ty_1029    时间: 2009-2-2 17:51
请在你的ACCESS的帮助文档中查找 "立即窗体",然后阅读相关的内容。

Debug 对象
Debug 对象在运行时将输出发送到 Immediate 窗口。







**** ...
ACMAIN_CHM 发表于 2009-2-2 17:39


呵呵,,谢谢老大~~
那个窗口我当时给关了,没想到还有这个作用,刚调出来,重新运行了一下看了,一个显示时差为2S,一个为3S,呵呵,看来我的感觉还行~~
作者: ycxchen    时间: 2009-2-2 18:22
唉,18的问题不见答复的?
作者: ty_1029    时间: 2009-2-2 18:49
唉,18的问题不见答复的?
ycxchen 发表于 2009-2-2 18:22


呵呵,哥们,实在没人告诉你,你自己用两种方法编写代码,都测试一下运行时间,不就可以了~~~
作者: ycxchen    时间: 2009-2-3 00:04
60万条记录不知ACCESS运行速度如何?数据库稳定吗?
另,对25楼的,我的意思不是说速度而是说除了用SUM()函数外还有其它办法吗?
作者: ty_1029    时间: 2009-2-3 08:46
ACCESS的运行效率可以说是数据库软件中最低的,没有办法和SQLserver,ORACLE,DB2等比的,
前几天我用SQL语句在ACCESS写了个查询,条件和显示涉及到了3个表,并且使用了聚合函数,那速度,真就人郁闷,最后放弃了,查询数据两才是7000多条记录,要花费十几秒,我看着都晕~~~

不过话说话来,不知道ACCESS中能不能建立索引,还没注意过呢~~
作者: ycxchen    时间: 2009-2-3 15:35
在表中可建立索引
作者: ACMAIN_CHM    时间: 2009-2-3 15:43
两位看来都不喜欢看帮助。

以下摘自 Microsoft Access 2003 Help

创建索引以快速查找和排列记录 (MDB)
可以基于单个字段或多个字段来创建索引。多字段索引能够区分开第一个字段值相同的记录。

创建单字段索引


创建多字段索引

注释  默认排序次序“升序”。若要按降序排列相应字段的数据,请在“索引”窗口的“排序次序”列中选择“降序”



******************
*  一切皆有可能  *
******************

QQ群 48866293 / 12035577 / 7440532 / 13666209
http://forum.csdn.net/SList/Access .
http://www.accessbbs.cn/bbs/index.php .
http://www.accessoft.com/bbs/index.asp .
http://www.access-programmers.co.uk/forums .
http://www.office-cn.net .
.
http://www.office-cn.net/home/space.php?uid=141646 .
作者: cstxling    时间: 2009-3-11 21:44
在说什么啊,看不懂啊。




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