Hi,
ich habe wieder ein neues Problemchen.
Diesmal möchte ich Datensätze aus Access herraus exportieren. Immer nur den aktuell angezeigten Datensatz in einem Formular. Dieser soll dann in eine *.CSV Datei geschrieben werden.
Nun ist die Frage, da dies nicht über eine Abfrage laufen soll, wie ich es umsetzen kann. Ich habe sowas schon mal nach Word hingemacht, jedoch gibt es in Word die Textmarken, die angesprungen werden, diese gibt es in Ecxel scheinbar nicht.
Gibt es eine Möglichkeit, dies auch in Excel zu benutzen?
Salvation
Hallo,
Zitatdiese gibt es in Ecxel scheinbar nicht
RICHTIG
ZitatGibt es eine Möglichkeit, dies auch in Excel zu benutzen
NEIN
Zitatda dies nicht über eine Abfrage laufen soll
Wird aber so sein müssen, sonst kriegst du den aktuellen DS des Formulars nicht exportiert - und ausserdem spricht TransferText m.E. nur Abfragen oder Tabellen an.
Wozu würdest du denn die Textmarken benötigen? Soll der Export an eine bestehende Datei angehängt werden?
Hi,
japp, der Export soll an eine bestehende Datei angehängt werden. ggf. soll der erste Export auch schauen, ob die Datei vorhanden ist oder nicht. Sprich, absicherung, ob jemand die Datei vielleicht gelöscht hat. Da diese ins ORBIS geladen wird, dmait daten darin aufgenommen werden. Dafür wird die CSV-Datei gebaucht. Danach kann sie ggf. gelöscht oder eben geleert werden. Danach werden wieder neue Datensätze darin gesammelt. Ich denke aber, dass die Kontrolle mit jedem Datensatz der exportiert wird durchlaufen werden soll, da sie jederzeit ins ORBIS geladen und damit ggf gelöscht werden kann.
Salvation
Hallo,
erstell erst mal ein genaues (!) Ablaufkonzept zu diesem Vorgang.
Dann kannst Du mit Hilfe dieser Beispiele:
http://dbwiki.net/wiki/Access_Tipps_und_Tricks unter "Verarbeitung von Textdateien"
(nach gewissen Code-Anpassungen) den Export der Formulardaten in eine CSV-Datei und sonstige Überprüfungen erledigen.
Hi,
so, ich hab mich nun für eine TXT-Datei entscheiden, da man diese fix in eine CSV-Datei umwandeln kann. Einen Export mit allen Datensätzen bekomme ich nun schon hin, jedoch möchte ich nur den Datensatz exportieren, der mir grade in dem Formular angezeigt wird.
Des Weiteren sollen weiter Datensätze angehängt werden, so dass nur eine TXT-Datei besteht und da dann mehrere verschiedene Datensätze drin stehen.
Sinn und Zweck:
Der Export erfolgt, nachdem die Person neu angelegt wurde. Diese muss dann in ORBIS (ein Krankenhaus-Programm) eingebunden werden, dafür werden CSV-Dateien benötigt, aber wie gesagt, eine TXT-Datei kann man schnell mal eben Umwandeln.
Ich bin nun soweit, dass ich folgendes Modul eingebunden habe:
Option Compare Database
Public Function ExportDelim(SQL As String, _
Optional FName As String = "C:\Temp\Temp.txt", _
Optional HasFieldNames As Boolean = True, _
Optional Delim As String = ";", Optional Quote As String = """")
Dim C As Long, Tmp As String, DB As DAO.Database
Dim RS As DAO.Recordset, Fld As DAO.Field
Set DB = CurrentDb
Set RS = DB.OpenRecordset(SQL, dbOpenSnapshot, dbForwardOnly)
C = FreeFile
Open FName For Output As #C
If Not RS.EOF And HasFieldNames Then
Tmp = ""
For Each Fld In RS.Fields
Tmp = Tmp & Delim & Quote & Fld.Name & Quote
Next Fld
Print #C, Mid(Tmp, Len(Delim) + 1)
End If
Do While Not RS.EOF
Tmp = ""
For Each Fld In RS.Fields
Tmp = Tmp & Delim & Quote & Fld.Value & Quote
Next Fld
Print #C, Mid(Tmp, Len(Delim) + 1)
RS.MoveNext
Loop
Close #C
RS.Close
DB.Close
End Function
Der Aufruf erfolgt so:
Private Sub Befehl8_Click()
MsgBox Me.RecordSource
MsgBox Me.Vorname
MsgBox Me.Nachname
MsgBox Me.Einstelungsdatum
ExportDelim "SELECT Me.Vorname, Me.Nachname, Me.Einstellungsdatum FROM Me.RecordSource", "C:\Dokumente und Einstellungen\Reaver\Desktop\Testumgebung\Test.TXT"
End Sub
Die MsgBox sind noch zur Kontrolle da, damit ich schauen kann, ob auch der Datensatz genommen wird, der aktuell angezeigt wird.
Nun hab ich jedoch einen Laufzeitfehler:
Laufzeitfehler '3024':
Datei 'C:\Dokumente und Einstellungen\Reaver\Eigene Dateien\Me.mdb' nicht gefunden
Markiert wird mir im Modul folgende Zeile:
Set RS = DB.OpenRecordset(SQL, dbOpenSnapshot, dbForwardOnly)
Irgendwie bin ich grade leicht verwird, da ich nirgends eine Me.mdb angelegt habe, geschweige den suchen lasse. Oder schaue ich da grade nur drüber hinweg?
Salvation
Hallo,
"ich hab mich nun für eine TXT-Datei entscheiden, da man diese fix in eine CSV-Datei umwandeln kann. "
?? Was willst Du da umwandeln? eine (entspr. formatierte) txt-Datei ist doch eine csv-Datei...
.
.
Optional FName As String = "C:\Temp\Temp.csv", _
.
ExportDelim "SELECT Me.Vorname, Me.Nachname, Me.Einstellungsdatum FROM Me.RecordSource", "C:\Dokumente und Einstellungen\Reaver\Desktop\Testumgebung\Test.CSV"
Die Recordsoure-Eigenschaft kann nicht als "Datenlieferant" für eine Abfrage (SQL-String) herhalten. Da muß ein Tabellen/Abfragename stehen.
Ein Formularobjekt-Verweis (Me) ist in einem SQL-String unsinnig.
Um einen bestimtmen DS in die Datei zu verfrachten, kann das Kriterium in den SQL-String eingebaut werden:
ExportDelim "SELECT Vorname, Nachname, Einstellungsdatum FROM tblDeineTabelle where PersID= " & Me!PersID, "C:\Dokumente und Einstellungen\Reaver\Desktop\Testumgebung\Test.CSV"
Um Datensätze an die CSV-Datei anzuhängen, kann das Öffnungsargument "For Append" bei "Open Dateiname" benutzt werden.
Hallo,
und in Anlehnung und als Ergänzung zu den Ausführungen von Franz KÖNNTEST du ja auch das Recordset deines Formulars verwenden um den aktuellen Datensatz zu erhalten:
Option Compare Database
Option Explicit
Public Function ExportDelim(SQL As String, _
Optional FName As String = "C:\Temp\Temp.txt", _
Optional HasFieldNames As Boolean = True, _
Optional Delim As String = ";", Optional Quote As String = """")
Dim C As Long, Tmp As String, DB As DAO.Database
Dim RS As DAO.Recordset, Fld As DAO.Field
Set DB = CurrentDb
Set RS = Me.RecordsetClone
RS.FindFirst "[PersID]=" & Me!PersID
C = FreeFile
Open FName For Output As #C
...
..
.
Close #C
Set RS = Nothing
End Function
Aufruf dann OHNE den SQL-String ...
ExportDelim "SELECT Vorname, Nachname, Einstellungsdatum FROM tblDeineTabelle where PersID= " & Me!PersID, "C:\Dokumente und Einstellungen\Reaver\Desktop\Testumgebung\Test.CSV"
Hallo,
dann muss die Funktion (wegen der "ME"-Referenzierung) aber im Formularklassen-Modul stehen, es sei denn, es wird der Recordset(Clone) anstelle der SQL-Strings übergeben..
Hallo Franz,
ja - habe ich vergessen zu erwähnen - oder eben das Form mit seinem Namen angesprochen werden.
Ausserdem könnte der Teil ...
Do While Not RS.EOF
Tmp = ""
For Each Fld In RS.Fields
Tmp = Tmp & Delim & Quote & Fld.Value & Quote
Next Fld
Print #C, Mid(Tmp, Len(Delim) + 1)
RS.MoveNext
Loop
...eigentlich entfallen, da Salvation ja nur den aktuellen DS angesprochen hat - oder?
Hallo
ja, sicher... Es gibt halt immer Optimierungsmöglichkeiten, wenn man die Situation individuell nimmt. :D
Hi,
Zitat?? Was willst Du da umwandeln? eine (entspr. formatierte) txt-Datei ist doch eine csv-Datei...
Das sollte auch nicht das Problem sein. Dennoch danke für den Tipp, ich hätte notfalls die Dateiändung umgeändert, aber wenn es auch so geht, um so besser :)
Nehme ich das Beispiel von DF6GL, bekomme ich folgene Fehlermeldung:
Laufzeitfehler '3464': Datentyen in Kriterienausdruck unverträglich.Makiert wird hierbei die Textzeile:
ExportDelim "SELECT Vorname, Nachname, Einstellungsdatum FROM tblDeineTabelle where PersNr= " & Me!PersNr, "C:\Dokumente und Einstellungen\Reaver\Desktop\Testumgebung\Test.CSV"Vermische ich nu beide Vorschläge - ja ich musste es mal versuchen - dann bekomme ich folgende Fehlermeldung. Im Endeffekt die selbe wie vorher:
Laufzeitfehler '13': Typen unverträglichDazu sollte vielleicht gesagt werden, das die PersID als Text geklariert wurde, da diese auch Punkte oder Komma enthalten kann. Ich meine, da dar dann was, dass man da noch einfache Gänsefüsse setzen muss, aber ich weiß grade nicht mehr wie und wo.
Nehme ich nun das Beispiel von database bekomme ich diese Fehlermeldung:
Fehler beim Kompilieren:
Variablen nicht DefiniertHierbei wird im Modul der komplette Kopf markiert:
Public Function ExportDelim( _
Optional FName As String = "C:\Temp\Temp.csv", _
Optional HasFieldNames As Boolean = True, _
Optional Delim As String = ";", Optional Quote As String = """")Salvation
Hall,
"Dazu sollte vielleicht gesagt werden, das die PersID als Text geklariert wurde,"
ja, das ist auch der Grund für die Fehlermeldung. Ich hatte PersID geschrieben mit der Annahme, dass das das Primärschlüsselfeld vom DatenTyp Long , respektive Autowert sein könnte...
Wenn es sich um ein Textfeld handelt, dann muß es so heissen:
ExportDelim "SELECT Vorname, Nachname, Einstellungsdatum FROM tblDeineTabelle where PersNr= '" & Me!PersNr & "'", "C:\Dokumente und Einstellungen\Reaver\Desktop\Testumgebung\Test.CSV"
wenn wir bei der ursprünglichen Code-Version mit einem SQL-String als Übergabeargument bleiben.
Hallo,
Zitat...aber ich weiß grade nicht mehr wie und wo...
PersNr=
'" & Me!PersNr &
"'"und
ZitatNehme ich nun das Beispiel von database bekomme ich diese Fehlermeldung...
Public Function ExportDelim(
_ Optional FName As String = "C:\Temp\Temp.csv", _
Optional HasFieldNames As Boolean = True, _
Optional Delim As String = ";", Optional Quote As String = """")
der Unterstrich hier muss raus wenn du meine Version versuchen willst
p.s.
Zitat von: DF6GL am Juli 03, 2011, 12:37:43
ja, sicher... Es gibt halt immer Optimierungsmöglichkeiten, wenn man die Situation individuell nimmt. :D
jou und das speziell an einem verregneten Sonntag ... :-\ :D ;D
@ database:
Nehme ich das _ raus, dann markiert er mir den folgenden Text rot. Wenn ich dann die Prozedur anstoze, hängt er sich daran auf.
Kann es sein, dass da noch was fehlt? Weil es ist ja - so dachte ich - eine komplette Funktion, draum hab ich das _ auch stehen lassen.
Hallo,
mhmm, glaub ich nicht so ganz ;) :D 8)
vermutlich hat er durch den Mischmasch vergessen, eine Variable zu ändern...
@Salvation: poste mal den Mischmasch und nenne die Variable, die BLAU markiert wird, wenn die Fehlermeldung entsteht.
Einmal das Modul:
Option Compare Database
Option Explicit
Public Function ExportDelim(
Optional FName As String = "C:\Temp\Temp.csv", _
Optional HasFieldNames As Boolean = True, _
Optional Delim As String = ";", Optional Quote As String = """")
Dim C As Long, Tmp As String
Dim RS As DAO.Recordset, Fld As DAO.Field
Set RS = DB.OpenRecordset(SQL, dbOpenSnapshot, dbForwardOnly)
C = FreeFile
Open FName For Output As #C
If Not RS.EOF And HasFieldNames Then
Tmp = ""
For Each Fld In RS.Fields
Tmp = Tmp & Delim & Quote & Fld.Name & Quote
Next Fld
Print #C, Mid(Tmp, Len(Delim) + 1)
End If
' Do While Not RS.EOF
' Tmp = ""
' For Each Fld In RS.Fields
' Tmp = Tmp & Delim & Quote & Fld.Value & Quote
' Next Fld
' Print #C, Mid(Tmp, Len(Delim) + 1)
' RS.MoveNext
' Loop
Close #C
Set RS = Nothing
End Function
Der Aufruf:
Option Compare Database
Private Sub Befehl8_Click()
ExportDelim "C:\Dokumente und Einstellungen\Reaver\Desktop\Testumgebung - database\Test.CSV"
End Sub
Beim Ausführen bekomme ich nun folgende Meldung - ich hab beide Beispiele mal in getrennte Testumgebungen gelegt, damit da nichts zusammen gemischt wird:
Fehler beim Kompilieren
Erwartet: Bezeichner
Rot unterlegt ist dann folgender Teil:
Public Function ExportDelim(
Optional FName As String = "C:\Temp\Temp.csv", _
Optional HasFieldNames As Boolean = True, _
Optional Delim As String = ";", Optional Quote As String = """")
Wobei der Curse - falls es auch was zu bedeuten haben könnte - am Ende der Zeile steht.
@ DF6GL:
Dein Beispiel funktiniert. Nun muss ich nur noch hinbekommen, dass die neuen Datensätze, welche ebenfalls exportiert werden, angehängt werden und nicht überschrieben. Enenso schön wäre es, wenn die erste Zeile, in der Vorname, Nachname und Eintrittsdatum weg sind, also nur die Daten es Datensatzes drin stehen. Gibt es da noch eine Möglichkeit?
Hallo,
bin gleich offline.. ;)
"Gibt es da noch eine Möglichkeit?"
Hab ich doch vorhin gesagt....
Hallo,
nur noch ein kleiner Einwurf:
Wenn du das .....
Public Function ExportDelim(
Optional FName As String = "C:\Temp\Temp.csv", _
Optional HasFieldNames As Boolean = True, _
Optional Delim As String = ";", Optional Quote As String = """")
... mit dem oben gepostetem Code der Function ExportDelim verwendest, kracht es unweigerlich
weil dieses Zeile ...
Set RS = DB.OpenRecordset(SQL, dbOpenSnapshot, dbForwardOnly)
...die Übergabe des SQL-Strings erwartet hätte - der aber im Prozedurkopf rausgenommen wurde.
Um die Verwirrung nicht weiter zu schüren .... bleib' beim Beispiel von Franz! ;)
Hi,
@ DF6GL
Args, grade wohl ein wenig in den Hintergrund verdrängt. Danke, werds gleich mal ein wenig weiter versuchen.
@ database:
Okay, wieder was gelernt. Vielleicht mach ich mich da i-wann nochmal ran. Dennoch Danke für deine Hilfe :)
Salvation
Hi,
aber bitte, keine Ursache - gute Idee, schau dir das mal an wenn du leicht Zeit findest ;)
Hi,
auf jeden Fall :) Habs ja nun schonmal auf meinem Rechner, da muss ich dann nur noch weiter machen :)
Aber erstmal mach ich das andere Beispiel weiter und da hänge ich auch gleich schon wieder.
Hab nun meinen Abruf erweitert, damit das Programm die Datensätze anhängt. Jedoch werden sie weiterhin überschrieben.
Wie folgt schaut es nun aus:
Private Sub Befehl8_Click()
Nr = FreeFile
Open "C:\Dokumente und Einstellungen\Reaver\Desktop\Testumgebung - DF6GL\Test.CSV" For Append As #1
Print #Nr, "Hier kommt der Inhalt was geschrieben werden soll"
Close #Nr
ExportDelim "SELECT Vorname, Nachname, Einstelungsdatum FROM Daten where PersNr= '" & Me!PersNr & "'", "C:\Dokumente und Einstellungen\Reaver\Desktop\Testumgebung - DF6GL\Test.CSV"
End Sub
Salvation
Hallo,
aber doch kein Open vor dem Aufruf der Funktion..
IN der FUNKTION das "For output" durch "For Append" ersetzen.
Hi,
args, okay, voll verpeilt. *schäm* Kappt nun aber.
Das einzige was nun noch stört, dass der Kopf mit Exportiert wird.
Vorname Nachname Einstelungsdatum
Autumn Hokee 01.07.2011
Vorname Nachname Einstelungsdatum
Embry Call 03.07.2011
Wenn dass nun noch raus ist, dann bin ich Wunschlos glücklich. Ich denke aber mal dass es was mit diesem Codeteil zu tun hat:
For Each Fld In RS.Fields
Tmp = Tmp & Delim & Quote & Fld.Name & Quote
Next Fld
Bin mir da nur nicht so sicher.
Salvation
Hallo,
versuch mal
Optional HasFieldNames As Boolean = False
im Prozedurkopf
und hier ... If Not RS.EOF And HasFieldNames = False Then
bzw. überhaupt weglassen der FieldNames-Geschichte in dieser Bedingung
ungetestet!
HTH
Huhu,
angepasst, behält aber bei, dass die Kopfzeile mit exportiert wird.
Salvation
AHA...
dann nimm hier mal statt Fld.Name Fld.Value
Tmp = Tmp & Delim & Quote & Fld.Name & Quote
... so wie es im auskommentierten Bereich ja richtig eingetragen war.
Hi,
Ich habs angepasst und dabei wurde nun der Datensatz doppelt ausgegeben. Dafür hab ich dann diesen Teil:
'Do While Not RS.EOF
' Tmp = ""
' For Each Fld In RS.Fields
' Tmp = Tmp & Delim & Quote & Fld.Value & Quote
' Next Fld
' Print #C, Mid(Tmp, Len(Delim) + 1)
' RS.MoveNext
'Loop
auskommentiert. Das wurde ja schonmal auskommentiert, bei deinem Beispiel.
Nun funktioniert es so, wie ich es haben wollte.
Vielen lieben Dank.
Salvation
Hallo,
na schön, dass es leztendlich läuft.
Bei den vielen Variationen von auskommentiert und nicht auskommentiert ....
LG
Hi,
irgendwann muss es ja mal funktionieren. Notfalls wäre ich nochmal alles durchgegangen und dann irgendwann sicherlich dahinter gekommen.
Vielen lieben Dank nochmal, vorallem für die Geduld.
Salvation