Avatar billede leif Seniormester
16. januar 2006 - 22:22 Der er 11 kommentarer og
1 løsning

Agent kun på nogen dokumenter

Hej,

Kan jeg få en Agent til at kun køre på Dokumenter oprettet med en bestemt Form ?

Fra
Leif
Avatar billede jogii Nybegynder
16. januar 2006 - 23:00 #1
I Starten af agenten skriver du:

SELECT Form="navnpådinform";
@HerFølgerResten;


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".
Avatar billede jogii Nybegynder
16. januar 2006 - 23:04 #2
Agenten ovenfor vil ved brug af @Return se sådan ud:

FIELD Test := "Kilroy was here";
@If(Form="BizarrePlaces"; @Success; @Return(""));
FIELD TestBizarre := "Kilroy was here, too";

Fordelen med @Return er at den kan anvendes flere steder i koden, men jeg mener ikke at du må have flere SELECT's i samme agent.
Avatar billede leif Seniormester
16. januar 2006 - 23:26 #3
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.
Avatar billede jogii Nybegynder
17. januar 2006 - 00:55 #4
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.
Avatar billede leif Seniormester
17. januar 2006 - 09:25 #5
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.
Avatar billede leif Seniormester
17. januar 2006 - 21:52 #6
Så kører den ikke på nogen dokumenter overhovedet.
Avatar billede jogii Nybegynder
17. januar 2006 - 22:31 #7
Du har rettet "DINFORMULARNAVN" til, ikke?
Måske kan du klippe/klistre din nye kode ind her
Avatar billede leif Seniormester
17. januar 2006 - 22:41 #8
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
Avatar billede leif Seniormester
18. januar 2006 - 07:11 #9
I loggen skriver den:  AMgr: Agent ('AssignAssetNumber' in 'IT.nsf') error message: Type mismatch
Avatar billede jogii Nybegynder
18. januar 2006 - 09:28 #10
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).
Avatar billede leif Seniormester
24. januar 2006 - 22:22 #11
jogii -> Fungerer perfekt ! Smider du et svar ?
Avatar billede jogii Nybegynder
24. januar 2006 - 22:52 #12
så gerne :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester