Копировать ссылку на страницу Перейти в предыдущий раздел Перейти в следующий раздел

 

Imports NpoComputer.WebAccess
Imports NpoComputer.WebAccess.Components
 
Public Class ContractBoundDocuments
 Inherits EDocumentBoundDocuments 'Наследуется от стандартной компоненты «Связанные документы»
 
''' <summary>
''' Получить главный договор для записи справочника "Договоры"
''' </summary>
''' <param name="Rec"></param>
''' <returns></returns>
''' <remarks></remarks>
Private Function GetMainContract(ByVal Rec As API.ReferenceRecord) As API.ReferenceRecord  
  'Найти первую запись справочника, у которой реквизит «Договор» пустой.
  While Not Rec.Requisites("Contract").IsNull
    'Получить ведущую запись справочника по ИД
     Rec = WebSession.Context.References(Constants.REFERENCE_CONTRACTS).GetRecordByID(Rec.Requisites("Contract").Value)
  End While
  Return Rec
End Function
 
''' <summary>
''' Получить все записи справочника "Договоры", связанные с данной.
''' </summary>
''' <param name="Contract">Договор</param>
''' <param name="Result">Список ID результатов</param>
''' <remarks></remarks>
Private Sub GetRecordIDsInContractTree(ByVal Contract As API.ReferenceRecord, ByVal Result As List(Of Integer))
  'Добавить ИД договора в результирующую коллекцию
   Result.Add(Contract.ID)  
  'Получить список договоров, которые связаны с данной записью.
  Dim Records = WebSession.Context.References(Constants.REFERENCE_CONTRACTS).GetFilteredRecords("Contract=" & Contract.ID)
  'Построить иерархию связанных записей
  For Each Record In Records
     GetRecordIDsInContractTree(Record, Result)
  Next
End Sub
 
''' <summary>
''' Получить список документов, связанных с данным договором или с какими-то другими договорами из иерархии.
''' </summary>
''' <param name="Rec">Запись справочника "Договоры"</param>
''' <returns></returns>
''' <remarks></remarks>
Private Function GetBoundDocuments(ByVal Rec As API.ReferenceRecord) As List(Of API.BaseDataObject)
  Dim RecIDList As New List(Of Integer)
  'Получить главный договор
   Rec = GetMainContract(Rec)
  'Получить все связанные записи в виде иерархии
   GetRecordIDsInContractTree(Rec, RecIDList)
 
  ' Отфильтровать документы по всем договорам.
  Dim Filter = String.Join("|", (From ID In RecIDList Select Constants.REQ_CONTRACT & "=" & ID).ToArray)
  Dim Res = WebSession.Context.EDocuments.GetFilteredDocuments(Filter)
  Return Res.Cast(Of API.BaseDataObject).ToList()
End Function
 
''' <summary>
''' Список связанных документов.
''' </summary>
''' <returns></returns>
''' <remarks></remarks>
Public Overrides Function GetSubObjects() As System.Collections.Generic.IEnumerable(Of API.BaseDataObject)
   IsReadOnly = True
  'Получить текущую запись справочника по ИД.
  Dim Rec = WebSession.Context.References(Constants.REFERENCE_CONTRACTS).GetRecordByID(ObjectID)
  'Найти связанные документы
  Return GetBoundDocuments(Rec)
End Function
 
''' <summary>
''' Построение контроля.
''' </summary>
''' <remarks></remarks>
 Protected Overrides Sub CreateChildControls()
   MyBase.CreateChildControls()
  'Отобразить иерархию связей.
   GetList()
End Sub
 
End Class

 

Примечание

WebSession – класс для упрощения доступа к текущему контексту пользователя.

© Компания DIRECTUM, 2018 Сообщество пользователей DIRECTUM
.navbar > a:hover { background: #FFD73B; }