Access交流中心

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

求超长更新查询的VB代码

流浪的木头  发表于:2011-09-19 22:30:21  
复制

更新查询,超长,含"*"通配符,需要把这个SQL写到某窗体控件的更新后事件里去,完整的代码如何写?

 

不要说代码格式什么的

 

sql=“字符串”
sql=sql+“字符串”
docmd.runsql sql

 

这个我知道,但具体就是不行,可能细节不对,谁能根据下面的SQL给出一段完整的代码,谢谢!

 

 

 

UPDATE 出库记录 SET 出库记录.选中 = -1

WHERE (((出库记录.出库订单号码) Like "*" & [订单号码1] & "*" Or (出库记录.出库订单号码) Is Null) AND ((出库记录.出库日期)>=[起始日期] And (出库记录.出库日期)<=[截止日期]) AND ((出库记录.收货人) Like "*" & [收货人1] & "*" Or (出库记录.收货人) Is Null) AND ((出库记录.省份) Like "*" & [省份1] & "*" Or (出库记录.省份) Is Null) AND ((出库记录.城市) Like "*" & [城市1] & "*" Or (出库记录.城市) Is Null) AND ((出库记录.区县) Like "*" & [区县1] & "*" Or (出库记录.区县) Is Null)) OR (((出库记录.出库订单号码) Like "*" & [订单号码1] & "*" Or (出库记录.出库订单号码) Is Null) AND ((出库记录.出库日期)>=[起始日期]) AND ((出库记录.收货人) Like "*" & [收货人1] & "*" Or (出库记录.收货人) Is Null) AND ((出库记录.省份) Like "*" & [省份1] & "*" Or (出库记录.省份) Is Null) AND ((出库记录.城市) Like "*" & [城市1] & "*" Or (出库记录.城市) Is Null) AND ((出库记录.区县) Like "*" & [区县1] & "*" Or (出库记录.区县) Is Null) AND (([截止日期]) Is Null)) OR (((出库记录.出库订单号码) Like "*" & [订单号码1] & "*" Or (出库记录.出库订单号码) Is Null) AND ((出库记录.出库日期)<=[截止日期]) AND ((出库记录.收货人) Like "*" & [收货人1] & "*" Or (出库记录.收货人) Is Null) AND ((出库记录.省份) Like "*" & [省份1] & "*" Or (出库记录.省份) Is Null) AND ((出库记录.城市) Like "*" & [城市1] & "*" Or (出库记录.城市) Is Null) AND ((出库记录.区县) Like "*" & [区县1] & "*" Or (出库记录.区县) Is Null) AND (([起始日期]) Is Null)) OR (((出库记录.出库订单号码) Like "*" & [订单号码1] & "*" Or (出库记录.出库订单号码) Is Null) AND ((出库记录.收货人) Like "*" & [收货人1] & "*" Or (出库记录.收货人) Is Null) AND ((出库记录.省份) Like "*" & [省份1] & "*" Or (出库记录.省份) Is Null) AND ((出库记录.城市) Like "*" & [城市1] & "*" Or (出库记录.城市) Is Null) AND ((出库记录.区县) Like "*" & [区县1] & "*" Or (出库记录.区县) Is Null) AND (([截止日期]) Is Null) AND (([起始日期]) Is Null));

 

Top
dbaseIIIer 发表于:2011-09-19 23:09:44

兄弟, 你的手法会让自己晕倒的!

 

既然你是用VBA编的, 你应该简短一下!

 

SQL=""

IF isnull( me!订单号码1, "*")<>"*" Then SQL=SQL & " and [出库记录.出库订单号码]='" & me!订单号码1 & "'"

