Das Notes Forum

Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: iukhdh am 05.05.11 - 11:23:28

Titel: Beim Kopieren eines Dokuments in Ansicht soll altes Dokument markiert bleiben
Beitrag von: iukhdh am 05.05.11 - 11:23:28
Hallo Forum,

folgendes Problem hab ich:

Ich erstelle über einen Ansichtsbutton eine Kopie eines Dokumentes, in dem ich dann noch einige Werte ändern muss.
Kopiervorgang läuft soweit ganz gut, nur hab ich das Problem, dass danach immer die Kopie in der Ansicht markiert ist, nicht mehr das Original.

Kann ich das so einrichten, dass das Original weiterhin markiert bleibt, weil sicherlich öfters mal mehrere Dokumente nacheinander durch diese Kopiererei erstellt werden.

Das ganze wird eine Inventardatenbank, in der z.B. eine Lieferung von 20 gleichartiger PCs eingegeben wird, die sich nur durch die Seriennummer unterscheiden.

Hier noch der bisherige, rudimentäre Code

Code
Sub Click(Source As Button)
	
	Dim session As New notessession
	Dim db As notesdatabase	
	Dim col As NotesDocumentCollection
	Dim doc As notesdocument
	Dim doc2 As notesdocument
	Dim nuiw As New NotesUIWorkspace
	
	Set db = session.currentdatabase
	'holt die ausgewählten Dokumente
	Set col = db.UnprocessedDocuments
	
	'Abfragen dass nur ein Dokument markiert ist
	If col.Count <> 1 Then
		Messagebox "Bitte genau 1 Dokument zum Kopieren markieren.", 0,"Achtung"
		Exit Sub
	End If
	
' aus dem aktuellen UIDokument ein BackendDoc erstellen
	Set doc = col.GetFirstDocument
'neues Doc generieren und in Datenbank kopieren
	Set doc2 = doc
	
'Felder austauschen zwischen doc2 und doc
	doc2.form = "Hardware"
	
	'Hier dann die Felder ändern **********************************
	
	doc2.Seriennummer = "hallo Testeingabe"
	
	
	'************************************
	Call doc2.CopyToDatabase(db)
	Call doc2.Save(True,False)
	
	Call nuiw.ViewRefresh
	
	
End Sub

Danke für die Hilfe

Thomas
Titel: Re: Beim Kopieren eines Dokuments in Ansicht soll altes Dokument markiert bleiben
Beitrag von: klaussal am 05.05.11 - 11:33:19
Vielleicht hiermit ?

Zitat
Call notesDocument.MarkUnread( [username] )
Titel: Re: Beim Kopieren eines Dokuments in Ansicht soll altes Dokument markiert bleiben
Beitrag von: koehlerbv am 05.05.11 - 11:37:05
Du machst das doch in einer NotesUIView - dann kannst Du die Methode SelectDocument verwenden.

Dein Set doc2 = doc
ist falsch - doc2 ist danach das gleiche wie doc.

Es reicht CopyToDatabase, dann Felder tauschen und dann nochmals speichern (CopyToDatabase hat bereits doc2 gespeichert).

Bernhard
Titel: Re: Beim Kopieren eines Dokuments in Ansicht soll altes Dokument markiert bleiben
Beitrag von: Tode am 05.05.11 - 12:19:12
Sorry, aber der Code ist Humbug...

Folgendes machst Du:

Du holst Dir Dok

dann erstellst Du eine neue Variable dok2, die auf das selbe Dokument referenziert.

Dann kopierst Du dok2, aber ohne eine Referenz auf das neu kopierte Dokument (in dem Fall dok3) zu erhalten.

Und schliesslich speicherst Du das dok2 (das gleichzeitig das ursprüngliche dok ist) neu ab und änderst dadurch das "Quelldokument" für Deine Kopieraktion nochmal ab...

Deine Feld- Änderungen sind nach dieser Aktion in BEIDEN Dokumenten, weil Du zuerst das Original- Dokument änderst, dann von der Änderung eine Kopie erstellst, und danach das Original- Dokument mit den neuen Werten abspeicherst....

So müsste es aussehen, dann tut es auch das, was Du willst:
Code
Sub Click(Source As Button)
	
	Dim session As New notessession
	Dim db As notesdatabase	
	Dim col As NotesDocumentCollection
	Dim doc As notesdocument
	Dim doc2 As notesdocument
	Dim nuiw As New NotesUIWorkspace
	
	Set db = session.currentdatabase
	'holt die ausgewählten Dokumente
	Set col = db.UnprocessedDocuments
	
	'Abfragen dass nur ein Dokument markiert ist
	If col.Count <> 1 Then
		Messagebox "Bitte genau 1 Dokument zum Kopieren markieren.", 0,"Achtung"
		Exit Sub
	End If
	
' aus dem aktuellen UIDokument ein BackendDoc erstellen
	Set doc = col.GetFirstDocument
'neues Doc generieren und in Datenbank kopieren
	Set doc2 = doc.CopyToDatabase(db)
	
'Felder austauschen zwischen doc2 und doc
	doc2.form = "Hardware"
	
	'Hier dann die Felder ändern **********************************
	
	doc2.Seriennummer = "hallo Testeingabe"
	
	
	'************************************
	Call doc2.Save(True,False)


	Call nuiv.SelectDocument(doc)	
	Call nuiw.ViewRefresh
	
	
End Sub

EDIT: Ich hoffe, Du hast sauber gefüllte Autoren- Felder in dem Dokument oder Deine User haben mehr als Autoren- Rechte in der Datenbank. Denn sonst wirst Du nach dem

set doc2 = doc.CopyToDatabase(db)

das doc2 unter Umständen nicht mehr bearbeiten können, weil auch die Autoren- Felder mitkopiert wurden. Dann bekommst Du beim Versuch des Speichern die Fehlermeldung "Sie können keine Dokumente ändern, für die sie nicht als zulässiger Autor aufgeführt sind" (oder so ähnlich)
Titel: Re: Beim Kopieren eines Dokuments in Ansicht soll altes Dokument markiert bleiben
Beitrag von: iukhdh am 05.05.11 - 15:17:02
Hallo zusammen,

sorry das ich so spät reagiere, kaum schreib ich hier was rein muss ich schon außer Haus. Aber jetzt bin ich wieder da. Danke für Eure Rückmeldungen.

So wie es aussieht und ich aus Todes Posting rauslese, hab ich das Handling mit dem CopytoDatabase falsch verstanden. Werd ich anpassen.

Aber es ist auch bei meinem bisherigen Code nicht so, dass ich hinterher 2 gleiche Dokumente hätte. Ich bekomme einwandfrei ein neues, geändertes Dokument und behalte weiterhin das Originaldokument.

 ??? 

Die Methode SelectDocument war das, was ich gesucht habe. Danke.
Titel: Re: Beim Kopieren eines Dokuments in Ansicht soll altes Dokument markiert bleiben
Beitrag von: iukhdh am 05.05.11 - 15:32:02
Nur zur Vollständigkeit:

Bei Todes Code hat noch im oberen Bereich ein wenig gefehlt, so funktioniert es einwandfrei. Es war die View noch nicht berechnet

Sub Click(Source As Button)
   
   Dim session As New notessession
   Dim db As notesdatabase   
   Dim col As NotesDocumentCollection
   Dim doc As notesdocument
   Dim doc2 As notesdocument
   Dim nuiw As New NotesUIWorkspace
   Dim nuiview As NotesUIView
   
   Set db = session.currentdatabase
   Set nuiview = nuiw.CurrentView
   
   'holt die ausgewählten Dokumente
   Set col = db.UnprocessedDocuments

...
   
   '************************************
   Call doc2.Save(True,False)
   
   Call nuiview.SelectDocument(doc)   
   Call nuiw.ViewRefresh
   
End Sub