Есть база данных на ней форма, в форме этот Embedded view. В базе он это находится в разделе shared elements/subform. Как узнать с какой БД взят или на какую ссылается этот view? Можно ли какнибудь поменять БД источник?
В том то и дело нельзя её перевыбирать, это вроде как рабочая конфигурация. Просто глючная до ужаса. Доков нет, приходится самому ковырятся.View находится на подформе, вот в ней надо смотреть.
2 варианта:
1. Вьюха из этой же базы
2. Если из другой, то в дизайнере изменить (перевыбрать)
Эх, не ожидал что все так плачевно)))) Попробую сделать. А пример кода как работать с DXL есть?ну я несколько по другому делаю. Приходиться писать много баз в которых встроенные представления на другие базы. При накате на клиента, всё "слетает" (ну как слетает, встроенное представление, по replicaID привязано к изначальной "базе источнику"). Решил достаточно просто, нашёл где-то инфу по тому как работать с DXL и на примере того кода, сделал у себя репарсер. При этом, все эмбеды выношу в отдельные подформы, потом, скриптом прелапачиваю DXL подформ, подменяя replicaid базы на нужный. После этого, главное, не забыть подписать подформы (т.к. цифровая подпись, у них, слетает).
При этом, подформы с эмбедами у меня имеют специальные названия. По названию между первым подчёркиванием и @-кой (см картинку) у меня находиться названия поля в профиле базы в котором храниться путь до базы из которой взято представление. Крайне удобно. Код написал ещё лет 5-ть назад (есть подозрение что на основе кода, который выше приведён).
Вообще рекомендую ознакомиться с DXL, очень полезная штука. Сильно пригождается, когда в дизайне надо, к примеру, переправить под 100-ню шаредных колонок (стиль поменять, клиент захотел шрифт "тахому"), ещё некоторое кол-во представлений и т.д. Также пригождается, когда надо "перепрыгнуть через голову", к примеру, сформировать RT поле с кнопками, табличками, ссылками и т.д. (ну это пригождается в таких моментах, когда нет возможности ХПагесы использовать, там, конечно, всё намного легче)![]()
Sub MAUX_rebuildView
''подфункция для MakeEmbView
On Error GoTo errline
' с помощью этого класса получим коллекцию подформ в текущей БД
Dim subformCollection As NotesNoteCollection
' с помощью этих классов выполним конвейерную обработку DXL
Dim exporter As NotesDXLExporter
Dim xml As NotesDOMParser
Dim importer As NotesDXLImporter
' создаем экземпляр NotesNoteCollection в текущей базе
Set subformCollection=CUR.DB.CreateNoteCollection(False)
' отбираем в коллекцию только подформы
subformCollection.SelectSubforms=True
' генерируем коллекцию
Call subformCollection.BuildCollection
' если вдруг подформ в БД не оказалось - выходим
If subformCollection.Count=0 Then Exit Sub
' сначала объявляем парсер, чтобы при объявлении экспортера сразу его указать в качестве
' приёмника
Set xml=CUR.SES.CreateDOMParser
' после того, как DXL будет отпарсен, приступаем к поиску и замене нужного нам
' параметра
On Event PostDOMParse From xml Call MAUX_postParse
' создаем экспортер, на входе - коллекция подформ, на выходе - парсер
Set exporter=CUR.SES.CreateDXLExporter(subformCollection,xml)
' создаем импортер, на входе - парсер, на выходе - текущая база
Set importer=CUR.SES.CreateDXLImporter(xml,CUR.DB)
' при импорте элементов дизайна - заменять уже существующие, а если не существует -
' игнорировать
importer.DesignImportOption = DXLIMPORTOPTION_REPLACE_ELSE_IGNORE
' поехали!
Call exporter.Process
Exit Sub
errline:
call er_error("",Nothing)
End 1
End Sub
Sub MAUX_postParse(xml As NotesDOMParser)
''подфункция для MakeEmbView
On Error GoTo errline
' корень экспортированного DXL
Dim root As NotesDOMDocumentNode
' ориентироваться будем на несколько подформ
Dim subFormNodeList As NotesDOMNodeList
Dim subFormNode As NotesDOMElementNode
' этот элемент будет представлять внедренное представление
Dim embViewNode As NotesDOMElementNode
Dim SUBFORM_NAME As String
Dim zz_db_name As String
Dim t_var As Variant
Dim i As Integer
' получаем корень
Set root=xml.Document
' и ищем все подформы
Set subFormNodeList=root.GetElementsByTagName("subform")
For i=1 To subFormNodeList.NumberOfEntries
' перебираем по очереди каждую
Set subFormNode=subFormNodeList.GetItem(i)
' выясням ее имя
SUBFORM_NAME$=subFormNode.GetAttribute("name")
' если имя подформы совпадает с шаблоном - обрабатываем ее
zz_db_name=StrLeft(SUBFORM_NAME$,"@")
zz_db_name=StrRight(zz_db_name,"$$EmbView_")
If zz_db_name<>"" Then
t_var=CUR.PROFILE.Getitemvalue(zz_db_name)
If t_var(0)<>"" Then
Set MAUX_VIEW_target=New NotesDatabase("","")
If MAUX_VIEW_target.Open(CUR.SRV,t_var(0)) Then
Set embViewNode=subFormNode.getElementsByTagName("embeddedview").getItem(1)
' и устанавливаем нужное значение для аттрибута database
Call embViewNode.SetAttribute("database",MAUX_VIEW_target.ReplicaID)
End If
End If
End If
Next
'парсер не умеет автоматически подавать на выход, поэтому нужно его об этом попросить
Call xml.Serialize
Exit Sub
errline:
call er_error("",Nothing)
End 1
End Sub