Тема: NmkVersionUserAccess

NmkVersionUserAccess - как он работает?
Мне нужно, чтобы на указанную версию ТП беспрекословно добавлялся пользователь со всеми правами к ТП
И без сопутствующих форм добавления пользователя к версии (как в SQL запросе вида Insert)
Я не разобралась в NmkVersionUserAccess, хорошо бы пример какой-нибудь

Re: NmkVersionUserAccess

Да как и везде, стандартно. Открываем API Explorer, смотрим свойства, там же можно добавить и получить прототип кода.

Что то типа такого

  Dim Module' as INmkVersionUserAccess
  Module.CancelChanges
  Module.CreateNew
  Module.p_ID.AsInteger = UserId
  Module.p_REM.AsString = "Нам комментарий"
  Module.p_CAN_EDIT.AsBoolean = True
  Module.SaveChangesEx 

Re: NmkVersionUserAccess

А Module определяется как:
Так?

Set Module = TCSApp.NMKVersionUserAccess(123456)               ???

Re: NmkVersionUserAccess

это свойство UserAccess у версии номенклатуру. Откройте API Explorer, там все это видно.
Получить объекты можно сильно по разному, хотя у многих есть заход и через TCSApp.

Только работая через TCSApp не забывайте что вы работаете с глобальными объектами. И если вы их пользуете в больших количествах, необходим делать вызовы типа (иначе скоро увидете Out of memory).

  Module.UserModuleName = Module.UniqueUserModuleName
  TCSApp.DeleteModuleByUserModuleName Module.UserModuleName
Спасибо сказали: Евсеева Людмила1

Re: NmkVersionUserAccess

Спасибо, все получилось

Re: NmkVersionUserAccess

Здравствуйте. Никак не получается через апи добавить пользователя и дать ему права на редактирование.
Макрос падает на ошибке на строчке сохранения:

Не могу изменить запись!-->SQL Server Error: Выполнение данной инструкции было прервано.
Конфликт инструкции INSERT с ограничением CHECK "C_USERS_VERSION_UV_ACCESS". Конфликт произошел в базе данных "IndustriCS", таблица "dbo.USERS_VERSION", column 'UV_ACCESS'. [MsSqlNativeError:547]
CSDN.NmkVersionUserAccess

Получившийся код макроса:

Sub Can_Edit(TCSActiveModule)

Dim Nmks 'As CSDN.Nomenclatures
Dim NmkTech 'As CSDN.NmkTechnology
Dim CurrVer 'As CSDN.NMkVersions
Dim NMKTP 'As CSDN.NmkTechnology
Dim UAccess 'As CSDN.NmkVersionUserAccess


Dim TCS 'As CSDN.TCS
Dim App 'As CSDN.Tcs_Application


Set TCS = CreateObject("CSDN.TCS")
Set App = TCS.LoginCurrent

notemtk = TCSActiveModule.Properties("NOTE").Value



'Dim Nmk As ISingleNomenclature
Set Nmk = theApp.SingleNmkFromNMkNote(notemtk)
Nmk.UserModuleName = Nmk.UniqueUserModuleName

Call theApp.DeleteModuleByUserModuleName( Nmk.UserModuleName )

Set NMKTP = Nmk.Properties("NmkTechnology").AsIDispatch
Set CurrVer = NMKTP.Properties("CurrentVersion").AsIDispatch
Set UAccess = CurrVer.Properties("UserAccess").AsIDispatch

UAccess.UserModuleName = UAccess.UniqueUserModuleName

UAccess.AppendAction.Execute

'UAccess.p_ID.AsInteger = UserId
'UAccess.p_User_Name.asstring = App.LoginUserName

Dim Module' as INmkVersionUserAccess
UAccess.CancelChanges
UAccess.CreateNew
UAccess.p_ID.AsInteger = UserId

UAccess.p_CAN_EDIT.AsBoolean = True
UAccess.SaveChangesEx

                    Call TCSApp.ShowErrorMessage( "Ãîòîâî" )



