Autor Thema: [Erledigt ohne Erfolg] Import einer CSV-Datei beim Maileingang  (Gelesen 10818 mal)

Offline Michael Kl

  • Frischling
  • *
  • Beiträge: 38
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.
« Letzte Änderung: 08.02.16 - 15:22:44 von Michael Kl »

Offline rambrand

  • Senior Mitglied
  • ****
  • Beiträge: 469
  • Geschlecht: Männlich
Re: Import einer CSV-Datei beim Maileingang
« Antwort #1 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
Domino/Notes ab 4.6 aktuell 10.1FP3
Traveler 10.0.1FP1
PHP-Entwickler
Domino/Notes-Entwickler (Hobby)
Consultant (Informationssicherheit & Datenschutz)

Offline Michael Kl

  • Frischling
  • *
  • Beiträge: 38
Re: Import einer CSV-Datei beim Maileingang
« Antwort #2 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.
« Letzte Änderung: 14.12.15 - 14:44:41 von Michael Kl »

Offline Michael Kl

  • Frischling
  • *
  • Beiträge: 38
Re: Import einer CSV-Datei beim Maileingang
« Antwort #3 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

Offline rambrand

  • Senior Mitglied
  • ****
  • Beiträge: 469
  • Geschlecht: Männlich
Re: Import einer CSV-Datei beim Maileingang
« Antwort #4 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
Domino/Notes ab 4.6 aktuell 10.1FP3
Traveler 10.0.1FP1
PHP-Entwickler
Domino/Notes-Entwickler (Hobby)
Consultant (Informationssicherheit & Datenschutz)

Offline Michael Kl

  • Frischling
  • *
  • Beiträge: 38
Re: Import einer CSV-Datei beim Maileingang
« Antwort #5 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

Driri

  • Gast
Re: Import einer CSV-Datei beim Maileingang
« Antwort #6 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  ;)

Offline rambrand

  • Senior Mitglied
  • ****
  • Beiträge: 469
  • Geschlecht: Männlich
Re: Import einer CSV-Datei beim Maileingang
« Antwort #7 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
Domino/Notes ab 4.6 aktuell 10.1FP3
Traveler 10.0.1FP1
PHP-Entwickler
Domino/Notes-Entwickler (Hobby)
Consultant (Informationssicherheit & Datenschutz)

Offline thkn777

  • Aktives Mitglied
  • ***
  • Beiträge: 176
Re: Import einer CSV-Datei beim Maileingang
« Antwort #8 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!

Offline Michael Kl

  • Frischling
  • *
  • Beiträge: 38
Re: Import einer CSV-Datei beim Maileingang
« Antwort #9 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 ;)

Offline rambrand

  • Senior Mitglied
  • ****
  • Beiträge: 469
  • Geschlecht: Männlich
Re: Import einer CSV-Datei beim Maileingang
« Antwort #10 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
Domino/Notes ab 4.6 aktuell 10.1FP3
Traveler 10.0.1FP1
PHP-Entwickler
Domino/Notes-Entwickler (Hobby)
Consultant (Informationssicherheit & Datenschutz)

Offline Michael Kl

  • Frischling
  • *
  • Beiträge: 38
Re: Import einer CSV-Datei beim Maileingang
« Antwort #11 am: 15.12.15 - 16:08:21 »
Outsch,

da hast du natürlich Recht!  :-P

Offline rambrand

  • Senior Mitglied
  • ****
  • Beiträge: 469
  • Geschlecht: Männlich
Re: Import einer CSV-Datei beim Maileingang
« Antwort #12 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
Domino/Notes ab 4.6 aktuell 10.1FP3
Traveler 10.0.1FP1
PHP-Entwickler
Domino/Notes-Entwickler (Hobby)
Consultant (Informationssicherheit & Datenschutz)

Offline Andrew Harder

  • Senior Mitglied
  • ****
  • Beiträge: 295
  • Geschlecht: Männlich
Re: Import einer CSV-Datei beim Maileingang
« Antwort #13 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.
« Letzte Änderung: 16.12.15 - 00:43:12 von Andrew Harder »
Andy

Offline Michael Kl

  • Frischling
  • *
  • Beiträge: 38
Re: Import einer CSV-Datei beim Maileingang
« Antwort #14 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 :(

Offline AC

  • Senior Mitglied
  • ****
  • Beiträge: 366
  • Geschlecht: Männlich
Re: Import einer CSV-Datei beim Maileingang
« Antwort #15 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



 
« Letzte Änderung: 16.12.15 - 14:23:13 von AC »
Microsoft Certified Technology Specialist Microsoft Dynamics NAV 5.0 C/Side Introduction
Microsoft Certified Technology Specialist Microsoft Dynamics NAV 5.0 C/Side Solution Development

"...Glücklich ist, wer vergisst, was doch nicht zu ändern ist..."

Offline Michael Kl

  • Frischling
  • *
  • Beiträge: 38
Re: Import einer CSV-Datei beim Maileingang
« Antwort #16 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.


Offline Andrew Harder

  • Senior Mitglied
  • ****
  • Beiträge: 295
  • Geschlecht: Männlich
Re: Import einer CSV-Datei beim Maileingang
« Antwort #17 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
« Letzte Änderung: 16.12.15 - 22:28:20 von Andrew Harder »
Andy

Offline Smurf

  • Frischling
  • *
  • Beiträge: 1
Re: Import einer CSV-Datei beim Maileingang
« Antwort #18 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

Offline Michael Kl

  • Frischling
  • *
  • Beiträge: 38
Re: Import einer CSV-Datei beim Maileingang
« Antwort #19 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 ;)

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz