Das Notes Forum

Domino 8 und frühere Versionen => ND7: Entwicklung => Thema gestartet von: gismored am 29.07.14 - 10:13:18



Titel: Massenänderung Script-Problem
Beitrag von: gismored am 29.07.14 - 10:13:18
Hallo zusammen,

würde gerne mehrere Dokumente markieren und diese aktion ausführen:

   Dim session As New NotesSession  
   Dim db As NotesDatabase          
   Dim doc As NotesDocument        
   Dim coll As NotesDocumentCollection  
   Dim feld1 As NotesItem  
   Dim Inhalt As String      
   Dim Feld As String                    
   Dim Inhalt2 As String                        
   Dim Feld2 As String                    
   Dim Inhalt3 As String
   Dim Feld3 As String          
   Set db=Session.CurrentDatabase        
   Set coll=db.UnprocessedDocuments  
   Feld="Lagerort"              
   Inhalt="MSC"            
   Feld2="Status"            
   Inhalt2="im MSC"            
   Feld3="Historie"          
   Inhalt3="wurde geändert von"            
   If coll.count>0 Then                            
      For Count = 1 To coll.Count            
         Set doc=Coll.GetNthDocument(Count)                  
         Set Feld1=doc.GetFirstItem(Feld)
         feld1.values=Inhalt            
         Set Feld1=doc.GetFirstItem(Feld2)
         feld1.values=Inhalt2                            
         Set Feld1=doc.GetFirstItem(Feld3)
         feld1.values=Inhalt3                    
         Call doc.Save (True, False)              
      Next                                
   End If

So lange ich Feld 3 und Inhalt 3 weglasse funktioniert es.
Das Feld Historie ist aber ein Richtext Feld und ich steh vor dem Problem
dass ich immer wieder die Meldung bekommen, objekt variable not set.
Ich finde nicht heraus, wie ich es deklarieren muß, damit es geht.
Könnt ihr mir da weiterhelfen ?


Titel: Re: Massenänderung Script-Problem
Beitrag von: ascabg am 29.07.14 - 10:34:21
Hallo,

Warum versuchts du nicht mal die Werte direkt in die betreffenden Felder zu schreiben?

Code:
doc.Lagerort = "MSC"
doc.Status = "im MSC"
doc.Historie = "wurde geändert von"

Call doc.Save(True, False)


Andreas

P.S.:
Eine Historie in dem Sinne ist es aber im Feld "Historie" nicht.
Du ueberschreibst es ja.


Titel: Re: Massenänderung Script-Problem
Beitrag von: gismored am 29.07.14 - 10:50:56
Stimmt, das ist viel einfacher so.  Danke dir.

Das mit der Historie ist so ne Sache.
So ist es natürtlich keine.

In der Formelsprache war das viel einfacher *grins

Würde gerne den Ist-Wert in eine Variable speichern und dann das Feld mit neuem Text + die Variable wieder speichern mit.

das hab ich schon probiert
h=doc.Getitemvalue("Historie")
und
doc.Historie="Wurde geändert am ..." + h


Titel: Re: Massenänderung Script-Problem
Beitrag von: ascabg am 29.07.14 - 10:52:39
Hallo,

Schau dir in der Hilfe mal etwas genauer diese Klasse hier an.

NotesRichTextItem


Andreas


Titel: Re: Massenänderung Script-Problem
Beitrag von: gismored am 29.07.14 - 12:02:23
hallo andreas,

versuche mich mal langsam da dran zu tasten.
erstnmal muß ich wissen was drin ist.
habe hier im forum eine explode funktion gefunden, die mir das mit zeile ausließt.
und wollte mir das in der msgbox anzeigen lassen.

Dim rt As NotesItem
Dim var As String
Set rt = doc.GetFirstItem("Historie")
var = Explode(rt.Text, Chr(13) +Chr(10))

MsgBox var ,MB_OK , Historie

doch er bringt mir immer wieder object variable not set
egal ob ich string oder variant nehme, oder notesitem oder notesrichtextitem.

gruß thomas



Titel: Re: Massenänderung Script-Problem
Beitrag von: ascabg am 29.07.14 - 12:26:48
Mal bescheiden gefragt.

Schon mal den Debugger bemueht?

Und wenn wir schon dabei sind.
Explode in Lotus Script ?   ???

Ich hoffe du verwechselst hier nicht @Forelsprache mit Lotus Script.


Andreas


Titel: Re: Massenänderung Script-Problem
Beitrag von: Tode am 29.07.14 - 13:08:33
@Andreas: Schonmal die Help durchforstet? Explode ist ein Alias für Split... auch in Script.

EDIT: Ich nehm alles zurück... da war wohl meine Erinnerung falsch...


Titel: Re: Massenänderung Script-Problem
Beitrag von: ascabg am 29.07.14 - 13:18:28
@Tode
Kann sein.

Ich hab aber aktuell keine Hilfe-Datenbanken zur Hand.
War aus dem Gedaechtnis heraus.


Andreas


Titel: Re: Massenänderung Script-Problem
Beitrag von: gismored am 29.07.14 - 13:20:53
hallo andreas,

sorry wenn ich mich vlt blöd anstelle.

den debugger hab ich genommen
und er steigt mir bei
Set rt = doc.GetFirstItem("Historie")
aus.
mit object variable not set

aber ich habe sie doch oben deklariert.

was mach ich hier für einen denkfehler.


Titel: Re: Massenänderung Script-Problem
Beitrag von: ascabg am 29.07.14 - 13:24:37
Und doc ist auch gesetzt?


Andreas


Titel: Re: Massenänderung Script-Problem
Beitrag von: gismored am 29.07.14 - 13:26:35
ich denke ja
mit
Dim doc As NotesDocument


Titel: Re: Massenänderung Script-Problem
Beitrag von: koehlerbv am 29.07.14 - 13:28:58
Das ist die Deklaration, aber nicht die Instantiierung ("Zuweisung").


Titel: Re: Massenänderung Script-Problem
Beitrag von: gismored am 29.07.14 - 13:37:24
stimmt.
Hab ich auch. Meine Zeilen hatte ich vor der Zuweisung. *grr.

ich häng das schript mal rein:
Dim session As New NotesSession   
   Dim db As NotesDatabase         
   Dim doc As NotesDocument         
   Dim coll As NotesDocumentCollection 
   Set db=Session.CurrentDatabase       
   Set coll=db.UnprocessedDocuments     
   Dim rt As NotesItem
   Dim var As String
   If coll.count>0 Then                             
      For Count = 1 To coll.Count             
         Set doc=Coll.GetNthDocument(Count) 
         Set rt = doc.GetFirstItem("Historie")
         var = Explode(rt.Text, Chr(13) +Chr(10))
         MsgBox var ,MB_OK , Historie             
         doc.Lagerort = "MSC"
         doc.Status = "im MSC"
         doc.Historie = "wurde geändert von"
         Call doc.Save (True, False)               
      Next                                 
   End If

und die funktion explode hier aus dem forum:

Function Explode(strWert As String, tz As String) As Variant
      Dim arrWerte() As String
      Dim i As Integer
    Do While Not strWert = ""
         If StrRight(strWert,tz) <> ""  Then
          ReDim Preserve arrWerte(i)   
            arrWerte(i)  = StrLeft(strWert,tz)
            strWert = StrRight(strWert,tz)
         Else
         strWert = ""
      End If
      i = i + 1
   Loop
   Explode = arrWerte
End Function

und dann bringt er mir:
attempt to access uninitialized dynamic array ???

gruß thomas


Titel: Re: Massenänderung Script-Problem
Beitrag von: gismored am 29.07.14 - 13:53:20
vlt nochmal hintergund für das ganze:

ein rtf-Feld auslesen in eine variable
dann den aktuellen baerbeitungstatus schreiben
und dann den inhalt der variable wieder dazuhängen.



Titel: Re: Massenänderung Script-Problem
Beitrag von: Driri am 29.07.14 - 14:52:12
var ist als String deklariert und die Explode-Function gibt einen Variant zurück.

Ich würde empfehlen, statt der selbstgeschriebenen Funktion die seit Domino 6 verfügbare Split-Function zu verwenden. Schmeiß die Explode-Function einfach raus und ersetze im Script "Explode" durch "Split".

Split liefert einen Array zurück, also achte auch hier auf die Deklaration der Variable.


Titel: Re: Massenänderung Script-Problem
Beitrag von: Driri am 29.07.14 - 14:56:09
Mir fällt gerade noch etwas auf:

Zitat
MsgBox var ,MB_OK , Historie

Der dritte Parameter ist ein String. Wenn Du das so übergibst, würde versucht, der Inhalt einer Variablen "Historie" als Titel für die Messagebox auszugeben.

Ich gehe davon aus, daß Du aber das Wort "Historie" als Titel haben willst. Dann müßtest Du das in Anführungszeichen setzen.


Titel: Re: Massenänderung Script-Problem
Beitrag von: gismored am 29.07.14 - 15:19:01
hallo ingo,

vielen dank für die hilfe.
das klappt jetzt auch .

im debugger seh ich jetzt bei der var alle einträge aus der historie.

wie kann ich nun erreichen, dass die variable in das feld "historie" wieder nach meinem eintrag:
doc.Historie = "wurde geändert von "+session.CommonUserName + " am " +Now +Chr(13)
wieder hinzugefügt wird?

gruß thomas

anbei das ganze script:

Sub Initialize
   Dim session As New NotesSession   
   Dim db As NotesDatabase         
   Dim doc As NotesDocument         
   Dim coll As NotesDocumentCollection 
   Set db=Session.CurrentDatabase       
   Set coll=db.UnprocessedDocuments     
   Dim rt As NotesItem
   Dim var As Variant
   If coll.count>0 Then                             
      For Count = 1 To coll.Count             
         Set doc=Coll.GetNthDocument(Count) 
         Set rt = doc.GetFirstItem("Historie")
         var = Split(rt.Text, Chr(13) +Chr(10))
         doc.Lagerort = "MSC"
         doc.Status = "im MSC"
         doc.Historie = "wurde geändert von "+session.CommonUserName + " am " +Now +Chr(13)
         Call doc.Save (True, False)               
      Next                                 
   End If
End Sub


Titel: Re: Massenänderung Script-Problem
Beitrag von: Tode am 29.07.14 - 16:40:11
ersetze
Code:
doc.Historie = "wurde geändert von "+session.CommonUserName + " am " +Now +Chr(13)
durch
Code:
Dim itemHistorie as NotesItem
...
For ...
    Set itemHistorie = doc.GetFirstItem( "Historie" )
    Call itemHistorie.AppendToTextList( "wurde geändert von "+session.CommonUserName + " am " +Now +Chr(13) )


Titel: Re: Massenänderung Script-Problem
Beitrag von: gismored am 29.07.14 - 16:53:40
hallo torsten

es funktioniert. ich danke dir.

das bedeutet aber dass alles mit split und so viel zu viel aufwand gewesen wäre.

aber ich möchte ja was lernen.
wenn ich mit der split aktion weiter gemacht hätte,
gäbe es eine andere variante, wie ich die variable hinzugefügt bekommen hätte,
denn ich hatte immer wieder das problem dass var nicht string sein konnte wegen dem inhalt
aber mein rtf string gebraucht hätte damit ich es mit "+var" in meine zeile bekommen hätte.
oder lieg ich da falsch ?

gruß thomas



Titel: Re: Massenänderung Script-Problem
Beitrag von: gismored am 30.07.14 - 09:05:46
hmmm.

warum funktioniert es heute morgen nicht mehr?
gestern hat es einwandfrei geklappt:
es kommt immer wieder object variable not set
Sub Initialize
   Dim session As New NotesSession   
   Dim db As NotesDatabase         
   Dim doc As NotesDocument         
   Dim coll As NotesDocumentCollection 
   Set db=Session.CurrentDatabase       
   Set coll=db.UnprocessedDocuments     
   Dim itemHistorie As NotesItem
   If coll.count>0 Then                             
      For Count = 1 To coll.Count             
         Set doc=Coll.GetNthDocument(Count) 
         doc.Lagerort = "MSC"
         doc.Status = "im MSC"
         Set itemHistorie = doc.GetFirstItem( "Historie" )
         Call itemHistorie.AppendToTextList( "wurde geändert von "+session.CommonUserName + " am " +Now +Chr(13) )
         Call doc.Save (True, False)               
      Next                                 
   End If
