Jamais N'utilisez @Today ou @Now dans les formules de sélection de vue. L'index de vue ne sera alors jamais mis à jour, par conséquent la tâche de mise à jour fonctionnera constamment pour actualiser l'index. Cela affectera la performance négative.
Ce que vous devez faire est d'avoir un agent quotidien (dans votre cas, probablement tous les soirs) qui marquera les documents à afficher dans la vue. Pour que l'agent soit le plus rapide possible, traitez une vue dans laquelle vous affichez la date dans l'une des colonnes.
Le absolument le plus rapide serait comme ceci:
1) Créez une vue cachée appelée (LookupServiceOrdersByValidDate)
.
2) La première colonne contiendra le nom du champ PosDesValidFrom
(je suppose qu'il s'agit d'un champ de date, sinon vous devez le convertir à ce jour), et être trié par ordre décroissant. Allez dans le quatrième onglet de l'infobox pour la colonne et assurez-vous que vous l'avez défini sur Date/Heure.
3) Créez une deuxième colonne dans laquelle vous affichez le champ de texte DisplayIn2MonthView
. Trier aussi décroissant.
4) Sauvegardez la vue.
Vous avez maintenant une vue que vous pouvez parcourir en utilisant un agent. Comme il est trié en descendant avec le plus récent au sommet, dès que vous arrivez à une date de plus de 2 mois, vous pouvez arrêter l'agent et avoir terminé.
Le script ressemblerait à quelque chose comme ceci:
Dim session as New NotesSession
Dim db as NotesDatabase
Dim view as NotesView
Dim col as NotesViewEntryCollection
Dim entry as NotesViewEntry
Dim doc as NotesDocument
Dim validDate as NotesDateTime
Dim cutoffDate As NotesDateTime
' Get current date and time and go back 2 months
Set cutoffDate = New NotesDateTime(Now())
Call cutoffDate.AdjustMonth(-2)
' Drill down to view
Set db = session.CurrentDatabase
Set view = db.GetView("(LookupServiceOrdersByValidDate)")
' Create a collection of all entries in the view and loop through them
Set col = view.AllEntries
Set entry = col.GetFirstEntry()
Do Until entry is Nothing
' Get value in first column in view and use it to create new DateTime object
validDate = New NotesDateTime(entry.ColumnValues(0))
' Check if we are within the 2 month cutoff date
If Cdat(validDate.dateOnly)>=Cdat(cutoffDate) Then
' Get document and set flag to display
Set doc = entry.Document
Call doc.ReplaceItemValue("DisplayIn2MonthView","Yes")
Call doc.Save(True,False)
Else
' We are beyond the cutoff date, but we need to clear old flags.
' Read the value in the second column and see if it is "Yes"
If entry.ColumnValues(1)="Yes" Then
Set doc = entry.Document
Call doc.ReplaceItemValue("DisplayIn2MonthView","")
Call doc.Save(True,False)
Else
' Since all "Yes" values should be at the top, if we
' get here there should be no more flagged documents.
Exit Do
End If
End If
Set entry = col.GetNextEntry(entry)
Loop
Print "All done."
Enfin, modifiez la vue pour afficher les documents. Vous devriez probablement utiliser le champ Form
, pas docForm
. Définissez la formule de sélection sur
SELECT [email protected]($Conflict) AND Form="ServiceOrders" AND DisplayIn2MonthView="Yes"
La vue doit maintenant contenir uniquement les documents ServiceOrder avec une date de validation au cours des deux derniers mois. Si vous voulez vraiment que la réplication/sauvegarde des conflits dans la vue, assurez-vous que la vue est réglé sur pas documents de réponse d'affichage dans une hiérarchie (décocher la case):
C'est une idée très intelligente, chose regrettable c'est que je n'ai pas la permission de créer de nouveaux champs dans les formulaires. – Curunir
Pour une raison quelconque, je reçois une incompatibilité de type sur cutoffDate ici: CDat (validDate.dateOnly)> = CDat (cutoffDate) – Curunir
@exasswede Cette solution fonctionne pour moi mais le problème est qu'un nouvel ordre n'apparaîtra pas visible jusqu'à ce que le l'agent court sur la vue. – Curunir