(изменено: vitaly576, 24 августа 2021 15:53:36)

Тема: Не переходит к следующей итерации цикла

Добрый день!
Ломаю голову уже второй день. Прошу вашей помощи в решении проблемы.
Написал макрос, который добавляет введенный инструмент к операции тех. процесса выделенных номенклатурных позиций (из справочника номенклатуры). Если позиция инструмента одна, то все работает хорошо (опробовал на 500+ ТП), но если же позиций инструмента больше, то макрос добавляет весь инструмент в одну операцию одной НМК и заходит в бесконечный цикл, вешая программу. К следующей номенклатурной позиции макрос не переходит.

Проблемный участок кода:

TP.First
                  Do 'цикл по всем операциям

                     If TP.ClassType = CSDN_Const.ctOperation then
                      tpname = TP.Properties("NMK_NAME").asstring
                       if tpname = kuda_dobabit then
                           operid = TP.Properties("OPER_ID").asinteger

                           for z=0 to Form.c_MemoInstr.Lines.Count-1
                              objects = Form.c_MemoInstr.Lines.Strings(z)
                              probelleft1=InStr(objects,"--")
                              idobject = Left(objects,probelleft1-1) ' вырезаем из строки ID инструмента
                               ID = TP.AddNMkToTechnology( 2, idobject, operid )
                                b=b+1

                                 ID=0
                           Next
                               a=a+1
                     operid = 0
                     tpname = 0
                       end if
                     end if
                  TP.Next
                  Loop While Not TP.EOF

Re: Не переходит к следующей итерации цикла

Здравствуйте!

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

Давайте лучше перепишем проще и надежнее.

1. Пробегаемся по всему ТП и собираем ID операций в которые нужно добавить инструмент (он у вас там как то кодируется, но будем думать что проблема не в этом)
2. Теперь бежим по собранным ID операций и добавляем в каждую инструмент. Можно перед этим ее даже выделить (https://help.technologics.ru/7.9/TCSAPI … tion_9.htm)
3. Все.

(изменено: vitaly576, 25 августа 2021 07:29:51)

Re: Не переходит к следующей итерации цикла

Доброе утро!
Логика работы следующая. Пользователь:
1. выбирает операцию к которой нужно добавить инструмент
2. выбирает инструмент
Не переходит к следующей итерации цикла
Скрипт проходит в цикле по операциям и сравнивает название операции в ТП с той к которой нужно добавить инструмент. Если есть совпадение, то к этой операции добавляет через функцию AddNMkToTechnology инструмент.
Проблема заключается в том, что если инструмент добавлен в поле один, то все работает замечательно, но если инструмента больше, то работа нарушается: с операции на операцию скрипт не переходит, а добавляет в бесконечном цикле инструмент к одной операции.

Не переходит к следующей итерации цикла

Re: Не переходит к следующей итерации цикла

Я понял. Алгоритм добавления в ТП я написал.

Re: Не переходит к следующей итерации цикла

А чем плох алгоритм, написанный выше, если не учитывать, что для множества добавляемых объектов он пока не работает?

Re: Не переходит к следующей итерации цикла

Вам важен порядок записей, но при добавлении новых данных в ТП его нет (если не вызывать обновить). И сложно понять точно что произойдет. Можно попытаться разобраться и заставить работать, но все равно это уже будет сильно зависеть от версии прораммы и настроек пользователя, и если что-то изменится, вам опять разбираться с кодом макроса.

То что я написал вроде работает понятнее и должно быть надежнее.

(изменено: , 25 августа 2021 12:33:01)

Re: Не переходит к следующей итерации цикла

Понятно.
А можно пример кода как пробежаться по собранным ID операций и добавить в каждую инструмент?

Нашел в чем причина, как Вы и написали, после добавления одного инструмента в цикл добавил инструкцию обновления тех. процесса. Все заработало.
Как это связано, я пока так и не понял.

Re: Не переходит к следующей итерации цикла

Я не сильно понял. Вроде у вас все написано, просто немного порядок поменять. Что то типа (не проверял)

'Ищем операции в которые нужно доабвить и сохраняем их ID
Set OperIds = theApp.CreateStrings
Tp.First
Do 'цикл по всем операциям
 If TP.ClassType = CSDN_Const.ctOperation And TP.Properties("NMK_NAME").AsSafestring = kuda_dobabit then
  idx = OperIds.Add( TP.Properties("OPER_ID").asString )
 End If
 TP.Next

'Добавляем инструмент к этим операциям
Loop While Not TP.EOF
For i=0 to OperIds.Count
  operid = Clng(OperIds.Strings(i))
  if TP.Locate( "ID", operid, 0 ) then
    'Добавляем инструмент как и раньше, по одной записи
  End if
Next

Re: Не переходит к следующей итерации цикла

Премного благодарен!