Autor Thema: Import von csv Daten innerhalb einen DB  (Gelesen 5786 mal)

Offline seerow

  • Aktives Mitglied
  • ***
  • Beiträge: 180
  • Geschlecht: Männlich
  • alles wird gut........
Import von csv Daten innerhalb einen DB
« am: 31.03.04 - 12:23:21 »
Hallo Leute,

ich habe jetzt schon seid einer knappen Stunde das ganze Forum durchsucht, ohne Erfolg.
Ich hoffe ihr könnt mit weiter helfen.
Folgendes Problem:

Diverse Tools fragen in bestimmten Zeitabschnitten eine IP Range nach Druckern ab. Diese Daten werden gesammelt
und im csv style an eine Notes Inbox geschickt.

drucker1;domain1;1.1.1.1;yes;yes;yes;128MB;5
drucker2;domain2;2.2.2.2;yes;yes;yes;96MB;5
drucker3;domain3;3.3.3.3;no;no:no;96MB;2

Jetzt möchte ich gerne diese Daten mittels Agentenin ein Notes Formular innerhalb dieser DB importieren/kopieren
(dokument drucker1, dokument drucker2, dokument drucker3).
Hat irgend jemannd eine Idee oder vieleicht sogar ein Beispiel?
MFG Antonio

-----------------------------------------------------------------------

Ordentliche Menschen sind selten genial,
geniale selten Ordentlich............

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re:Import von csv Daten innerhalb einen DB
« Antwort #1 am: 31.03.04 - 12:59:17 »
Hi,

such mal in der Sandkiste nach csv. Dort findest einige Beispiele.

http://www-10.lotus.com/ldd/sandbox.nsf?OpenDatabase


Axel
Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline seerow

  • Aktives Mitglied
  • ***
  • Beiträge: 180
  • Geschlecht: Männlich
  • alles wird gut........
Re:Import von csv Daten innerhalb einen DB
« Antwort #2 am: 31.03.04 - 13:08:08 »
Hi,

habe ich auch schon gemacht, dort gibt es nur Beispiele wie ich csv Textdateien in ein Dok bekomme.

Ich möchte ja aus dem Inhalt einer Note ein Dok erstellen.
MFG Antonio

-----------------------------------------------------------------------

Ordentliche Menschen sind selten genial,
geniale selten Ordentlich............

klaussal

  • Gast
Re:Import von csv Daten innerhalb einen DB
« Antwort #3 am: 31.03.04 - 13:15:41 »
... sollen beim import neue docs erstellt werden, oder wie oder was ?

Offline seerow

  • Aktives Mitglied
  • ***
  • Beiträge: 180
  • Geschlecht: Männlich
  • alles wird gut........
Re:Import von csv Daten innerhalb einen DB
« Antwort #4 am: 31.03.04 - 13:22:49 »
ja klar, für jeden Drucker ein Dok.
MFG Antonio

-----------------------------------------------------------------------

Ordentliche Menschen sind selten genial,
geniale selten Ordentlich............

klaussal

  • Gast
Re:Import von csv Daten innerhalb einen DB
« Antwort #5 am: 31.03.04 - 13:29:14 »
... wenn das jetzt im klartext heissen soll, dass, wenn der agent/die agentin läuft, jedesmal neue docs erstellt werden sollen, dann sollten die beispiele aus der sandkiste dich zum ziel bringen.

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re:Import von csv Daten innerhalb einen DB
« Antwort #6 am: 31.03.04 - 15:36:38 »
Fragen wir mal anders herum (da das Problem ja an sich trivial ist, ein bisschen Parserbau): Wo klemmt es denn ? Wo fehlt Dir der Ansatz ?

Bernhard

Offline seerow

  • Aktives Mitglied
  • ***
  • Beiträge: 180
  • Geschlecht: Männlich
  • alles wird gut........
Re:Import von csv Daten innerhalb einen DB
« Antwort #7 am: 31.03.04 - 16:18:27 »
Hallo,

mh naja, ich denke mal das lässt sich nur über Lotus script realisieren, und davon habe ich leider noch nicht so die Ahnung.
MFG Antonio

-----------------------------------------------------------------------

Ordentliche Menschen sind selten genial,
geniale selten Ordentlich............

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re:Import von csv Daten innerhalb einen DB
« Antwort #8 am: 31.03.04 - 16:33:58 »
Da hast Du wahr - das lässt sich nur über LotusScript (oder Java) lösen. Du hast ja bei einem server based agent allein schon null Chance, neue Dokumente zu erstellen. Von den anderen needs mal ganz zu schweigen.

Wie sieht das bei Euch mit einer Fremdvergabe eines solchen Agentleins aus ? Das wäre ja nach Deiner bisherigen Beschreibung sehr, sehr schnell erledigt ...

Bernhard

Offline seerow

  • Aktives Mitglied
  • ***
  • Beiträge: 180
  • Geschlecht: Männlich
  • alles wird gut........
Re:Import von csv Daten innerhalb einen DB
« Antwort #9 am: 31.03.04 - 18:22:51 »
Hallo zusammen,

ich glaube ich habe jetzt genau das gefunden was ich brauche. Das Script holt sich zwar nicht die Daten auf einer Mail sondern aus einen lokal liegenden csv Datei, aber das sollte für den Anfang reichen.

Das script nennt sich "csv import" und ist hier zu finden -> http://www-10.lotus.com/ldd/sandbox.nsf/ecc552f1ab6e46e4852568a90055c4cd/7d3285a6721418ed85256df2006561e9?OpenDocument&Highlight=0,csv
MFG Antonio

-----------------------------------------------------------------------

Ordentliche Menschen sind selten genial,
geniale selten Ordentlich............

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.728
  • Geschlecht: Männlich
Re:Import von csv Daten innerhalb einen DB
« Antwort #10 am: 31.03.04 - 18:27:36 »
Zitat
Diese Daten werden gesammelt
und im csv style an eine Notes Inbox geschickt

können den die "diversen Tools" nicht gleich pro Drucker ein Doc verschicken ??

Nur mal so ein Gedanke...

Ulrich
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re:Import von csv Daten innerhalb einen DB
« Antwort #11 am: 31.03.04 - 18:42:27 »
Ob eins oder n - das ist doch wurscht. Auseinandergebröselt gehört es sowieso ...

Bernhard

Offline seerow

  • Aktives Mitglied
  • ***
  • Beiträge: 180
  • Geschlecht: Männlich
  • alles wird gut........
Re:Import von csv Daten innerhalb einen DB
« Antwort #12 am: 01.04.04 - 10:43:54 »
Hallo,

ich habe gestern Abend noch (nach langen probieren) das "csv import" script in meine DB implementiert, und ich muss sagen, dass ding ist genial.
Der große Vorteil des scripts ist, dass es nicht nur Doks anlegt, sondern auch löscht bzw. aktualisiert.  8)

Aber die Lösung Text aus einer Notes Memo in ein Notes Dok umzuwandeln beschäfftigt mich immer noch..... ???
MFG Antonio

-----------------------------------------------------------------------

Ordentliche Menschen sind selten genial,
geniale selten Ordentlich............

Offline scipio

  • Junior Mitglied
  • **
  • Beiträge: 57
  • Ich liebe dieses Forum!
Re: Import von csv Daten innerhalb einen DB
« Antwort #13 am: 21.10.04 - 13:08:39 »
Ist zwar schon ein älterer Thread, habe die Datei aus der Sandbox in einem aktuellen Projekt eingesetzt. Da das Script nicht lief, habe ich die bei mir auftretenden (Notes 5.0.11) Bugs im Originalscript der Sandbox gefixt:

- Der erste Primärschlüssel der CSV-Datei wird erkannt.
- Die Erkennung „Mit“ oder „Ohne Textbegrenzungszeichen“ funktioniert jetzt.
- Die globalen Einstellungen stehen im Agenten, nicht im Script der Scriptbibliothek.
- Kommentare eingedeutscht.
- Der letzte Fehler fällt mir gar nicht mehr ein ;-)

Anleitung:

- Neue Datenbank.
- Maske mit Namen ‚F_NAME’ erstellen.
- In dieser Maske die Felder ’SSN’, ‚FIRST’ und ‚LAST’ erstellen.
- Ansicht mit Namen ‚ V_LOOKUPBYSSN’ erstellen.
- Drei Spalten namens ’SSN’, ‚FIRST’ und ‚LAST’ erstellen und mit den gleichnamigen Feldern füttern.
- Agenten erstellen (Werte siehe unten).
- Script-Bibliothek erstellen (Werte unten).
- Agent starten, CSV wählen und warten.

Hoffe, ich habe nix vergessen.

Agent 'CSV-Import'

Wann soll dieser Agent gestartet werden:
Manuell aus dem Menü 'Aktionen'

Options:

Code
Option Public
Use "import"

Initialize:

Code
'Original Script by LDD user [http://www.cadencesolutions.com/]
'Sandbox [http://www-10.lotus.com/ldd/sandbox.nsf/ecc552f1ab6e46e4852568a90055c4cd/7d3285a6721418ed85256df2006561e9?OpenDocument&Highlight=0,csv]
	Dim csv As CSVFile
	Dim st_Fields(1 To 3) As String
	
	st_Fields(1) = "SSN"
	st_Fields(2) = "FIRST"
	st_Fields(3) = "LAST"
	
	Set csv = New CSVFile("","F_NAME", st_Fields)
	
	' WENN DIE WERTE SYNCHRONISIERT WERDEN SOLLEN (VERGLEICH, OB DATEN AKTUELL), DANN 'TRUE', ANSONSTEN 'FALSE'
	csv.Synchronize = True
	
    'NAME DER ANSICHT, DIE ZUR SYNCHRONISATION BENUTZT WERDEN SOLL
	csv.SynchronizeView = "V_LOOKUPBYSSN"
	
	'WENN DOKUMENTE GELÖSCHT WERDEN SOLLEN, SOBALD SIE IN DER CSV-DATEI FEHLEN, DANN 'TRUE', ANSONSTEN 'FALSE'
	csv.SynchronizeDeletions = True
	
    'WENN DIE CSV-DATEI EINE TITELZEILE BESITZT, DANN 'TRUE', ANSONSTEN 'FALSE'
	csv.SkipTitleLine = True
	
	'MIT WELCHEM ZEICHEN WERDEN DIE DATEN IN DER CSV-DATEI VONEINANDER GETRENNT
	csv.Delimiter = ","
	
	csv.NumChanges = 0 
	csv.NumAdds = 0 
	csv.NumDeletes = 0
	
	Call csv.Import

Script-Bibliothek ''import'

Options:

Code
Option Public

Declarations:

Code
Class CSVFile
	Public FileName As String
	Public Delimiter As String
	Public ImportDatabase As NotesDatabase
	Public ImportForm As String
	Public ImportFields As Variant   ' ARRAY  DER FELDNAMEN - INDEX MUSS MIT 1 STARTEN
	Public RefreshForm As Variant
	Public ShowProgress As Variant
	Public QuoteDelimiter As Variant  ' IST EIN DOPPELTER ANFÜHRUNGSSTRICH, DER VERWENDET WIRD, UM WERTE MIT KOMMAS ZU TRENNEN
	Public Synchronize As Variant     ' SOLLTE IMPORT ANHAND PRIMÄRSCHLÜSSEL SYNCHRONISIERT WERDEN
	Public NumKeyFields As Integer  ' WIE VIELE DER ERSTEN FELDER SIND PRIMÄRSCHLÜSSEL
	Public SynchronizeView As String ' NAME DER ANSICHT, MIT DER DIE PRIMÄRSCHLÜSSEL SYNCHRONISIERT WERDEN
	Public SynchronizeDeletions As Variant 
	Public SkipTitleLine As Variant
	Public NumChanges As Integer
	Public NumAdds As Integer
	Public NumDeletes As Integer
	
	
	Private SynchUNIDS List As String
	
	Sub New(st_FileName As String, st_FormName As String, v_FieldArray As Variant)
		Dim lib_s As New NotesSession
		Dim lib_ws As New NotesUIWorkspace
		Dim v_ReturnValue As Variant
		
		If Trim(st_FileName) = "" Then ' WENN KEINE DATEI VORGEGEBEN WERDEN, NACH DATEI FRAGEN
			v_ReturnValue =  lib_ws.OpenFileDialog(False, "Wählen Sie eine CSV Datei", "CSV Files|*.CSV", "C:\")
			If Not Isarray(v_ReturnValue) Then Exit Sub
			If v_ReturnValue(0) = "" Then Exit Sub
			st_FileName = v_ReturnValue(0)
		End If
		
		Me.FileName = st_FileName
		Set Me.ImportDatabase = lib_s.CurrentDatabase
		Me.ImportForm = st_FormName
		Me.ImportFields = v_FieldArray
		Me.RefreshForm = True
		Me.ShowProgress = True
		Me.QuoteDelimiter = True
		Me.NumKeyFields = 1 
		Me.NumChanges = 0 
		Me.NumAdds = 0 
		Me.NumDeletes = 0
		
	End Sub
	
	Sub Import
		Dim i_FileNum As Integer
		Dim st_LineData As String
		Dim i_ImportCount As Integer
		Dim vw_Lookup As NotesView
		Dim doc_List As NotesDocument
		
		If Trim(Me.FileName) = ""  Then 
			Messagebox "Kein Dateiname spezifiziert.", 16, "Error"
			Exit Sub
		End If
		
		If Me.Synchronize Then
			Set vw_Lookup =  Me.ImportDatabase.GetView(Me.SynchronizeView) 
			If vw_Lookup Is Nothing Then
				Messagebox "Unzulässige Synchronisationsansicht.", 16, "Error"
				Exit Sub  
			End If   
			
			Call vw_Lookup.Refresh ' ERNEUERT DIE ANSICHT, DAMIT ALLE NEUEN DATEN SICHTBAR SIND.
			
			If Me.SynchronizeDeletions Then
				
    ' ERSTELLT LISTE 
				
				Set doc_List = vw_Lookup.GetFirstDocument
				Do While Not doc_List Is Nothing
					Me.SynchUNIDS(doc_List.UniversalID) = False
					Set doc_List  = vw_Lookup.GetNextDocument(doc_List)
				Loop    
			End If
		End If
		
		If Not Isarray(Me.ImportFields) Then 
			Messagebox "Unzulässiger Feldnamen-Array.", 16, "Error"
			Exit Sub
		End If
		
		i_FileNum = Freefile()
		
		Open Me.FileName For Input As i_FileNum
		
		
		i_ImportCount = 0 
		
		' DIE TITELLINIE WIRD IN DER CSV-DATEI ÜBERSPRUNGEN (WENN WERT AUF 'TRUE')
		If Not Eof(i_FileNum) And Me.SkipTitleLine Then Line Input #i_FileNum, st_LineData     
		
		Do While Not Eof(i_FileNum) 
			i_ImportCount = i_ImportCount + 1
			If Me.ShowProgress Then Print "Importiere Datensatz # " & Cstr(i_ImportCount)
			
			Line Input #i_FileNum, st_LineData ' HOLT EINE DATEN-ZEILE AUS DER DATEI
			
			If Not Me.Synchronize Then
				If Not ImportLine(st_LineData) Then
					Messagebox "Fehler beim Import.", 16, "Error"
					Close i_FileNum
					Exit Sub
				End If
			Else
				If Not SynchLine(st_LineData) Then
					Messagebox "Fehler bei der Synchronisation.", 16, "Error"
					Close i_FileNum
					Exit Sub
				End If
			End If
		Loop
		
		Close i_FileNum
		
		If Me.Synchronize And Me.SynchronizeDeletions Then
			Forall x In Me.SynchUNIDS
				If x = "False"  Then ' WENN DER WERT DER ANSICHT NICHT IN DER CSV-DATEI GEFUNDEN WIRD, DATENSATZ LÖSCHEN
					Call Me.ImportDatabase.GetDocumentByUNID(Listtag(x)).Remove(True)
					Me.NumDeletes = Me.NumDeletes + 1
				End If
			End Forall   
		End If
		
		Print "Import vollständig. " & Cstr(i_ImportCount) & " Datensätze verarbeitet. " & Cstr(Me.NumAdds) & " hinzugefügt " & Cstr(Me.NumChanges) & " geändert " &  Cstr(Me.NumDeletes) & " gelöscht"  
	End Sub
	
 ' IMPORTIERT DIE DATEN - ERSTELLT EIN NEUES DOKUMENT FÜR JEDE LINIE
	Private Function ImportLine(st_LineData As String) As Variant
		Dim v_ValueArray As Variant
		Dim i As Integer
		Dim doc_Current As NotesDocument
		
		ImportLine = True
		
		v_ValueArray = ReturnValueArray(st_LineData)  ' FASST DIE DATEN IN EINEN ARRAY
		
		Set doc_Current = Me.ImportDatabase.CreateDocument 
		
		For i = Lbound(Me.ImportFields) To Ubound(Me.ImportFields)
			Call doc_Current.ReplaceItemValue(Me.ImportFields(i), v_ValueArray(i))
		Next
		
		doc_Current.Form = Me.ImportForm
		If Me.RefreshForm Then Call doc_Current.ComputeWithForm(False, True)
		Call doc_Current.Save(True, False)
		
	End Function
	
 ' IMPORTIERT DIE DATEN - SYNCHRONISIERT DAS DOKUMENT AUF BASIS DER PRIMÄRSCHLÜSSEL
	Private Function SynchLine(st_LineData As String) As Variant
		Dim v_ValueArray As Variant
		Dim v_Key As Variant
		Dim v_TempKey (1 To 10) As Variant
		Dim i As Integer
		Dim doc_Current As NotesDocument
		Dim vw_Lookup As NotesView
		Dim v_FieldChange As Variant
		
		SynchLine = True
		
		v_ValueArray = ReturnValueArray(st_LineData)  ' BREAK UP THE DATA INTO AN ARRAY
		
  ' ERSTELLT DEN SCHLÜSSEL 
		For i = 1 To Me.NumKeyFields
			v_TempKey(i) = v_ValueArray(i)
		Next
		'v_Key = Fulltrim(v_TempKey)
		
  ' INSTANZIIERT DIE ANSICHT
		Set vw_Lookup = Me.ImportDatabase.GetView(Me.SynchronizeView)
		
  ' DURCHSUCHT DIE ANSICHT
		'Set doc_Current = vw_Lookup.GetDocumentByKey(v_Key, True)		
		Set doc_Current = vw_Lookup.GetDocumentByKey(v_ValueArray(1), True)
		
		If doc_Current Is Nothing Then  ' ERSTELLT EIN NEUES DOKUMENT
			
			Set doc_Current = Me.ImportDatabase.CreateDocument 
			
			For i = Lbound(Me.ImportFields) To Ubound(Me.ImportFields) 
				Call doc_Current.ReplaceItemValue(Me.ImportFields(i), v_ValueArray(i))
			Next
			
			doc_Current.Form = Me.ImportForm
			If Me.RefreshForm Then Call doc_Current.ComputeWithForm(False, True)
			Call doc_Current.Save(True, False)
			Me.NumAdds = Me.NumAdds + 1
		Else ' WENN EIN DOKUMENT MIT DEM GLEICHEN PRIMÄRSCHLÜSSEL GEFUNDEN WIRD > PRÜFT, OB NOTWENIGKEIT ZUR AKTUALISIERUNG GEGEBEN IST.
			
			If Me.SynchronizeDeletions Then
				Me.SynchUNIDS(doc_Current.UniversalID) = True ' MARKIERT DAS DOKUMENT, SO DASS ES NICHT GELÖSCHT WIRD
			End If
			
			v_FieldChange = False
			
			For i = Lbound(Me.ImportFields) To Ubound(Me.ImportFields) 
				If Cstr(doc_Current.GetItemValue(Me.ImportFields(i))(0)) <> Cstr(v_ValueArray(i)) Then
					v_FieldChange = True
					Call doc_Current.ReplaceItemValue(Me.ImportFields(i), v_ValueArray(i))
				End If
			Next
			
			If v_FieldChange Then
				If Me.RefreshForm Then Call doc_Current.ComputeWithForm(False, True)
				Call doc_Current.Save(True, False)
				Me.NumChanges = Me.NumChanges + 1
			End If
			
		End If
		
	End Function
	
	Private Function ReturnValueArray(st_LineData) As Variant   ' FASST EINE ZEILE DER CSV-DATEI IN EINEN ARRAY
		Dim i As Integer
		Dim doc_Current As NotesDocument
		Dim i_NextDelimiter As Integer
		Dim v_DoubleQuotes As Variant
		Dim v_ValueArray(1 To 150) As Variant
		
		For i = 1 To Ubound(Me.ImportFields)
			
			v_DoubleQuotes = False
			
			If Me.QuoteDelimiter = True And Left(st_LineData, 1) = Chr(34) Then ' WENN WERT IN DOPPELTEN ANFÜHRUNGSSTRICHEN STEHT
				
				i_NextDelimiter = Instr(st_LineData,Chr(34) & Me.Delimiter) ' SCHLIESSENDES TRENNZEICHEN IST EIN ANDERER SATZ VON DOPPELTEN ANFÜHRUNGSSTRICHEN + TRENNZEICHEN
				
				v_DoubleQuotes = True
				
			Else
				i_NextDelimiter = Instr(st_LineData, Me.Delimiter)     
			End If
			
			If i_NextDelimiter = 0 Then '  KEIN TRENNZEICHEN MEHR GEFUNDEN, SO DASS ES DER LETZTE WERT SEIN MUSS
				
				If v_DoubleQuotes Then 
					v_ValueArray(i) = Mid(st_LineData, 2, Len(st_LineData) - 2) ' ENTFERNT DOPPELTE ANFÜHRUNGSSTRICHE
				Else
					v_ValueArray(i) = st_LineData
				End If    
				Exit For
			End If
			
			If v_DoubleQuotes Then
				
				v_ValueArray(i) =  Mid(st_LineData, 2, i_NextDelimiter - 2)
				
			Else
				v_ValueArray(i) =  Trim(Left(st_LineData, i_NextDelimiter - 1))
				
			End If
			
			If v_DoubleQuotes = True Then
				st_LineData = Trim(Mid(st_LineData, i_NextDelimiter + 2))	
			Else
				st_LineData = Trim(Mid(st_LineData, i_NextDelimiter + 1))				
			End If
			
		Next
		
		ReturnValueArray = v_ValueArray
		
	End Function
End Class
« Letzte Änderung: 21.10.04 - 13:16:34 von scipio »

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz