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

0 件のコメント:

コメントを投稿