Autor Thema: Alle Dokumente in der Datenbank aktuallsieren als Agent  (Gelesen 3157 mal)

Offline Klaas

  • Junior Mitglied
  • **
  • Beiträge: 78
  • Geschlecht: Männlich
Hallo,

ich habe eine Datenbank für das Qualitätsmanagement entwickelt.

Im Hauptdok. gibt es ein Statusfeld (Aktiv | 1,Gelöscht| 2,Entwurf | 3).
Zum Hauptdok. gibt es Antwortdok.. Hier müssen Verantwortliche den aktuellen Revisionsstand
freigeben.
Wenn dieses Antwortdok. freigegeben ist, dann soll der Status im Hauptdok. auf Aktiv|1 gesetzt werden.

Wenn man nun das Antwortdok. Freigegeben hat und ins Hauptdok. geht und es aktuallisiert, dann funktioniert auch alles.

Deshalb meine Frage:

"Gibt es einen @Befehl mit dem ich mittels Agent alle Dokumente in der Datenbank regelmäßig aktualliesieren kann?"
"Oder gibt es eine viel Bessere Lösung/Idee?"
"Oder kann ich mir beim Speichern des Antwortdok. irgendwie das Hauptdok. greifen und aktualliesieren?"

ich hoffe Ihr seit nicht sauer weil ich sone PillePalle Frage stelle


Vielen Dank

Klaas

Driri

  • Gast
Re: Alle Dokumente in der Datenbank aktuallsieren als Agent
« Antwort #1 am: 12.08.10 - 14:40:16 »
Alle Dokumente aktualisieren, weil sich evtl. ein Antwortdokument geändert hat, halte ich für den schlechtesten Weg. Im schlimmsten Fall aktualisiert Du 1000 Dokumente, obwohl eigentlich gar keins aktualisiert werden müßte.

Die ideale Lösung wäre, auf die Änderung im Antwortdokument gezielt zu reagieren. Da wirst Du vermutlich mit Formelsprache aber nicht auskommen, sondern auf LotusScript zurückgreifen müssen.

Über das Antwortdokument kommst Du direkt an das zugehörige Hauptdokument und kannst dann dort einen Wert setzen.

Schau Dir zu dem Thema generell auch mal den BestPractice-Artikel hier im Forum an.

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Alle Dokumente in der Datenbank aktuallsieren als Agent
« Antwort #2 am: 12.08.10 - 14:46:34 »
Ingo, hier würde es sogar die Formelsprache tun. Klaas sollte sich mal @SetDocField anschauen.

Bernhard

Offline Klaas

  • Junior Mitglied
  • **
  • Beiträge: 78
  • Geschlecht: Männlich
Re: Alle Dokumente in der Datenbank aktuallsieren als Agent
« Antwort #3 am: 12.08.10 - 14:49:28 »
Hm.

Ja damit müsste es gehen. Ich werde mal bissel weiter baun.
« Letzte Änderung: 12.08.10 - 14:51:45 von Klaas »

Offline Klaas

  • Junior Mitglied
  • **
  • Beiträge: 78
  • Geschlecht: Männlich
Re: Alle Dokumente in der Datenbank aktuallsieren als Agent
« Antwort #4 am: 13.08.10 - 08:41:47 »
Ich habe das jetzt mal sagen wir gebaut. Ich bin noch nicht so erfahren im Script....
Zitat
Sub Querysave(Source As Notesuidocument, Continue As Variant)
   Dim session            As New NotesSession
   Dim db                As NotesDatabase
   Dim doc               As NotesDocument               'Aktuelles Doc ( AntwortDoc )
   Dim Vdoc                As NotesDocument               'Hauptdokument des AntwortDocs
   Dim item               As NotesItem
   Dim Dummy             As Variant
   Dim DummyString         As String
   Dim KGStatus            As String
   Dim VGStatus            As String
   Dim UnID               As String
   Set db                = session.CurrentDatabase
   Set doc                = Source.Document                'UIDoc zu Backend-doc
   
   UnID                  = doc.ParentDocumentUNID
   Set Vdoc                = db.GetDocumentByUNID(UnID)      'Vdoc wird zum Vaterdokument
   
   Dummy               = doc.GetItemValue("GesamtStatus")
   KGStatus               = Dummy(0)
   If KGStatus <>4 Then
      Goto Ende
   End If
   Dummy               =""
   Dummy               = vdoc.GetItemValue("DocStatus3")      
   DummyString            = Dummy(0)
   If DummyString <>"" Then
      VGStatus             = "3"
   Else
      Goto Ende
   End If
   If KGStatus ="4" And VGStatus ="3" Then
      Set item             = vdoc.ReplaceItemValue("DocStatus1","1")
      Set item             = vdoc.ReplaceItemValue("DocStatus2","")
      Set item             = vdoc.ReplaceItemValue("DocStatus3","")
   End If
