Hallo,
man kann in Ansichten ja image Ressourcen anzeigen, die in der Datenbank eingebunden sind.
Gibt es eine Möglichkeit, per Script oder Formelsprache Bilder in die Datenbank zu importieren?
Danke für Eure Antworten
Gruss
Zonk
Hallo,
man kann in Ansichten ja image Ressourcen anzeigen, die in der Datenbank eingebunden sind.
Gibt es eine Möglichkeit, per Script oder Formelsprache Bilder in die Datenbank zu importieren?
Danke für Eure Antworten
Gruss
Zonk
sieht schlecht aus. Selbst wenn es gehen würde bräuchte der Ersteller der Bildressource mind. Entwicklerrechte.
Gruß
Dirk
das wäre nicht wirklich das Problem, weil die Bilder über einen periodischen Import geliefert würden. Der Agent würde dann mit Managerrechten aktiviert werden.
Danke für Deine Antwort....
Gruss
Zonk
Mit reinen Notesmitteln ist ein automatisierter Import insofern problematisch, da die Client-Funktion "Importieren" eine UI-Funktion des Designers ist.
Man könnte hier versuchen mit Script oder über die API entsprechende Ressourcenobjekte zu generieren.
Was ich mir noch vorstellen könnte, wenn es ausschließlich um Objekte des Typs Image-Ressource geht, die Funktion WebDAV zu verwenden. WebDAV ist seit Release 6 extra zur Pflege von Imageressourcen mit Nicht-Notes-Clients eingeführt worden. Dazu kann man dann einen WebDAV Client einsetzen. Einige Anbieter von WebDAV-Clients haben sicherlich auch Scripte für die automatisierte periodische Pflege beigelegt und es braucht in dem Fall nichts programmiert sonder nur WebDAV aktiviert zu werden.
Zonk
die Bildressourcen können per Base64-Encode und DXL importiert werden. Dazu reicht LotusScript, d.h. keine API und keine Fremdprodukte. Habe es mit JPG und GIF getestet. Die Fehlerbehandlung ist noch verbesserungswürdig.
Aufruf:
Sub Initialize Dim session As New NotesSession Dim db As NotesDatabase Set db = session.CurrentDatabase Dim ImageFile As String Dim FileName As String Dim TempPath As String Dim Typ As String Dim array As Variant' ImageFile = "d:\test.jpg" ImageFile = "d:\test.gif" TempPath = "c:\temp\" Array = Split(ImageFile, ".") Typ = Lcase(Array(Ubound(Array))) Set Array = Nothing Array = Split(ImageFile, "\") FileName = Lcase(Array(Ubound(Array))) Dim b64 As New Base64 RT64 = B64.encodeFile(ImageFile, TempPath & FileName & ".txt") If Not RT64 Then Exit Sub RTCreateDXL = CreateDXL(TempPath & FileName & ".txt", TempPath & FileName & ".dxl", Typ, FileName) If Not RTCreateDXL Then Exit Sub RTImportDXL = DXLImport(db, TempPath & FileName & ".dxl") If Not RTImportDXL Then Exit SubEnd Sub
In Declarations importierst Du den Dateianhang. Dort ist die Class zur Base64 Codierung enthalten.
Function CreateDXL
Function CreateDXL(sourceFile As String, targetFile As String, Typ As String, ImageName As String) As Variant Dim text As String CreateDXL = True CreateDXLError = "" If Typ <> "gif" And Typ <> "jpg" And Typ <> "jpeg" Then CreateDXLError = "ERROR: Falscher Typ" CreateDXL = False End If If Trim(ImageName) = "" Then CreateDXLError = "ERROR: ImageName ist leer" CreateDXL = False End If fin = Freefile() Open sourceFile For Input As fin fout = Freefile Open targetFile For Output As fout Print #fout, "<?xml version='1.0' encoding='utf-8'?>" Print #fout, "<!-- DXLExporter version 1.00 (build 72), schema (DTD) version 1.01 -->" Print #fout, "<!DOCTYPE imageresource SYSTEM 'xmlschemas/domino_6_5_4.dtd'>" Print #fout, "<imageresource name='" & ImageName & "' xmlns='http://www.lotus.com/dxl' version='1.01' publicaccess='false' designerversion='6.5.4'>" If Typ = "gif" Then Print #fout, "<gif>" Else Print #fout, "<jpeg>" End If Do While Not Eof(fin) Line Input #fin, text Print #fout, text Loop If Typ = "gif" Then Print #fout, "</gif>" Else Print #fout, "</jpeg>" End If Print #fout, "</imageresource>" Close #fout Close #finEnd Function
Function DXLImport
Function DXLImport(db As NotesDatabase, dxlDatei As String) As Variant
Dim session As New NotesSession
Dim stream As NotesStream
Dim importer As NotesDXLImporter
DXLImport = True
DXLImportError = ""
If Not db.isopen Then
DXLImportError = "ERROR: DB konnte nicht geöffnet werden."
DXLImport = False
Exit Function
End If
Set stream = session.CreateStream
If Not stream.Open(dxlDatei) Then
DXLImportError = "ERROR: Datei """ & dxlDatei & """ konnte nicht geöffnet werden."
DXLImport = False
Exit Function
End If
If stream.Bytes = 0 Then
DXLImportError = "ERROR: Datei """ & dxlDatei & """ ist leer."
DXLImport = False
Exit Function
End If
REM Import DXL into database
Set importer = session.CreateDXLImporter
importer.DesignImportOption = DXLIMPORTOPTION_CREATE
Call importer.Import(stream, db)
Call stream.Close
End Function
Alles anzeigen
Gruß
Dirk
Hallo Dirk,
ein super Beitrag, hat auch sofort funktioniert.
Meine Frage:
Ich habe aber das Problem, dass die Bildresource zwar sofort angelegt wird, aber ich die Datenbank erst schließen und danach wieder öffnen muß um das Bild zu sehen.
Gibt es eine Möglichkeit um einen refresh auf die Bildresourcen zu machen, um das Bild
z.B sofort als Zellenbild ( @GetField("picture") anzuzeigen ??
Gruß Paul
Aus folgenden Gründen solltest Du für die Bild-Resourcen eine extra DB benutzen:
- der Importer benötigt Designerrechte auf die DB und ich glaube nicht, dass Du allen Usern Entwicklerrechte geben willst.
- weil Du das Desigen im Hintergrund änderst, muss die DB im UI erst geschlossen werden.
Beide Punkte umgehst Du mit einer eigenen Ressourcen DB.
Gruß
Dirk
Guten Morgen Dirk,
es sollen natürlich nicht alle diese Uploads machen, nur ein bestimmter Personenkreis und die haben Entwicklerrechte.
Muß ich im UI die ganze DB closen oder reicht es wenn ich die Resource öffne und dann wieder close ( wenn ich die Maske aus dem Designer starte, ein Bild in die NSF speichere und anschließend im Designer die Bildresourcen öffne und wieder schließe ist das Bild sofort in der Maske verfügbar ).
Kannst du mich da im Source-Code unterstützen, in der Ecke war ich noch nicht im Lotusscript.
Danke
Gruß
Paul
Zitates sollen natürlich nicht alle diese Uploads machen, nur ein bestimmter Personenkreis und die haben Entwicklerrechte.
Ups ... wäre mir zu risikoreich. Ein User bekommt bei uns maximal Editorrechte auf eine DB. Am liebsten nur Autorenrechte.
Hintergrund ein Anwender kann Dir über verschiedene Wege aus Unwissenheit oder Unaufmerksamkeit Deine komplette DB zerstören. Deshalb bei mir der Umweg über die leere DB, in der nur die Ressourcen abgelegt werden. Auf diese DB haben die User dann Entwicklerrechte, können mir aber die Gestaltung der prod. DB nicht zerstören. Diese Ressourcen DB wird eigentlich zur reinen Inhalts-DB.
ZitatMuß ich im UI die ganze DB closen oder reicht es wenn ich die Resource öffne und dann wieder close ( wenn ich die Maske aus dem Designer starte, ein Bild in die NSF speichere und anschließend im Designer die Bildresourcen öffne und wieder schließe ist das Bild sofort in der Maske verfügbar ).
Kann ich Dir aus obigen Grund nicht sagen, müsste ich auch erst testen. Meine Vermutung geht aber schon in die Richtung, dass die DB richtig geschlossen werden muss, d.h. sie darf in der Arbeitsoberfläche noch nicht mal markiert sein.
Wenn Du die Ressource öffnest und wieder schließt, wird eventuell der Client syncronisert, d.h. es könnte funktionieren (z.B. werden Ansichten bei Änderungen im Designer auch im Client neu aufgeaut).
Aber mal ein Ablauf, bei dem es zu sehr unschönen Nebeneffekten kommen kann:
- User A (kein Entwickler) öffnet die DB
- User B (Entwickler) öffnet die DB und erstellt eine neue Ressource
- User A bekommt bis zum nächsten Öffnen der DB (oder Client-Start) diese nicht angezeigt!
User B müsste auf allen Clients die DB ggf. schließen, bekommst Du aber nicht hin.
Gruß
Dirk
es ist doch aber auch bei einer extra NSF genauso, dass ich die DB zuerst komplett schließen muß bevor die Resourcen sichtbar werden oder liege ich da falsch und wie verhält sich das Zellenbild wenn die Bildresource nicht mehr in der eigenen nsf liegt
( @GetField("picture") ).
Ich werde ja mit Sicherheit auch deinen Beispiel-Code ändern müssen, wenn die Resource in eine andere DB geschrieben werden soll.
Gruß Paul
Du musst nur eine Zeile anpassen. Anstelle
Set db = session.CurrentDatabase
musst Du die andere DB benutzen
Set db = session.GetDatabase("DeinServer", "Deine DB").
Die DB musst Du nicht schließen, da diese nicht offen ist, die wird im BE zum Import geöffnet und das Objekt wird wieder geschlossen.
Zellenbild? Thema ist doch "Bilder in Ansichten anzeigen" oder in Dokumenten als Bild-Ressource.
OK probieren kannst Du folgendes:
- füge irgend ein Bild aus dieser DB als Zellenhintergrund ein
- ändere dann die Berechnung anhand eines Feldes
- in dieses Feld muss der Name des Bildes aus der Ressourcen-DB eingetragen werden.
Gruß
Dirk
Ich kann dem Zellenhintergrund aber entweder ein Bild zuweisen, oder ein Bild über eine Formel ( @getfield(Feldname aus dem Dokument )zuweisen.
Ich wüßte nicht wie ich hier eine ander DB angeben könnte
Gruß Paul
deshalb auch erstmal ein Bild (irgendein Bild) aus der Ressourcen DB eintragen (zum DB wechseln siehe Anhang). Und dann die Formel ändern. Bei eingebetteten Bildern wird dann das Bild aus dieser Ressourcen DB genommen.
Gruß
Dirk