End Sub


Titel: Re: Massenänderung Script-Problem
Beitrag von: ascabg am 30.07.14 - 09:41:11
Hallo,

Schwer zu sagen.
An welcher Stelle kommt denn der Fehler?


Andreas


Titel: Re: Massenänderung Script-Problem
Beitrag von: gismored am 30.07.14 - 09:51:31
hallo andreas,

bei der:
Call itemHistorie.AppendToTextList( "wurde geändert von "+session.CommonUserName + " am " +Now +Chr(13) )

ich steh grad vollkommen auf dem schlauch.



Titel: Re: Massenänderung Script-Problem
Beitrag von: Tode am 30.07.14 - 09:57:31
Das doc hat kein item Historie...


Titel: Re: Massenänderung Script-Problem
Beitrag von: gismored am 30.07.14 - 10:31:49
hallo torsten,

das item "Historie" gibt es in der Maske.

an was könnte es noch liegen.



Titel: Re: Massenänderung Script-Problem
Beitrag von: koehlerbv am 30.07.14 - 10:38:24
Was bitte hat ein Item mit einer einer Maske zu tun??

Torsten hat eine Feststellung getroffen und keine Vermutung genannt.


Titel: Re: Massenänderung Script-Problem
Beitrag von: ascabg am 30.07.14 - 10:39:34
Zitat
das item "Historie" gibt es in der Maske.
Das mag sein.

Aber gibt es dieses Item auch in dem Dokument, welches du gerade mit dem Script bearbeitest?

Schau dir mal im Debugger die Items im doc an.


Andreas


Titel: Re: Massenänderung Script-Problem
Beitrag von: gismored am 30.07.14 - 11:26:10
hallo andreas,
danke dir für deine hilfe, auch wenn ich mich etwas dümmlich anstelle.
bin noch schwer formellastig, merk ich immer wieder.

unter doc item gibt es wirklich kein "historie".
die anderen felder sind doch aber auch drin
wieso das ?

hast einen tip für meinen denkfehler ?

gruß thomas


Titel: Re: Massenänderung Script-Problem
Beitrag von: gismored am 30.07.14 - 11:53:45
ein Licht ging auf *smile.
Sobald das Feld einen Inhalt hat funktioniert es.
Wenn noch nichts drin steht, gibt es das item noch nicht.

Was kann ich tun damit das item trotzdem im doc kommt auch wenn noch kein inhalt drin ist?


Titel: Re: Massenänderung Script-Problem
Beitrag von: RunRevilo am 30.07.14 - 12:11:20
Du prüfst zuerst ob es das item gibt. Wenn nicht erstellst du es.
Dasg geht z.B. indem du in deinem Code nach der Zeile

Set itemHistorie = doc.GetFirstItem("Historie")
folgendes einfügst:

Code:
If (itemHistorie is Nothing) then
set itemHistorie = New NotesRichtTextItem(doc,"Historie")
Call itemHistorie.AppendToTextList( "wurde geändert von "+session.CommonUserName + " am " +Now +Chr(13) )
end if

 


Titel: Re: Massenänderung Script-Problem
Beitrag von: ascabg am 30.07.14 - 12:13:05
Kurz gesagt.

Vorher pruefen, ob dieses im Dokument existiert (z.B. doc.HasItem(...))
und anhand des Resultates dieser Pruefung entscheiden, was getan werden soll.
- vorhandenes nehmen und wie bisher ergaenzen
- noch nicht vorhanden, dass erstellen.


Andreas


Titel: Re: Massenänderung Script-Problem
Beitrag von: gismored am 31.07.14 - 10:45:23
hallo zusammen,

es funktioniert.
ich danke euch allen

und sorry, für meine scheinbar etwas dämlichen fragen zwischendurch.

gruß