2015-08-25 3 views
0

Я пытаюсь запустить все записи в таблице доступа с помощью вложенных do ... while циклов.Вложенные do .... while петли в доступе vba

Существуют разные критерии для каждого цикла, поэтому я запускаю несколько наборов записей, прежде чем запускать циклы.

Когда я запускаю код, он работает так, как должен, однако проблема заключается в том, что при 1 наборе записей нет записей, весь процесс завершается с ошибкой.

Вот немного кода для вложенных циклов.

Dim rst1, rst2, rst3, rst4, rst5, rst6 As Recordset 
Dim sqlSt1, sqlSt2, sqlSt3, sqlSt4, sqlSt5, sqlSt6 As String 
Dim rcdCount, a, b, c, d, e, f As Double 

Set dbs = CurrentDb 
sqlSt1 = "SELECT * FROM [Rune List - Optimizer List] WHERE [Rune Slot]= 1" 
sqlSt2 = "SELECT * FROM [Rune List - Optimizer List] WHERE [Rune Slot]= 2" 
sqlSt3 = "SELECT * FROM [Rune List - Optimizer List] WHERE [Rune Slot]= 3" 
sqlSt4 = "SELECT * FROM [Rune List - Optimizer List] WHERE [Rune Slot]= 4" 
sqlSt5 = "SELECT * FROM [Rune List - Optimizer List] WHERE [Rune Slot]= 5" 
sqlSt6 = "SELECT * FROM [Rune List - Optimizer List] WHERE [Rune Slot]= 6" 

Set rst1 = dbs.OpenRecordset(sqlSt1) 
Set rst2 = dbs.OpenRecordset(sqlSt2) 
Set rst3 = dbs.OpenRecordset(sqlSt3) 
Set rst4 = dbs.OpenRecordset(sqlSt4) 
Set rst5 = dbs.OpenRecordset(sqlSt5) 
Set rst6 = dbs.OpenRecordset(sqlSt6) 

startTime = Time 

rcdCount = rst1.recordCount 
SysCmd acSysCmdInitMeter, "Processing: ", rcdCount 

Debug.Print "4: " & rst4.recordCount 
Debug.Print "6: " & rst6.recordCount 


Do While Not rst1.EOF And Not rst1.BOF 
    Do While Not rst2.EOF And Not rst2.BOF 
     Do While Not rst3.EOF And Not rst3.BOF 
      Do While Not rst4.EOF And Not rst4.BOF 
       Do While Not rst5.EOF And Not rst5.BOF 
        Do While Not rst6.EOF And Not rst6.BOF 

         f = f + 1 
         rst6.MoveNext 
        Loop 

        e = e + 1 
        rst6.MoveFirst 
        rst5.MoveNext 
       Loop 

       d = d + 1 
       rst5.MoveFirst 
       rst4.MoveNext 
      Loop 

      c = c + 1 
      rst4.MoveFirst 
      rst3.MoveNext 
     Loop 

     b = b + 1 
     rst3.MoveFirst 
     rst2.MoveNext 
    Loop 

    a = a + 1 
    SysCmd acSysCmdUpdateMeter, a 
    DoEvents 

    rst2.MoveFirst 
    rst1.MoveNext 
Loop 
rst1.Close 
rst2.Close 
rst3.Close 
rst4.Close 
rst5.Close 
rst6.Close 

SysCmd acSysCmdRemoveMeter 

endTime = Time 

tmDuration = DateDiff("s", CDate(startTime), CDate(endTime)) 
tm = Format(Int([tmDuration]/3600), "00") & ":" & Format(Int(([tmDuration] - (Int([tmDuration]/3600) * 3600))/60), "00") & ":" & Format((([tmDuration] Mod 60)), "00") 

Debug.Print a 
Debug.Print b 
Debug.Print c 
Debug.Print d 
Debug.Print e 
Debug.Print f 
Debug.Print "-----------------" 
Debug.Print tm 

Есть ли простой способ проверить пустые записи и пропустить те, которые вызовут проблемы?

Спасибо за любую помощь

K

+1

«Пустые записи» Я предполагаю, что вы имеете в виду пустые записи. Убедитесь, что rst # .eof = false. Я бы реорганизовал это, чтобы они не все были вложенными. Если вы разместите больше своего кода, возможно, кто-то может предложить лучшую логику. – MatthewD

+1

«Весь процесс не проходит» ничего не говорит нам. Скажите нам, что на самом деле неправильно. Кроме того, покажите нам фактический код, который терпит неудачу, так как приведенное выше выглядит правильным. – RBarryYoung

+0

Когда это не удается, таблица действительно существует в наборе записей? –

ответ

0

он появляется все, что вы хотите, это имеет значение. Почему бы не использовать формулы вместо циклов.

f = rst6.recordcount * rst5.recordcount * ... 
e = rst5.recordcount * rst4.recordcount * ... 

Сделайте это для всех шести переменных. Поймите, что если rst4.recordcount равно 0, вы получите 0 для d, e, f. Но, кстати, вы кодируете то, что хотите.

0

Спасибо за то, что посмотрели ребята, я понял, что код действительно работает так, как должен, если в любом из наборов записей есть 0 записей, тогда он не должен запускать вложенные циклы.

Еще раз спасибо.

Смежные вопросы