Тема: работа с окном "Показать в технологии"

Добрый день! скажите пожалуйста как мне работать с активным окном после применения функции TCSActiveModule.ActionList.ActionByName("TechAction").Execute? т.е. после того, как будет показано, где используется номенклатура.  версия ТКС - 4.7.1.  Конкретнее, захожу в справочник цехов, выбираю "где используется", в списке устанавливаю "показать в каких операциях используется". Далее хочу запустить макрос: проход по списку с исправлением текущего цеха на другой (возникла такая необходимость в связи со слиянием цехов на предприятии). Заранее благодарен :)

Re: работа с окном "Показать в технологии"

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

Через ActionList вызываются команды, так что все что происходит далее  - это уже действие данной команды и ко всему этому нет доступа.

Нужно более подробное описание что вы хотите сделать. Обычный способ разобраться - запускается TCS API Explorer и в нем уже изучаем требуемый нам модуль. Работаем либо по Properties (это будут интерфейсы предусмотренные разработчиком) либо по ChildModules (там можно получить все что есть в зависимых объектах но только на чтение) .

Если ничего этого нет, то проще всего запустить макрос в том самом окне которое вам необходимо (обычно макросы в TechnologiCS есть почти на каждом модуле).

В новых версиях возможностей побольше конечно.

Re: работа с окном "Показать в технологии"

можно в том самом окне запустить, согласен, но ведь это только на единичную позицию я операцию сделаю! а я хотел на список! Есть список позиций в которых используется цех № и мне надо было заменить его на цех №1! в ручную это удобней всего сделать из модуля "справочник цехов"--->"показать где используется данный цех" и тут работаешь только с нужной номенклатурой, не надо перелопачивать всю. на каждой позиции есть кнопочка вызова техпроцесса и сразу можно менять там цех на нужный! вот хотел этот процесс автоматизировать. Получается вызвать окошечко техпроцесса, а как  после с ним работать через API - непонятно... :(

Re: работа с окном "Показать в технологии"

Вот тут и понадобится TCS API Explorer.  Открываем модуль Справочник цехов, в нем вызываем команду - показать где используется данный цех. Выбираем показать Тех операции. Получаем список операций в которых используется данный цех. Теперь вызываем окно Редактировать макросы и в нем вызываем TCS API Explorer. Дальше понадобятся знания АПИ хоть небольшие. Исследуем текущий модуль, на закладке IModule  смотрим IModule2 свойство IsChildModules. Оно возвращает True, что означает что у данного модули  нет встроенного интерфейса и значить можно работать только на чтение. Переходим на страничку IPModule и изучаем список свойств доступных нам в данный момент Properties. Там мы видим свойства TECH_ID и VER_ID который дают нам информацию о версии техпроцесса и позиции в нем. Этой информации нам достаточно чтобы получить техпроцесс ( а на него интерфейс есть уже) и произвести в нем требуемую замену.
Закрываем TCS API Explorer,  создаем используемый модуль (его скорей всего нет), вызываем редактор скриптов и в нем создаем макрос

Sub FormMacro_ReplaceCeha(TCSActiveModule)'Замена цеха
  If TCSApp.PlantDepartments.ShowModal( "Выберите цех для замены" )>0 Then
    NewCehaId = TCSApp.PlantDepartments.Properties("ID").AsInteger
    Set ErrCols = TCSAPp.CreateStrings
    'Dim  ErrCols As ICSDNStrings    
    TCSActiveModule.First    
    While Not TCSActiveModule.Eof
      TechId =  TCSActiveModule.Properties("TECH_ID").AsInteger
      VerId  = TCSActiveModule.Properties("VER_ID").AsInteger      
      DispName = "[Запись:" + TCSActiveModule.Properties("NMK_NOTE").AsSafeString + "-" + _
                   TCSActiveModule.Properties("NMK_NAME").AsSafeString + "(" + _
                   TCSActiveModule.Properties("VER_NAME").AsSafeString + ") Операция{" + _
                   TCSActiveModule.Properties("NAME").AsSafeString + "}]"                   
                   
      Set Tp = Nothing
      On Error Resume Next
      Set Tp = TCSAPp.NmkTechnology( -1, VerId )
      'Dim Tp As INmkTechnology
      On Error Goto 0
      If Not Tp Is Nothing Then
        If Tp.Locate( "ID", TechId, 0 ) Then 
          If Tp.AllowEdit Then 
            On Error Resume Next
            Set TpAts = Tp.Properties("TechnologyAttributes").AsIDispatch
            'Dim TpAts As IGModule
            If Not  TpAts Is Nothing Then
              TpAts.Edit
              TpAts.Properties("PlantDepatment_ID").AsInteger = NewCehaId
              TpAts.SaveChanges              
            Else
              idx = ErrCols.Add( DispName )
              idx = ErrCols.Add( "Техпроцесс с идентификатором " & CStr(VerId) & ": Не могу получить реквизиты!" )
            End If 
            If Err Then
              idx = ErrCols.Add( DispName )
              idx = ErrCols.Add( "Техпроцесс с идентификатором " & CStr(VerId) & ". Ошибка при работе: " & Err.Description )
              Err.Clear
            End If 
            On Error Goto 0
          Else
            idx = ErrCols.Add( DispName )
            idx = ErrCols.Add( "Техпроцесс с идентификатором " & CStr(VerId) & " может быть изменен!" )
          End If
        Else 
          idx = ErrCols.Add( DispName )
          idx = ErrCols.Add( "Не могу найти запись <" & CStr(TechId) & "> в техпроцесс по идентификатору " & CStr(VerId) )
        End If
        Tp.UserModuleName = TCSApp.UniqueUserModuleName
        Call TCSAPp.DeleteModuleByUserModuleName( Tp.UserModuleName )
      Else
        idx = ErrCols.Add( DispName )
        idx = ErrCols.Add( "Не могу получить техпроцесс по идентификатору " & CStr(VerId) )
      End If
      TCSActiveModule.Next
    Wend    
    If ErrCols.Count>0 Then 
      Call ErrCols.ShowModal( "При работе возникли ошибки", 400, 400 )    
    End If
  End If
End Sub

Создаем его описание, запускаем. Это просто пример (хотя кое какие действия он и производит, так что осторожно).  Запуская этот макрос можно производить замены цеха по указанным в данном модуле записям. Написан для версии 6.2 но по идее должен работать и в 4.7.1.

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

В 5.7 и выше можно организовать полностью свой набор данных и тогда  работу можно организовать еще комфортнее конечно, нарисовав свою форму ввода, прописав различные формы взаимодействия с пользователем.

Спасибо сказали: Убяка1

Re: работа с окном "Показать в технологии"

спасибо большое :)
очень подходящий способ

