Тема: Как через API позиционироваться на конкретный документ?

Как через API позиционироваться на конкретный документ?

Re: Как через API позиционироваться на конкретный документ?

Какие данные есть входные?

Самое просто конечно это SingleDoc (правда это не совсем позиционирование, а получить данные об одном документе). Пример макроса (запускается любого модуля)

Sub FormMacro_ShowDoc(TCSActiveModule)'Показать документ по идентификатору
  Id = TCSApp.InputBox( "Введите идентификатор версии документа", "Идентификатор", "" )
  If Id<>"" Then
    Set Doc = TCSApp.SingleDoc( CSDN_Const.dspSearchDocByVerID, Id )
    'Dim Doc As ISingleDoc
    If Not Doc Is Nothing Then
      'Подготовим модуль для последующего автоматического освобождения
      Doc.UserModuleName = Doc.UniqueUserModuleName
      TCSApp.DeleteModuleByUserModuleName( Doc.UserModuleName )
      I = Doc.ShowModal( "Наш документ" )
    End If
  End If
End Sub

А так обычно используется свойство Locate, но при работе с деревом необходимо выбрать нужную ветвь либо выбрать корень дерева и не выставить опцию показывать данные всех ветвей ShowOneTreeNodeData (при работе с архивом необходимо выбрать архив а не корень дерева).

Re: Как через API позиционироваться на конкретный документ?

Если можно пример работы с деревом Архива с использованием функции
ArchiveTree

Re: Как через API позиционироваться на конкретный документ?

Если можно пример работы с деревом Архива с использованием функции
ArchiveTree

Какой именно пример?

Re: Как через API позиционироваться на конкретный документ?

В Хэлпе я нашел только

Dim OCS As CSDN.OCS
Dim App As CSDN.Ocs_Application
Sub Test()
    Call Login
   
    Dim aTree As CSDN.ArchiveTree
   
    Set aTree = App.ArchiveTree(False)
   
    I = aTree.ShowModal("Классификатор архива документов")
       
    Set aTree = Nothing
   
End Sub
Sub Login()
   
    If OCS Is Nothing Then Set OCS = CreateObject("CSDN.OCS")
   
    If App Is Nothing Then Set App = OCS.Login
   
End Sub

Но какой результат...Пользователь пощелкал по дереву архива...Выбрал нужное...И....Как получить например ID дерева, которое он выбрал и перейти в архив с позицыонированием на выбранное...

Re: Как через API позиционироваться на конкретный документ?

Пример поиска ноды в архиве (в других режимах проще) и создания ноды в дереве.

Sub TestATree

  If TCSApp.ArchiveTree( True ).ShowModal( "Выберите ветку дерева архива" )>0 Then
     NodeId = TCSApp.ArchiveTree( True ).DbTree.Selected.NodeId
     'В обычных режимах достаточно сделать так
     'Set Node =TCSApp.Archive.DbTree.DbNodeByNodeId( NodeId )
     'В Архиве дерево динамическое, поэтому только так
     'Dim Node AS IDbNode
     Set Node = Nothing
     For i=0 To TCSApp.Archive.DbTree.RootNodes.Count-1
       Set Node = TCSApp.Archive.DbTree.RootNodes.Item(i)
       For j=0 To Node.Count-1
          Call Node.Item(j).Expand( False )
       Next
     Next
     Set Node = TCSApp.Archive.DbTree.DbNodeByNodeId( NodeId )
     If Not Node Is Nothing Then Node.Selected = True
     I = TCSApp.Archive.ShowModal( "Выбраная ветка дерева" )
     If Not Node Is Nothing Then
       If TCSApp.MessageBoxAskYesNo( "", "Создать ветку", False, 2, False )=1 Then
         NewId = GetDbTreeNodeIdEx( TCSApp.Archive.DbTree, Node.FullPath( "" ) & "\\Тест создания", True )
         I = TCSApp.Archive.ShowModal( "Созданная ветка дерева" )
       End If
     End If
  End If
End Sub


