2013-07-23 1 views
2

У меня есть код, который берет таблицу и переставляет таблицу для формирования новой таблицы. Он работал с небольшим количеством данных, но теперь, когда я попытался запустить тот же код с более чем 1000 записями, он получает ошибку 28, которая «вне пространства стека». Я не буду копировать весь мой код здесь, потому что это было бы слишком много, и я думаю, что это не нужно, если вы не подумаете иначе. Я думаю, что это проблема с моей рекурсией sub. Мне нужно это, потому что DONOR_CONTACT_ID может иметь только 4 получателя, если он больше, то он должен создать новую запись с тем же DONOR_CONTACT_ID и заполнить получателей.Как исправить ошибку «из пространства стека»?

Вот подпрограмма, которая получает ошибку:

Sub NextDonor() 

With rstOutput 
.FindNext "[DONOR_CONTACT_ID] = " & strDonor2 
'Find the next record in T_OUTPUT with that DONOR_CONTACT_ID 

      If .NoMatch Then 
       'If there are no more records with that DONOR_CONTACT_ID, add a new one 
       .AddNew 
       !DONOR_CONTACT_ID = strDonor1 
       !RECIPIENT_1 = strRecip1 
       !ORDER_NUMBER = strOrderNum1 
       .Update 
      Else 
      'A second DONOR_CONTACT_ID in T_OUTPUT exists. Check to see if all fields are filled. 
       If !DONOR_CONTACT_ID = strDonor2 Then 
        If IsNull(!RECIPIENT_2) And Not (IsNull(!RECIPIENT_1)) Then 
        'RECIPIENT_2 is empty, so populate it 
         .Edit 
         !RECIPIENT_2 = strRecip1 
         .Update 

        ElseIf IsNull(!RECIPIENT_3) And Not (IsNull(!RECIPIENT_2)) Then 
        'RECIPIENT_3 is empty, so populate it 
         .Edit 
         !RECIPIENT_3 = strRecip1 
         .Update 
        ElseIf IsNull(!RECIPIENT_4) And Not (IsNull(!RECIPIENT_3)) Then 
        'RECIPIENT_4 is empty, so populate it 
         .Edit 
         !RECIPIENT_4 = strRecip1 
         .Update 

        ElseIf Not IsNull(!RECIPIENT_4) Then 
        'RECIPIENT_4 is filled, so run this function again 
         Call NextDonor 
        End If 

       End If 
      End If 
End With 
End Sub 

Ошибки в строке, где он говорит: «Позвоните NextDonor», вероятно, из-за рекурсии. Если вам нужно, чтобы я уточнил, что мой код пытается сделать, или если вы хотите, чтобы я копировал другие части моего кода, просто дайте мне знать.

ответ

3

Попробуйте это, чтобы избежать рекурсий ...

Sub NextDonor(byref Again as Boolean) 
With rstOutput 
DoItAgain : 
.FindNext "[DONOR_CONTACT_ID] = " & strDonor2 

    If .... 
    .... 
    ElseIf Not IsNull(!RECIPIENT_4) Then 
    'RECIPIENT_4 is filled, so run this function again 
    Goto DoItAgain 
    End If 
End Sub 
0

На самом деле ваш рекурсивный код и первый ответ и пропустить мимо получателя, если четвёртое слот заполнено, вы итерация с другим Находки, и вы потеряете текущий получатель! Это также исключает рекурсию. вместо:

If .NoMatch or (not isnull(!recipient_4)Then 
      'If there are no more records with that DONOR_CONTACT_ID, add a new one 
      ' or current record is full 
      .AddNew 
      !DONOR_CONTACT_ID = strDonor1 
      !RECIPIENT_1 = strRecip1 
      !ORDER_NUMBER = strOrderNum1 
      .Update 
     Else 
Смежные вопросы