Тема: Зависимые объекты

Как отобразить необходимый зависимый объект на форме?
Отображать получается, а как выбрать необходимый (в данном случае спецификацию расчётного документа)?
TCS 7.9

Set Docs = TCSApp.Inventory.CalculateDocuments
Docs.ActionList.ActionByName("ShowDataChildAction").Execute
r = Docs.RunModuleForSelect("select", False)

Re: Зависимые объекты

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

Для показа лучше использовать https://help.technologics.ru/7.9/TCSAPI … ules_9.htm, https://help.technologics.ru/7.9/TCSAPI … Item_9.htm

Re: Зависимые объекты

1. Я пробовал CM_ShowChildItemByName, не выполняется. К сожалению нет примеров и я не пойму где имя ChildItem брать? И можно ли так Docs.CM_ShowChildItemByName("modulename")?
2. А нет ли описания этого самого ICustomizedModule интерфейса? Где его применять можно? Что происходит при выполнении той или иной функции? Где брать параметры/значения параметров (в частности названия childitem) Когда примеры есть ещё куда ни шло, а так вообще трудно догадаться к чему это всё.
3. Отображение на форме с помощью двух гридов делал, только зависимый модуль надо обновлять каждый раз при смене записи, а зачем, если есть стандартный вариант. Обработчик смены записи писать не надо, форму создавать не надо, в общем стандартными средствами было бы намного приятнее как мне кажется. Остался только один вопрос: как сменить зависимый объект?

Ссылки ваши не открываются, оставляю рабочую.
https://help.technologics.ru/7.0/TCSAPI … Module.htm

Re: Зависимые объекты

ICustomizedModule  - это интерфейсы пользователя в TechnologiCS https://help.technologics.ru/7.9/TCSHelp/_802.htm.
Соответствено Captions - это то, что видите в TechnologiCS, или в дизайнере интерфейсов.
Name у ChildItem можно узнать в АПИ Explorer https://help.technologics.ru/7.9/TCSHelp/_800.htm. Закладка IDmodule, в ней закладка ChildModules (рядом с ActionList).

Применяется он обычно там, где есть интерфейсы пользователя (а это все модули TechnologiCS).

Ну и надо понимать что вся кастомизация специфична для версии TCS, так что при обнолении может отвалитсья.

Примеры подготовлю, действительно в хелпе их почти нет. Хотя там вроде все просто, но иногда последовательность нужна.

3. На ваш выбор. В случае кастомизации вы можете гибче управлять видом, например убрав все лишнее от полльзователя. Ну я написав свои связки между модулями (там ведь не много кода особенно в последниех версиях АПИ), можно вообще соединять и строить любой удобный вам вид.

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

Re: Зависимые объекты

Пример подготовил  https://forum.technologics.ru/post14827.html#p14827

Re: Зависимые объекты

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

Пример подготовил  https://forum.technologics.ru/post14827.html#p14827

За пример спасибо. Но ответа на свой вопрос я так и не получил, в самом примере написано что зависимые объекты могут создаваться только для отчётов.
Я создал набор данных "RSDSpec", который получает набор данных из CalcDocSpec ограниченный параметром (CalcDocID=?RasDocID), написал код, и при запуске ничего ожидаемого не произошло, то есть зависимый объект не появился.

Sub TestCM2
  Set CM = theApp.Inventory.CalculateDocuments
  CM.UserModuleName = CM.UniqueUserModuleName
  Call theApp.DeleteModuleByUserModuleName( CM.UserModuleName )
  CM.CM_ClearAllCustomization
  Call CM.CM_AddChildItem( "RSDSpec", "RSDSpec01", "Sostav dokumenta", 1, "RasDocID=::ID" )
  Call CM.CM_ShowChildItem( True, "*" )
  CM.CM_ApplyCustomization
  Call CM.CM_ShowChildModules( True )
  r =  CM.ShowModal( "Test8.2 (test new child!" )
End Sub

Будьте добры, если возможно, ответьте на первоначальный вопрос, как выбрать/сменить зависимый объект с помощью api?

Re: Зависимые объекты

в самом примере написано что зависимые объекты могут создаваться только для отчётов.

Да, но это самые произвольные! как в примере. Про CM_AddChildItem действительно забыл указал, это же тоже есть в интерфейсах пользователя.
К сожалению тут какая то неточность, в хелпе написано передавать значение поля через ::, а реально передается через :. Мне кажется что первый вариант правильнее, но это надо изучить повнимательней. Пока даю пример как сейчас у меня работает.

Для примера в скриптовых модулях создаем пустую форму ввода с именем formtoshow. В ней только вот такой код

Sub FormEvent_OnFormShow(Form)
'Form As ITCSForm
  if Form.UserData.Values("ShowModule")<>"" Then
    On Error Resume Next
    Set M = Form.TCSModuleByName( Form.UserData.Values("ShowModule") )
    If not M is Nothing Then
      'Dim M as ICustomizedModule
      M.CM_ShowChildModules( True )
      if Form.UserData.Values("chitem")<>"" Then M.CM_SelectChildItem( Form.UserData.Values("chitem" ) )
    End If
  End If
End Sub

В наборах данных создаем набор с обозначением test01 - таблица единицы измерения и параметром в фильре по ID. На странице SQL должен выглядеть так

SELECT
    Mesuriments.ID AS Mesuriments_ID,
    Mesuriments.NOTE AS Mesuriments_NOTE,
    Mesuriments.NAME AS Mesuriments_NAME,
    Mesuriments.IsWeight AS Mesuriments_IsWeight
 FROM 
    Mesuriments Mesuriments
 WHERE 
 ( (Mesuriments.ID =  :ID) ) 

Терерь в любом месте запускаем такой пример и запускаем на выполнение

Sub Test02
  Set F = theApp.TCSForm( "formtoshow", False )
  'Dim F As ITCSForm
  Set CM = theApp.Mesuriments
  'Dim CM As ICustomizedModule
  Call CM.CM_ClearAllCustomization
  Call CM.CM_AddChildItem( "test01", "test01", "test01", 0, "ID=:MESUR_ID" )
  Call CM.CM_ApplyCustomization
  'LogObject.ShowPropExplorer( CM )
  Call F.AddTCSModule( theApp.Mesuriments, "Mes", "", True, False, null )
  F.UserData.Values( "ShowModule" ) = "Mes"
  F.UserData.Values( "chitem" ) = "UQ_test01"
  F.ShowModal
End Sub

Re: Зависимые объекты

Спасибо, познавательно. Прекрасно работает. Но не совсем то, что хочется. Не знаю по какой причине, но такой вариант слабоотзывчивый. То есть при скроллинге он может просто зависнуть, пока система не отработает все запросы по каждой прокрученной записи. Также зависимый объект каждый раз перерисовывается (полагаю полностью пересоздаётся), хотя должны бы только данные меняться.
В стандартных зависимых объектах ощутимых задержек нет, поэтому хотелось бы использовать именно их, поскольку для моей задачи этого достаточно.
Есть возможность переключаться между зависимыми объектами на форме программно?
Метод CM_SelectChildItem показывает зависимые объекты, делает нажатой необходимую кнопку на панели зависимых объектов, но на сам зависимый объект не переключает.
в любом месте запускаем следующий пример на выполнение и видим о чём я говорю

Sub SelectChildTest
Set Docs = TCSApp.Inventory.CalculateDocuments
Call Docs.CM_ClearAllCustomization
Docs.CM_SelectChildItem("BalanceDocKindRelation")
'r = Docs.CM_ShowChildItemByName (True, "*;BalanceDocKindRelation")
'Call Docs.CM_ApplyCustomization
z = Docs.RunModuleForSelect("Test", False)
End Sub

Re: Зависимые объекты

еще раз. Вызов

Docs.RunModuleForSelect("Test", False)

меняет вид модуля, и не гарантируется что срабоатает.

Как сработает я пример дал. В этом случае модуль лежит на форме и имеет какой то вид на ней.

Re: Зависимые объекты

В примере, который вы дали, как сменить зависимый объект?

Re: Зависимые объекты

на форме вызвать

M.CM_SelectChildItem( Form.UserData.Values("chitem" ) )

Re: Зависимые объекты

я же написал сменить.
этот и так выбран, а как выбрать другой, встроенный?

Re: Зависимые объекты

Ну другое имя подставить.

Re: Зависимые объекты

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

Ну другое имя подставить.

Другое имя не работает. Я писал об этом ранее.

Sub Test02
  Set F = theApp.TCSForm( "formtoshow", False )
  'Dim F As ITCSForm
  Set CM = theApp.Mesuriments
  'Dim CM As ICustomizedModule
  Call CM.CM_ClearAllCustomization
  Call CM.CM_AddChildItem( "test01", "test01", "test01", 0, "ID=:MESUR_ID" )
Call CM.CM_SelectChildItem("Documents")
  Call CM.CM_ApplyCustomization
  'LogObject.ShowPropExplorer( CM )
  Call F.AddTCSModule( theApp.Mesuriments, "Mes", "", True, False, null )
  F.UserData.Values( "ShowModule" ) = "Mes"
  F.UserData.Values( "chitem" ) = "UQ_test01"
  F.ShowModal
End Sub

Re: Зависимые объекты

Там имя зависимого указано неверно.

Sub Test02
  Set F = theApp.TCSForm( "formtoshow", False )
  'Dim F As ITCSForm
  Set CM = theApp.Mesuriments
  'Dim CM As ICustomizedModule
  Call CM.CM_ClearAllCustomization
  Call CM.CM_AddChildItem( "test01", "test01", "test01", 0, "ID=:MESUR_ID" )
  Call CM.CM_ApplyCustomization
  'LogObject.ShowPropExplorer( CM )
  Call F.AddTCSModule( theApp.Mesuriments, "Mes", "", True, False, null )
  F.UserData.Values( "ShowModule" ) = "Mes"
  F.UserData.Values( "chitem" ) = "Documetns"
  F.ShowModal
  F.UserData.Values( "chitem" ) = "UQ_test01"
  F.ShowModal
End Sub

Re: Зависимые объекты

  F.UserData.Values( "chitem" ) = "Documetns"

Это нужно просто чтобы передать данные форме при вызове OnShow.
В другом месте можно и просто вызвать

Call CM.CM_SelectChildItem("ИМЯ")
Спасибо сказали: mtrc731

Re: Зависимые объекты

Спасибо!

Олег Зырянов пишет:
  F.UserData.Values( "chitem" ) = "Documetns"

А вот с

Call CM.CM_SelectChildItem("ИМЯ")

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

Re: Зависимые объекты

Да нет, просто в моем примере я сначала модуль размещаю на форме. А потом уже переключаю зависимые объекты как сам хочу. Я для этого подготовил загрушку - универальную форму, которая переданный ей модуль отображает на себе, а затем выбирает переданный зависимый объект.

А вы в своем примере сначала переключаете, а потом показываете модуль. При этом результат не гарантируется.

Самое простое - просто поместите модуль на форму, и дальше можно на нем зависимые самому включать. ТОгда мой пример не нужен.

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