Dateihandling

Jeder kennt das Problem: Die User in einem Unternehmen erstellen verschiedenartige Dokumente, die im Filesystem gespeichert werden. Bedingt durch Sicherheitsrichtlinien haben nicht alle Mitarbeiter die gleichen Zugriffsrechte.
In den meisten Unternehmungen gibt es noch nicht einmal ein Transferlaufwerk, auf das ALLE Mitarbeiter Lese- und Schreibberechtigung haben. Daher wird vielfach der Dateiaustausch über das Medium email bewerkstelligt. Je nach den gewählten Benutzereinstellungen entstehen durch diese Methode Duplikate ( Original auf dem Filesystem, Kopie im Ordner “Gesendet” und noch eine Kopie beim Empfänger ).
Angeregt durch den Thread “Dateiauswahl in Mailmaske” im deutschen Notes Forum habe ich das Thema aufgegriffen und möchte hier meinen Lösungsvorschlag vorstellen.

Einen Lösungsansatz findet man z.B. in der Sandbox. Allerdings werden die Dateien beim Klicken auf die erzeugten Links nicht in der zugehörenden Applikation sondern im Browser geöffnet. Im ungünstigsten Fall wird statt des Dateiinhaltes lediglich der Downloaddialog angezeigt. Da drehen wir uns dann im Kreis, denn ein erneutes Speichern der Datei wollen wir ja gerade vermeiden.

Selbstverst?ndlich wäre es schön, wenn ein Link zu einer Datei ebenso wie die Links in diesem Beitrag im Kontext des Textes erzeugt werden k?nnen. Dazu müsste man dann die Notes API verwenden. Erste Versuche haben aber gezeigt, dass die Verwendung der Api in diesem Falle alles Andere als trivial ist.

Daher habe ich mir einen anderen Ansatz überlegt. Zwar wird auch hier in einer Funktion Gebrauch von der Windows API gemacht, ob die API aber unbedingt notwendig ist, ist im Einzelfall zu prüfen.

Die vorgeschlagene Lösung basiert auf einer Teilmaske; somit kann die gewünschte Funktionalität in jede beliebige Datenbank eingebaut werden. Die Teilmaske enthält alle erforderlichen Elemente. Zusätzliche Script Bibliotheken oder Agenten sind nicht erforderlich.

In der Teilmaske sind folgende Funktionen enthalten

  • Hinzufügen einer Datei ( Add File )
  • Enfernen einer Datei ( Remove File )
  • Entfernen aller Dateien ( Remove All )
  • Starten einer Datei ( Open File )

Die Auswahl der Dateien erfolgt über einen Dialog, wie er in Windows Anwendungen üblich ist. Notes stellt eine API Funktion zur Verfügung, die in Lotus Script verwendet werden kann.

Declare Function NEMGetFile Lib "nnotesws" (wUnk As Integer, Byval szFileName As String, Byval szFilter As String, Byval szTitle As String ) As Integer
Sub Click(Source As Button)
	Dim workspace As New NotesUIWorkspace
	Dim uidoc As NotesUIDocument
	Set uidoc = workspace.CurrentDocument
	Dim szFileName As String*256
	Dim szTitle As String
	Dim szFilter As String
	Dim session As New NotesSession
	szFilename = Chr(0)
	szTitle = session.Commonusername & ", select your database NOW"
	szFilter = "MS Word Documents|*.doc|Notes Databases|*.NSF|Notes Templates|*.NTF|Programs|*.EXE|All Files|*.*|"
	If NEMGetFile( 0, szFileName, szFilter, szTitle) <> 0 Then
		szFileName = szFileName & |"|
		Call uidoc.FieldAppendText ( "fList",  "," + GetShortFileName (szFileName) + "," )
	End If
End Sub

In einem früheren Code ( reattach ) habe ich beobachtet, daÃ? Notes manchmal Probleme bei langen Dateinamen hat. Diese Probleme treten besonders dann auf, wenn der Pfad oder die Datei selber Leerzeichen enthält. Daher habe ich die Function GetShortFileName eingebaut. Die Funktion bedient sich der Windows API

Declare Function GetShortPathName Lib "kernel32" Alias"GetShortPathNameA" (_
Byval lpszLongPath As String,Byval lpszShortPath As String, Byval cchBuffer As Long) As Long
Function GetShortFileName ( fileName As String ) As String
	Dim sBuffer As String , lLen As Long
	sBuffer = Space$ ( 512 )
	lLen = GetShortPathName  ( fileName , sBuffer , Len ( sBuffer ) )
	GetShortFileName = Left$(sBuffer, lLen )
End Function

Damit ist eigentlich auch schon der GroÃ?teil der Arbeit getan; ab hier geht es wieder ohne Lotus Script weiter.

btnRemoveFile

 _Names :=  fList ;
_Del :=  @Prompt([OkCancelList]:[NoSort] ;"Dateiauswahl";"Bitte wählen Sie die zu löschende Datei aus!"; "" ; _Names ) ;
@If( _Del != 1; "" ; @Return( "" ) ) ;
_Elems := @Elements( _Names ) ;
_Pos := @Member( _Del ; _Names ) ;
FIELD fList := @Trim( @If( _Pos = 1 ; "" ; @Subset( fList ; _Pos - 1 ) )  : @If( _Pos = _Elems ; "" ; @Subset( fList ; - ( _Elems - _Pos )  ) ) ) ;
@Command([ViewRefreshFields])

btnRemoveAll

FIELD fList:=@DeleteField;
@True

Damit wären wir schon am Ende; war doch gar nicht so schwer, oder? Ich bin mir darüber im Klaren, dass dies nur eine einfache Lösung ist. Selbstverständlich m?ssen die Empfänger einer Mail mit Dateilinks auch Zugriff auf die Dateien haben. Anwender, die ohne Netzanbindung arbeiten können nicht auf die Links zugreifen. Es sollte auch keine allumfassende Lösung vorgestellt werden. Es handelt sich, wie eingangs erwähnt lediglich um einen Ansatz. Möglicherweise ist dem Einen oder Anderen damit schon geholfen. Wenn dem so ist, würde ich mich ?ber ein kurzes Feedback freuen.

DOWNLOAD

One thought on “Dateihandling

  1. Hallo,
    ich haben die Teilmaske in 1 – 2 Datenbanken eingebaut. Leider stelle ich fest, dass das Script Probleme mit Umlauten in Dateinamen macht. Will ich eine solche Datei zufügen, so wird zwar ein weiteres Komma eingefügt, jedoch fehlt der Eintrag der konkreten Datei. Dies betrifft sowohl Dateien im AktiveDirectory als auch auf der lokalen Festplatte.
    Wir verwenden hier WinXP.
    Ist dieses Problem bekannt oder gibt’s gar schon eine Lösung?
    Ich google mal noch ein bisschen und versuche mal in die API-Tiefen hinabzusteigen.
    Dank und Gruß
    von Rudido

Comments are closed.