'<doc Поиск ноды в дереве по полному пути
'<par DbTree As IDbTree>
'<par FullPath Полный путь>
'<par AllowCreate Boolean Создавать путь если не существует (кроме корневой ноды)>
'<type As Integer Идентификатор ноды. -1 Не найдена>
'>
Function GetDbTreeNodeIdEx( DbTree, FullPath, AllowCreate )
  GetDbTreeNodeIdEx = -1
  Paths = Split( CStr(FullPath), "\\" )
  If Not IsArray(Paths) Then Exit Function
  Set PNode = Nothing
  'Dim PNode as IDbNode
  Lvl = 1
  For i=0 To DbTree.RootNodes.Count-1
    Set  PNode = DbTree.RootNodes.Item(i)
    If PNode.Text=Paths(Lvl) Then
      PNode.Selected = True
      Exit For
    End If
    Set PNode = Nothing
  Next
  If Not PNode Is Nothing Then
    For Lvl=2 To UBound(Paths)
        If Not PNode Is Nothing Then
          Set Node = Nothing
          'Dim Node As IDbNode
          For I=0 To PNode.Count-1
             Set Node = PNode.Item(i)
             If Node.Text=Paths(Lvl) Then
               Node.Selected = True
               Node.Expanded = True
               Exit For
             End If
             Set Node = Nothing
          Next
          If Node Is Nothing And AllowCreate Then
            On Error Resume Next
            PNode.Selected = True
            DbTree.CancelChanges
            DbTree.CreateNew
            DbTree.Properties("NodeText").AsString = Paths(Lvl)
            DbTree.SaveChangesEx
            If Err Then
               Call TCSApp.ShowDetailedErrorMessage( "Не могу создать ветку дерева классификатора", Err.Description )
               Set Node = Nothing
            Else
              Set Node = DbTree.Selected
            End If
            On Error Goto 0
          End If
          Set PNode = Node
        End If
    Next
  End If
  If Not PNode Is Nothing Then GetDbTreeNodeIdEx = PNode.NodeId
End Function

(изменено: vitaly576, 12 мая 2021 13:02:18)

Re: Как через API позиционироваться на конкретный документ?

Здравствуйте.
Чтобы не плодить темы, спрошу здесь. Не понимаю выскакивает ошибка в условии:

 Dim Nmks 'As ISingleDoc
  Set Nmks = TCSApp.SingleDoc(0,Note)
 If Nmks Is Nothing Then
 Set Doc = TCSApp.CreateDoc( Notewithsuf, Name, DocType, ArchiveTreeID, WorkFlowTypes, WorkGroups, Null, Null )
  end if

Система выдает ошибку:

SQL Server Error: Выполнение данной инструкции было прервано.
Конфликт инструкции INSERT с ограничением FOREIGN KEY "FK_PROJECTS_ROUTING". Конфликт произошел в базе данных "IndustriCS", таблица "dbo.ROUTING", column 'ROUTING_ID'. [MsSqlNativeError:547]

Re: Как через API позиционироваться на конкретный документ?

Ошибку поборол, но условие не отрабатывается:

If Nmks Is Nothing Then
Set Doc = TCSApp.CreateDoc( Notewithsuf, Name, DocType, ArchiveTreeID, WorkFlowTypes, WorkGroups, Null, Null )
 end if

Пишет, что Обозначение документа не уникально.

Re: Как через API позиционироваться на конкретный документ?

В качестве идентификатора способа обоработки (видимо WorkFlowTypes) передано что то не валидное.

Re: Как через API позиционироваться на конкретный документ?

Пишет, что Обозначение документа не уникально.

Ну тут видимо ответ уже в сообщении?

(изменено: vitaly576, 12 мая 2021 13:10:07)

Re: Как через API позиционироваться на конкретный документ?

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

Пишет, что Обозначение документа не уникально.

Ну тут видимо ответ уже в сообщении?

Это понятно, но ведь должно отрабатываться условие, а по факту оно игнорируется:
Set Nmks = TCSApp.SingleDoc(0,Note)
   If Nmks Is Nothing Then
Set Doc = TCSApp.CreateDoc( Notewithsuf, Name, DocType, ArchiveTreeID, WorkFlowTypes, WorkGroups, Null, Null )
   end if

Re: Как через API позиционироваться на конкретный документ?

Ну судя по примеру кода вы ищете одно обозначение (Note), а создаете другое (Notewithsuf). Переменную одну используйте и наверное заработает все.

(изменено: vitaly576, 12 мая 2021 13:21:56)

Re: Как через API позиционироваться на конкретный документ?

Был не внимателен, спасибо.