Das Notes Forum

Domino 9 und frühere Versionen => ND9: Entwicklung => Thema gestartet von: Michael Kl am 14.12.15 - 12:55:14

Titel: [Erledigt ohne Erfolg] Import einer CSV-Datei beim Maileingang
Beitrag von: Michael Kl am 14.12.15 - 12:55:14
Hey Leute,

wiedereinmal brauche ich eure Hilfe.
Es geht um einen automatischen Import von CSV Dateien die bei dem Maileingang erkannt werden.
Die Erkennung läuft bereits, nur der Import selber nicht.

Wenn ich den Import manuell starte und eine Datei vom PC auswähle, dann funktioniert es einwandfrei.
Meine Frage ist, wie kann ich ein Anhang für den Import öffnen?
Normalerweise war meine impfile = "C:\Pfad"
Ich dachte ich kann nun direkt den Anhang auswählen, aber ich bekomme es nicht hin :(

EDIT: Aktualisierter Code steht unten.
Titel: Re: Import einer CSV-Datei beim Maileingang
Beitrag von: rambrand am 14.12.15 - 13:07:58
Hi,

löse den Anhang und lege ihn auf die Platte, dann kann Du mit Open das File auch öffnen.

Bye
Markus
Titel: Re: Import einer CSV-Datei beim Maileingang
Beitrag von: Michael Kl am 14.12.15 - 13:09:21
Hey,

danke, das hatte ich auch schon überlegt.
Aber geht das nicht direkter?

EDIT: Okay habs einfach so probiert, ich berichte demnächst ob es sauber läuft.
Titel: Re: Import einer CSV-Datei beim Maileingang
Beitrag von: Michael Kl am 15.12.15 - 13:33:42
Ich nochmal,

leider funktioniert es nicht so, wie ich mir das vorgestellt habe.
Wenn ich den Agenten lokal ausführe läuft er super.
Wenn er jedoch automatisch ausgeführt werden soll, nach Maileingang, dann spuckt er nur wirres Zeug aus.

Ich vermute, dass es vielleicht am Zwischenspeicher (Temp) liegen kann.

Hier der Codeausschnitt:

Code
                                                temp  = Environ("Temp")					'Temporären Ordner bestimmen
						pfad = temp & "\" & anhang.source		'Dateipfad erstellen
						Call datei.ExtractFile ( pfad )			'Datei lokal speichern
						intNum = FreeFile() 					
						
						Open pfad For Input As intnum			'Datei öffnen
Titel: Re: Import einer CSV-Datei beim Maileingang
Beitrag von: rambrand am 15.12.15 - 14:15:27
Hi,

der Zwischenspeicher ist nichts anderes als die Umgebungsvariable "TEMP", in dieser ist der Pfad zu Deinem Temp-Verzeichnis z.B. C:\Temp enthalten. Der kann damit nichts zu tun haben.

Sicher, dass die CSV PLAINTEXT ist? Wie sieht der Code bei der Zuweisung der Spaltenwerte zu den Feldern aus?
Von welchem Typ ist das Objekt Datei? NotesEmbeddedObject?

Bye
Markus
Titel: Re: Import einer CSV-Datei beim Maileingang
Beitrag von: Michael Kl am 15.12.15 - 14:25:31
Moin,

Datei ist vom Typ NotesEmbeddedObject.
Lokal funktioniert es wunderbar, jedoch automatisiert (bei Maileingang) vom Server nicht :(
Anbei den ganzen Code.

Code
Option Public
Option Declare

Sub Initialize
	'				Deklaration & Initialisierung
	Dim session As New NotesSession					'Sitzung deklarieren
	Dim db As NotesDatabase							'Datenbank deklarieren
	Dim document As  NotesDocument					'Dokument deklarieren
	Dim importdocument As NotesDocument				'Importdokuemnt deklarieren
	Set db = session.CurrentDatabase				'Datenbank definieren
	Dim view As NotesView							'Ansicht deklarieren
	Set view = db.Getview("Maileingang")			'Ansicht öffnen
	Dim viewentry As NotesViewEntry
	Dim viewcollection As NotesViewEntryCollection	'Ansichtssammlung deklarieren
	Set viewcollection = view.Allentries			'Alle Dokumente der Ansicht zur Sammlung hinzufügen
	Set viewentry = viewcollection.Getfirstentry()	'Auswählen des ersten Eintrages in der Ansicht
	On Error GoTo Fehler
	Set document = viewentry.Document				'Auswählen des ersten Dokumentes
	Dim rtitem As notesrichtextitem	
	
	Dim strZeile As variant
	Dim intnum As integer
	Dim impfile As String
	Dim datei As NotesEmbeddedObject
	Dim temp, pfad As String

	'				Bearbeitung und Ausgabe
	'MsgBox (viewcollection.count)					'Anzahl der Dokumente in der Ansichtssammlung als Prompt ausgeben
	
	
	
	'				Schleifenanfang Jeden Anhang importieren und anschließend Mail löschen, bzw. verschieben
	Do While Not viewentry Is Nothing							'Schleifenbedingung
		If Not document.Hasembedded Then GoTo looop

		'document.Test = "Test"									'Testdaten schreiben
		Dim anhang As Variant									'Anhang als Variant deklarieren
		Set rtitem = document.Getfirstitem("Body")				'Richtextitem als Body bestimmen
		ForAll i In document.Items								'Alle Items im body auslesen
			If i.type=Attachment Then							'Ausführen, wenn Item = Anhang (Datei)
				Set anhang = document.Getattachment(i.values(0))'Anhang als Variant setzen
				Set datei = document.Getattachment(anhang.name)	'Anhang als Objekt setzen
				'MessageBox anhang.source						'Dateinamen vom Anhang ausgeben
				If Left(anhang.source, 10) = ("Infobau_Au") Then'Die ersten 10 Buchstaben von Links sind zur Erkennung einer Ausschreibung gedacht
					If Right(anhang.source, 3) = ("csv") Then	'Die letzten 3 Buchstaben deuten auf eine CSV Datei hin
						'MsgBox("Anhang ist eine Ausschreibung")
						
						
						temp  = Environ("Temp")										'Temporären Ordner bestimmen
						pfad = temp & "\" & anhang.source							'Dateipfad bestimmen
						Call datei.ExtractFile ( pfad )								'Datei lokal speichern
						impfile = pfad							'Dateipfad angeben für den Import
						intNum = FreeFile() 					
						
						Open pfad For Input As intnum			'Datei öffnen
						
						Do While Not EOF(intNum)
							Set importdocument = db.CreateDocument
							importdocument.form="Projekt"
							Line Input #intNum, strZeile 
							
							If FullTrim (StrToken(strZeile, ";",1)) = "ObjNr" GoTo jump
							importdocument.IBAUNUMMER = FullTrim (StrToken(strZeile, ";",1))
							importdocument.OBJEKT= FullTrim(StrToken(strZeile, ";",2))
							importdocument.SUBMISSIONSDATUM = FullTrim (StrToken(strZeile, ";",3))
							importdocument.SPARTEN = FullTrim (StrToken(strZeile, ";",4))
							importdocument.BAUPLZ = FullTrim (StrToken(strZeile, ";",6))
							importdocument.BAUORT = FullTrim (StrToken(strZeile, ";",7))
							importdocument.AUSSCHREIBER = FullTrim (StrToken(strZeile, ";",9))
							importdocument.STRASSE = FullTrim (StrToken(strZeile, ";",10))
							importdocument.PLZ= FullTrim (StrToken(strZeile, ";",11))
							importdocument.ORT = FullTrim (StrToken(strZeile, ";",12))
							importdocument.TEL = FullTrim (StrToken(strZeile, ";",14))
							importdocument.FAX = FullTrim (StrToken(strZeile, ";",15))
							importdocument.AUSSCHREIBUNGSTEXT = FullTrim (StrToken(strZeile, ";",16))
							importdocument.LVANFORDERUNG = FullTrim (StrToken(strZeile, ";",20))
							importdocument.BAUBEGINN = FullTrim (StrToken(strZeile, ";",23))
							importdocument.BAUENDE = FullTrim (StrToken(strZeile, ";",24))
							importdocument.STATUS = "Unberührt"
							
							Call importdocument.save(True,True)
							
jump:
						Loop
						
						
					End if
				elseIf Left(anhang.source, 10) = ("Infobau_Su") Then				'Die ersten 10 Buchstaben von Links sind zur Erkennung eines Submissionsergebnisses gedacht
					If Right(anhang.source, 3) = ("csv") Then						'Die letzten 3 Buchstaben deuten auf eine CSV Datei hin
						'MsgBox("Anhang ist ein Submissionsergebnis")
						Set datei = document.Getattachment(anhang.name)
						
						temp  = Environ("Temp")										'Temporären Ordner bestimmen
						pfad = temp & "\" & anhang.source							'Dateipfad bestimmen
						Call datei.ExtractFile ( pfad )								'Datei lokal speichern
						impfile = pfad												'Dateipfad angeben für den Import
						intNum = FreeFile() 					
						
						Open pfad For Input As intnum								'Datei öffnen
						
						Do While Not EOF(intNum)
							Set importdocument = db.CreateDocument
							importdocument.form="Submissionsergebnis"
							Line Input #intNum, strZeile 
							
							If FullTrim (StrToken(strZeile, ";",1)) = "ObjNr" GoTo jump2
							importdocument.IBAUNUMMER = FullTrim (StrToken(strZeile, ";",1))
							importdocument.SDATUM= FullTrim(StrToken(strZeile, ";",2))
							importdocument.SAUSSCHREIBER= FullTrim (StrToken(strZeile, ";",3))
							importdocument.SOBJEKT = FullTrim (StrToken(strZeile, ";",4))
							importdocument.SBAUPLZ = FullTrim (StrToken(strZeile, ";",5))
							importdocument.SBAUORT = FullTrim (StrToken(strZeile, ";",6))
							importdocument.SPLATZ = FullTrim (StrToken(strZeile, ";",10))
							importdocument.SSUMME = FullTrim (StrToken(strZeile, ";",11))
							importdocument.SPROZENT = FullTrim (StrToken(strZeile, ";",12))
							importdocument.BIETER = FullTrim (StrToken(strZeile, ";",15))
							importdocument.BSTRASSE = FullTrim (StrToken(strZeile, ";",16))
							importdocument.BPLZ = FullTrim (StrToken(strZeile, ";",17))
							importdocument.BORT = FullTrim (StrToken(strZeile, ";",18))
							importdocument.BTEL = FullTrim (StrToken(strZeile, ";",19))
							importdocument.BFAX = FullTrim (StrToken(strZeile, ";",20))
							importdocument.BMAIL = FullTrim (StrToken(strZeile, ";",21))
							importdocument.SBINDEFRIST = FullTrim (StrToken(strZeile, ";",25))
							importdocument.SNACHLASS = FullTrim (StrToken(strZeile, ";",26))
							importdocument.SBEMERKUNG = FullTrim (StrToken(strZeile, ";",27))
							document.SBAUENDE = FullTrim (StrToken(strZeile, ";",30))
							
							Call importdocument.save(True,True)
							
jump2:	
						Loop
						
						
					End if
				Else 
					'MsgBox(anhang.source & " ist nicht für den Import geeignet")'Ausführen, wenn Dateiname unbekannt
				End If
			End If												'Schleifenende
		End ForAll												'Schleifenende
		
		document.importiert = "1"
		Call document.Save(True,true)							'Dokument speichern
		
		Set viewentry = viewcollection.Getnextentry(viewentry)	'Nächsten Eintrag in der Ansicht auswählen
		Set document = viewentry.Document						'Auswählen des nächsten Dokumentes
looop:	
	loop
	'				Schleifenende


	'				Fehlerbehandlung
Fehler:															'Ausführen, wenn Fehler
	Resume Fehlerbehandlung 									'Fortfahren bei Fehler



	





Fehlerbehandlung:
End Sub
Titel: Re: Import einer CSV-Datei beim Maileingang
Beitrag von: Driri am 15.12.15 - 15:00:45
Meine Erfahrung ist, daß der Zugriff auf Dateien nur verlässlich funktioniert, wenn man sie auf die lokale Platte löst und von da aus verarbeitet.

Die Erfahrungen basieren noch auf Domino 5/6.x, aber es würde mich doch wundern, wenn IBM an der Stelle etwas optimiert hätte  ;)
Titel: Re: Import einer CSV-Datei beim Maileingang
Beitrag von: rambrand am 15.12.15 - 15:11:02
Die Umgebungsvariable TEMP sollte - eigentlich -  auch beim Server auf die lokale Platte verweisen.

Kannst Du im TEMP auf dem Server mal schauen, was er da für eine Datei dann abgelegt hat? Ist die lesbar?

Hängt die Datei im Body mit drin? Oder warum hast Du Dir das rtitem gezogen?

Bye
Markus
Titel: Re: Import einer CSV-Datei beim Maileingang
Beitrag von: thkn777 am 15.12.15 - 15:13:37
@Michael Kl
Also ich würde mir die Datei mal ansehen, die da im Notes-Dokument gespeichert ist. Da Dein Script die exportierten Dateien nicht löscht, sollte diese ja noch im TEMP-Pfad sein.

Vielleicht steht da einfach "Müll" drin?

Ansonsten: auf NotesStream umsteigen und mit Charset arbeiten. Darauf zielt ja auch rambrand's Frage ab.

Viel Erfolg!
Titel: Re: Import einer CSV-Datei beim Maileingang
Beitrag von: Michael Kl am 15.12.15 - 15:20:53
Hey,

danke für eure Hilfe ;)

