Access交流中心

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

数据查询问题

初学者  发表于:2018-11-23 16:07:19  
复制

 

我希望在Access中实现以下查询功能:

在采购明细表中,查出近期连续5次,单笔采购数量大于500台的商品目录明细。望老师指导,谢谢!!!

采购明细表的字段有:商品名称,采购时间,采购数量,采购价格

 

Top
qq1985178585 发表于:2018-11-25 21:34:14

select top 5  商品名称,采购时间,采购数量,采购价格 from 采购明细表 where 采购数量>500 order by 采购时间  desc      

查的采购数量》500的最近5次采购  。是不是你说的连续,怎么连续就不知道了



天马行空 发表于:2018-11-26 06:31:10

'自定义函数

function TrueOrFalse(次数 as integer,商品名称 as string) as Boolean

dim i as integer

dim lasttime as datetime

lasttime=date()+1

TrueOrFalse=true

for i = 1 to 次数

    lasttime=dmax("采购时间","采购明细表","商品名称=‘“&商品名称&"' and 采购时间<#"&lasttime&“#”)

    if (dlookup("采购数量","采购明细表","商品名称=‘“&商品名称&"' and 采购时间=#"&lasttime&“#”))<=500 then

        TrueOrFalse =false

        exit function

    end if

next

end function


'查询

select * from 采购明细表 where TrueOrFalse(5,商品名称)=true



初学者 发表于:2018-11-27 10:28:59

谢谢天马行空的指点。我通过DoCmd.RunSQL “select * from 采购明细表 where TrueOrFalse(5,商品名称)=true;"运行出错,请问如何解决?

另外,如果希望获得采购价格连续大于50元的商品目录,是否将函数中的“采购数量”替换为“采购价格”,将“500”替换为“50”即可?



Natsume Takashi 发表于:2018-11-27 13:45:45

我通过DoCmd.RunSQL “select * from 采购明细表 where TrueOrFalse(5,商品名称)=true;"运行出错,请问如何解决?

【Access查询扫盲知识】RunSQL不能与Select共用[Access软件网] http://www.accessoft.com/article-show.asp?id=11424



天马行空 发表于:2018-11-27 15:11:16

‘上次纯手码的,没经过测试,改一下函数,仅取符合条件商品的开始日期,避免重复运行

点击下载此附件

Function StartDate(次数 As Integer, 商品名称 As String) As Date

Dim i As Integer
StartDate = Date + 1
For i = 1 To 次数
    StartDate = DMax("采购时间", "采购明细表", "商品名称='" & 商品名称 & "' and 采购时间<#" & StartDate & "#")
    If (DLookup("采购数量", "采购明细表", "商品名称='" & 商品名称 & "' and 采购时间=#" & StartDate & "#")) < 500 Then
        StartDate = Date  '不够5次不显示
        Exit Function
    End If
    If StartDate = DMin("采购时间", "采购明细表", "商品名称='" & 商品名称 & "'") Then
        Exit Function
    End If
Next

End Function

’查询符合条件的商品以及开始日期

SELECT 采购明细表.商品名称, StartDate(5,[商品名称]) AS 开始日期
FROM 采购明细表
GROUP BY 采购明细表.商品名称, StartDate(5,[商品名称])



西出阳关无故人 发表于:2018-11-27 18:02:29

用临时表+查询的方式:

Private Sub Command0_Click()
    Dim rst As Recordset, i
    Set rst = CurrentDb.OpenRecordset("select 商品名称 from 采购明细表 group by 商品名称")
    For i = 1 To rst.RecordCount
        CurrentDb.Execute "insert into 条件 (商品名称,采购时间,采购数量,采购单价) select top 5 商品名称,采购时间,采购数量,采购单价 from 采购明细表 where  商品名称='" & rst.Fields(0) & "' ORDER BY 采购时间 DESC"
        rst.MoveNext
    Next i
   End Sub
运行上面过程,获得每种商品的最近5次采购数据,追加到临时表“条件”,然后创建以下语法的查询,并运行:

SELECT 条件.商品名称, 条件.采购时间, 条件.采购数量, 条件.采购单价
FROM 条件
GROUP BY 条件.商品名称, 条件.采购时间, 条件.采购数量, 条件.采购单价
HAVING (((DCount("ID","条件","商品名称='" & [商品名称] & "' AND 采购数量>=500"))>4));




初学者 发表于:2018-11-28 11:50:04
天马行空老师:我下载了附件试用了一下,发现查询1中a的开始日期为“2018-11-28“,而表中没有这一日期,望能再看看。谢谢!

天马行空 发表于:2018-11-28 19:59:36
因为a不符合近期连续5次采购数量大于500,开始日期大于当天相当于不显示a的记录

初学者 发表于:2018-11-29 09:10:12
明白了。再请教一下,如果希望通过窗体输入连续的次数(如:5、7、10次等)来增加灵活性,不用每次去修该次数,应如何实现?谢谢!!

初学者 发表于:2018-12-28 14:43:35
SELECT 条件.商品名称, 条件.采购时间, 条件.采购数量, 条件.采购单价
FROM 条件
GROUP BY 条件.商品名称, 条件.采购时间, 条件.采购数量, 条件.采购单价

HAVING (((DCount("ID","条件","商品名称='" & [商品名称] & "' AND 采购数量>=500"))>4));

以上通过创建查询,运行正常,但修改为;

sll="SELECT 条件.商品名称, 条件.采购时间, 条件.采购数量, 条件.采购单价" _
      & "FROM 条件" _
      & "GROUP BY 条件.商品名称, 条件.采购时间, 条件.采购数量, 条件.采购单价" _
      & "HAVING (((DCount('ID','条件','商品名称='" & [商品名称] & "' AND 采购数量>=500'))>4));"

DoCmd.RunSQL sll

提示错误“2465” 不能找到表达式中引用的字段。

如不加商品名称内容,不提示错误。望各位老师指导解决。谢谢!!



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