IF isdate( me!起始日期 Then SQL=SQL & " and [出库记录.出库日期]>=#" & Format(me!起始日期,"yyyy-mm-dd") & "#"

IF isdate( me!截止日期 Then SQL=SQL & " and [出库记录.出库日期]<=#" & Format(me!截止日期,"yyyy-mm-dd") & "#"

IF isnull( me!收货人1, "*")<>"*" Then SQL=SQL & " and [出库记录.收货人]='" & me!收货人1 & "'"

..

..

SQL=mid( SQL, 6) '去掉前面的 '_and_'

docmd.RunSQL SQL

 

这样, 的代码的可读性,检测,除错 都会提高数百倍!



流浪的木头 发表于:2011-09-20 09:06:53
我没专门学过VB,楼上的帮人帮到底,能帮我把完整的代码弄出来吗?先解决问题,然后我慢慢琢磨,谢谢。

都市侠影 发表于:2011-09-20 10:19:23

史上最长的SQL语句,电脑都会得哮喘的。



chinasa 发表于:2011-09-20 12:28:39

其实你根本就不需要这么复杂,试一下这个语句看看,如果出错的话就调整一下最后一段。

 

UPDATE 出库记录 SET 出库记录.选中 = -1
WHERE ((([出库记录].[出库订单号码]) Like "*" & [订单号码1] & "*" Or ([出库记录].[出库订单号码]) Is Null) AND (([出库记录].[收货人]) Like "*" & [收货人1] & "*" Or ([出库记录].[收货人]) Is Null) AND (([出库记录].[省份]) Like "*" & [省份1] & "*" Or ([出库记录].[省份]) Is Null) AND (([出库记录].[城市]) Like "*" & [城市1] & "*" Or ([出库记录].[城市]) Is Null) AND (([出库记录].[区县]) Like "*" & [区县1] & "*" Or ([出库记录].[区县]) Is Null) AND (([出库记录].[出库日期])>=IIf(IsNull([起始日期]),#1/1/1900#,[起始日期]) And ([出库记录].[出库日期])<=IIf(IsNull([截止日期]),#1/1/2999#,[截止日期])));



流浪的木头 发表于:2011-09-20 14:55:38
这段SQL是精简很多,能帮忙在这个基础上转化为VB代码吗?

流浪的木头 发表于:2011-09-20 14:57:57

下面是我写的,报错,“类型不匹配”,,错在哪里?帮忙指正一下

 

 

Dim sql As String

sql = "UPDATE 出库记录 SET 出库记录.选中 = -1 "
sql = sql + "WHERE ((([出库记录].[出库订单号码]) Like " * " & [订单号码1] & " * " Or ([出库记录].[出库订单号码]) Is Null)"
sql = sql + "AND (([出库记录].[收货人]) Like " * " & [收货人1] & " * " Or ([出库记录].[收货人]) Is Null) AND (([出库记录].[省份]) Like " * " & [省份1] & " * " Or "
sql = sql + "([出库记录].[省份]) Is Null) AND (([出库记录].[城市]) Like " * " & [城市1] & " * " Or ([出库记录].[城市]) Is Null) AND (([出库记录].[区县]) Like " * " & "
sql = sql + "[区县1] & " * " Or ([出库记录].[区县]) Is Null) AND (([出库记录].[出库日期])>=IIf(IsNull([起始日期]),#1/1/1900#,[起始日期]) And ([出库记录].[出库日期])<=IIf(IsNull([截止日期]),#1/1/2999#,[截止日期])));"""
DoCmd.RunSQL sql



羽扇子君 发表于:2011-09-20 15:20:22

告诉你原因吧:

你的WHERE语句(字符串)中如果还有引号,那么需要把双引号变成单引号。即:"-→'    示例如下:

sql = sql + "WHERE ((([出库记录].[出库订单号码]) Like ' * '" & [订单号码1] & "' * ' Or ([出库记录].[出库订单号码]) Is Null)"



流浪的木头 发表于:2011-09-20 15:34:00

按您的指点把SQL原有的双引都换成了单引,还是报错(提示为“字符串的语法错误”),是否通配符*有问题?

 

 

 

 

Dim sql As String

sql = "UPDATE 出库记录 SET 出库记录.选中 = -1 "
sql = sql + "WHERE ((([出库记录].[出库订单号码]) Like ' * ' & [订单号码1] & ' * ' Or ([出库记录].[出库订单号码]) Is Null)"
sql = sql + "AND (([出库记录].[收货人]) Like ' * ' & [收货人1] & ' * ' Or ([出库记录].[收货人]) Is Null) AND (([出库记录].[省份]) Like ' * ' & [省份1] & ' * ' Or '"
sql = sql + "([出库记录].[省份]) Is Null) AND (([出库记录].[城市]) Like ' * ' & [城市1] & ' * ' Or ([出库记录].[城市]) Is Null) AND (([出库记录].[区县]) Like ' * ' & "
sql = sql + "[区县1] & ' * ' Or ([出库记录].[区县]) Is Null) AND (([出库记录].[出库日期])>=IIf(IsNull([起始日期]),#1/1/1900#,[起始日期]) And ([出库记录].[出库日期])<=IIf(IsNull([截止日期]),#1/1/2999#,[截止日期])));"

DoCmd.RunSQL sql



煮江品茶 发表于:2011-09-20 16:24:24

以上所论皆非根本。此处理属于操作思路不清,应该是大致筛选一个范围后,直接勾选即可,不必如此劳神费力。



chinasa 发表于:2011-09-20 16:57:49
你先建一个查询,把日期为空的都处理一下(比如起始日期为1900年,终止日期是2999年),这样你在查询的时候就不用去用那么多语句来判断日期为空的问题了,直接使用BETWEEN AND就可以了。

流浪的木头 发表于:2011-09-20 23:48:03

对楼上的作一回答

 

煮江品茶

???以上所论皆非根本。此处理属于操作思路不清,应该是大致筛选一个范围后,直接勾选即可,不必如此劳神费力。

===因为考虑到筛选结果记录的行数量可能会比较大,所以需要具备全选/全反选的功能.单条记录的点选功能已经有了.

 

chinasa

???日期为空是因为窗体上有两个控件,起始日期和截止日期,实际业务查询操作的时候,可能都填,也可能只填其中一个,所以,空的问题无法避免.

 

虽然问题还没有最后解决,还是很感谢大家的支持!

 



dbaseIIIer 发表于:2011-09-21 02:21:08

MSDN 在 1997年 SQL Server 3.0 内都有说过, 千万不要使用 Like '*' 的查询语句!

原因是多耗用 3倍以上数据库资源!

 

你们每个字段都那样编,根本就非环保派! 或者根本就不要求自己成为编程的领导!

 

我们多写几句前台执行语句, 后台就运作轻松多了! 别忘记编程员的本质啊! 

 

我建议木头哥哥用ACCESS 1.0 开始有的自带功能 叫 QBE Query By Example,

即每个Access版本中的 "按窗体筛选" 按钮,

或 建一个按钮 给它一句 DoCmd.RunCommand acCmdFilterByForm

 

你窗体内任何一个有绑定数据源的控件都可以用来筛选了!

 

加个按钮 你可以把已筛选出来可见的数据上更新记录:

Docmd.RunSQL "Update 出库记录 SET 出库记录.选中 = -1 where " & me.filter



dbaseIIIer 发表于:2011-09-21 03:09:01


dbaseIIIer 发表于:2011-09-21 03:18:16

正规编程员代码

 

Dim s as String

s=""

If Not IsNull( Me!订单号码1) Then s=s & " AND [出库订单号码] Like '*" & Me!订单号码1 & "*'"

If Not IsNull( Me!起始日期) Then s=s & " AND [出库日期] >= #" & Format( Me!起始日期,"yyyy-mm-dd") & "#"

If Not IsNull( Me!截止日期) Then s=s & " AND [出库日期] <= #" & Format( Me!截止日期,"yyyy-mm-dd") & "#"

If Not IsNull( Me!收货人1) Then s=s & " AND [收货人] Like '*" & Me!收货人1 & "*'"

If Not IsNull( Me!省份1) Then s=s & " AND [省份] Like '*" & Me!省份1 & "*'"

If Not IsNull( Me!城市1) Then s=s & " AND [城市] Like '*" & Me!城市1 & "*'"

If Not IsNull( Me!区县1) Then s=s & " AND [区县] Like '*" & Me!区县1 & "*'"

If s <> "" Then

    docmd.runSQL "Update 出库记录 set 选中=True WHERE " & mid(s,6)

Endif

 

以上的 Me! 可以省略的, 但为了代码可读性, 建议加上, 以避免混肴视听是变量或是数据集内容



dbaseIIIer 发表于:2011-09-21 03:21:43

哦, 差了一些 is null

 

Dim s as String

s=""

If Not IsNull( Me!订单号码1) Then s=s & " AND ([出库订单号码] Like '*" & Me!订单号码1 & "*' or [出库订单号码] is null)"

If Not IsNull( Me!起始日期) Then s=s & " AND [出库日期] >= #" & Format( Me!起始日期,"yyyy-mm-dd") & "#"

If Not IsNull( Me!截止日期) Then s=s & " AND [出库日期] <= #" & Format( Me!截止日期,"yyyy-mm-dd") & "#"

If Not IsNull( Me!收货人1) Then s=s & " AND ([收货人] Like '*" & Me!收货人1 & "*' or [收货人] is null)"

If Not IsNull( Me!省份1) Then s=s & " AND ([省份] Like '*" & Me!省份1 & "*' or [省份] is null)"

If Not IsNull( Me!城市1) Then s=s & " AND ([城市] Like '*" & Me!城市1 & "*' or [城市] is null)"

If Not IsNull( Me!区县1) Then s=s & " AND ([区县] Like '*" & Me!区县1 & "*' or [区县] is null)"

If s <> "" Then

    docmd.runSQL "Update 出库记录 set 选中=True WHERE " & mid(s,6)

Endif



煮江品茶 发表于:2011-09-22 15:27:53

既然有筛选,那就更简单了,如此便罢:

 

ssql="UPDATE 出库记录 SET 出库记录.选中 = -1 "

ssql=ssql & " WHERE  " & me.子窗体名称.form.filter

Currentdb.Execute ssql



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