Россыпь мелких вопросов

  • Автор темы Автор темы Vagor.ini
  • Дата начала Дата начала
objdoc - в Вашем примере сам документ?
Я так делаю:
Код:
attachments = Evaluate("@AttachmentNames", doc)
Forall a In attachments
Set o=doc.GetAttachment(a)
... o.Name
именно, только в моем варианте еще есть 0 - что не маловажно
Про ДХЛ - чтобы получить имена вложений, надо выгрузить в ДХЛ документ и в нем уже искать вложения?
весь документ не нужно, хинты хранятся в РТ (пример указал выше)
аттачи м.б. большими и выгрузка будет (тогда) "затратной"
 
Последнее редактирование модератором:
и вложения искать не надо, пары имя хинта/имя файла легко выцепляются с XSLT
 
xsl для получения текста в форме имя аттача:имя
XML:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
	xmlns:dxl='http://www.lotus.com/dxl'>
	<xsl:output method='text'/>
	<xsl:strip-space elements='*'/>
	<xsl:template match='dxl:richtext'>
		<xsl:apply-templates select="dxl:par/dxl:attachmentref"/>
	</xsl:template>
	<xsl:template match='dxl:attachmentref'>
		<xsl:value-of select="@name"/>:<xsl:value-of select="@displayname"/>
		<xsl:text>
</xsl:text> <!-- newline character -->
	</xsl:template>
	<!-- Match all text that has not yet been picked up by the templates, and discard it. -->
	<xsl:template match="text()">
	</xsl:template>
</xsl:stylesheet>
 
Последнее редактирование модератором:
для комплекта - ф-ци трасформации (можно и через пайплайн)
Код:
Function RThints(doc As NotesDocument) As String
	Dim routineName As String
	routineName="RThints"
	On Error GoTo ErrH
	'your code here
	Dim ses As New NotesSession, stream As NotesStream
	Set stream=ses.Createstream()
	Dim dxl As NotesDXLExporter
	Set dxl=ses.Createdxlexporter()
	dxl.Richtextoption=RICHTEXTOPTION_DXL
	Call dxl.Setinput(doc)
	Call dxl.SetOutput(stream)
	dxl.Exitonfirstfatalerror=False
	Call dxl.Process()
	RThints=Transform(stream,xsl_hints)
Quit:
	Exit Function
ErrH:
	Error Err, RaiseError
	Resume Quit
End Function
Transform, здесь выкладывал (в составе SAXtest БД)
Код:
function Transform(xml As Variant, xsl As String) As String
	Dim routineName As String
	routineName="test"
	On Error GoTo ErrH
	'your code here
	Dim transformer As NotesXSLTransformer, ses As New NotesSession
	Dim strmXML As NotesStream, strmXSL As NotesStream, res As NotesStream
	Set strmXML=ses.Createstream():Set strmXSL=ses.Createstream():Set res=ses.CreateStream()
	If DataType(xml)=V_STRING Then
		strmXML.writetext(xml)
	Else
		Set strmXML=xml
	End If
	strmXSL.Writetext(xsl)
	Set transformer=ses.CreateXSLTransformer(strmXML, strmXSL, res)
	transformer.Inputvalidationoption=False
	Call transformer.Process()
	res.Position=0
	Do
		Transform=Transform & res.Readtext()
	Loop Until res.isEOS
Quit:
	Exit Function
ErrH:
	MsgBox transformer.Log
	Error Err, RaiseError
	Resume Quit
End Function
 
Подскажите, как получить список макросов в Excel-файле?
 
Лотус формирует данные для отчёта, которые собираются XLTM-файлом стороннего разработчика, макрос из которого запускается Лотусом. Сторонний разработчик иногда выкатывает новый файл с другим названием инициирующего макроса. Хочу в настроечном документе сделать кнопку выбора этого макроса.
 
макрос из которого запускается Лотусом
это значит используется COM...
и нужно адресовать вопрос, вроде как в ЛС не входят ф-ции эхеля и к платформе отношения не имеют ;)
 
  • Нравится
Реакции: Shandrik
Коллеги, есть способ запретить нажатие Ctrl+X в представлении?
Пользователи путают порой Ctrl+C и документ вырезается...
Возможность копирования надо оставить. Отдельная кнопка "Скопировать есть" - не всегда пользуются, неудобно при копировании "пунктов".
Три уровня иерархии: Проект - Задача - Пункт.
Копировать можно: либо проект целиком, либо только отдельные пункты.
Это я сделал и работает, но Ctrl + X победить не могу...
 
@lmike, ммм, как вариант, правда удалять они тоже должны иметь право, но это решаемо.
 
@lmike, ммм, как вариант, правда удалять они тоже должны иметь право, но это решаемо.
в системах где документы м.б. связаны - интерактивное удаление должно перехватываться, а уж что предложить юзеру - может зависеть от типа (формы) дока,
дополним SoftDeletation и докладом админу...
 
