Domino 9 und frühere Versionen > ND6: Entwicklung
Übernahme von Feldwerten per Lotus Script
tinchen222:
Hallo ANotes Gemeinde,
ich habe folgendes Problem, zu dem ich bisher hier im Forum nichts vergleichbares finden konnte:
In unserer Firma werden in einer Datenbank alle Eigenschaften eingetragen, die ein neu zu produzierendes Produkt haben muß. Das nennen wir hier "Lastenheft". Verschiedene Abteilungen prüfen dann nacheinander ob das neue Produkt diese Eigenschaften erfüllen kann. Das Problem beginnt bei der ersten Abteilung - der Vertrieb - der für alle anderen die Vorgaben macht. In einer Maske habe ich für jede Abteilung einen Reiter angelegt und wird dann das Dokument an die erste zu prüfende Abteilung weitergegeben, werden alle Werte, die der Vertrieb eingegeben hat, auf die anderen Reiter in der gleichen Maske auf die entsprechenden Abteilungen verteilt. Da es sich bei dieser Übernahme von Feldwerten um ca. 350 Felder handelt, dauert es - mit meiner Programmierung - entsprechend lange bis alles gespeichert wurde. Die Anwender sind daher genervt, weil sie während dessen nicht weiter in Notes arbeiten können. Verständlich.
Die Feldübernahme realisiere ich wie folgt:
doc.FeldA = getItemValue("FeldB")(0)
Bei 350 Feldern warten die Anwender gut und gerne 8 Minuten. Ich bin der Meinung, dass das nicht effizient ist und besser gehen muß, aber da ich leider auch kein professioneller Programmierer bin wollte ich mal fragen ob jemand zu diesem Problem eine Idee hat. Dazu noch folgender Hinweis: Die Feldübernahme habe ich nicht mit berechneten Feldern lösen können, weil die Felder von den zu prüfenden Abteilungen bearbeitbar sein sollen. Die aus dem Vertrieb kommende Vorgabe muß also überschreibbar sein.
Für alle Ideen schon mal im voraus Danke.
Tina
m3:
Ich würde keine Tabs machen sondern eigene Dokumente, dann könntest Du mit "notesDocument.CopyAllItems()" arbeiten.
Ansonsten poste mal ein bissl mehr von dem Codeteil, in dem Du kopierst. 8 Minuten kommt mir schon sehr lange vor, ev. hast Du wo einen Gedankenknoten. ;)
tinchen222:
Das mit den Tabs ist vom Vertrieb extra gewünscht. Man soll in einem Dokument alle Informationen beisammen haben und nicht nochmal in ein extra Dokument springen müssen. Deshalb auch kein "CopyAllItems", was mir stundenlange Programmierarbeit erspart hätte. :)
Ich kann unmöglich das gesamte Coding der Schaltfläche einstellen, denn dieses umfasst zu viele Zeilen. Anbei deshalb ein Auszug, der hoffentlich ausreichend ist (Punkte sollen kennzeichnen, dass es in analoger Weise weitergeht):
Sub Click(Source As Button)
Dim thisws As New NotesUIWorkspace
Dim session As New NotesSession
Dim db As NotesDatabase
…
Dim protokoll As String
Dim autor As String
Dim vpruefer As String 'vorhergehender Prüfer
Dim npruefer As String 'nächster Prüfer
Dim qw As String
Dim entwicklung As String
…
Set thisdb = thisws.CurrentDatabase
Set thisdoc = thisws.CurrentDocument
Set db = session.CurrentDatabase
Set doc = thisdoc.document
Set maildoc = New NotesDocument( db )
Set link = New NotesRichtextItem( maildoc, "Body")
'Globale Werte aus Feldern auslesen
entwurf = doc.GetItemValue("entwurf")(0)
status = doc.GetItemValue("status")(0)
Pruefer_QW = doc.GetItemValue("Pruefer_QW")(0)
Pruefer_Entwicklung = doc.GetItemValue("Pruefer_Entwicklung")(0)
Pruefer_Produktion = doc.GetItemValue("Pruefer_Produktion")(0)
Pruefer_Druck = doc.GetItemValue("Pruefer_Druck")(0)
Pruefer_Dispo = doc.GetItemValue("Pruefer_Dispo")(0)
Pruefer_Einkauf = doc.GetItemValue("Pruefer_Einkauf")(0)
Pruefer_Etikettierung = doc.GetItemValue("Pruefer_Etikettierung")(0)
Pruefer_Vertrieb = doc.GetItemValue("Pruefer_Vertrieb")(0)
Materialbeschreibung = doc.GetItemValue("Materialbeschreibung")(0)
currentuser = session.username
berechtigung = "false"
j=0
'Prüfung ob lokal oder am Server gearbeitet wird (Außendienstler)
If ( db.Server = "" ) Then
Set nab = New NotesDatabase ("", "unseradressbuch.nsf") 'Lokale hbnames.nsf
Else
Set nab = New NotesDatabase ("servername", "names.nsf")
End If
Set view = nab.GetView ("Groups")
Set viewentry = view.GetEntryByKey("ZHB_Lastenheft_Vertrieb")
Set person = viewentry.Document
Forall item In person.GetItemValue("members")
user(i)=item
If user(i) = currentuser Then
berechtigung = "true"
End If
End Forall
If berechtigung = "false" Then
Messagebox "Sie sind nicht berechtigt ein Dokument zur Prüfung einzureichen",64,"Achtung"
Exit Sub
Else
continue = True
End If
'Pfichtfelder prüfen --------------
Print "Status des Dokuments wird überprüft ..."
If status = "vertrieb" Then
Print "Pflichtfelder für Vertrieb werden geprüft ..."
Forall item In doc.GetItemValue("UmweltaspekteVertrieb")
UmweltaspekteVertrieb (j) = item
j=j+1
End Forall
…
End If
'Prüfung Pflichtfelder Ende ----------
'Feldwerte in andere Bereiche überführen
Print "Felder werden in andere Bereiche übertragen ... Bitte warten..."
doc.DLastenheft1 = doc.GetItemValue("Lastenheft1")(0)
doc.ELastenheft1 = doc.GetItemValue("Lastenheft1")(0)
doc.DLastenheft2 = doc.GetItemValue("Lastenheft2")(0)
doc.ELastenheft2 = doc.GetItemValue("Lastenheft2")(0)
doc.DZeichung = doc.GetItemValue("Zeichung")(0)
doc.EZeichung = doc.GetItemValue("Zeichung")(0)
…
'QW
doc.QualitaetHygieneText1 = doc.GetItemValue("VQualitaetHygieneText1")(0)
doc.QualitaetHygieneText2 = doc.GetItemValue("VQualitaetHygieneText2")(0)
doc.QualitaetHygieneText3 = doc.GetItemValue("VQualitaetHygieneText3")(0)
'Entwicklung
doc.Schrumpffolie = doc.GetItemValue("VSchrumpffolie")(0)
doc.MonaxialBiaxial = doc.GetItemValue("VMonaxialBiaxial")(0)
…
'Druck
doc.dpfd = doc.GetItemValue("pfd")(0)
doc.ppfd = doc.GetItemValue("pfd")(0)
…
'Produktion
doc.MaschinenNrP = doc.GetItemValue("VMaschinenNr")(0)
doc.DMaschinenNrP = doc.GetItemValue("VMaschinenNr")(0)
…
'Disposition
doc.DNadelperforation2 = doc.GetItemValue("VNadelperforation2")(0)
doc.DPerforationsart2 = doc.GetItemValue("VPerforationsart2")(0)
doc.DLochung2 = doc.GetItemValue("VLochung2")(0)
…
'Feldwerte in andere Bereiche übertragen Ende -------
'Entwurfsmodus des Dokuments beenden
Call doc.Replaceitemvalue("entwurf", "nein")
'Das Protokollfeld füllen
autor = doc.GetItemValue("Display_Autor")(0)
protokoll = "Zur Prüfung eingereicht am " + Now() + " von " + session.CommonUserName
materialnummer = doc.GetItemValue("Materialnummer")(0)
i=0
'Den ersten Prüfer ermitteln
qw = doc.GetItemValue("Pruefer_QW")(0)
entwicklung = doc.GetItemValue("Pruefer_Entwicklung")(0)
produktion = doc.GetItemValue("Pruefer_Produktion")(0)
…
thisdoc.EditMode = True
'Nächsten Prüfer ermitteln
Print "Prüfer werden ermittelt ..."
If qw <> "Keine Prüfung" Then
npruefer = "ZHB_Lastenheft_QW"
status = "qw"
recipients = "ZHB_Lastenheft_QW"
Elseif entwicklung <> "Keine Prüfung" Then
npruefer = "ZHB_Lastenheft_Entwicklung"
status = "entwicklung"
recipients = "ZHB_Lastenheft_Entwicklung"
Elseif produktion <> "Keine Prüfung" Then
…
End If
'Felder setzen
Call doc.Replaceitemvalue("vpruefer", "ZHB_Lastenheft_Vertrieb")
Call doc.Replaceitemvalue("npruefer", npruefer)
Call doc.Replaceitemvalue("status", status)
'Protokoll ausfüllen
Print "Protokoll ausfüllen..."
Forall item In doc.GetItemValue("protocol")
neuesProtokoll(i)=item
i=i+1
End Forall
neuesProtokoll(i) = protokoll
Call doc.Replaceitemvalue("protocol", neuesProtokoll)
Call thisdoc.Save
Call thisdoc.Close
'Mailversand
maildoc.Form = "Memo"
maildoc.Subject = "Ein Lastenheft liegt für Sie zur Bearbeitung vor (" + Materialbeschreibung + ")"
maildoc.SendTo = recipients
Call link.AppendText("Das folgende Lastenheft liegt für Sie zur Bearbeitung vor!")
Call link.AddNewLine( 2 )
Call link.AppendText("Hier ein direkter Link = > ")
Call link.AppendDocLink(doc, doc.Subjekt (0))
maildoc.Send( False)
'Infobox
Messagebox "Dokument wurde zur Prüfung eingereicht",64, "Hinweis"
Call thisdoc.Close
End Sub
Glombi:
Erstmal musst Du das AutoReload des Dokuments verhindern, denn sonst aktualisiert Notes nach jedem Feldsetzen die Darstellung des Dokuments und das kann dauern.
Also
Set thisdoc = thisws.CurrentDocument
thisdoc.AutoReload = false
...
Andreas
tinchen222:
Das hört sich doch schon mal nach einem guten Tipp an. Von der Funktion habe ich bisher noch nie was gehört. Hab´s jetzt eingebaut und werde es die Anwender testen lassen. Aber: Wenn es wirklich so einfach war die Wartezeit zu reduzieren, dann wird es echt peinlich für mich :(.
Trotzdem erstmal danke. Weitere Infos folgen nach dem Test.
Tina
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln