按顺序为表中的分组记录插入排名

时间:2014-11-05 19:49:18

标签: ms-access access-vba ms-access-2010

我正在尝试寻找将值分配给表中记录的最佳方法,该表以值1开始并逐步前进值1.该表包含按日期记录的记录,其中有多条记录每个日期。我需要一个解决方案(可能是一个循环),它将按日期进行,并为每个从第一个开始插入一个等级编号,并为每个记录增加一个。一旦确定了新的日期,我需要再次从值1开始。例如,如果我有4个字段'Date','User','User ID',并且想要使用此逻辑更新字段'sequence',则我的代码将(1)按日期对所有记录进行分组,( 2)按用户ID排序,(3)在“序列”字段中显示以下结果:

Date         | User      | User ID | Sequence
4 September  | Mary      |    09   | 1
4 September  | Bob       |    58   | 2
4 September  | Dave      |    59   | 3
5 September  | Drew      |    32   | 1
5 September  | Steve     |    35   | 2
6 September  | Mary      |    09   | 1

我意识到我需要每天进行某种类型的循环,但需要帮助才能开始。

2 个答案:

答案 0 :(得分:3)

如果您绝对必须存储序列值,请使用带有UPDATE表达式的DCount查询来计算序列

UPDATE tblMarchese
SET [Sequence] = DCount(
    '*',
    'tblMarchese',
    '[Date]=' & Format([Date],'\#yyyy-m-d\#') &
        ' AND [User ID] <= ' & [User ID]
    );

该查询更简单,并且比打开和移动记录集以更新存储的 Sequence 值要快得多。

然而,重新考虑您是否必须首先存储序列值。您可以在需要查看它们时使用SELECT查询来计算它们,这样可以确保您看到的 Sequence 值始终与基础数据的最新更改保持一致。 / p>

将您的示例数据与下面的查询一起使用,这是我在Access 2010中的结果集:

Date        User   User ID Sequence
----------- ------ ------- --------
4 September Mary         9        1
4 September Bob         58        2
4 September Dave        59        3
5 September Drew        32        1
5 September Steve       35        2
6 September Mary         9        1
SELECT
    m1.Date,
    m1.User,
    m1.[User ID],
    (
        SELECT Count(*)
        FROM tblMarchese AS m2
        WHERE
                m2.Date = m1.Date
            AND m2.[User ID] <= m1.[User ID]
    ) AS [Sequence]
FROM tblMarchese AS m1
ORDER BY m1.Date, m1.[User ID];

答案 1 :(得分:0)

我找到了!无需继续寻找。以下循环例程正是我解决此问题所需要的。将其应用于上面的“通用/理论”示例,您可以看到上面的“序列”字段如何通过以下例程中的字段“ID_Event”反映出来。循环检查先前的记录,如果它具有相同的日期('生效日期'),它将1添加到字段'ID_Event'

Private Sub Comando197_Click()

Dim sql As String
Dim varEffective_Date As Date
Dim NumberOfTimes
Dim varID_Event As Integer

sql = "select ID_Event,ID_ValueAddWaste,Effective_Date,ValueAddType,ValueAddType02 from tblPerformanceTrackingMaster03 where tblPerformanceTrackingMaster03.[ID_Event]=0 order by ID"

Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset

rs.Open sql, CurrentProject.Connection, adOpenDynamic, adLockPessimistic

Dim counter As Integer
counter = 1

Do While Not rs.EOF

If counter > 1 Then

    If varEffective_Date = rs!Effective_date Then
    rs!ID_Event = varID_Event + 1

    End If
End If

varEffective_Date = rs!Effective_date
varID_Event = rs!ID_Event

rs.MoveNext
counter = counter + 1

Loop
rs.Close
Set rs = Nothing

End Sub