End Sub

Re: NmkVersionUserAccess

UAccess.UserModuleName = UAccess.UniqueUserModuleName

Это лишнее, или хотя бы удалить не забудьте потом модуль (иначе будет болтаться глобальным).
Собираемся расписать тему с удалением объектов, так как вопросов много тут.

Вот так работает. Там права нужно выставить все похоже. Не совсем правильно конечно, но пока так

  Call TCSActiveModule.CancelChanges
  Call TCSActiveModule.CreateNew
  TCSActiveModule.Properties("ID").Value = 1402
  TCSActiveModule.Properties("REM").Value = "Test"
  TCSActiveModule.Properties("CAN_VIEW").Value = 1
  TCSActiveModule.Properties("CAN_EDIT").Value = 1
  TCSActiveModule.Properties("CAN_EDITOTHER").Value = 0
  TCSActiveModule.Properties("CAN_DELOTHER").Value = 0
  TCSActiveModule.Properties("CAN_MOVE").Value = 0
  Call TCSActiveModule.SaveChangesEx

Re: NmkVersionUserAccess

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

For i=TCSActiveModule.SelectedRowsCount-1 to 0 Step -1
If TCSActiveModule.GotoSelectedRow(i) Then

'Dim Nmk As ISingleNomenclature
Set Nmk = theApp.SingleNmkFromNMkNote(TCSActiveModule.Properties("NOTE").Value)
Nmk.UserModuleName = Nmk.UniqueUserModuleName

Call theApp.DeleteModuleByUserModuleName( Nmk.UserModuleName )

' переходим в раздел Технология
Set NMKTP = Nmk.Properties("NmkTechnology").AsIDispatch

' переходим в раздел Текущая версия
Set CurrVer = NMKTP.Properties("CurrentVersion").AsIDispatch

' переходим в раздел Доступ пользователей
Set UAccess = CurrVer.Properties("UserAccess").AsIDispatch

' запускаем окно выбора пользователя для добавления прав
UAccess.AppendAction.Execute

' запускаем окно выбора добавления прав
If UAccess.RunModuleForSelect("Выберите права", False )>0 Then

' сохраняем изменения
Call UAccess.SaveChanges
End If

end if

set NMKTP = Nothing
set CurrVer = Nothing

Re: NmkVersionUserAccess

Код что я дал взят из API Prop Explorer.
Вам нужно либо прочитать права в переменные, и подставить их (в код подбнный моему примеру. Да и ваш рабочий, просто там нужно все права проставить а не одно только).
Либо свою форму просто сделать вместо нашей, и значеняи с нее подставлять уже в код.

Re: NmkVersionUserAccess

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

Re: NmkVersionUserAccess

Примеры и ролик по возможностям.
https://forum.technologics.ru/post14273.html#p14273
https://forum.technologics.ru/post14432.html#p14432

VBScript язык простой, больше знание самом TCS нужно конечно. Мы стараемся делать, чтобы простые задачи легко реализовывались.


А вообще откуда пример зупускается? он так что немного странный конечно, либо что то не известно.

Re: NmkVersionUserAccess

Олег Зырянов пишет:

А вообще откуда пример зупускается? он так что немного странный конечно, либо что то не известно.

Запускается из справочника "Номенклатура".

Re: NmkVersionUserAccess

Для чего писать свои формы в данном случае, если стандартные вполне устраивают?

Re: NmkVersionUserAccess

Для чего писать свои формы в данном случае, если стандартные вполне устраивают?

Это по вашему желанию конечно. Я же конечную цель не знаю. Сами тоже стараемся и рекомендуем пользоваться нашиими.

Тогда код немного иначе лучше сделать (с одной стороны).
А с другой у нас есть то что вы хотите сделать вот тут https://help.technologics.ru/7.9/TCSHelp/_193.htm и писать ничего не надо даже.

Спасибо сказали: vitaly5761

Re: NmkVersionUserAccess

Большое Вам спасибо! Это то что нужно.

Re: NmkVersionUserAccess