In der Datei steht sicherlich kein Müll drin, da ich sie selber zum testen weiterleite.
Ich erhalte die Dateien von einem externen Diensleister und die Dateien sind immer gleich.
Die Datei wird auch säuberlich erkannt und importiert.

Der Anhang befindet sich im Body, deswegen das rtitem.

Code
                Set rtitem = document.Getfirstitem("Body")				        'Richtextitem als Body bestimmen
		ForAll i In document.Items								'Alle Items im body auslesen
			If i.type=Attachment Then							'Ausführen, wenn Item = Anhang (Datei)
				Set anhang = document.Getattachment(i.values(0))'Anhang als Variant setzen
				Set datei = document.Getattachment(anhang.name)	'Anhang als Objekt setzen
				'MessageBox anhang.source						'Dateinamen vom Anhang ausgeben
				If Left(anhang.source, 10) = ("Infobau_Au") Then'Die ersten 10 Buchstaben von Links sind zur Erkennung einer Ausschreibung gedacht
					If Right(anhang.source, 3) = ("csv") Then	'Die letzten 3 Buchstaben deuten auf eine CSV Datei hin
						'MsgBox("Anhang ist eine Ausschreibung")

Ich habe gerade erfahren, dass der Server eventuell das "\" nicht versteht, sondern ein "/" benötigt.
Das werde ich gleich testen und euch berichten.

