Autor Thema: [solved] Copy Embedded Objektes aus RTF Feld aus DB in akt. Dok ohne Ed. Rechte  (Gelesen 4499 mal)

Offline MiPa

  • Frischling
  • *
  • Beiträge: 15
Hallo,

ich möchte aus eineme RTF Feld das nur eine einziges OLE Objekt enthält aus ein Vorlagendatenbank herauskopieren und in mein aktuelles Body Field einfügen. Das klappt auch mit meinem Script perfekt. Aber sobald ich keine Editoren Rechte auf die Vorlagendatenbank ahbe um das Dokument in den Edit Modus zu setzen kann ich das nicht kopieren. Wie lässt sich das anders lösen damit das auch ohne Editoren Rechte auf die Vorlagendatenbank klappt?

Michael


Code
Sub Initialize
	On Error Goto errorHandler
	
	Dim ws As New notesUIWorkspace
	Dim uidoc As NotesUIDocument
	Dim templateDB As notesdatabase
	Dim session As New notesSession
	Dim dc As NotesDocumentCollection
	Dim templateDoc As notesDocument
	Dim currentUIDoc As notesUIDocument
	
	Set templateDB = session.getDatabase(session.CurrentDatabase.Server, "vorlagen2.nsf", False)
	If templateDB Is Nothing Then
		Messagebox "Vorlagendatenbank nicht gefunden."
		Exit Sub
	End If
	
	Set dc = ws.PickListCollection( 3, False, templateDB.server, templateDB.filepath, "($All)", "Vorlage wählen", "Wählen Sie eine Vorlage." )
	
	If dc.Count = 0 Then
		Print "Keine Vorlage gewählt."
		Exit Sub
	End If
	
	Set templateDoc = dc.getFirstDocument
	
	Print "Gewählte Vorlage: "+templateDoc.subject(0)
	
	Set currentUIDoc = ws.CurrentDocument
	
	Set uidoc = ws.EditDocument(True, templateDoc)
	Call uidoc.GotoField("Body")
	Call uidoc.SelectAll
	uidoc.document.saveOptions = "0"
	Call uidoc.Copy
	Call uidoc.close
	
	Call currentUIDoc.GotoField("Body")
	Call currentUIDoc.Paste
	
	
errorExit:
	Exit Sub
errorHandler:
	Print Cstr(Erl)+" "+Error$
	Resume errorExit
End Sub
« Letzte Änderung: 26.10.10 - 10:41:01 von MiPa »

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Hier wird Dir nur ein NotesDocument.CopyItem resp. CopyAllItems helfen - also eine Backend-Aktion, die selbstverständlich das Speichern des neu erzeugten Dokuments vor dem Öffnen im Frontend erfordert.

Mit einem Zwischenschritt mehr geht es auch wieder im Frontend: Du machst einen Zwischenschritt über ein persönliches ProfileDocument. Hier bei natürlich nicht vergessen, die Items, die gleich mit dem Kopieren kommen, vorher aus dem ProfileDocument zu löschen.

HTH,
Bernhard

PS: Da Du bisher noch nie auf gegebene Tipps geantwortet hast, ist dies mein letzter Versuch ...

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Du kannst auch eine Maske bauen, die nur das zu kopierende Feld enthält, dann vor dem Öffnen des Dokuments das Feld Form auf die Maske ändern, Dokument öffnen und im Lesemodus alles markieren und kopieren.

Offline MiPa

  • Frischling
  • *
  • Beiträge: 15
Und wie bitte baue ich eine Maske auf, die nur das Body Field aus der anderen Maske darstellt? Ich stehe jetzt mal total auf dem Schlauch. Danach könnte ich dann mit CopyAllItems denke ich mal arbeiten....

Michael

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Ok, ein kleiner Grundlagenkurs:

Eine Maske definiert, wie ein Dokument, das mit der Maske geöffnet wird, aussieht und funktioniert.

Ein Dokument enthält Daten in Feldern. Ein Feld heißt "Form", in diesem Feld steht der Name der Maske, mit dem das Dokument angezeigt wird, wenn es geöffnet wird (ich ignoriere bewusst im Dokument gespeicherte Masken).

Du kannst daher nicht eine Maske erstellen, die den Feldinhalt aus einer anderen Maske anzeigt, denn der Feldinhalt befindet sich in einem Dokument.

Wenn Du also Dein Dokument, in dem sich das Feld mit dem Embedded Object befindet, in einer anderen Maske anzeigen willst, brauchst Du nur in das Feld "Form" dieses Dokuments temporär den Namen der anderen Maske einzutragen und dann das Dokument zu öffnen. Ein Kopieren von Feldern ist hierzu nicht notwendig (Du öffnest schließlich dieses Dokument, es findet keine Veränderung am Dokument statt (außer der Form), es wird nur anders angezeigt, eben durch die Anzeigemaske und nicht durch die Maske, mit der es erstellt wurde).

In die Anzeigemaske nimmst Du nur das Body-Feld auf, dann wird beim Öffnen des Dokuments auch nur das Body-Feld angezeigt.

Kleiner Nachsatz zur kompletten Verwirrung:
Selbstverständlich sind Masken wie alle Gestaltungselemente auch Dokumente in einer Datenbank, und auch diese Dokumente haben Felder mit Feldinhalten, z.B. über die Definition, wie ein Feld aussieht, oder welches Script in welchem Event ablaufen soll.

Offline MiPa

  • Frischling
  • *
  • Beiträge: 15
Ich habe das ganze nun gelöst. Alle Inhalte bis auf das Body Feld vor dem Kopieren geschützt und dann mit Formelsprache umgesetzt:

Einfach aber es funktioniert wie gewünscht

Michael
Code
@Command( [EditGotoField] ; "Body" );
cAus := "Auswahl";
cAusTxt := "Bitte wählen Sie eine Vorlage aus";
cServer := @ServerName;
cDBName := "vorlagen2.nsf";
TBaustein := @PickList([Custom] : [Single] ; cServer : cDBName ; "($All)" ; cAus ; cAusTxt ; 4);
TBListe := @Trim(TBaustein);
@Command( [FileOpenDatabase]; cServer : cDBName; "($All2)";TBListe);
@PostedCommand([EditDocument]; "0");
@PostedCommand([EditCopy]);
@PostedCommand([FileCloseWindow]);
@PostedCommand([FileCloseWindow]);
@PostedCommand([EditPaste])

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Danke für die Rückmeldung. Wichtig in einem Forum ist m.E. nicht nur, dass man selbst eine Lösung erhält, sondern auch, dass man diese (oder den Ansatz dazu) auch anderen Forumsteilnehmern zur Verfügung stellt.

Um den Ansatz mit der separaten Anzeigemaske zu realisieren, hätte es nur ein paar kleiner Änderungen in Deinem Script gebraucht. Hier der relevante Auszug:

Set templateDoc = dc.getFirstDocument
templateDoc.Form = "NameDerAnzeigemaske"   
Print "Gewählte Vorlage: "+templateDoc.subject(0)
   
Set currentUIDoc = ws.CurrentDocument
   
Set uidoc = ws.EditDocument(TrueFalse, templateDoc)
Call uidoc.GotoField("Body")
Call uidoc.SelectAll
uidoc.document.saveOptions = "0"
Call uidoc.Copy
Call uidoc.close
   
Call currentUIDoc.GotoField("Body")
Call currentUIDoc.Paste

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz