0

私はすでに次のコードを使用して、ファイルを Livelink にコピーしています。

Public Function saveFileLL(target As Long, pathSource As String, fileName As String) As Boolean
    Dim dav As New ADODB.Record
    Dim files As New ADODB.Recordset
    Dim objStream As New ADODB.Stream
    Dim url As String

    If Not Val(Nz(target, 0)) > 0 Or Not pathSource Like "*.*" Or Not fileName Like "*.*" Then
        saveFileLL = False
        Exit Function
    End If

    url = URL_LIVELINK_DAV & target

    dav.Open url, , adModeReadWrite
    Set files = dav.GetChildren

    If Not (files.BOF And files.EOF) Then files.MoveFirst

    Do Until files.EOF
        If fileName Like Replace(files("RESOURCE_DISPLAYNAME"), "_", "?") Then Exit Do
        files.MoveNext
    Loop

    If files.EOF Then
        files.addnew "RESOURCE_PARSENAME", fileName
        files.Update
    End If

    files.Close
    dav.Close

    objStream.Open "URL=" & url & "/" & fileName, adModeWrite
    objStream.Type = adTypeBinary
    objStream.LoadFromFile pathSource
    objStream.Flush
    objStream.Close

    Set dav = Nothing
    Set files = Nothing
    Set objStream = Nothing

    saveFileLL = True
End Function

さて、タイトルが示すように、同じことをしたいのですが、フォルダーを使用します。私の質問は実際には Livelink に関連しているのではなく、一般的なフォルダーの処理方法に関連していると思います。すべてのサブフォルダー/ファイルをループせずに、すべての子を含むフォルダーを移動することは可能ですか? saveFileLL()そのために機能をどのように適応させることができますか?

編集:

以下は、objId によって設計された Livelink フォルダーに 1 つのフォルダーを直接作成できるコードの別の部分です。

Public Function CreateFolderToLLFolder(ObjId As String, folderName As String, Optional getId As Boolean = False) As String
    Dim davfile As New ADODB.Record
    Dim davFiles As New ADODB.Recordset
    Dim davDir As New ADODB.Record

    Dim newDirFields(1) As Variant
    Dim newDirValues(1) As Variant

    newDirFields(0) = "RESOURCE_PARSENAME"
    newDirValues(0) = folderName
    newDirFields(1) = "RESOURCE_ISCOLLECTION"
    newDirValues(1) = True

    Set davDir = connection(ObjId, "")
    Set davFiles = davDir.GetChildren()
    If (davFiles.Supports(adAddNew)) Then
        davFiles.addnew newDirFields, newDirValues
    End If

    davfile.Open davFiles, , adModeReadWrite
    CreateFolderToLLFolder = davfile.fields("urn:x-opentext-com:ll:properties:nodeid").value
End Function

Public Function connection(ObjId As String, Optional filename As String = "") As ADODB.Record
    Dim davDir As New ADODB.Record
    davDir.Open filename, "URL=http://livelink-server/livelinkdav/nodes/" & ObjId & "/", adModeReadWrite, adFailIfNotExists, DelayFetchStream, "", ""
    Set connection = davDir
End Function

これが機能する理由を聞かないでください。私はこれを見つけましたが、機能します。objId は、Livelink がすべてのファイル/フォルダーに与える一意の ID です。

ありがとうございました。

4

2 に答える 2

0

フォルダとその構成ファイル/サブフォルダのセット全体を1つのブロックとして保存するには、それらをzipしてから、zipファイルをアップロードします。このようにhttp://www.rondebruin.nl/windowsxpzip.htm

LiveLinkに構造を反映させたい場合は、コンテンツを複製するためにフォルダーツリーを探索する必要がありますが、ファイルとフォルダーツリーをループするためのvbaコードがたくさんあり、必要に応じてすべてsaveFileLL関数を呼び出すことができます。そのルートに行きます。

于 2013-01-15T18:39:02.977 に答える
0

私がやりたいことを実行する最も簡単な方法は、最終的に Livelink に統合された Web サービスを使用することです。Web には Livelink API 全体に関する情報があまりないため (最近 Google で見つけられる情報がすべてあることを考えると驚くべきことです)、私のソリューションをここに投稿します。それは実際にはとても簡単です。

私がしなければならなかったのは、Firefox にいくつかのアドオンをインストールすることだけでした (私は Fox を使用しましたが、他の人も仕事をするでしょう)。ほとんどの場合、操作は POST メソッドで行われます。Fox プラグインで 3 つの POST が送信されていることに気付きました.2 つは最初に 401 エラーを返し、3 番目は正しい 200 応答を返し、アクションを実行しました。

次に、Livelink は NTLM 認証に基づく SOAP サービスであると推測できます。ASP.net で開発されているようです。

VBA 内で Web サービスを使用するには、これほど簡単なことはありません。MSXML2 オブジェクトには Microsoft XML v6.0 ライブラリが必要です。

Dim sMsg As String
Dim sURL As String, postData As String
Dim ObjHTTP As Object

Set ObjHTTP = New MSXML2.XMLHTTP
sURL = "http://server.com/livelink/livelink.exe"
postData = "your-post-data"

ObjHTTP.Open "Post", sURL, False
ObjHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
ObjHTTP.send (postData)

Set ObjHTTP = Nothing

それと同じくらい簡単で、ある種のブラウザのプラグインを使用して適切な POST データを見つけるだけで、それを取得できます。投稿データのほとんどはエンコードされておらず、扱いが簡単です。

于 2013-01-17T15:33:37.323 に答える