Access交流中心

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

在Access中建立一个查询:字段含有的字符,距该字段最后出现间隔的行数

一牧歌  发表于:2017-07-28 10:06:56  
复制

在Access的查询中建立一个:字段含有的字符,距该字段最后出现过的间隔行数。

表一是数据,查询一是需要的结果。

例如“表一”:ID,2017193行,数值为02,第一位是0,第二位是2,02曾经在2017185数值中最后出现过,相距现在出现间隔7行,在2017193行的“整体间隔行数”列中显示数字7。第一位0曾经在2017192数值中最后出现过,相距现在出现间隔0行,在“第一位间隔行数”列中显示数字0。第二位2曾经在2017191数值中最后出现过,相距现在出现间隔1行,在“第二位间隔行数”列中显示数字1。

请大神们赐教。扣扣46080,谢谢。

用最简单的方法解决最复杂的问题是上上策!我曾经为了寻找文本类型与数字类型进行转换问题的解决方法,搜遍百度,都一些通过函数或VB语句等复杂的方法进行转换,最后我自己用了一个最简单的方法就全解决了,而且所占资源很小,方法是:文本=数字 & "";数字=文本*1,就OK。

我期希答案同样也是:用最简单的方法解决最复杂的问题。


 

Top
西出阳关无故人 发表于:2017-07-28 17:17:35

在模块中建立自定义函数:

Option Compare Database
Option Explicit
Public Function 间隔行数(ByVal tID As Long) As Long
    '返回值有一下2种情况

'-1:表示第一次出现

'0~N:表示间隔的行数.

 Dim rst As Recordset, Str As String, i As Long, tEnd As Boolean
    Set rst = CurrentDb.OpenRecordset("select * from 表1 where id<" & tID & " order by id desc")
    Str = DLookup("数值", "表1", "id=" & tID)
    tEnd = True
    For i = 1 To rst.RecordCount
        If rst!数值 = Str Then
            tEnd = False
            Exit For
        End If
        rst.MoveNext
    Next i
    If tEnd = True Then
        间隔行数 = -1
    Else
        间隔行数 = i - 1
    End If
End Function
查询SQL语法:

SELECT 表1.id, 表1.数值, 间隔行数([id]) AS 整体间隔行数 FROM 表1

至于第一位/第二位同样做自定义函数来解决



一牧歌 发表于:2017-07-31 10:16:39

非常感谢回复!本人纯属一个业余爱好者,自学知识甚浅,但求知欲很高,所以对深奥的理论很难读懂。

根据“西出阳关无故人”提供的方法,经试验得出了查询结果:

有些等于“-1”,需要的数字存在效大差距。

如果有空的话,能否帮我再修改一下。没空就算了,已经很感谢你对我的帮助。




一牧歌 发表于:2017-07-31 10:52:11

这个自定义函数非常好,非常有用。但通用性比较局限。能不能把表和字段分离出来,可以任意设定表和字段?尤其是不同的表。

不然,我每对一个表进行类似的查询时,我就需要重新做一个类似的模块。



一牧歌 发表于:2017-07-31 11:15:22

如果把自定义函数设成这样有话就非常好用了:间隔行数(参数1,参数2,参数3)

参数1:表名

参数2:查询字段名

参数3:ID



西出阳关无故人 发表于:2017-08-04 00:03:30

Public Function 间隔行数(ByVal tb As String, ByVal qf As String, ByVal keyqf As String, ByVal tID As Long) As Long
'TB:表名称;QF:查询字段的名称;keyqf:自动编号或排序的数字字段名称;tID:指定的自动编号或排序的字段数值。
'返回值有一下2种情况
'-1:表示第一次出现
'0~N:表示间隔的行数.

 Dim rst As Recordset, Str As String, i As Long, tEnd As Boolean
    Set rst = CurrentDb.OpenRecordset("select * from " & tb & " where " & keyqf & "<" & tID & " order by id desc")
    Str = DLookup(df, tb, keyqf & "=" & tID)
    tEnd = True
    For i = 1 To rst.RecordCount
        If rst.Fields(df) = Str Then
            tEnd = False
            Exit For
        End If
        rst.MoveNext
    Next i
    If tEnd = True Then
        间隔行数 = -1  '这里用"-1"表示第一次出现,不能用0,因为按你的要求,在连续出现某个值后,计算结果为0,以便区别.当然在不需要区别的时候也可以用0,或者其他特定的数字。
    Else
        间隔行数 = i - 1
    End If
End Function

 



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