Ende:
   Call doc.Save(False, False )
   Call Vdoc.Save(False, False )
End Sub

Das Läuft jetzt. Gibts da noch was was man besser machen könnte?

Driri

  • Gast
Re: Alle Dokumente in der Datenbank aktuallsieren als Agent
« Antwort #5 am: 13.08.10 - 09:07:33 »
Auf die Schnelle fallen mir 4 Sachen auf :

1. Du speicherst aktuell auf jeden Fall doc und vdoc, auch wenn die Dokumente gar nicht verändert wurden. Das vdoc.Save reicht eigentlich innerhalb der letzten If-Schleife aus.

2. Du verwendest die Variable Dummy für verschiedene Werte. Das würde ich aus Gründen der Übersichtlichkeit nicht tun. In so kurzen Scripten mag das noch gehen, in längeren läuft dir das garantiert in die Hacken.
Darüber hinaus kannst Du dir den Schritt mit Dummy = eigentlich sparen und direkt den Wert in die Variablen weisen :

KGStatus = doc.GetItemValue("GesamtStatus")(0)

3. Wenn Du nur Werte in Items zuweisen willst und die Items nicht für andere Dinge benötigst, würde ich das Objekt NotesItem nicht benutzen, sondern die Werte direkt mit ReplaceItemValue in die Items schießen.

Call vdoc.ReplaceItemValue("DocStatus1","1")

4. Wenn Du Sprungmarken verwendest, dann solltest Du vor der Sprungmarke noch ein Exit Sub oder Exit Function einfügen. Ansonsten arbeitet das Script auf jeden Fall die Befehle hinter der Sprungmarke ab. Wenn das so gewollt ist, kannst Du dir das natürlich schenken.

Offline DerAndre

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.655
  • Geschlecht: Männlich
  • Keep cool!
Re: Alle Dokumente in der Datenbank aktuallsieren als Agent
« Antwort #6 am: 13.08.10 - 09:10:57 »
Hi Klaas.

Das ist sehr viel Code der eigentlich nichts macht.
Ich habe mal einen schönen Spruch gehört:
Code ist erst Fertig, wenn man nichts mehr entfernen kann.

Sub Querysave(Source As Notesuidocument, Continue As Variant)
   Dim session            As New NotesSession
   Dim db                As NotesDatabase
   Dim doc               As NotesDocument               'Aktuelles Doc ( AntwortDoc )
   Dim Vdoc                As NotesDocument               'Hauptdokument des AntwortDocs

   Set db                = session.CurrentDatabase
   Set doc                = Source.Document                'UIDoc zu Backend-doc

   Set Vdoc                = db.GetDocumentByUNID(doc.ParentDocumentUNID)      'Vdoc wird zum Vaterdokument

   If doc.GetItemValue("GesamtStatus")(0) = 4 and vdoc.GetItemValue("DocStatus3")(0) <> "" Then

      call vdoc.ReplaceItemValue("DocStatus1","1")
      call vdoc.ReplaceItemValue("DocStatus2","")
      call vdoc.ReplaceItemValue("DocStatus3","")
      Call Vdoc.Save(False, False )
     
   end if

   
End Sub



So sparst Du Dir die Sprungmarke und andere Dinge. Ausserdem ist das so Recht übersichtlich.
André

Elterninitiative diabetischer Kinder und Jugendlicher e.V.
-----------------------------------------------------------------------------
Fliegen ist die Kunst auf den Boden zu Fallen, aber daneben.
-----------------------------------------------------------------------------
Etwas mehr Hardware dazu zu kaufen ist viel billiger als
Software besser zu machen. ( Niklaus Wirth )

Offline Klaas

  • Junior Mitglied
  • **
  • Beiträge: 78
  • Geschlecht: Männlich
Re: Alle Dokumente in der Datenbank aktuallsieren als Agent
« Antwort #7 am: 13.08.10 - 09:50:44 »
Hammer,

