martes, 15 de abril de 2014

Agregar adjuntos con dapihttp

En doorsapi puedo agregar un adjunto a un documento simplemente especificando la ruta al archivo:

doc.Attachments.Add "c:\archivo.txt"

O pasandole un ADODB.Stream cargado y el nombre:

Set oStream = CreateObject("ADODB.Stream")
oStream.Open
oStream.Type = 1 ' adTypeBinary
oStream.LoadFromFile "c:\archivo.txt"
doc.Attachments.Add oStream, "archivo.txt" ' Si paso un stream debo especificar el nombre

dapihttp implementa la coleccion Attachments del objeto Document, pero en solo-lectura, es decir, no puedo agregar nuevos adjuntos.
Para poder agregar un nuevo adjunto vamos a utilizar el metodo CustomScript del listener (ver Ejemplo de llamada a metodo no implementado en dapihttp). Vamos a utlizar el metodo del stream, ya que del lado del servidor no tengo acceso a mis archivos locales.

Creamos un Sub:

Sub DocAttachmentsAdd(ByRef pDoc, ByRef pStream, ByVal pName)
    Set oDom = pDoc.Session.XML.NewDom
    oDom.loadXML ""
    
    oDom.documentElement.setAttribute "method", "CustomScript"
    ' Cargamos un esquema que nos va a permitir manejar binarios
    oDom.documentElement.setAttribute "xmlns:dt", "urn:schemas-microsoft-com:datatypes"
    
    'Arg 0: El script
    ' node y newObj tambien estan disponibles como variables
    Set node = oDom.createNode("element", "item", "")
    node.Text = "Set obj = Session(CStr(Arg(1)))" & vbCrLf & _
                "Set node = oReq.documentElement.childNodes(2)" & vbCrLf & _
                "Set newObj = Server.CreateObject(""ADODB.Stream"")" & vbCrLf & _
                "newObj.Type = 1 ' adTypeBinary" & vbCrLf & _
                "newObj.Open" & vbCrLf & _
                "If Not IsNull(node.nodeTypedValue) Then newObj.Write node.nodeTypedValue" & vbCrLf & _
                "obj.Attachments.Add newObj, CStr(Arg(3))"
    oDom.documentElement.AppendChild node

    '1: Guid
    Set node = oDom.createNode("element", "item", "")
    node.Text = pDoc.ObjGuid
    oDom.documentElement.AppendChild node

    '2: File
    Set node = oDom.createNode("element", "item", "")
    ' Utilizamos bin encoded en Base64
    node.dataType = "bin.base64"
    node.nodeTypedValue = pStream.Read
    oDom.documentElement.AppendChild node

    '3: Att name
    Set node = oDom.createNode("element", "item", "")
    node.Text = pName
    oDom.documentElement.AppendChild node
    
    pDoc.Session.HttpCallDom (oDom)
End Sub

Para llamarlo:

Set oStream = CreateObject("ADODB.Stream")
oStream.Open
oStream.Type = 1 ' adTypeBinary
oStream.LoadFromFile "c:\archivo.txt"
DocAttachmentsAdd doc, oStream, "archivo.txt"

voila

No hay comentarios:

Publicar un comentario