понедельник, 28 июля 2014 г.

Выгрузка вложений из документов на диск посредством java кода

Файлы хранятся как вложения. Достать без клиента Notes можно:
1) HTTP (если поднят web сервер и разрешен доступ через web к базе а по дефолту так и есть). Нужно знать а) UNID документа б) имя вложения.
тогда URL такой http(s)://yourServer/path/to/database.nsf/0/<UNID>/$FILE/<nameOfAttachmentFile>
минусы - надо знать UNIDы документов и наименования файлов вложений. Есть правда еще варианты сделать собственные представлния с еменами вложений и отдачей этих вьюх в виде JSON или XML, но если с лотусом туго, то они не стоят упоминания.

2) Java + DIIOP (CORBA в Lotus так называется)
для этого нужно
а) поднять на сервере DIIOP (load diiop на консоли сервера, по умолчанию не поднят)
б) взять ncso.jar из клиента или сервера (%PathToNotes%/data/domino/java/ncso.jar например)
ц) запустить что-то типа этого (модифицированный пример из хелпы):

import lotus.notes.*; //для этого нужен ncso.jar
import java.util.Vector;
import java.util.Enumeration;

public class SuperFileExtractor {
  public void static void main(String argv[]) {
    try {
      Session session = NotesFactory.createSession("serverName","userName","password");
   
      Database db = session.getDatabase("serverName","Path/to/yourDatabase.nsf");
      DocumentCollection dc = db.getAllDocuments();
      Document doc = dc.getFirstDocument();
   
      while (doc != null) {
   // вариант 1 - выбрать все вложения из RTF поля BODY (может и по другому называться)
        RichTextItem body = (RichTextItem)doc.getFirstItem("Body");
        Vector v = body.getEmbeddedObjects();
        Enumeration e = v.elements();
        while (e.hasMoreElements()) {
          EmbeddedObject eo = (EmbeddedObject)e.nextElement();
          if (eo.getType() == EmbeddedObject.EMBED_ATTACHMENT) {
            eo.extractFile("path/To/Extaction/Dir/" + eo.getSource());
 }
        }
//END OF вариант 1

//вариант 2 - выбрать вложение по имени (Аttachment.doc например)
EmbeddedObject eo = doc.getAttachment("Attachment.doc");
if(oe != null){
eo.extractFile("/path/To/Extraction/Dir/" + oe.getSource());
}
// END OF вариант 2

        doc = dc.getNextDocument();
      }
    } catch(NotesException e) {
      System.out.println(e.id + " " + e.text);
      e.printStackTrace();
    }
  }
}

//Ссылка на оригинал

Отправка письма из Лотуса в формате HTML

Dim s As New NotesSession
Dim db As NotesDatabase
Dim mime As NotesMIMEEntity
Dim memo As NotesDocument

Set db=s.CurrentDatabase
Set memo = db.CreateDocument  
Set result = memo.CreateMIMEEntity("Body")
Dim hdr As NotesMIMEHeader
Set hdr = result.CreateHeader("MIME-Version")
Call hdr.SetHeaderValAndParams(|1.0|)
   
Set mime = result.CreateChildEntity( )
Dim stream As NotesStream
   
Set stream = s.CreateStream
s.ConvertMIME = False ' Restore conversion

stream.WriteText {<body>Тут пишем html-текст</body>}
mime.SetContentFromText stream, "text/html; charset=Windows-1251", ENC_IDENTITY_8BIT  
'приаттачивание файлов
Set rtdoc=doc.GetFirstItem("Files")
    If ( rtdoc.Type = RICHTEXT ) Then
        If Not Isempty(rtdoc.EmbeddedObjects) Then
            Set mime = result.CreateChildEntity( )
            Forall object In rtdoc.EmbeddedObjects
                If (object.Type = EMBED_ATTACHMENT ) Then
                    filepath =Environ("Temp")+"\"+Cstr(Object.Name)
                    Call object.ExtractFile(filepath)
                   
                    tmpSource=Object.Source
                    i=i+1
NameSource:
                    If i=0 Then
                        Redim Preserve filenames(0)
                        filenames(0)=Object.Source
                    Else
                        For j=0 To Ubound(filenames)
                            If filenames(j)=tmpSource Then
                                tmpSource=Strleft(Object.Source,".")+Cstr(n)+"."+Strright(Object.Source,".")
                                n=n+1
                                Goto NameSource
                            End If
                        Next
                        'tmpSource=Strleft(Object.Source,".")+"_"+Cstr(n-1)+"."+Strright(Object.Source,".")
                        Redim Preserve filenames(Ubound(filenames)+1)
                        filenames(Ubound(filenames))=tmpSource
                    End If
                   
                    tmp=Evaluate({@ReplaceSubstring(@URLEncode("UTF-8";"}+Cstr(tmpSource)+{");"%";"=")})
                    filename="=?utf-8?Q?"+tmp(0)+"?="
                   
                    Set mime = result.CreateChildEntity( )
                   
                    Set hdr = mime.CreateHeader("Content-Disposition")
                    Call hdr.SetHeaderValAndParams(|attachment; filename="|+filename+|"|)
                    Set hdr = mime.createHeader("Content-ID")
                    Call hdr.setHeaderVal(filename)
                    Set stream = s.CreateStream
                    stream.Open filepath, "binary"
                    mime.SetContentFromBytes stream, |application/octet-stream; name="|+filename+|"|, ENC_BINARY
                    mime.EncodeContent ENC_BASE64
                    Kill filepath
                End If
            End Forall      
        End If
    End If

Call memo.CloseMIMEEntities(True, "Body")
memo.SendTo ="Кому "
memo.Principal="От кого"
memo.INetFrom="От кого"
memo.Subject = "Тема"
Call memo.Send(False)
s.ConvertMIME = True ' Restore conversion

Ссылка на оригинал

четверг, 24 июля 2014 г.

Нахождение разницы в днях между двумя датами

'Первые три параметра относятся к дате, которую вычитают. Вторые три параметра относятся к дате из которой вычитают
Function  Betwindate(Byval d1 As Integer , Byval  m1 As Integer , Byval y1 As Integer , Byval d2 As Integer , Byval m2 As Integer, Byval y2 As Integer ) As Long
    Dim Result As Long
    Dim n1 As Long
    Dim n2 As Long
 
    If m1>2 Then
        m1 = m1+1
    Else
        m1 = m1+13
        y1 = y1-1
    End If
    n1 = 36525*y1\100+306*m1\10+d1
    If m2>2 Then
        m2 = m2+1
    Else
        m2 = m2+13
        y2 = y2-1
    End If
    n2 = 36525*y2\100+306*m2\10+d2
    Result = n2-n1
 
    Betwindate= Result
End Function

Оригинальная ссылка на форум codeby.net