Das Notes Forum

Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: TomLudwig am 30.10.03 - 12:59:12

Titel: Per Script neues Dokument erstellen (Maske selbst festlegen)
Beitrag von: TomLudwig am 30.10.03 - 12:59:12
Hallo,
ich möchte per Script ein neues Dokument mit einer von mir festgelegten Maske erstellen. In das neue Dokument einige Feldinhalte befüllen. Und mir von diesem Dokument die DocumentUniqueID zurück geben lassen.

Wie???
Titel: Re:Per Script neues Dokument erstellen (Maske selbst festlegen)
Beitrag von: ghost am 30.10.03 - 13:13:22
Hallo,

neues Dokument anlegen mit NotesDatabase Methode CreateDocument.

Felder setzen mit NotesDocument Methode ReplaceItemValue oder AppendItemValue.

Maske zuweisen mit notesdoc.ReplaceItemValue("Form", <Formname>)

Berechnet Felder der Maske berechnen mit NotesDocument Methode ComputeWithForm.

Dokument speichern mit NotesDocument Methode Save.

UNId des Dokumentes auslesen mit NotesDocument Eigenschaft UniversalID.

Genaueres zu den Methoden und Eigenschaften findest Du in der Designerhilfe.

Viele Grüße
ghost
Titel: Re:Per Script neues Dokument erstellen (Maske selbst festlegen)
Beitrag von: TomLudwig am 30.10.03 - 13:24:19
Ich habs ausprobiert... Es kommt aber eine Fehlermeldung (Object Variable not set)

Dim db As New NotesDatabase
Dim doc As NotesDocument
Dim item As NotesItem

Set doc = db.CreateDocument
Set item = doc.Replaceitemvalue("Form", "AdvancedInfo")
Set item = doc.GetFirstItem("Temp" )
item.Text = "Hallo"         Hier kommt die Fehlermeldung
Call doc.Save( True, True )
   
Titel: Re:Per Script neues Dokument erstellen (Maske selbst festlegen)
Beitrag von: Driri am 30.10.03 - 13:24:43
Eine Anmerkung :

Man muß zum Füllen der Felder nicht unbedingt die genannten Methoden benutzen, es geht auch z.B. so :

doc.Form = "Maskenname"
Titel: Re:Per Script neues Dokument erstellen (Maske selbst festlegen)
Beitrag von: Driri am 30.10.03 - 13:29:15
item.Text ist ein Property (read-only), den Du so nicht ändern kannst. Schau mal in die Designer-Hilfe unter NotesItem.

Anhand deines Codes würde ich mal behaupten, Du hast noch nicht viel in Script gemacht, oder ?
Mir ist auf jeden Fall nicht klar, was Du da eigentlich machen willst, beschreib doch mal, dann sehen wir weiter  ;)
Titel: Re:Per Script neues Dokument erstellen (Maske selbst festlegen)
Beitrag von: TomLudwig am 30.10.03 - 13:36:02
Ich hab wirklich noch nicht viel mit Script gemacht....
Ich möchte ein Dokument neu erstellen und was in Felder rein schreiben. Das dann speichern und mir die DocumentUniqueID zur weiteren verarbeitung zurück geben lassen.

Bei folgendem Code, sagt der Debugger mir, dass die Variable "item" nicht gesetzt ist. Aber warum? Das Feld "Temp" gibt es in der Maske!

   Dim item As NotesItem
   Set doc = db.CreateDocument
   doc.Form ="AdvancedInfo"
   Set item = doc.GetFirstItem("Temp" )
   Call item.AppendToTextList("Hallo")
   Call doc.Save( True, True )
Titel: Re:Per Script neues Dokument erstellen (Maske selbst festlegen)
Beitrag von: ghost am 30.10.03 - 13:40:10
Dim db As New NotesDatabase
Dim doc As NotesDocument
Dim item As NotesItem

Set doc = db.CreateDocument
Call doc.Replaceitemvalue("Form", "AdvancedInfo")
Call doc.ReplaceItemValue("Temp", "Hallo")
Call doc.Save( True, True )

Ich glaube so sollte es sein.

@Driri: Es ist richtig, dass man nicht die Methoden benutzen muss, aber ich finde es persönich als unschön die verkürzte Schreibweise zu verwenden. Außerdem ist ein Aufruf über die Methoden performanter. Das macht in kleinen Scripten nicht viel aus, bei größeren Sachen ist es aber durchaus sinnvoll. Trotzdem ist Dein Hinweis natürlich angebracht  ;)

Viele Grüße
ghost
Titel: Re:Per Script neues Dokument erstellen (Maske selbst festlegen)
Beitrag von: koehlerbv am 30.10.03 - 13:41:52
Nein, das item gibt es nicht - es ist ja ein völlig leeres, neues Dokument, was Du vor Dir hast. Wo soll das item dann herkommen ?
Titel: Re:Per Script neues Dokument erstellen (Maske selbst festlegen)
Beitrag von: TomLudwig am 30.10.03 - 13:44:50
Wenn ich mit doc.Form = "AdvancedInfo" die Maske zuweise, dann muss doch das Feld auch da sein, wie es in der Maske dargestellt wird. Oder nicht?
Titel: Re:Per Script neues Dokument erstellen (Maske selbst festlegen)
Beitrag von: koehlerbv am 30.10.03 - 13:46:41
Nein, es ist nicht da - jetzt gibt es nur das item "Form".
Du kannst aber ComputeWithForm eine Chance geben ;-)

Bernhard
Titel: Re:Per Script neues Dokument erstellen (Maske selbst festlegen)
Beitrag von: Driri am 30.10.03 - 13:49:37
Hi,

äh, jein. Also wenn Du ein neues Dokument erzeugst, dann existieren keine Felder. Es ist quasi vollkommen leer.
Auch wenn Du die Form setzt, wird dem Dokument zwar die Maske zugewiesen, aber dadurch existieren die Felder immer noch nicht.
Das ist quasi nur eine Info, mit welcher Maske das Dokument später geöffnet werden soll.

Du mußt also wirklich die Felder manuell füllen. Und dabei brauchst Du nicht über das Item zu gehen, denn das existiert einfach noch nicht.

Das Script von Ghost tut genau das. Nach dem doc.Save gibt es dann auch die DocumentUniqueID.
Titel: Re:Per Script neues Dokument erstellen (Maske selbst festlegen)
Beitrag von: TomLudwig am 30.10.03 - 14:00:48
Ich schaffs einfach nicht...

   Set doc = db.CreateDocument
   Call doc.Replaceitemvalue("Form", "AdvancedInfo")
   Call doc.ReplaceItemValue("Temp", "Hallo")
   Call doc.ComputeWithForm(True,False)
   Call doc.Save( True, True )

funktioniert nicht. Ich bekomm zwar keine Fehlermeldung mehr. Aber wenn ich mir eine Ansicht bastle in der alle Dokumente aufgelistet werden sollen die das Feld Temp beinhalten.
Bzw. die mit der Maske AdvancedInfo erstellt worden sind, wird nichts angezeigt.
Titel: Re:Per Script neues Dokument erstellen (Maske selbst festlegen)
Beitrag von: Driri am 30.10.03 - 14:17:48
Hi,

ReplaceItemValue funktioniert nur, wenn Du vorher ein entsprechendes Objekt erzeugst.

Versuchs mal so :

Set doc = db.CreateDocument
doc.Form = "AdvancedInfo"
doc.Temp = "Hallo"
Call doc.ComputeWithForm(True,False)
Call doc.Save( True, True )
Titel: Re:Per Script neues Dokument erstellen (Maske selbst festlegen)
Beitrag von: TomLudwig am 30.10.03 - 14:24:24
Das macht er auch ohne Probleme laut Debugger....
Aber ich finde das erstellte Dokument immernoch in keiner Ansicht oder der gleichen!
Titel: Re:Per Script neues Dokument erstellen (Maske selbst festlegen)
Beitrag von: koehlerbv am 30.10.03 - 14:27:03
Schick mal Deinen kompletten Code ...
Titel: Re:Per Script neues Dokument erstellen (Maske selbst festlegen)
Beitrag von: TomLudwig am 30.10.03 - 14:30:41
bittesehr... ich werd nicht mehr schlau draus....

Sub Click(Source As Button)
   Dim uiwork As New NotesUIWorkspace
   Dim uidoc As NotesUIDocument
   Dim doc As NotesDocument   
   Dim itemDB As NotesItem
   Dim itemSRV As NotesItem   
   Dim strSrv As String
   Dim strDb As String   
   Dim db As NotesDatabase
   Dim acl As NotesACL
   Dim entry As NotesACLEntry
   Dim isSonstig As Integer
   
   Set uidoc = uiwork.CurrentDocument
   Set doc = uidoc.document
   Set itemDB = doc.GetFirstItem("DB")
   Set itemSRV = doc.GetFirstItem("Server")   
   strDb = itemDB.Text   
   strSrv = itemSRV.Text
   
   If strDb = "" Then
      returnvalue = Messagebox("Es wurde keine Datenbank ausgewählt!",MB_OK, "Keine Datenbank")
      Exit Sub
   End If
   
   If strSrv = "Lokal" Then
      strSrv = ""
   End If
   Set db = New NotesDatabase( strSrv, strDb)
   Set acl = db.ACL   
   Set entry = acl.GetFirstEntry      
   
   Dim itemPerson As NotesItem
   Dim itemServer As NotesItem
   Dim itemSonst As NotesItem
   
   Do While Not(entry Is Nothing)
      Set nname = New NotesName(entry.Name)   
      isSonstig = 0
      Select Case nname.Organization
      Case "HH"
         Set itemServer = doc.Getfirstitem("HH_ACLServer")
         Set itemPerson = doc.Getfirstitem("HH_ACLPerson")      
         Set itemSonst = doc.Getfirstitem("HH_ACLSonstiges")
      Case "IWS"
         Set itemServer = doc.Getfirstitem("IWS_ACLServer")
         Set itemPerson = doc.Getfirstitem("IWS_ACLPerson")      
         Set itemSonst = doc.Getfirstitem("IWS_ACLSonstiges")   
      Case Else
         Set itemServer = doc.Getfirstitem("Sonst_ACLServer")
         Set itemPerson = doc.Getfirstitem("Sonst_ACLPerson")      
         Set itemSonst = doc.Getfirstitem("Sonst_ACLSonstiges")   
         isSonstig = 1
      End Select      
      
      If isSonstig =1 Then
         If entry.IsPerson = True Then   
            itemPerson.appendToTextList(entry.Name)               
            itemPerson.appendToTextList(" ")      
         Elseif entry.IsServer = True Then
            itemServer.appendToTextList(entry.Name)            
            itemServer.appendToTextList(" ")                        
         Else
            itemSonst.appendToTextList(entry.Name)            
            itemSonst.appendToTextList(" ")                        
         End If   
      Else
         If entry.IsPerson = True Then   
            itemPerson.appendToTextList(nname.Common)               
         Elseif entry.IsServer = True Then
            itemServer.appendToTextList(nname.Common)            
         Else
            itemSonst.appendToTextList(entry.Name)
            itemSonst.appendToTextList(" ")      
         End If   
      End If
      
      Set entry = acl.GetNextEntry(entry)      
   Loop    
   
   
   
   Set doc = db.CreateDocument
   doc.Form = "AdvancedInfo"
   doc.Temp = "Hallo"
   Call doc.ComputeWithForm(True,False)
   If (doc.Save( True, True )) Then
      Messagebox("gespeichert")
   Else
      Messagebox("Fehler")
   End If
   
   
End Sub
Titel: Re:Per Script neues Dokument erstellen (Maske selbst festlegen)
Beitrag von: Driri am 30.10.03 - 14:39:19
Hi,

ich habs jetzt aus Zeitgründen nur überflogen, aber mir ist aufgefallen, daß Du doc einmal oben verwendest und dort auf das UIDocument verweist und dann später im letzten Abschnitt über doc ein neues Dokument erzeugst.

Ich schau nachher noch mal drüber, wenn ich nen bißchen mehr Zeit habe.
Titel: Re:Per Script neues Dokument erstellen (Maske selbst festlegen)
Beitrag von: koehlerbv am 30.10.03 - 14:42:49
Das sollte aber nicht weh tun ...
Wächst denn nach Ablauf des Scripts Deine DB um ein Dokument (lt. DB-Properties)? Schaust Du auch in der richtigen DB nach ? Du erzeugst das Doc ja in einer anderen DB, die Du ja über die Felder in Deinem NotesUIDocument ausliest.

Bernhard
Titel: Re:Per Script neues Dokument erstellen (Maske selbst festlegen)
Beitrag von: TomLudwig am 30.10.03 - 14:52:37
Verdammt....

Genau des wars mit der Datenbank die ich von oben einlese! Shit!
Jezt hab ich unsere ganzen Datenbanken mit irgendeinem müll zugeschüttet.

Ich glaube jetzt müsste es funktionieren....
Titel: Re:Per Script neues Dokument erstellen (Maske selbst festlegen)
Beitrag von: Semeaphoros am 30.10.03 - 14:58:44
Aha, man lerne:

Zuerst soll man alle Datenbanken zumüllen, wenn man das geschafft hat, dann funktionierts ......... :P
Titel: Re:Per Script neues Dokument erstellen (Maske selbst festlegen)
Beitrag von: koehlerbv am 30.10.03 - 15:02:07
Nein, nein: Man lerne, NIEMALS fremden Code einzusetzen, dessen Funktion man nicht vollständig erfasst hat. Und das gilt meines Erachtens insbesondere für Neulinge.

Wir hatten das doch erst vor wenigen Monaten: "Niemand würde sich in einen EuroFighter mit laufenden Triebwerk setzen (den man zufällig "gefunden" hat ;-) und irgendeinen Knopf drücken, um zu sehen, was denn dann passiert."
;-)

Bernhard
Titel: Re:Per Script neues Dokument erstellen (Maske selbst festlegen)
Beitrag von: TomLudwig am 30.10.03 - 15:04:41
Theoretisch sind die Dokumente ja egal, die ich gespeichert habe.
Steht ja nur Hallo drin.

Oder können die irgendwelche Auswirkungen haben?
Titel: Re:Per Script neues Dokument erstellen (Maske selbst festlegen)
Beitrag von: Semeaphoros am 30.10.03 - 15:09:05
Bernhard:

Ok ok, das sind wohl die, die dann in Obb abstürzen ..... :-((

Und ich bin doch auch noch Neuling, bin doch erst seit 5 Wochen hier ............     ;D



Tom:
Na ja, elegant ist es sicher nicht. Ob sie stören oder nicht, wenn in allen betroffenen Datenbanken die Programmeure der Agenten und ähnlichem damit rechnen, dass sie falsche Dokumente bekommen könnten, dann sollte tatsächlich nix passieren. Sonst ......... siehe EuroFighter