Ansonsten werde ich mir den NotesStream-Part anschauen ;)
Titel: Re: Import einer CSV-Datei beim Maileingang
Beitrag von: rambrand am 15.12.15 - 16:00:36
Aber Du verwendest das rtitem nicht, Du weißt ihm zwar das RT-Feld Body zu, aber danach ziehst Du vom Dokument alle Items und läufst die ab.

Bye
Markus
Titel: Re: Import einer CSV-Datei beim Maileingang
Beitrag von: Michael Kl am 15.12.15 - 16:08:21
Outsch,

da hast du natürlich Recht!  :-P
Titel: Re: Import einer CSV-Datei beim Maileingang
Beitrag von: rambrand am 15.12.15 - 16:27:05
Ich hab das mit dem / jetzt erst gesehen. Ist der Server kein Windows-Server?

Ich hab mal irgendwo diesen Code gesehen.
Code
  Select Case session.Platform 
   Case "Macintosh", "Linux", "UNIX" 
      GetSystemTempFolder = "/tmp" 
   Case "Windows/32" 
      GetSystemTempFolder = Environ("TEMP") 
   Case Else 
      Error ERR_UNSUPPORTED_PLATFORM, "GetSystemTempFolder: Unsupported platform '" & session.Platform & "'." 
   End Select 

Daraus schlussfolgere ich, dass ENVIRON("Temp") nur unter Windows funktioniert.

Bye
Markus
Titel: Re: Import einer CSV-Datei beim Maileingang
Beitrag von: Andrew Harder am 16.12.15 - 00:39:24
Ja, habe eben unter Linux nachgesehen, da gibt es keine Temp Variable.
Überhaupt ist das temporäre Verzeichnis bei meinem Linux Server nicht in den Systemvariablen.

Der Code ist zwar etwas angestaubt... aber vielleicht kann er eine Hilfestellung geben:
Code
Private Function isWindows As Boolean
	
	On Error GoTo lblErrorHandler
	
	Dim session As NotesSession
	Dim blnReturnValue As Boolean
	Dim strPlatform As String
	Dim strPlatformUCase As String
	Dim strPlatformFlat As String

	Set session = New NotesSession
	strPlatform = session.Platform
	strPlatformUCase = UCase(strPlatform)
	strPlatformFlat = StrLeft(strPlatformUCase, "/")

	Select Case strPlatformFlat
		Case "WINDOWS"
			blnReturnValue = True
		Case Else
			blnReturnValue = False
	End Select

	isWindows = blnReturnValue
	
lblEnd:
	Exit Function
	
lblErrorHandler:
	Call processErrorSub()
	Exit Function
	
End Function

IBM ist übrigens lustig, die meinen in der 9er Hilfe, das das Temp Verzeichnis unter Windows in der autoexec.bat gesetzt würde.
Das erklärt so einiges, u. a. warum es das Schlüsselwort "Abstract" es nie in LotusScript geschafft hat.

Danke für den Thread, das brachte mich dazu in uraltem Code rumzuwühlen und hat mich an einige lustige Sachen erinnert.
Damals... als noch alles Orange war und ein IsDate mit einem Leerstring als Argument Notes zum abschmieren brachte.
Titel: Re: Import einer CSV-Datei beim Maileingang
Beitrag von: Michael Kl am 16.12.15 - 08:39:35
Danke danke danke,

