2025/02/19

ソートはソートにあらず!?

今回は、Notes/Domino と他のシステムとの間でデータ交換を行うプログラムで経験したトラブルのご紹介です。


システム間の連携仕様

別のシステム内にあるマスタデータをノーツフォームの選択肢として利用したいとの要望があり、マスタデータをテキストファイルでもらい、ノーツ DB 内に文書として保存することにしました。

日々の更新に対応するべく、毎日夜間にマスタデータ全件をファイルを出力してもらい、未明にノーツエージェントで DB に取り込むこととしました。データ件数が多いこともあり、エージェントの処理は、全件削除して全件取り込みするのではなく、差分更新としました。そこで、連携ファイルはソートして出力してほしいと依頼しました。

 

エージェントの仕様

まず、エージェントの処理用にマスタデータをソートしたビューを作成します。そのビューを利用して、次のようなマスタ更新するエージェントを作成しました。

  1. ファイルから最初のマスタデータを取得
  2. ビューから最初の文書を取得
  3. お互いのデータを比較し、以下の処理を行う
    1. 一致する場合、ファイルとビューの双方から次のデータを取得
    2. ノーツにない場合は、ノーツにマスタデータを登録し、ファイルの次のデータを取得
    3. ファイルにない場合は、マスタデータを削除し、ビューから次のデータを取得
  4. ファイルとビュー両方のデータが最後になるまで 3 に戻る

お互いソートされたデータ同士なので順に存在確認すれば、追加 か 削除、更新しないを効率よく判断できるという算段です。


発生した問題点

運用後、エージェントは一見正常に動作していました。ただ、よくよくチェックすると、ファイルに更新がなくても一定数のデータの追加と削除が発生しました。


その原因がソートだったのです。


連携ファイルは他のシステムでソートされ、ビューはノーツでソートされています。同じ ”ソート” でもデータの並び順が違っていたのです。


ノーツだけでも問題は起こる

このようにソートしてもデータの並び順が発生する現象はシステムが違うから発生するとは限りません。ノーツだけでも同様の症状を再現できます。

以前『LotusScript で値のソートを作成』の記事で紹介したソートする関数 xSort を利用したサンプルエージェントを作成します。関数 xSort は割愛(先のリンクを確認ください)。

Option Declare

Sub Initialize
   Dim ns As New NotesSession
   Dim ndb As NotesDatabase
   Dim nd As NotesDocument

   Dim s As String
   Dim vSrc As Variant
   Dim vSort As Variant
   Dim i As Integer

   s = "Test,Test1,Test_1,Test-1,Test 1,Test2,Test_2,Test-2,Test 2"
   vSrc = Split(s, ",")
   vSort = xSort(vSrc)

   '結果を1件ごとに文書に出力
   Set ndb = ns.CurrentDatabase
   For i = 0 To UBound(vSrc)
      Set nd = ndb.CreateDocument()
      nd.Form = "SortText"
      nd.Text = vSort(i)
      nd.SortNum = i

      Call nd.Save(True, False)
   Next
End Sub

実行するとソート順とその値が文書に保存されます。この文書を表示するビューを作成し、値でソートします。すると、LotusScript と同じソート順とはなりません。


続いて、フォームを使って @Sort をテストします。

Src と Sort の 2 つのフィールド(複数値)を持つフォームを作成します。Sort フィールドは計算結果フィールドに設定し、Src フィールドに入力された値をソートする計算式を設定します。

プリビューして先の LotusScript のテストと同じ値を入力し、計算させます。結果を確認すると LotusScript、ビューのソートのどちらとも一致しません。


まとめ

改めて、LotusScript、ビュー、@Sort の値を比較すると次のようになります。なかなかバラバラな結果となっていますね...

LotusScript ビュー @Sort
Test
Test 1
Test 2
Test_1
Test_2
Test-1
Test-2
Test1
Test2
Test
Test-1
Test-2
Test 1
Test 2
Test1
Test2
Test_1
Test_2
Test
Test 1
Test 2
Test1
Test2
Test-1
Test-2
Test_1
Test_2

Notes の場合にはデータがソートされているかだけでなく、どうやってソートしたのかも重要なようです。特に他のシステムと連携する場合には要注意ですね。

もちろん、このような症状は、数字だけや英字だけの場合には発生しません。今回の事例のように記号やスペースを含む場合に注意が必要です。


0 件のコメント:

コメントを投稿