Re: работа с окном "Показать в технологии"

Добрый день! Скажите пожалуйста. почему выскакивает сообщение "Недопустимый тип класса" при запуске макроса из вышеуказанного модуля? и, соответственно, не производится никаких изменений в ТП! При запуске непосредственно из модуля самого ТП - выполняется нормально. Версия ТКС, напомню, 4.7.1.0

Sub FormMacro_Edit_Ceh(TCSActiveModule)'изменить цех в реквизитах операции - вместо 105 (id цеха) должен стать 89
If TCSapp.MessageBoxAskYesNo("Проверка на случайный вызов", "Продолжить выполнение скрипта? это приведет к необратимым изменениям в базе данных",False,1,True)=0 Then Exit Sub
c_id=""
    Set nmk=TCSActiveModule 
            TechId =  nmk.Properties("TECH_ID").AsInteger
            VerId  = nmk.Properties("VER_ID").AsInteger
            Set Tp = TCSAPp.NmkTechnology( -1, VerId )
            Set versia =tp.properties("Versions").AsIDispatch                      
            If versia.properties("VER_STATE").DisplayText="Активная(Утверждена)" Or versia.properties("VER_STATE").DisplayText="В архиве" Then versia.makeActive
            Set versia=Nothing
            If Tp.Locate( "ID", TechId, 0 ) Then                   
                    Set attrib = tp.Properties("TechnologyAttributes").AsIDispatch 
                    flag=0 
                    On Error resume Next   
                    Do until flag=1                     
                        attrib.edit
                        attrib.properties("plantDepatment_id").Asinteger =89
                        attrib.SaveChanges
                        If err Then
                            Set tRigthModule = tp.ActionList.ActionByName("VerRigthsAction")    
                            If  Not tRigthModule Is Nothing Then  tRigthModule.Execute
                            Set tRigthModule=Nothing
                            tp.refresh
                            err.clear
                        Else
                            flag=1   
                        End If
                    Loop 
                    Set attrib=Nothing
            End If                       
            Set tp=Nothing                    
    Set nmk=Nothing
End Sub

Re: работа с окном "Показать в технологии"

на какой именно строчке? Скорей всего проблема в ТТП (очистите поле класс ТТП если у вас типовой не назначен)

Re: работа с окном "Показать в технологии"

Отрабатывает скрипт и потом выдается такое окошкос предупреждением после завершения. Результаты выполнения не сохраняются. Пробывал выводить мессаджбокс со значением  attrib.properties("plantDepatment_id").Asinteger перед end sub - показывал нужный результат! затем конец процедуры, окошко с предупреждением о классе... и все осталось неизменно опять. пожалуйста, по-подробней объясните, что сделать надо?

Re: работа с окном "Показать в технологии"

Попробуйте перед SaveChanges добавить

if attrib.properties("TypifiedManufacturingProcess_Nmk_ID").IsNull then attrib.properties("TypifiedManufacturingProcess_Class_ID").Value = Null

Re: работа с окном "Показать в технологии"

Здравствуйте. В этом случае ошибка "недопустимый тип класса" начинает выскакивать сразу после добавленной строки.

Re: работа с окном "Показать в технологии"

Либо что то не так сделали, либо какая-то особенность 4.7.1 (на текущей все в порядке).

Re: работа с окном "Показать в технологии"

прошу прощения, и правда сделал "что то не так"! :) Все работает! спасибо!