ich habe grade meine Ausbildung zum Fachinformatiker abgeschlossen.
Anwendungsentwicklung in der Schule war nicht mal Ansatzweise so.

Ich glaube ich kann die hälfte von dem was ich bis jetzt geschrieben habe, streichen.

Dankeschön. Sowas bringt ein echt weiter.

Wielange Programmiert ihr eigentlich schon?

BigWim

  • Gast
Re: Alle Dokumente in der Datenbank aktuallsieren als Agent
« Antwort #8 am: 13.08.10 - 10:14:06 »
Zitat
Das Läuft jetzt. Gibts da noch was was man besser machen könnte?
Ob ich verbessern kann, bezweifle ich, aber mal ein Erfahrungsbericht.


Mit dem hier habe ich als fortgeschrittenen Anfänger immer meine Probleme:
Code
doc.GetItemValue("GesamtStatus")(0) .....  vdoc.GetItemValue("DocStatus3")(0)

Bei mir besteht die latente Gefahr, dass ich die Items nicht konsequent initialisiere. Und dann habe ich Streß mit den Variablentypen. Ich weiß nicht, ob obige Anfrage damit zu Recht. In meinem Fall würde sich das garantiert so darstellen.

GesamtStatus - Type = Zahl  (wegen =4)
DocStatus3 - Type = String ( wegen = ""), sollte aber Zahl sein ...
(Typisch für mich. Nicht initialisiert)


Deswegen ziehe ich es mittlerweile vor, die Werte in eigene Variablen zu packen, die dem Typ entsprechen (Stichwort Option Declare).

Und bei DB, die ich (zwangsweise wegen einer Erweiterung) übernehmen muß, gehe ich auf Nummer sicher und frage den Type mit TypeName ab ....

Zitat
Wielange Programmiert ihr eigentlich schon?
Lange genug um zu wissen, dass es immer besser geht.
Nicht lange genug um sagen zu können, ich sei ausgebildet ;)

Markus


Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Alle Dokumente in der Datenbank aktuallsieren als Agent
« Antwort #9 am: 13.08.10 - 11:01:41 »
Ist es korrekt, dass im Item Gesamtstatus Zahlen gespeichert sind? Ist das nicht vielmehr auch ein String, der dort zu erwarten ist?

Bernhard

Offline Klaas

  • Junior Mitglied
  • **
  • Beiträge: 78
  • Geschlecht: Männlich
Re: Alle Dokumente in der Datenbank aktuallsieren als Agent
« Antwort #10 am: 13.08.10 - 11:15:29 »
Also das Feld ist ein String.
Dadrin wird der Status sozusagen Kodiert.
-1 für muss geprüft werden.
-2 für muss freigegeben werden.
-3 für ist freigegeben.
-4 für muss geändert werden.

Im Grunde ist es also immer eine Zahl. Die aber im Moment als String gespeichert wird.

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Alle Dokumente in der Datenbank aktuallsieren als Agent
« Antwort #11 am: 13.08.10 - 11:20:19 »
Im Grunde ist es also immer eine Zahl.

Nein - es ist eben keine Zahl, sondern ein String! Keyword aliases sind immer Strings.
Der bisherige Code muss also noch dahingehend korrigiert werden.

Bernhard

Offline Klaas

  • Junior Mitglied
  • **
  • Beiträge: 78
  • Geschlecht: Männlich
Re: Alle Dokumente in der Datenbank aktuallsieren als Agent
« Antwort #12 am: 13.08.10 - 11:32:30 »
Achso...ja das habe ich gemacht.
Grade kürze ich alle Agenten von mir.... wie zum beispeil den hier:

Vorher:
Zitat
Sub Initialize
   Dim gSession                      As New NotesSession
   Dim view                        As NotesView
   Dim docA                        As NotesDocument
   Dim docVater                     As NotesDocument
   Dim currentDB                      As NotesDatabase
   Dim mailDoc                      As NotesDocument
   Dim mailPerson                  As String
   Dim Dummy1                     As Variant
   Dim Dummy2                     As Variant
   Dim Dummy3                     As Variant
   Dim Dummy4                     As Variant
   Dim mailBetreff2                  As String
   Dim rtItem                      As NotesRichTextItem
   Dim tmpForm                     As String
   Const Ansicht1                     ="AdminGeprüft"
   Const mailName                  ="ExaminePersonAW"
   Const mailBetreff1                  ="Sie müssen das Dokument: "
   Const mailBetreff3                  =" noch prüfen."
   Const mailInhalt1                  ="Zu diesem Dokument wurden sie als Prüfer ermittelt."
   Const mailInhalt2                  ="Link zum Dokument"
   
   Set gSession                      = New NotesSession
   Set currentDB                     = gSession.CurrentDatabase
   Set view                         = currentDB.GetView( Ansicht1 )
   Set docA                         = view.GetFirstDocument
   
   While Not docA Is Nothing
      Dummy1                     = docA.GetItemValue( "Form")
      tmpForm                     = Dummy1(0)
      If tmpForm = "NewRevi" Or tmpForm = "NeuesFormular" Then
         
      Else
         Goto Ende
      End If
      Dummy1                     = docA.GetItemValue( mailName )
      mailPerson                  = Dummy1(0)
      Dummy1                     = docA.GetItemValue("ISONameAW")
      mailBetreff2                  = Cstr(Dummy1(0))
      Set mailDoc                   = currentDB.CreateDocument
      Call mailDoc.ReplaceItemValue ( "Form", "Memo")
      Call mailDoc.ReplaceItemValue ("SendTo", mailPerson)
      Call mailDoc.ReplaceItemValue ("Subject", mailBetreff1+mailBetreff2+mailBetreff3)
      Set rtItem = mailDoc.CreateRichTextItem ("Body")
      Call rtItem.AppendText ( mailInhalt1 )
      Call rtItem.AddNewline(1, True)   
      Call rtItem.AddNewline(1, True)
      Call rtItem.AppendDocLink( docA, mailInhalt2)
      Call rtItem.AppendText ( mailInhalt2 )
      If mailPerson<>"" Then   
         Call mailDoc.Send (True)
      End If
      Set docA                     =view.GetNextDocument( docA )
Ende:
   Wend
End Sub

Nachher:
Zitat
Dim gSession                   As New NotesSession
   Dim view                        As NotesView
   Dim docA                        As NotesDocument
   Dim docVater                     As NotesDocument
   Dim currentDB                      As NotesDatabase
   Dim mailDoc                      As NotesDocument
   Dim rtItem                      As NotesRichTextItem
   Const Ansicht1                     ="AdminGeprüft"
   Const mailName                  ="ExaminePersonAW"
   Const mailBetreff1                  ="Sie müssen das Dokument: "
   Const mailBetreff3                  =" noch prüfen."
   Const mailInhalt1                  ="Zu diesem Dokument wurden sie als Prüfer ermittelt."
   Const mailInhalt2                  ="Link zum Dokument"
   
   Set gSession                      = New NotesSession
   Set currentDB                     = gSession.CurrentDatabase
   Set view                         = currentDB.GetView( Ansicht1 )
   Set docA                         = view.GetFirstDocument
   
   While Not docA Is Nothing
      If docA.GetItemValue( "Form")(0) = "NewRevi" Or docA.GetItemValue( "Form")(0) = "NeuesFormular" Then
         Set mailDoc                = currentDB.CreateDocument
         Call mailDoc.ReplaceItemValue ( "Form", "Memo")
         Call mailDoc.ReplaceItemValue ("SendTo", docA.GetItemValue( mailName )(0))
         Call mailDoc.ReplaceItemValue ("Subject", mailBetreff1+docA.GetItemValue("ISONameAW")(0)+mailBetreff3)
         Set rtItem = mailDoc.CreateRichTextItem ("Body")
         Call rtItem.AppendText ( mailInhalt1 )
         Call rtItem.AddNewline(1, True)   
         Call rtItem.AddNewline(1, True)
         Call rtItem.AppendDocLink( docA, mailInhalt2)
         Call rtItem.AppendText ( mailInhalt2 )
         Call mailDoc.Send (True)
         Set docA                  =view.GetNextDocument( docA )
      End If
   Wend

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Alle Dokumente in der Datenbank aktuallsieren als Agent
« Antwort #13 am: 13.08.10 - 11:38:56 »
Da kann noch die Deklaration von docVater heraus,, das Set gSession = ist überflüssig, und die "+" sind keine geeigneten String-Verknüpfer, statt dessen ist "&" zu verwenden.

HTH,
Bernhard

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz