2010年2月10日水曜日

フィールドが大きすぎる(32K)、またはビューの列と選択式が大きすぎます。

ある掲示板のエントリについてコメントしましたが手抜きになりましたので、ここに書き直します。

標記のメッセージが表示される文書を作ってみました。
Set doc = ss.CurrentDatabase.CreateDocument
doc.Form = "Main"
Set rtitem = New NotesRichTextItem(doc, "Body")
For i = 1 To 3277
    Call rtitem.AppendText("AAAAAAAAAA")
Next
Call doc.Save(True, True)
v = doc.GetItemValue("Body")
doc.Body1 = v
Call doc.Save(True, True)

作成した文書はビューに表示できますが、ダブルクリックなどアクションをすると「フィールドが大きすぎる(32K)、またはビューの列と選択式が多きすぎます。」と表示されます。
以下、この文書からアイテム Body1 を削除して復活させるべく、試した内容と結果です。


次の式で選択文書からのフィールドの削除を試みましたが「フィールドが大きすぎる(32K)、またはビューの列と選択式が多きすぎます。」が表示されます。

FIELD Body1 := @DeleteField


Lotus Script では NotesDocument オブジェクトは取得できるものの、そのプロパティやアイテムにはアクセスできません。
デバッグモードで見ると NotesDocument.IsValid は False (削除スタブと同じ)、作成日等はゼロになっています。
Set dc = ss.CurrentDatabase.Search(|@Length(Body1) > 32767|, Nothing, 0)  
If dc.Count > 0 Then  
    Set doc = dc.GetFirstDocument  
    While Not doc Is Nothing  
        Forall item In doc.Items '<<- エラー「T003 型が一致しません」  
            If item.Name = "Body1" Then  
                Call item.Remove  
                Exit Forall  
            End If  
        End Forall  
        Call doc.Save(True, True)  
        Set doc = dc.GetNextDocument(doc)  
    Wend  
End If 

Set dc = ss.CurrentDatabase.Search(|@Length(Body1) > 32767|, Nothing, 0)  
If dc.Count > 0 Then  
    Set doc = dc.GetFirstDocument  
    While Not doc Is Nothing  
        Set item = doc.GetFirstItem("Body1") '<<- ここで item は Nothing になる  
        If Not item Is Nothing Then  
            Call item.Remove  
            Call doc.Save(True, True)  
        End If  
    Set doc = dc.GetNextDocument(doc)  
    Wend  
End If 
文書だけのnoteコレクションを作ろうにもエラーになります。
Set nc = db.CreateNoteCollection( False )  
nc.SelectDocuments = True  
Call nc.BuildCollection '<<- ここで「フィールドが大きすぎる(32K)、またはビューの列と選択式が多きすぎます。」  
XMLへ書き出ししようにもエラーになります。
Set dc = ss.CurrentDatabase.Search(strFormula$, Nothing, 0)  
Set nc = db.CreateNoteCollection( False )  
Call nc.BuildCollection  
Call nc.Add( dc )  
Set stream = ss.CreateStream  
If Not stream.Open( filename$ ) Then Exit Sub  
Call stream.Truncate  
Set exporter = ss.CreateDXLExporter( nc, stream )  
Call exporter.Process '<<- ここでエラー「DXL exporter operation failed」  
フルアクセスアドミニストレーションで実行しても変わらずエラーが表示されます。


以上が試したことです。


現状「お手上げ」です。
復活は無理かも。

ちなみに、テキストフィールドの値が32KBを超える場合でも NotesItem.IsSummary へ False を設定すると、ビューから「異常な」文書を開こうとしてもエラーになりません。ただしビューには表示できませんが...orz
Set item = doc.GetFirstItem( "Body1" )
If item.ValueLength > ( 32 * 1024 ) Then
    item.IsSummary = False
End If

それから、アプリケーションのプロパティで「一時的削除を許可」を有効にすると、[Delete] -> [F9]でビューから「異常な」文書を削除できなくなります。[F9]を押したとき「フィールドが大きすぎる(32K)、またはビューの列と選択式が多きすぎます。」が表示されます。


次のコマンドをクライアントのコマンドプロンプトから投入したところ「異常な」文書だけが全件削除されました。

ncompact -c -i -D hogehoge.nsf


<<2020/02/21 追記>>
Notes/Domino の 9.0.1 FP8 と 10.0 のバージョンでは -LargeSummary オプションを有効にすることで、サマリーフィールドの制限を拡張する新機能があります。下のエントリをご参照ください。
サマリーフィールドの制限を緩和するには

0 件のコメント:

コメントを投稿