SDKでできること ~初級編~

SDKでできること ~初級編~

これからSDKで開発する人や既に開発している人のために、SDKでどんなことができるのか、サンプルを紹介していきます。

ASP.NETの知識があれば、FullWEB SDKの知識ゼロでも読み進められます。
(以下のサンプルコードはVisual Basicで書いています)

第1回 右クリックメニューにオリジナルのコマンドを追加する

第1回の今回は、右クリックメニューにオリジナルのコマンドを追加するサンプルです。
ファイルを1つ選択して右クリックメニューの「拡張コマンド」をクリックすると、自作画面にファイルの属性値を表示させるプログラムを作っていきましょう。


まずはVisual Studio で開発環境を整えます。
(FullWEB SDKマニュアルに掲載しています)

準備ができたらプロジェクトにあるWeb.configを開いての子要素に以下を追加します。

<cmd caption=”拡張コマンド” targeturl=”javascript:void(0);” begingroup=”true” index=”3″ validcount=”0″ description=””>

これだけで右クリックメニューにオリジナルのコマンドが追加されていますので確認してみます。
Visual Studio から「デバッグの開始」を実行し、ブラウザが起動したらFullWEBにログインします。
右クリックメニューを表示すると、「拡張コマンド」というメニューが追加されているのが確認できます。

画像

今はまだ「拡張コマンド」メニューをクリックしても何も起きません。

上記でWeb.configに追加した要素について説明します。
各属性の意味は下記表の通りです。

属性名 内容
 caption メニューに表示されるキャプションです。
 begingroup メニューの直前にセパレータを追加するかどうかを指定します。
 index ポップアップの何番目にメニューを挿入するかを指定します。ポップアップの先頭に表示する場合は 1、末尾に挿入する場合は-1を指定します。
挿入位置はGUI編集モードでの並び順に従って挿入されます。一度GUI編集モードにして並び順を確認してから位置を決めてください。
 validcount メニューが有効になるために必要な選択ファイルの数を指定します。

設定値 有効になる条件
 0 常に有効
 1 ファイルが1つだけ選択されているときに有効
 2 ファイルが1つ以上選択されているときに有効
 description プラグインの内容を表す文字列を設定します。

targeturl にjavascript: 疑似プロトコルでvoid(0)としていたので何も動きませんでした。
試しに下記のようにすると、メニュークリック時にアラートが表示されることが確認できるはずです。

<cmd caption=”拡張コマンド” targeturl=”javascript:alert(‘拡張コマンド’);” begingroup=”true” index=”3″ validcount=”0″ description=”” />

それでは、残りの処理を作成していきましょう。

選択されたファイルの属性値を自作画面に表示する流れは以下になります。

1.「拡張コマンド」がクリックされたら、HTMLに埋め込まれている選択行のファイル番号を取得する

2.自作画面を起動して、ファイル番号を渡す

3.自作画面は、ファイル番号をもとに属性値を取得して画面に表示する

1、2の処理は、JavaScriptでの処理になります。
選択行のファイル番号を取得するJavaScript関数が用意されてますのでそれを使います。
一連の処理をWeb.configのtargeturl のjavascript: 疑似プロトコルに記載するのはメンテナンス性がよくありません。
FullWEBが読み込んでいるExCmdFileList.js という外部ファイルに関数として定義することにします。

Visual Studioのソリューション エクスプローラーで、「すべてのファイルを表示」ボタンをクリックします。

画像:Visual Studioのソリューション エクスプローラー画面

ExCmdFileList.js を開いて以下の関数を定義します。

function exCmdClickHandler() {
    SetSelectedInfo();
    if (nSelFid > 0) window.open("ExFile.aspx?fid="+nSelFid,"_blank","resizable=yes,fullscreen=yes");
}

SetSelectedInfo() は選択行のファイル番号を取得するJavaScript関数です。
SetSelectedInfo() を実行すると、選択行のファイル番号がnSelFid 変数 に格納されます。
JavaScriptのwindow.open() でExFile.aspxというページを呼び出しています。
ExFile.aspxはまだ存在しません。このあと作成します。
クエリパラメータでExFile.aspx にファイル番号を渡しています。

拡張コマンドメニューをクリックしたときに、上記のexCmdClickHandler()が呼ばれるように
Web.configの<cmd>要素の内容を以下のように変更します。
validcountも変更して、1ファイル選択時にメニューが有効になるようにしています。

<cmd caption=”拡張コマンド” targeturl=”javascript:exCmdClickHandler();” begingroup=”true” index=”3″ validcount=”1″ description=”” />

次に、ExFile.aspxを作成します。
Visual Studioのソリューション エクスプローラーでプロジェクトを右クリックし、[追加]>[Webフォーム]を選択します。
項目名を「ExFile」としてOKボタンをクリックします。

ExFile.aspxに属性値を表示するための表を追加しましょう。
Visual StudioのツールボックスからTableコンポーネントを追加します。

画像:Visual StudioのツールボックスからTableコンポーネントの画面説明

表の罫線を表示するようにプロパティを設定します。

画像:プロパティ画面

3の属性値の取得は、サーバ側での処理になります。
属性項目の情報を取得する流れは以下のようになります。

  1. 渡ってきたファイル番号を取得します。
  2. FullWEBログイン時に生成されているDatabaseオブジェクトを取得します。
    ※FullWEBの情報を取得するためには、Databaseオブジェクトが必要となります。
  3. Databaseオブジェクトを介して、ファイル番号からFileオブジェクトを取得します。
    ※ファイルの情報はFileオブジェクトに紐づいています。
  4. Fileオブジェクトから分類ラベル情報(Attributesオブジェクト)を取得します。
    ※ログインユーザの権限にもとづいて情報が取得されますので、権限を気にする必要はありません。
  5. 分類ラベルごとに属性項目情報(Attributeオブジェクト)を取得します。
  6. 取得した属性項目の項目名を表のヘッダ行に、属性値をデータ行に追加します。
    ※ヘッダに表示する項目名は「分類ラベル名\属性項目名」の形式にします。

Visual StudioでExFile.aspxのコードビハインド(ExFile.aspx.vb)を表示します。
Visual Studioによって、Page_Loadイベントハンドラが生成されていますので、ここに処理を追加します。

