Du ser ofte at Notes Designer tilføjer en SELECT @ALL i bunden af agentformler.
Det er angivelsen af koden der er FØR køres på alle og at koden der føler efter SELECT OGSÅ kører på alle dokumenter der matcher dit "scope".
Hvis din agent f.eks. ser sådan ud:
FIELD Test := "Kilroy was here"; SELECT Form = "BizarrePlaces"; FIELD TestBizarre := "Kilroy was here, too";
og du kører den på alle dokumenter, så vil alle dokumenter få sat feltet TEST, mens kun dokumenter hvor feltet Form er lig "BizarrePlaces" får sat feltet TESTBIZARRE.
Du kan også anvende funktionen @Return( "" ) for at aflsutte eksekveringen af en agent på det pågældende dokument, hvorefter agenten starter på næste dokument i dit "scope".
Hmm, min agents Initialize: Sub Initialize Dim session As New NotesSession Dim db As NotesDatabase Dim collection As NotesDocumentCollection Dim doc As NotesDocument
Dim number As Double
Set db = session.CurrentDatabase Set collection = db.UnprocessedDocuments
Set doc = collection.getfirstdocument
While Not doc Is Nothing If doc.assetNumber(0) = "" And doc.Status(0) = "Received" Then number = assignUniqueSeqNumber If number <> 0 Then doc.assetNumber = "TEST" + Cstr( number ) doc.assetNumberSort = number Call doc.save( True , False ) ' Mark this doc Call session.updateProcessedDoc( doc ) End If End If
Set doc = collection.getnextdocument( doc ) Wend End Sub
Kan ikke lige se hvordan det skal bygges ind der.
Skal lige siges at den er hugget fra en anden DB (Efter aftale med programmøren), den bruger også en komponent fra Script Libraries.
Nå, det er LotusScript. Det gør det umiddelbart ikke nemmere. Serienummertildeling er et kapitel for sig. Hvor tit vil du køre agenten? Hvad er dens "scope"?
Umiddelbart skal du blot inde i din WHILE løkke lave et check for den rigtige form.
While Not doc Is Nothing IF DOC.FORM="DINFORMULARNAVN" THEN If doc.assetNumber(0) = "" And doc.Status(0) = "Received" Then number = assignUniqueSeqNumber If number <> 0 Then doc.assetNumber = "TEST" + Cstr( number ) doc.assetNumberSort = number Call doc.save( True , False ) End If End If END IF ' Mark this doc Call session.updateProcessedDoc( doc ) Set doc = collection.getnextdocument( doc ) Wend
Jeg kan ikke se præcist i dette lille editfelt om alt er med, men jeg håber du kan se ideen. Jeg har også flyttet UpdateProcessedDoc ud af den indre IF og placeret udenfor IFFERNE.
Agenten er oprindeligt lavet til 1 gang i døgnet, den bliver faktisk kun brugt i tilfælde af at man sidder Offline og/eller på en anden server end hovedserveren og laver et nyt Hardware Indkøb, således at det kun er 1 server som tildeler Serienumre.
Sub Initialize Dim session As New NotesSession Dim db As NotesDatabase Dim collection As NotesDocumentCollection Dim doc As NotesDocument
Dim number As Double
Set db = session.CurrentDatabase Set collection = db.UnprocessedDocuments
Set doc = collection.getfirstdocument
While Not doc Is Nothing If DOC.FORM="Hardware" Then
If doc.HardTag(0) = "" Then number = assignUniqueSeqNumber If number <> 0 Then doc.HardTag = "TEST" + Cstr( number ) doc.HardTagSort = number Call doc.save( True , False )
End If End If End If
' Mark this doc Call session.updateProcessedDoc( doc ) Set doc = collection.getnextdocument( doc ) Wend End Sub
Undskyld, der skal stå If DOC.FORM(0)="Hardware" Then
dum klassisk fejl ved programmering i LotusScript og Notes: Alle felter er arrays, også selvom de kun indeholder èn værdi. Derfor skal referencer til feltindhold altid angives med parenteser og et index, oftest 0 (første element i arrayet).
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.