Я еще не пробовал, поэтому не отвечал про реализацию.
интерактивное удаление должно перехватываться
оно перехватывается, код не мой, да и кривоват он, делался еще под 4-ку.
Документы сносятся со всеми зависимостями + SD + запись в лог.
Включив запрет на удаление я должен документы метить к удалению и скрывать из вида или отображать метку, но как различить Ctrl+X и Del ?

Может поставить $KP и обрабатывать данный флаг в событиях вида и агенте, который копирует...
 
Последнее редактирование модератором:
 
  • Нравится
Реакции: savl
кстати, "о птичках"...
The ability to check clipboard content can be useful when using queryPaste events to determine the nature of the content that's being pasted into the database. You can also use it as a temporary "dumping ground" for problem documents that you want to analyze using test agents -- without touching the original documents or modifying the test agent code.
Lotus Notes stores cut or copied documents and design pieces to a temporary database. To retrieve these documents, access a local temporary file called "~clipbrd.ncf" as a NotesDatabase object, and use this database's AllDocuments property. Here are two LotusScript code snippets, the first of which performs a copy/update to documents in the target database that have the same universal IDs.
Код:
Sub pasteWithUNID(targetDB As NotesDatabase)
   '** This subroutine will paste the contents of the clipboard into the target database,
   '** maintaining the Universal IDs and replacing any existing documents there may be.
   Dim clipboard As New NotesDatabase("", "~clipbrd.ncf")
   Dim dc As NotesDocumentCollection
   Dim doc As NotesDocument, clipdoc As NotesDocument
   '** Compile useful statistics **'
   Dim uc As Integer, ac As Integer
   On Error 4091 Resume Next '* Ignore "bad unid" errors *
   If clipboard.isOpen() Then
	  Set dc = clipboard.allDocuments
	  Set clipdoc = dc.getFirstDocument
	  While Not clipdoc Is Nothing
		 '** Check for an existing document with the same unid.  If it exists, replace its contents.
		 Set doc = Nothing
		 Set doc = targetDB.getDocumentByUNID(clipdoc.universalID)
		 If doc Is Nothing Then
			ac = ac + 1
		 Else
			doc.remove True
			uc = uc + 1
		 End If
		 Set doc = New NotesDocument(targetDB)
		 clipdoc.copyAllItems doc, True
		 doc.universalID = clipdoc.universalID
		 doc.save True, False, True
		 Set clipdoc = dc.getNextDocument(clipdoc)
	  Wend
	  If ac + uc = 0 Then
		 Print "Nothing to Do.  Please select and copy the documents first."
	  Else
		 Print "Done import: " & ac & " additions, " & uc & " updates."
	  End If
   Else
	  Error 1, "Could not open the clipboard.  Please select and copy the documents first."
   End If
End Sub
взял
[DOUBLEPOST=1464188994,1464188892][/DOUBLEPOST]т.е. чекаем спец. БД на присутствие там доков
 
вариант по коду, чиста позырить - что в буфере
Код:
Sub checkClipBoard
   Dim clipboard As New NotesDatabase("", "~clipbrd.ncf")
   Dim dc As NotesDocumentCollection, sDoc As String
   Dim doc As NotesDocument, clipdoc As NotesDocument
   '** Compile useful statistics **'
   Dim uc As Integer, ac As Integer
   On Error 4091 Resume Next '* Ignore "bad unid" errors *
   If clipboard.isOpen() Then
	  Set dc = clipboard.allDocuments
	  Set clipdoc = dc.getFirstDocument
	  While Not clipdoc Is Nothing
		 '** Check for an existing document with the same unid.  If it exists, replace its contents.
		 ac = ac + 1
		 sDoc = sDoc &clipdoc.universalID &{:} &clipdoc.Getitemvalue({Form})(0) &Chr(10)
		 'doc.save True, False, True
		 Set clipdoc = dc.getNextDocument(clipdoc)
	  Wend
	  If ac = 0 Then
		 Print "Nothing to Do.  Please select and copy/cut the documents first."
	  Else
		 MsgBox sDoc
	  End If
   Else
	  Error 1024, "Could not open the clipboard.  Please select and copy the documents first."
   End If
End Sub
просто сравним UNID при удалении со списком оных, в БД буфера, если есть - принимаем действия (восстанавливаем, например)
 
Узнал на днях, что для агента и библиотек на LS можно задать Property Get/Set.
Вопрос: зачем это было нужно?
Предполагаю - "для доступа к private переменным", может быть объектам... Но картинка пока не ясная..
 
например, можно использовать Property Get в библиотеке для использования объекта в качестве статического.

Код:
Public Property Get DbManager
    If(dbm Is Nothing) Then
        Set dbm = New DbManager()
    End If
   
    Set DbManager = dbm
End Property

В таком случае можно использовать Set db = DbManager.getDb({dbFilePathOrReplica}) не прибегая к явному вызову New в своем коде.
В статическом объекте так же можно организовать кеш.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!