コード全体は以下のようになります。

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        ' 選択ファイルのファイル番号
        Dim fid As Integer = CInt(Request.Params("fid"))
	
        Dim db As cnWebCoreTest.Database = GetDB(Me)
	
        Dim f As cnWebCoreTest.File = db.SafeGetFile(fid)
	
        Dim header As New TableRow()    ' ヘッダ行
        Dim datarow As New TableRow()   ' データ行
	
        ' 分類ラベルの数だけ繰り返す
        For i As Integer = 1 To f.AttrsCount
            ' 分類ラベル取得
            Dim attrs As cnWebCoreTest.Attributes = f.Attrs(i)
	
            ' 属性項目の数だけ繰り返す
            For j As Integer = 1 To attrs.Count
                Dim attr As cnWebCoreTest.Attribute = attrs.Item(j)
	
                ' ヘッダに追加(分類ラベル名\属性項目名)
                header.Cells.Add(New TableCell() With {.Text = attr.AgName & "\" & attr.Name})
                datarow.Cells.Add(New TableCell() With {.Text = attr.Value})
            Next
        Next

        Table1.Rows.Add(header)
        Table1.Rows.Add(datarow)

プロジェクトをビルドしたら動きを確認します。
実行すると下記のような画面が表示されます。

画像:実行後の画面

第2回 自動登録ツール

第2回の今回は、自動登録ツールのサンプルです。
フォルダ内のファイルをFullWEBに登録する実行可能ファイル(EXEファイル)を作ります。
このプログラムをWindowsのタスク スケジューラに設定して定期的に処理を実行させます。


SDK開発環境の準備ができたら、Visual Studio でコンソールアプリケーションのプロジェクトを新規作成します。
(開発環境についてはFullWEB SDKマニュアルに掲載しています)

プログラムの最初の部分は、指定フォルダにファイルが存在するかどうかを確認することです。
ファイルが存在したら、FullWEBへ接続(ログイン)します。
すべての処理が完了したら、必ずログアウトする必要があります。
まずは、この部分を作ります。

    Const server As String = "localhost"                  ' 接続先
    Const user As String = "admin"                         ' ユーザ名
    Const password As String = ""                          ' パスワード	
    Const inDir As String = "D:¥tmp¥test¥IN"       ' ファイル配置フォルダ

    Dim lm As cnWebCoreTest.LoginManager = Nothing

    Try				
        Dim files() As String = IO.Directory.GetFiles(inDir)
	
        If files.Length = 0 Then
            ' 処理対象ファイル0件なので終了
            Return
        End If

        ' ログイン情報
        Dim xParam As XElement = <param
                                     mode="new"
                                     lcuser=<%= user %>
                                     lctime=<%= Now.ToString("yyyyMMddHHmmss") %>
                                     atime=<%= Now.ToString("yyyyMMddHHmmss") %>
                                     pc=""
                                     ipaddr=""
                                     datakey=""/>
        lm = cnWebCoreTest.LoginManager.CreateInstance(server, xParam)
        ' ログイン
        Dim err As String = lm.Connect(lm.UserName, password, True)

    Finally
        ' 必ずログアウト
        If lm IsNot Nothing Then
            lm.Disconnect()
        End If
    End Try

SDKのログイン処理は、LoginManagerクラスのConnect() メソッドで行います。
ログインに必要な情報はXML形式で指定します。
try句の中でログイン処理を行い、finally句で必ずログアウトするようにします。
※Connect() メソッドの第三引数には、Windowsアプリケーションから利用する場合はTrueを設定してください。

ログインができたらDatabaseオブジェクトを取得します。
※FullWEBの情報を取得するために必要なオブジェクトです。


    Dim db As cnWebCoreTest.Database = lm.Database

FullWEBへのファイル登録を担当するのはEntryItemsオブジェクトです。
Databaseオブジェクトから取得します。


    Dim eis As cnWebCoreTest.EntryItems = db.EntryItems

EntryItemsオブジェクトを使ったファイル登録の流れは以下のようになります。

  1. EntryItemsオブジェクトのAddNewItem() でFileオブジェクトを生成します。
    AddNewItem() の引数パラメータには、登録ファイルのフルパスを指定します。
    この時点ではまだファイルはFullWEBに登録されていません。

  2. FileオブジェクトのCheckIn() メソッドでファイルをFullWEBに登録します。

コードは以下になります。

    Dim eis As cnWebCoreTest.EntryItems = db.EntryItems

    eis.Clear()

    ' ファイルを登録
    Dim f As cnWebCoreTest.File = eis.AddNewItem(filePath)
    f.CheckIn(Nothing, True)

※Clear() でEntryItemsオブジェクトを初期化します。
※CheckIn() の第一引数は登録先フォルダです。

登録先フォルダのオブジェクトを指定することで、FullWEBからドラッグスルー&ドロップしたときと同様に属性値やアクセス権が付加されます。
今回は登録先フォルダを指定しないためNothingを指定しています。
第二引数には、登録後にローカルファイルを削除するかどうかを指定します。Trueの場合、登録後にローカルファイルを削除します。

今回は、以下の処理を追加で行いましょう。
登録したファイルに、「自動登録」という名前の分類ラベルを付与することにします。
FileオブジェクトのAddAttr() メソッドで行います。

    ' ファイルを登録
    Dim f As cnWebCoreTest.File = eis.AddNewItem(filePath)
    ' 分類ラベル付与
    f.AddAttr("自動登録")
    Dim fid As Integer = f.CheckIn(Nothing, True)

以上の処理を指定フォルダ内のファイル数だけ繰り返します。
コード全体は以下のようになります。
※エラーがあった場合は、コンソールにエラー内容を表示するようにしています。

    Sub Main()
        Const server As String = "localhost"                  ' 接続先
        Const user As String = "admin"                        ' ユーザ名
        Const password As String = ""                         ' パスワード
        Const inDir As String = "D:¥tmp¥test¥IN"              ' ファイル配置フォルダ
        Const errDir As String = "D:¥tmp¥test¥ERROR"          ' エラーファイル配置フォルダ
        Const labelName As String = "自動登録"                 ' 付与する分類ラベル名

        Dim needNotitication As Boolean = False               ' ユーザへの通知が必要な場合はTrue
        Dim lm As cnWebCoreTest.LoginManager = Nothing

        Try
            ' ファイルを取得
            Dim files() As String = IO.Directory.GetFiles(inDir)

            If files.Length = 0 Then
                ' 処理対象ファイル0件なので終了
                Return
            End If

            ' ログイン情報
            Dim xParam As XElement = <param
                                         mode="new"
                                         lcuser=<%= user %>
                                         lctime=<%= Now.ToString("yyyyMMddHHmmss") %>
                                         atime=<%= Now.ToString("yyyyMMddHHmmss") %>
                                         pc=""
                                         ipaddr=""
                                         datakey=""/>
            lm = cnWebCoreTest.LoginManager.CreateInstance(server, xParam)
            ' ログイン
            Dim err As String = lm.Connect(lm.UserName, password, True)

            If err <> "" Then
                ' ログインエラーなら終了
                Throw New System.Exception(err)
            End If

            Dim db As cnWebCoreTest.Database = lm.Database
	
            Dim eis As cnWebCoreTest.EntryItems = db.EntryItems

            For Each filePath As String In files
                Try
                    eis.Clear()	

                    ' ファイルを登録
                    Dim f As cnWebCoreTest.File = eis.AddNewItem(filePath)
                    ' 分類ラベル付与
                    f.AddAttr(labelName)
                    f.CheckIn(Nothing, True)
                Catch ex As Exception
                    ' エラーをコンソールに表示してユーザに通知
                    needNotitication = True
                    Console.WriteLine(ex.Message)
                End Try
            Next
        Catch ex As Exception
            ' エラーをコンソールに表示してユーザに通知
            needNotitication = True
            Console.WriteLine(ex.Message)
        Finally
            ' 必ずログアウト
            If lm IsNot Nothing Then
                lm.Disconnect()
            End If
        End Try

        If needNotitication Then
            ' コンソール画面は開いたままにする
            Console.Write("press any key ... ")
            Console.ReadKey()
        End If
    End Sub

プロジェクトをビルドしたらタスク スケジューラに設定しましょう。
以下は、1時間ごとにツールを起動するタスクの例です。

画像:画面説明

これで完成です。
指定フォルダにファイルを配置しておくと、定期的にFullWEBに登録されます。

第3回 自動登録ツールのサンプルを改良してより汎用的にする

第3回の今回は、第2回の自動登録ツールのサンプルを改良してより汎用的にします。
第2回では新規登録するSDKの使い方をご紹介しました。
今回はそれに加え、既存ファイルの検索、承認状態の確認、上書きチェックイン、改訂チェックインの方法をご紹介します。


完成したプログラム全体の動きは次のようになります。

画像:全体の動きフローチャート

1 プログラムを起動し、指定フォルダから登録ファイル一覧を取得し、ファイルごとにループ
1-1 ファイル名で登録済みファイルを検索
1-2 未登録の場合、新規登録(第2回のサンプルで実装済み)
1-3 登録済みファイルの更新日時から変更がない場合、何もせずにスキップ
1-4 登録済みファイルが承認中の場合、何もせずにスキップ
1-5 登録済みファイルが承認済みの場合、改訂チェックアウトしてチェックイン
1-6 登録済みファイルが未承認の場合、チェックアウトして上書きチェックイン
1-7 登録済みファイルが複数見つかった場合、何もせずにスキップ

登録済みファイルの検索

ファイルの検索には VirtualFolderクラスを使います。
今回の場合、次のコードとなります。

'   ファイル名で検索
Dim xConditions As XElement = <conditions function="AND">
                                  <condition>		
                                      <category><%= cnWebCoreTest.cnCondCategory.chCateFileName %></category>
                                      <operation>chCondOpEq</operation>
                                      <value><%= fileName %></value>
                                  </condition>
                              </conditions>
Dim vf As cnWebCoreTest.VirtualFolder = db.GetSearchVF(xConditions.ToString)
Select Case vf.Files.Count
    Case 0
        '   未登録の場合、新規登録
    Case 1
        '   登録済みの更新対象ファイルを取得
        Dim f As cnWebCoreTest.File = vf.Files.Item(1)
    Case Else
        '   登録済みファイルが複数見つかった場合、スキップ
End Select

検索条件は XML で指定します。
<condition>が属性検索画面の1行分を表し、それぞれ以下のように対応しています。

画像:属性検索画面の説明

複数の検索条件を指定する場合は <condition> タグを複数記述します。
また、複数の検索値を指定する場合は <value> タグを複数記述します。
詳細はSDKマニュアルを参照してください。

検索結果は VirtualFolder オブジェクトの Files プロパティで取得します。
Files.Count が検索結果の件数になりますので、0件なら未登録なので新規登録、2件以上ある場合は
更新対象が特定できないのでエラーとします。

ファイル属性の確認

検索結果の File オブジェクトを取得したら、プロパティで更新日時と承認状態を確認します。
更新日時は File.ModifiedDate で取得できます。
FullWEB のファイル属性の更新日時は登録(またはチェックイン)したファイルの更新日時が設定されますので、
この値と登録しようとしているファイルの更新日時を比較することで更新の有無が確認できます。
(実際のアプリケーションではファイルサイズなど別の条件も確認して更新の有無を確認します。)

画像:ファイル属性の確認

ファイルの状態は File.Status で取得でき、FullWEBの検索結果のアイコンと対応しています。
Status はビット割で複数の状態を表すので、目的の状態を判定するためには論理演算を行います。

結果、次のようなコードとなります。

If f.ModifiedDate = IO.File.GetLastWriteTime(filePath) Then
    '   登録済みファイルの更新日時から変更がない場合、何もせずにスキップ
    Continue For
End If

If (f.Status And cnWebCoreTest.cnFileStatusBit.cnFStatApproving) > 0 Then
    '   承認中はスキップ
    Continue For
End If

'   承認状態に応じてチェックアウトの方法を切り替える
If (f.Status And cnWebCoreTest.cnFileStatusBit.cnFStatApproved) > 0 Then
    '   登録済みファイルが承認済みの場合、改訂チェックアウト
Else
    '   登録済みファイルが未承認の場合、改訂せずにチェックアウト
End If

ファイルのチェックアウト・チェックイン

SDKのチェックアウトはデータベースの更新のみを行います。
CheckOutコマンドは FullWEBのチェックアウト画面と対応します。

画像:FullWEBのチェックアウト画面

revXX 引数を省略した場合、改訂するのチェックOFFの動きとなります。

チェックインは Fileオブジェクトにチェックアウト先のファイルを設定後、新規登録と同じインターフェイスで処理を行います。

ポイント: チェックアウト先のフルパスには拡張子の後ろにダミーの拡張子を追加してください。
チェックイン時にはダミーの拡張子部分が削除されてデータ領域にファイルが格納されます。

結果として、コードは次のようになります。

'   承認状態に応じてチェックアウトの方法を切り替える
If (f.Status And cnWebCoreTest.cnFileStatusBit.cnFStatApproved) > 0 Then
    '   登録済みファイルが承認済みの場合、改訂チェックアウト
    f.CheckOut(filePath, "", "", "改訂理由", "改訂内容")
Else
    '   登録済みファイルが未承認の場合、改訂せずにチェックアウト
    f.CheckOut(filePath, "")
End If

'   チェックイン用にファイルの末尾にダミー拡張子を付与
Dim copath As String = String.Format("{0}.{1}", filePath, Guid.NewGuid.ToString)
IO.File.Move(filePath, copath)

'   チェックイン用にFileオブジェクトを取得してチェックアウト先を指定し、チェックイン
f = db.GetFile(f.Fid)
f.LocalFile.LocalPath = copath

f.AddAttr(labelName)
Dim fid As Integer = f.CheckIn(Nothing, True)

m_log.Info("ファイル更新完了 FID={0}", fid)

最終的にコードは以下のようになりました。
既存ファイルの検索条件を図面番号にしたり、更新時に属性を設定したり、用途に合わせてカスタマイズしてください。
なお本サンプルは最低限のエラー処理のみ記載しています。あらかじめご了承ください。

    Sub Main()
        Const server As String = "dev2"            ' 接続先
        Const user As String = "test1"                  ' ユーザ名
        Const password As String = ""             ' パスワード
        Const inDir As String = "D:¥tmp¥test¥IN"        ' ファイル配置フォルダ
        Const labelName As String = "自動登録"          ' 付与する分類ラベル名

        Dim needNotitication As Boolean = False
        Dim lm As cnWebCoreTest.LoginManager = Nothing

        Try
            Dim files() As String = IO.Directory.GetFiles(inDir)

            If files.Length = 0 Then
                ' 処理対象ファイル0件なので終了
                Return
            End If

            ' ログイン
            Dim xParam As XElement = <param
                                         mode="new"
                                         lcuser=<%= user %>
                                         lctime=<%= Now.ToString("yyyyMMddHHmmss") %>
                                         atime=<%= Now.ToString("yyyyMMddHHmmss") %>
                                         pc=""
                                         ipaddr=""
                                         datakey=""/>
            lm = cnWebCoreTest.LoginManager.CreateInstance(server, xParam)
            Dim err As String = lm.Connect(lm.UserName, password, True)

            If err <> "" Then
                Throw New System.Exception(err)
            End If

            Dim db As cnWebCoreTest.Database = lm.Database
            Dim eis As cnWebCoreTest.EntryItems = db.EntryItems

            For Each filePath As String In files
                Dim fileName As String = IO.Path.GetFileName(filePath)
                Console.Write("{0} -- ", fileName)

                '   ファイル名で検索
                Dim xConditions As XElement = <conditions function="AND">
                                                  <condition>
                                                      <category><%= cnWebCoreTest.cnCondCategory.chCateFileName %></category>
                                                      <operation>chCondOpEq</operation>
                                                      <value><%= fileName %></value>
                                                  </condition>
                                              </conditions>
                Dim vf As cnWebCoreTest.VirtualFolder = db.GetSearchVF(xConditions.ToString)
                Select Case vf.Files.Count
                    Case 0
                        '   未登録の場合、新規登録
                        Try
                            eis.Clear()

                            ' ファイルを登録
                            Dim f As cnWebCoreTest.File = eis.AddNewItem(filePath)
                            ' 分類ラベル付与
                            f.AddAttr(labelName)
                            Dim fid As Integer = f.CheckIn(Nothing, True)

                            m_log.Info("ファイル登録完了 FID={0}", fid)
                            Console.WriteLine("[新規登録] fid={0}", fid)
                        Catch ex As Exception
                            needNotitication = True
                            Console.WriteLine(ex.Message)
                            m_log.WarnException(ex.Message, ex)
                        End Try
                    Case 1
                        Dim f As cnWebCoreTest.File = vf.Files.Item(1)

                        If f.ModifiedDate = IO.File.GetLastWriteTime(filePath) Then
                            '   登録済みファイルの更新日時から変更がない場合、何もせずにスキップ
                            m_log.Info("[{0}]は登録済みファイルと更新日時[{1}]が同じであるため、処理をスキップ",
                                       fileName, f.ModifiedDate.ToString("yyyy/MM/dd HH:mm:ss"))
                            Console.WriteLine(" [スキップ] 更新なし")
                            Continue For
                        End If

                        If (f.Status And cnWebCoreTest.cnFileStatusBit.cnFStatApproving) > 0 Then
                            '   承認中はスキップ
                            m_log.Info("[{0}]は承認中であるため、処理をスキップ", fileName)
                            Console.WriteLine(" [スキップ] 承認中")
                            Continue For
                        End If

                        '   承認状態に応じてチェックアウトの方法を切り替える
                        If (f.Status And cnWebCoreTest.cnFileStatusBit.cnFStatApproved) > 0 Then
                            '   登録済みファイルが承認済みの場合、改訂チェックアウト
                            f.CheckOut(filePath, "", "", "改訂理由", "改訂内容")
                            Console.Write("[改訂登録]")
                        Else
                            '   登録済みファイルが未承認の場合、改訂せずにチェックアウト
                            f.CheckOut(filePath, "")
                            Console.Write("[上書き登録]")
                        End If

                        '   チェックイン用にファイルの末尾にダミー拡張子を付与
                        Dim copath As String = String.Format("{0}.{1}", filePath, Guid.NewGuid.ToString)
                        IO.File.Move(filePath, copath)

                        '   チェックイン用にFileオブジェクトを取得してチェックアウト先を指定し、チェックイン
                        f = db.GetFile(f.Fid)
                        f.LocalFile.LocalPath = copath
                        ' 分類ラベル付与
                        f.AddAttr(labelName)
                        Dim fid As Integer = f.CheckIn(Nothing, True)

                        m_log.Info("ファイル更新完了 FID={0}", fid)
                        Console.WriteLine(" fid={0}", fid)
                    Case Else
                        '   登録済みファイルが複数見つかった場合、スキップ
                        m_log.Info("[{0}]は登録済みファイルが[{1}]件あるため処理をスキップ", fileName, vf.Files.Count)
                        Console.WriteLine(" [スキップ] 登録済み{0}件", vf.Files.Count)
                End Select
            Next
        Catch ex As Exception
            needNotitication = True
            Console.WriteLine(ex.Message)
        Finally
            ' 必ずログアウト
            If lm IsNot Nothing Then
                lm.Disconnect()
            End If
        End Try

        If needNotitication Then
            ' コンソール画面は開いたままにする
            Console.Write("press any key ... ")
            Console.ReadKey()
        End If
    End Sub
第4回 ステータス変化に応じた自動処理

FullWEBには「よく使う検索フォルダ」という種類のフォルダがあります。
このフォルダには検索条件を設定することができ、フォルダをクリックするだけで検索条件に該当するファイルが表示されます。

画像:よく使う検索フォルダ例
図 1よく使う検索フォルダ例(廃棄申請中のファイルを分類するフォルダ

検索結果に対して以下のような管理処理を実施することがよくあります。これらの処理を自動化し、運用管理者の負担を下げたいという要望があります。

  • CSVファイルにまとめて情報抽出する。
  • 利用停止となったデータを削除する。
  • アクセス権限の変更で公開範囲を変更する。

今回はSDKを用いて、指定した条件を満たしたデータに対して自動処理を実施する例を紹介します。

<実施内容>

 定期的(※1)に廃棄対象を取得し、取得結果の個々のアクセス権限から読み込み権を削除し、一般利用者から検索できない状態とする。これを持って廃棄とする。

<FullWEB基本機能での設定>

「よく使う検索フォルダ」に、廃棄処理対象を表示するフォルダを作成する。

  • 納品から10年経過したデータ
  • ステータス管理属性が[廃棄申請中] となったデータ

<SDKで開発する内容>

  • フォルダ内のすべてのデータに設定されているアクセス権限から読み込み権を削除する。
  • 廃棄処理が済んだことを表すためにステータス管理属性を[廃棄済み]に変更する。

※1 定期的に処理実行するプログラムは第2回:自動登録のMain処理が利用できます。

'   自動処理対象を集めた「よく使う検索フォルダ」の取得
Dim vf As cnWebCoreTest.VirtualFolder =
           db.VirtualFolder("共有よく使う検索\システム管理")
Dim childcnt As Integer = vf.ChildCount
'   自動処理対象条件が設定されたサブフォルダの展開
For idx_vf = 1 To childcnt
    Dim vfc As cnWebCoreTest.VirtualFolder = vf.Child(idx_vf)
    '   フォルダ名で処理内容を分岐
    Select Case vfc.Name
           Case "1.公開"
              '----------------------------------------------
              '   公開処理
              '----------------------------------------------
           Case"2.生産システム連携"
              '----------------------------------------------
              '   生産システム連携処理
              '----------------------------------------------

           Case "3.廃棄申請中"
              '----------------------------------------------
              '   廃棄処理
              '----------------------------------------------
              Dim fs As cnWebCoreTest.Files = vfc.Files
              '   フォルダ内のすべてのデータを取得する
              For idx_fs As Integer = 1 To fs.Count
                  Dim f As cnWebCoreTest.File = fs.Item(idx_fs)
                  '   アクセス権限の変更:アクセス権限を取得し、読み込み権限を削除した値を再設定する
                  For idx_fsa As Integer = 1 To f.Security.Count
                      f.Security.Item(idx_fsa).Value =
                          (f.Security.Item(idx_fsa).Value And
                          (Not cnWebCoreTest.cnSecurityFlag.cnSecurityFlagRead))
                  Next
                  '   スタータス属性の変更
                  Dim updateStatus As Boolean = False
                  For i As Integer = 1 To f.AttrsCount
                      Dim attrs As cnWebCoreTest.Attributes = f.Attrs(i)
                      For j As Integer = 1 To attrs.Count
                          Dim attr As cnWebCoreTest.Attribute = attrs.Item(j)
                          If attr.Name = "ステータス" Then
                              attr.Value = "廃棄済み"
                              updateStatus = True
                              Exit For
                          End If
                      Next
                      If updateStatus Then
                          '   属性の更新処理
                          '   メール通知設定があれば標準機能でメール通知される
                          f.UpdateAttr(True)
                          Exit For
                      End If
                  Next
              Next
   End Select
Next

廃棄処理が自動処理されたことの把握は、ステータス管理属性が[廃棄済み]となったデータが検索されるフォルダを作成し、運用管理者にメール通知されるように仕込んでおくことで実現できます。

画像: 処理完了のメール通知設定
図 2 処理完了のメール通知設定

このようにパッケージに備えられた標準機能と、運用に必要な独自ルールの組み合わせにより、短時間で目的にあった機能の開発ができます。
また、この開発例では「よく使う検索フォルダ」を対象データの収集に利用していますので、運用ルールに変更があった時は、フォルダへの条件設定を変更することで対応可能です。

SDKでできること ~中級編~ >
SDKでできること TOPページ