Добрый день! Все же написал макрос, чтобы пакетно добавлять права на редактирование текущему пользователю.
Макрос перестал у некоторых пользователей работать, хотя раньше все работало. Не знаю с чем это могло быть связано. Из-за выполнения макроса программа зависает и ее приходится принудительно закрывать.
Код макроса на всякий случай прилагаю:

Sub Can_edit_paketno(TCSActiveModule)

Dim Nmks 'As CSDN.Nomenclatures
Dim NmkTech 'As CSDN.NmkTechnology

Dim CurrVer 'As CSDN.NMkVersions
Dim NMKTP 'As CSDN.NmkTechnology

Dim CurrVerSpec 'As CSDN.NMkVersions
Dim Spec 'As CSDN.NmkSpecification

Dim UAccess 'As NmkVersionUserAccess
Dim UAccessSpec 'As NmkVersionUserAccess

Dim ID
Dim TCS 'As CSDN.TCS
Dim App 'As CSDN.Tcs_Application

a = 0
b = 0
c = 0
Set TCS = CreateObject("CSDN.TCS")
'Set App = TCS.LoginCurrent
For i=TCSActiveModule.SelectedRowsCount-1 to 0 Step -1

If TCSActiveModule.GotoSelectedRow(i) Then
      call TCSApp.ShowProgressMessage("Ждите ... Осталось обработать "+cStr( i ) +" из "+cStr( TCSActiveModule.SelectedRowsCount ) +" записи " , "Информация")
      Dim Nmk 'As ISingleNomenclature
      Set Nmk = theApp.SingleNmkFromNMkNote(TCSActiveModule.Properties("NOTE").Value)
      Nmk.UserModuleName = Nmk.UniqueUserModuleName
      Call theApp.DeleteModuleByUserModuleName( Nmk.UserModuleName )

      ' переходим в раздел Технология
      Set NMKTP = TCSActiveModule.Properties("NmkTechnology").AsIDispatch
      ' переходим в раздел Текущая версия Технологии
      Set CurrVer = NMKTP.Properties("Versions").AsIDispatch

        if not CurrVer.Properties("id").value = 0 or CurrVer.Properties("id").value = null then
          ' переходим в раздел Доступ пользователей ТП
          Set UAccess = CurrVer.Properties("UserAccess").AsIDispatch

          Call UAccess.CancelChanges
          Call UAccess.CreateNew

          UAccess.Properties("ID").Value = ID
          UAccess.Properties("REM").Value = "Права установлены макросом"
          UAccess.Properties("CAN_VIEW").Value = 1
          UAccess.Properties("CAN_EDIT").Value = 1
          UAccess.Properties("CAN_EDITOTHER").Value = 1
          UAccess.Properties("CAN_DELOTHER").Value = 1
          UAccess.Properties("CAN_MOVE").Value = 1
          On Error Resume Next
          Call UAccess.SaveChangesEx
              If Err Then
              end if
        end if

On Error goto 0
a = a + 1
else
b= b + 1

End If

    Set NMKTP = Nothing
    Set UAccess = Nothing
    Set CurrVer = Nothing
Next
 Call TCSApp.HideProgressMessage
   if b > 0 then
  Call TCSApp.ShowMessageBox("Информация", "Права успешно добавлены для " & a & " записей."+ Chr(10) + Chr(10) +"Права НЕ добавлены для " & b & " записей из-за отсутствия версии!" )
  else
  Call TCSApp.ShowMessageBox("Информация", "Права успешно добавлены для всех записей" )
  end if
End Sub

Re: NmkVersionUserAccess

Set TCS = CreateObject("CSDN.TCS")

Это лишнее, App мы для макроса сами создаем, что и есть theApp, либо TCSApp (это устаревшее название).
Может это как то и влияет.

Ну и так есть лишнее конечно, при наличии ID работа по NOTE (можно но зачем?).

Откуда макрос запускается? Такое впечатление что из номенклатурника, тогда у него самого есть ТП (не нужен SingleNmk),