移动记录集评估当前月份加上前两个月

时间:2017-04-28 20:31:00

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

我正在编写一个VBA宏来管理手机数据库。我正在测试的是,如果前几个月(当月和前两个月)中的任何一个有活动。如果所有三个月都显示"没有使用"然后我们将检查一个布尔框为true,然后停用该行。

我有部分写的逻辑。

我从一个具有计算字段的交叉表查询开始。这样我的查询始终保持结构。我被评估了值的字段。如果字段值大于零,请继续。如果它等于零,则将计数器设置为1.一旦计数器达到3,将该行的布尔框标记为true,表示不使用。

下面列出了代码。我的桌子上的月份列前面有两列,因此我的rsIndexes从2开始,经过12,整个表格有14列。通过我创建的For Next循环,我可以非常自然地管理出现的情况,例如7,6,5(7月,6月,5月)。

以下是我的问题:当您必须使用记录集索引1,12,11(1月,12月,11月)评估数据时,如何使用此结构并遍历记录集。从1回到12回到11这是我的问题。

Sub detectNonUsage2()

Dim rsNonUsageList As New ADODB.Recordset

lastMonthIndex = [Forms]![frmNonUsageLogic]![cboCurMonth].ListIndex

lastMonthIndex = (lastMonthIndex + 2)

MsgBox lastMonthIndex

rsSQL = "Select * from qryDeviceIDbyMonth"

rsNonUsageList.Open rsSQL, CurrentProject.Connection, adOpenKeyset, adLockReadOnly

Do Until rsNonUsageList.EOF

    curVal = rsNonUsageList(lastMonthIndex)

    curMonth = rsNonUsageList(lastMonthIndex).Name
    curCount = 0

    For curField = lastMonthIndex To lastMonthIndex - 2 Step -1

           If rsNonUsageList(lastMonthIndex) = 0 Then
                curCount = curCount + 1
            Else

            End If

        curMonth = rsNonUsageList(curField).Name
        Debug.Print curMonth

    Next curField

        If curCount >= 3 Then
        'set flag for nonUsage
        Else

        End If

        rsNonUsageList.MoveNext

    Loop

    rsNonUsageList.Close

End Sub

2 个答案:

答案 0 :(得分:1)

您可以使用这样的简单查询:

Update 
    CellLines
Set 
    Deactivated = True
Where 
    PhoneId Not In 
        (Select Distinct PhoneId From CellCalls
        Where CallDate Between 
            DateSerial(Year(Date()), Month(Date()) - 2, 1) And Date()

答案 1 :(得分:0)

我不确定“使用此结构”是什么意思,因为您的解释和代码有点难以理解。如果您只需要迭代一年中的数月,那么有效的解决方案将使用模运算。请考虑以下表达式:

result = ((month + delta + 11) mod 12) + 1

result将是从month开始delta步骤转换的结果月份,例如+1或-1。这假定monthresult在1到12的集合中。

另一种方法是简单地使用基本的 if语句来检测和控制当您处于边缘时会发生什么。如果继续前进:

if month == 12 then result = 1 else result = month + 1

否则如果向后移动

if month == 1 then result = 12 else result = month - 1