es läuft zwar noch nicht, aber ich denke daran liegt es.
Momentan muss ich auf die Signierung vom Admin warten.

Das System ist ein i System.
Jedoch kenne ich die Struktur davon nicht :(
Titel: Re: Import einer CSV-Datei beim Maileingang
Beitrag von: AC am 16.12.15 - 14:08:46
Danke danke danke,

es läuft zwar noch nicht, aber ich denke daran liegt es.
Momentan muss ich auf die Signierung vom Admin warten.

Das System ist ein i System.
Jedoch kenne ich die Struktur davon nicht :(

Du meinst das ist eine AS/400 ?

Das wird dann vielleicht schwieriger werden.

Dann besser auf Windowsserver das laufen lassen ( falls ein Dominosever auf Win vorhanden ist) oder Du überlegst Dir etwas für Client.

Als wir noch mit dem Sever auf AS/400 waren, bekamen wir EDIFAKT Salesreports mit Mail als Dateianhang.
Zur Vorabprüfung habe da einen Agenten gehabt, der aus der Mail die Datei gelöst und den Inhalt erfasst und ausgewertet hat.

Das ganze habe ich aber von Usern in einer Notesdatenbank  triggern lassen ( Innendienst oder Verkaufsleiter), dann konnten die sich idiotensicher einen sehr schnellen Übersicht über Verkaufszahlen schafen oder schnell sehen, welche Konzerne noch fehlten.


Alexander
PS an ander Stelle gefunden  die machen das angeblich auch auf AS/400 und benutzen
ExtrPfad="/Domino/xxx/Data/xxx/Archiv/" 'Pfad in dem der Anhang gelöst werden soll



 
Titel: Re: Import einer CSV-Datei beim Maileingang
Beitrag von: Michael Kl am 16.12.15 - 14:39:01
Moin,

ja genau eine AS/400.
Ich habs versucht übers Internet mögliche Lösungen zu finden, jedoch ohne Erfolg.

Ich konnte eine Präsentation entdecken, in der ich eine Art Explorer sehen konnte, aber ob das auch bei unserem System zutrifft...
...hoffentlich.

Den Weg mit dem User könnte ich auch gehen, aber lieber wäre mir eine Automatik.

Titel: Re: Import einer CSV-Datei beim Maileingang
Beitrag von: Andrew Harder am 16.12.15 - 22:25:01
Du kannst Dir auch die Variable "Directory" aus der Notes.ini holen:
Code
strFilename = session .GetEnvironmentString("Directory" True)
Damit kannst Du die Datei immer ins Data des auführenden (Server oder lokal) schreiben.
Dannach würde ich aber auf jeden Fall mit
Code
Kill strFilename
das File wieder entfernen.

Warnung: Sobald das ein Admin sieht, gibts auf die Ohren :P
Titel: Re: Import einer CSV-Datei beim Maileingang
Beitrag von: Smurf am 23.12.15 - 12:02:18
Hallo

wenn es bei den Daten um ibauDaten gehen sollte, die von "www.ibau.de" gesendet werden, gibt es da einen 'einfacheren' Weg.

Ich hab das mal für einen Kunden in Form eines WebService Consumers Dominoseitig umgesetzt.

Falls Interesse besteht, bitte PM an mich.

Gruß
   Uwe
Titel: Re: Import einer CSV-Datei beim Maileingang
Beitrag von: Michael Kl am 25.01.16 - 09:58:56
Danke euch für die hilfreichen Antworten,
ich wünsche euch erstmal ein frohes neues Jahr.

Ich versuche es mit dem
Code
strFilename = session .GetEnvironmentString("Directory" True)

Ich melde mich, nachdem ich es testen konnte ;)
Titel: Re: Import einer CSV-Datei beim Maileingang
Beitrag von: Michael Kl am 08.02.16 - 15:22:18
Nach mehreren gescheiterten Versuchen bin ich zur halbautomatischen Lösung gewechselt.
Irgendein Benutzer kann das Update anstoßen und die Datei auf dem Server hinterlegen und von dort aus importieren...

Bei der vollautomatischen Variante, wie ich es mir jedenfalls vorgestellt habe, kamen nur Sonderzeichen in die Dokumente, als wäre die Codierung falsch.

#Thema erledigt.
Titel: Re: [Erledigt ohne Erfolg] Import einer CSV-Datei beim Maileingang
Beitrag von: jBubbleBoy am 08.02.16 - 17:32:06
Das Lesen einer Datei geht auch mit Angabe des Zeichensatzes - hast du das schon probiert?
Mein Tipp: UTF-8