Notes データベース内で一意である必要がある「JobID」というフィールドがあります。私の計画は、ドキュメントの JobID をデータベースで検索し、それが現在のドキュメントの JobID と等しい場合は、ユーザーに警告して保存をキャンセルすることです。私はこれを行う方法を理解できないようです。
5 に答える
You could shorten your code a bit, there is no need to loop through all documents...
db.Search is very slow, I would use a view lookup instead. You could use db.FTSearch, but if the full-text index is not up-to-date, you will not get the correct return value. So just create a hidden lookup view with the job ID as the first and only column (sorted).
You should also declare session/db/etc in your function. Make sure you always use Option Declare...
Function JobIdIsValid (jobId As String) As Boolean
'*** Check if a form with this project number is already created
Dim session As New NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim col as NotesDocumentCollection
Dim searchformula As String
Set db = session.CurrentDatabase
Set view = db.GetView("(LookupJobID)")
Call view.Refresh() 'Optional, but useful if documents are created often
Set col = view.GetAllDocumentsByKey(JobID)
If col.Count > 0 Then
JobIdIsValid = False
Else
JobIdIsValid = True
End If
End Function
このように固有番号を自分で管理すると、トラブルにつながる可能性があります。@Unique
一意の値を返す式があり、代わりにそれを使用する必要があります。
または、毎回手動でインクリメントする数値を保持する単一のドキュメントをデータベースに保持することもできます。手間はかかりますが、リレーショナル データベースが持つ自動インクリメント ID のようなものを提供します。
これがかなり醜いことを認めたのは私が初めてですが、最初の列が JobID であるビューがあれば、効果的で非常に簡単です。
Put this in the input validation of the JobID field.
outcome := @DbLookup("":"NoCache"; "":"" ; "<viewname>"; JobID; 2);
@If(@IsError(outcome); @Success; @Failure("A Job with this ID already exists").
またはそのようなもの。
他の多くの方法でもっと良いことをすることもできます:
e.g. LotusScript in the Exiting event of the JobID field using
....
set doc= NotesView.GetDocumentByKey(workspace.currentdocument.fieldgettext("JobID"))
If doc Is Nothing Then ....
etc.
これがあなたにインスピレーションを与えるのに役立つことを願っています:-) Phil
うーん、あなたのフィールドを含む特定のフォームを使用するデータベース内のすべてのドキュメントを反復処理する以外に方法はないのではないかと思います。毎回繰り返すのではなく、はるかに効率的な方法は、使用済みのJobIDを2つの場所(ドキュメントと、使用されているすべてのJobIDを含むストレージ)に保存することです。次に、収集されたセットで確認したり、オフですべてのドキュメントのスキャンを実行したりできます。データの整合性を確保するための時間。特定のカスタム定義ビューを使用して検索を絞り込み、DB内のすべてのドキュメントではなく、このビュー内のドキュメントを反復処理できます。ただし、このようなソリューションはリスクがあり、データ統合が多少偽造されていると、問題が発生します。
Dim ws As New NotesUIWorkspace
Dim session As New NotesSession
Set db = session.CurrentDatabase
Set view = db.GetView(("TMP_ID"))
Dim ckDoc As NotesDocument
Set ckDoc = view.GetDocumentByKey(ws.CurrentDocument.FieldGetText("ID"), True)
If Not ckDoc Is Nothing Then
Messagebox ("Запись с таким идентификатором уже существует")
Call source.GotoField( "ID" )
continue = False
End If