Ich geh mal davon aus, das Du Zugriff auf die Datei hast.
Durchiterieren und gut ist.
Sowas gab es glaub ich schonmal hier im Forum.
Das ist aus der Hilfe:
' Display the contents of c:\config.sys a line at a time.
Dim text As String, fileNum As Integer
fileNum% = FreeFile()
Open "c:\config.sys" For Input As fileNum%
Do While Not EOF(fileNum%)
Line Input #fileNum%, text$
Print text$ ' Prints one line of config.sys
Loop
Close fileNum%
Dann musst Du Dir die Sachen besorgen die Du brauchst, damit das Doc suchen und ändern.
Mach dir eine Ansicht nach Auftragsnummer (die sollte wohl eindeutig sein) und dann ein
Getdocumentbykey und den Wert updaten.
Ja, wie aber such ich zuerst in der neu übermittelten csv-datei zunächst die Auftragsnummer raus und ändere das Hauptdokument mit der gleichen Auftragsnummer in der DB?
Ganz einfach in dem du Zeile für Zeile die csv-Datei einliest und guckst, ob die eingelesene Zeile die entsprechende Auftragsnummer enthält.
Axel
Open fileName$ For Input As fileNum%
Line Input #1, InputStr$
Do While Not Eof(fileNum%)
' Zeile für Zeile einlesen
Line Input #1, InputStr$
FieldArray = Split(InputStr$,delimiter)
Set doc = view.GetDocumentByKey(FieldArray(0))
Call doc.ReplaceItemValue("XYZ", "ABC")
Call doc.Save
Loop
Dir fehlt die view?Das wäre der nächste Fehler (Object Variable Not Set), der angegebene Fehler lässt vermuten, dass der Aufruf von Split das Array nicht füllt...
...
Sub Initialize
Dim session As New notessession
Dim db As notesdatabase
Dim doc As notesdocument
Dim fileNum As Integer, cells As Integer, k As Long
Dim fileName As String
Dim InputStr As String, delimiter As String
Dim FieldArray As Variant
Dim view As NotesView
Set db = session.currentdatabase
Set view = db.GetView ("NAME")
fileNum% = Freefile()
'Dateipfad
fileName$ = "C:\Ordner Archiv\Erledigung\Archiv.csv"
'Trennzeichen
delimiter = ";"
Open fileName$ For Input As fileNum%
Line Input #1, InputStr$
Do While Not Eof(fileNum%)
'Zeile für Zeile einlesen
Line Input #1, InputStr$
FieldArray = Split(InputStr$,delimiter, -1, 0)
If Not Isempty(FieldArray) Then
Set doc = view.GetDocumentByKey(FieldArray(0))
Call doc.ReplaceItemValue("Status", "erledigt")
Call doc.Save(True,True)
End If
Loop
Close fileNum%
End Sub
Dir fehlt die view?Das wäre der nächste Fehler (Object Variable Not Set), der angegebene Fehler lässt vermuten, dass der Aufruf von Split das Array nicht füllt...
...
Muss ich nicht irgendwo übergeben was für einen Wert er überhaupt in den Dokumenten suchen muss?
Den Maskennamen angeben?
Tust Du doch mit dieser Zeile :Paßt dann eigentlich alles. Aber wo hängt es dann noch.
Set doc = view.GetDocumentByKey(FieldArray(0))
Voraussetzung dafür ist natürlich :
a) Die verwendete View ist nach dem Suchkriterium sortiert
b) Es ist wirklich der erste Wert, nach dem gesucht werden soll (FieldArray(0) = 1. Wert im Array)
Wozu ? Beim Neuanlegen von Dokumenten sollte man das Item "Form" setzen, damit beim Öffnen später die korrekte Maske gezogen wird.
Bei vorhandenen Dokumenten sollte man eigentlich davon ausgehen, daß die Form gesetzt ist.
Was sagt denn der Debugger ? Wird überhaupt ein Dokument gefunden ?
Alos im Debugger bei den Variablen sieht es so aus, dass er
*Filename
*Inputstr
*Delimeter
*Fieldarray 0,1,2
richtig füllt.
Ja die Dok´s findet er, aber bei Call doc.replaceItem bricht er mit nem "Objekt variable not set" ab.
Das heißt er findet das Feld nicht oder so ähnlich.
Daher nochmal meine Frage. Was sagt der Debugger zur Variable doc ???
Axel
, nicht sortiert,
Finds a document based on its column values within a view. You create an array of keys, where each key corresponds to a value in a sorted column in the view. The method returns the first document whose column values match each key in the array.
Voraussetzung dafür ist natürlich :
a) Die verwendete View ist nach dem Suchkriterium sortiert
b) Es ist wirklich der erste Wert, nach dem gesucht werden soll (FieldArray(0) = 1. Wert im Array)
Hallo Leute,
die entsprechende Ansicht ist in der ersten Spalte mit den gewünschten Werten gefüllt, nicht sortiert, nicht kategorisiert und ist ein Textfeld.
Sorry Jungens und Mädels,
habs echt verbummelt, doch leider ist der Fehler nicht behoben, denn ich hatte den Code auch mit ner sortierten Spalte heute Morgen schon mal ausprobiert.
Und auch jetzt funzt es wieder nicht.
.... und aufsteigend.....
Da hast Du wohl absolut Recht.
Die Suchabfrage lautet dann auf "54321, statt auf 54321.
So kann Notes nichts finden.
Mag sein das es an der Datei liegt, hättest Du aber,wie ich es geschrieben hatte, Deinen Suchwert mal in eine Temp gegeben hättest Du gleich gesehen das Dein erwarteter Wert nicht gleich dem der Datei ist.
Entsprechend hättest Du den Wert nur noch formatieren brauchen (Replace) und....
Du hättest längst die Lösung.
So aber drehen wir uns schon seit Stunden im Kreis.
Boris
Hat sich die Mühe der Kollegen denn wenigstens gelohnt? Sprich: tut es nu?
Replace(FieldArray(0),""","")
Warum Variant und kein String ?ZitatReplace(FieldArray(0),""","")
Sehe ich da nicht drei ?
Replace(FieldArray(0),""","")
müsste vielleicht so aussehen:
Replace(FieldArray(0),|"|,"")
Das glaube ich eher weniger. Dann müsste die Fehlermeldung anders lauten.Schande über mein Haupt, du hast Recht. Ich habe vergessen, dass view hier nicht deklariert wurde und somit natürlich ein Variant ist.
Die Meldung "Variant does not contain an Object." weist in diesem Fall eindeutig auf die nicht gesetzte Variable view hin.
EditHier den endgültige Code, der auch funzt:
Sub Initialize
Dim session As New notessession
Dim db As notesdatabase
Dim doc As notesdocument
Dim fileNum As Integer, cells As Integer, k As Long
Dim fileName As String
Dim InputStr As String, delimiter As String
Dim FieldArray As Variant
Dim view As NotesView
Set db = session.currentdatabase
Set view = db.GetView ("Alle Dokumente")
fileNum% = Freefile()
'Dateipfad
fileName$ = "C:\PROTOKOLL.TXT"
'Trennzeichen
delimiter = ";"
Open fileName$ For Input As fileNum%
Line Input #1, InputStr$
Do While Not Eof(fileNum%)
'Zeile für Zeile einlesen
Line Input #1, InputStr$
FieldArray = Split(InputStr$,delimiter, -1, 0)
If Not Isempty(FieldArray) Then
Set doc = view.GetDocumentByKey(FieldArray(2))
If Not doc Is Nothing Then
Call doc.ReplaceItemValue("Status", "erledigt")
Call doc.Save(True,True)
End If
End If
Loop
Close fileNum%
End Sub
Das sieht doch gar nicht mal so schlecht aus.
So kann' weitergehen.
...
Set profdoc = db.getprofiledocument("Config")
servername = profdoc.Server(0)
dateipfad = profdoc.Verzeichnis(0)
filenum = Freefile()
'Trennzeichen
delimiter = ";"
aktfile = Dir$( servername & "\" & dateipfad & "\*.*",0)
If aktfile <> "" Then
Open aktfile For Input As fileNum%
Line Input #1, InputStr$
Do While Not Eof(fileNum%)
Else
Messagebox "Datei nicht vorhanden", 16, "Fehler"
End If
...
Axel
Aber bekomm da ein Prob mit dem "Else". -->Unexpected Else, Expected Loop.
Kann das sein?
Dem While fehlt das wend
Also es scheint als würde es funzen.
Leider hängt er sich noch auf mit "Unable to open File".
Was aber wohl eher was mit der Berechtigung auf das Laufwerk zu tun hat oder?
Du hast meine Frage nicht beantwortet. Wo läuft denn der Agent, Server oder lokal beim Client?
Axel
Was mir beim Lesen gerade aufgefallen ist:
Dir$( servername & "\" & dateipfad & "\*.*",0)
stinkt für mich sehr nach einem UNC-Netzwerkpfad a la "\\SERVER002\VERZ\Datei".
Und da gibts mit Domino - wie man über die Forensuche schnell herausfindet - Probleme, wenn der Code auf dem Server läuft.
Ich bin geneigt einen Merkbefreiungsschein auszustellen.
Ich verweise nochmal auf mein Posting von oben:Was mir beim Lesen gerade aufgefallen ist:
Dir$( servername & "\" & dateipfad & "\*.*",0)
stinkt für mich sehr nach einem UNC-Netzwerkpfad a la "\\SERVER002\VERZ\Datei".
Und da gibts mit Domino - wie man über die Forensuche schnell herausfindet - Probleme, wenn der Code auf dem Server läuft.
Das gesagte gilt natürlich auch für verbundene Netzlaufwerke. Nur weil Du als Admin,... auf dem Server das Laufwerk "W" hast, heißt das noch lange nicht, dass der Domino-Server, der unter dem "SYSTEM" Account läuft, dieses Laufwerk auch hat.
Geh bitte zu Deinen Windows-Admins und lass Dir helfen.
...
servername = profdoc.Server(0)
dateipfad = profdoc.Dateiname(0)
...
aktfile = Dir$( servername & "\" & dateipfad & "*.*",0)
...
Das heißt doch, dass er zwar den Pfad aber die Datei nicht findet oder?
Eine Antwort auf meine Frage steht noch aus. Ist sichergestellt, daß im Profildokument die korrekten Werte stehen ?
Wenn servername und dateipfad leer sind, dürfte er im Root nach einer Datei suchen.
Feld Server ist gefüllt mit -> \\Filename
Dateinname ist gefüllt mit -> laufwerksname/Ordnername
ZitatFeld Server ist gefüllt mit -> \\Filename
Dateinname ist gefüllt mit -> laufwerksname/Ordnername
Ähm, wenn ich das richtig verstehe, steht dann z.B. so etwas da drin ?
Server = "\\test.txt"
Dateiname = "C:\test\"
Weil wenn dem so ist, dann würde Dir in folgendem Pfad suchen :
\\test.txt\C:\test\*.*
Ich würde vorschlagen, Du schaust Dir mal im Debugger an, was da überhaupt in den Variablen "servername" und "dateipfad" steht, wenn Du das Script ausführst.
Also mal ganz ehrlich, bei den Variableninhalten ist das doch ganz offensichtlich, dass das nicht funktionieren kann.
Heißt euer Server wirklich Filename?
Der Dateipfad heißt auch berstimmt nicht laufwerksname/Ordnername.
Der Inhalt von aktfile passt auch nicht so ganz.
Sorge erstmal dafür, dass das vernüftige Werte drinstehen und sehen wir weiter.
Axel
Ja, denn die Ausgabe der Fehlermeldung erfolgt im wahrsten Sinne des Wortes Bedingugslos
Nach dem loop ein else.
Wenn dann aktfile = "" dann kommt die Meldung
Zu 1: If....... = "Lager" then tue irgendetwas else weiterlesen.Also so in der Art?
zu 2:
Lagere den Import der Daten in eine Funktion oder Routine aus. Dann holst du dir in einer Schleife der Reihe nach alle Textdateien und rufst dann für jede diese Funktion/Routine auf.
Sinnigerweise sollten dann in diesem Verzeichnis nur solche Dateien enthalten sein. So kannst du alle Dateien verarbeiten. Sonst musst du da noch irgendwie die entsprechenen Dateien filtern.
Axel
Im Grunde muss er sich mit den Folgezeilen nicht lange aufhalten.Nein, weil "Performance" kostet das Lesen von der Platte. Der check, ob da nun "Lager" steht oder nicht, fällt da nicht mehr ins Gewicht, IMHO.
1.Wie realiesiere ich es am Besten, dass er nur immer die Zeilen, in der "Lager" steht , die Nummer holt und im Dok den Feldwert ändert?
Da würde ich doch ne Menge an Performance sparen.
We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil.
2.In dem Ordner in dem die zu überprüfende TXT liegt gibt es mehrere Dateien,Ja? Wie lautet das Problem? Entweder sind die Dateinamen bekannt, dann stehen sie in einem Array, über das Du iterieren kannst, oder Du musst sie mit Dir() auslesen.
die soll er alle der Reihe nach abarbeiten. Bisher war es nur eine.
String zerlegen mit Left und Midfunction?Danke für den Tipp, hat sich nun erledigt.
Man kann m.E. Alles erlernen wenn man will.
Andererseits liegt Deiner Ansicht nach meine Stärke wohl darin, blöde Fragen zu stellenNochmals: Nein, Jason. Ich bin zwar der Meinung, dass es doch dumme (blöde) Fragen gibt, aber es ist selten. Du erkennst vielmehr gar nicht, was Du eigentlich fragen solltest. Und *das* ist der Knackpunkt.