PDA

Vollständige Version anzeigen : TXT Datei mit TAB als Feldtrenner erstellen


peter55
02.06.2012, 14:10
Moin zusammen,

habe ein Problem, dass wahrscheinlich keines ist?

Ich versuche einen Bericht als TXT Datei zu speichern. Als Feldtrennzeichen sollen TABs verwendet werden. Semikolon und/oder Komma geht wahrscheinlich auch. Aber irgendwie stehen da immer Leerstellen zwischen den Feldern. Die falsche Beispieldatei könnte ich zusenden.
Kann man das irgendwie beeinflussen?
Nachstehend der Code, den ich benutze.


Private Sub btn_Rechnungsdatei_Click()
On Error GoTo Err_btn_Rechnungsdatei_Click

Dim stDocName As String

stDocName = "rpt_Rechnungdatei"
DoCmd.OutputTo acReport, stDocName, acFormatTXT, , True

Exit_btn_Rechnungsdatei_Click:
Exit Sub

Err_btn_Rechnungsdatei_Click:
MsgBox ERR.Description
Resume Exit_btn_Rechnungsdatei_Click

End Sub


Besten Dank schonmal für freundliche Unterstützung.

Steffen0815
02.06.2012, 14:17
Hallo,
ein Bericht ist für einen (tabellarischen) Export eher ungeeignet. Hier sollten Tabellen/Abfrage mit entsprechender Exportspezifikation genutzt werden.

peter55
02.06.2012, 15:59
Moin Steffen,

Danke, aber was bedeutet das konkret bei A97?
Tabelle erstellen ok. Und dann?

ebs17
02.06.2012, 16:09
Dein Bericht hat doch eine Datenquelle, vermutlich eine Abfrage. Diese kannst Du mit der Methode TransferText exportieren. Zur Umsetzung bestimmter Notwendigkeiten kann (und sollte) man eine Exportspezifikation (http://www.ardiman.de/datenbanken/grundlagen/tabellen.html#SEC2) anlegen.

peter55
02.06.2012, 17:06
Moin Eberhard,

ich bin ja absoluter Laie, aber ich habe etwas zu dem Thema gefunden.
Es scheint so, als wäre es genau das, was ich brauche.

Den Bericht habe ich ja wie folgt erzeugt:

DoCmd.OpenQuery stDocName, acNormal, acEdit


Dann müsste es ja mit der von Dir beschrieben Methode in etwas so ausshen, oder?


DoCmd.TransferText acExportMerge, , stdocname, , true -1, ,


Ich kann bloß mit den Begriffen nicht anfangen.

Wie die erzeugte Datei heisst, ist völlig wurscht.
Die felder, die ich abfrage und in die Datei schreiben möchte sind Belegdatum, Belegnummer, Rechnung_Brutto etc.

Kannst Du mir da weiterhelfen?

Bist Du sicher, dass sich das Beispiel in den Link auch auf A97 anwenden lässt?

ebs17
02.06.2012, 17:16
Acc97 habe ich nie ernsthaft verwendet, daher kann ich da keine verbindlichen Aussagen dazu machen.
Mit Sicherheit musst Du nicht eine Abfrage öffnen (OpenQuery), um sie zu exportieren. Informationen zur TransferText-Methode findest du in der VBA-Hilfe, auch mit Beispiel.
Die felder, die ich abfrage ...
... heißt was genau? TransferText benötigt eine gespeicherte Abfrage (oder aber eine Tabelle), also ein Objekt zum Exportieren.

Alternativ könnte man den "Text" für die Textdatei auch per Code erzeugen und damit die Datei erzeugen. Das ist auch kein großer Akt, aber VBA-technisch deutlich anspruchsvoller.

Steffen0815
02.06.2012, 17:45
Hallo,
Ich kann bloß mit den Begriffen nicht anfangen.Dafür gibt es die OH. Es hat sich auch nichts Wesentliches seit AC97 verändert.
Teste/exportiere zunächst manuell und lege dabei die Spezi an.

der Aufruf erfolgt dann in der Art: DoCmd.TransferText acImportDelim, "NameDerSpezi", "DeineTabeleOderAbfrage", "c:\...\deine.txt"

Marsu65
02.06.2012, 18:00
Hallo zusammen,

vielleicht sollte man erst mal die Begrifflichkeiten klären ;)
Den Bericht habe ich ja wie folgt erzeugt:
DoCmd.OpenQuery stDocName, acNormal, acEdit


Ein Bericht wäre ein REPORT.
Ich gehe inzwischen davon aus, das du ein Abfrageergebnis (Query) exportieren möchtest.

Markiere im VBA-Editor doch mal "TransferText" und drücke F1

peter55
02.06.2012, 18:00
Moin,

das habe ich mir jetzt zusammengebastelt.

Die qry_Rechnungsdatei sieht wie folgt aus:


SELECT RECHNUNGSAUSGANGSBUCH.Rechnungsnr, RECHNUNGSAUSGANGSBUCH.Rechnungsdatum, RECHNUNGSAUSGANGSBUCH.DEBITORNR, RECHNUNGSAUSGANGSBUCH.LIEFERWERK, "8400" AS Gegenkonto, [Auftragsgesamtsumme]*1.19 AS Rechnung_Brutto, RECHNUNGSAUSGANGSBUCH.KZSTEUER, RECHNUNGSAUSGANGSBUCH.Skontotage, RECHNUNGSAUSGANGSBUCH.Skontoprozent
FROM RECHNUNGSAUSGANGSBUCH
WHERE (((RECHNUNGSAUSGANGSBUCH.Rechnungsdatum)=[von welchem Datum ?]) AND ((RECHNUNGSAUSGANGSBUCH.KZSTEUER)=-1))
ORDER BY RECHNUNGSAUSGANGSBUCH.Rechnungsnr, RECHNUNGSAUSGANGSBUCH.Rechnungsdatum;


Das ist der Code hinter der Schaltfläche auf dem Formular:


Private Sub btn_Rechnungsdatei_Abfrage_Click()
On Error GoTo Err_btn_Rechnungsdatei_Abfrage_Click

Dim stDocName As String

stDocName = "qry_Rechnungsdatei"

DoCmd.TransferText acExportDelim, , stDocName, "C:\Users\peter\Desktop\Rechnungsdatei.txt", True



Das ist das Ergebnis. Kann man natürlich nicht gebrauchen, weil nicht, bzw. falsch formatiert. Die in dem Beispiel beschriebene Exportspezifikation finde ich bei mir nicht.

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| Rechnungsnr | Rechnungsdatum | DEBITORNR | LIEFERWERK | Gegenkonto | Rechnung_Brutto | KZSTEUER | Skontotage | Skontoprozent |
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| 81843 | 31.05.2012 | 10336 | 3 | 8400 | 8396,497319 | Ja | 8 | 4,00% |
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| 81844 | 31.05.2012 | 10295 | 3 | 8400 | 9063,516357 | Ja | 8 | 4,00% |
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Wie gesagt, wenn das in A97 möglich ist, muss ich mal weiter suchen.
Oder hast Du noch eine Idee?

Marsu65
02.06.2012, 18:21
Die in dem Beispiel beschriebene Exportspezifikation finde ich bei mir nicht. Wenn dir die Hilfe nicht ausreicht,
Guckst du hier: http://dbwiki.net/wiki/Access_Bedienungsanleitung:_Importspezifikation_anlegen
oder hier: KlickMich (http://lmgtfy.com/?q=access+97+exportspezifikation) ;)

Steffen0815
02.06.2012, 18:39
Hallo,
wie geschrieben, als erstes ist ein manueller Export notwendig.

... und dann solltest du dich konzentrieren:
Die gepostete Textdatei wurde garantiert nicht vom geposteten Code erzeugt :boah: .

peter55
02.06.2012, 18:41
Moin Marsu,

exakt die gleiche Seite habe ich via Goole geöffnet. Ich habe auch nach Access 97 Exportspezifikation gesucht.

Aber was soll ich mit Import? Siehe das Wiki.
Bin ich zu blöd zumzum, oder habe ich ein Brett vor'm Kopf?

Mir scheint, es fehlt der Assistent?

Marsu65
02.06.2012, 18:50
Nun ja, dass man statt Importieren Exportieren wählt, hatte ich als Transferleistung vorausgesetzt. ;)

Auch unter 97 sollte - wenn du eine Tabelle oder Abfrage im Datenbankfenster markiert hast - der Menüpunkt Datei/Exportieren zu finden sein.

Edit:
Im Auswahlfenster einen Dateinamen angeben und als Dateityp Textdateien(txt) - (Nicht WordMerge(txt)!) - auswählen ... dann kommt auch der Assistent ...

peter55
02.06.2012, 18:54
Moin Steffen,

hast Recht. Habe jetzt mal alle TXT Dateien gelöscht. Das war wohl eine Doublette. So sieht das Ergebnis aus:


"Rechnungsnr";"Rechnungsdatum";"DEBITORNR";"LIEFERWERK";"Gegenkonto";"Rechnung_Brutto";"KZSTEUER";"Skontotage";"Skontoprozent"
81843;31.05.2012 00:00:00;10336;"3";"8400";8396,49;1;8;0,04
81844;31.05.2012 00:00:00;10295;"3";"8400";9063,51;1;8;0,04
81845;31.05.2012 00:00:00;10251;"3";"8400";587,38;1;14;0,04
81846;31.05.2012 00:00:00;10000;"3";"8400";1355,41;1;0;0,00
81847;31.05.2012 00:00:00;10127;"3";"8400";1307,09;1;30;0,04
81848;31.05.2012 00:00:00;10087;"3";"8400";2022,37;1;0;0,00
81849;31.05.2012 00:00:00;11515;"3";"8400";1532,48;1;30;0,03
81850;31.05.2012 00:00:00;10278;"3";"8400";233,24;1;8;0,04


Scheint, dass es so funktionieren könnte. Kann ich hier und jetzt aber leider nicht testen.

Manuell geht es aber trotzdem nicht. Ich komme nicht zu der Stelle mit dem Assistenten. Wenn ich den Haken bei Formatiert reinmache, dann kommen diese schönen senkrechten Striche (wie gepostet) etc.

Wenn ich den Haken rauslasse, kommt eine Fehlermeldung. "Ein Parameter wurde erwartet, aber es wurden zu wenig Parameter übergeben."

Danke an alle bis hierhin und weiterhin schönes Wochenende.

Marsu65
02.06.2012, 19:02
Wenn ich den Haken rauslasse, kommt eine Fehlermeldung. "Ein Parameter wurde erwartet, aber es wurden zu wenig Parameter übergeben."
Das liegt evtl. daran, das du eine Parameterabfrage verwendest ([von welchem Datum ?])
Setz dort doch erst einmal ein festes Kriterium ein um die Spezifikation zu erstellen.

Steffen0815
02.06.2012, 19:05
Hallo,Wenn ich den Haken rauslasse, kommt eine Fehlermeldung. "Ein Parameter wurde erwartet, aber es wurden zu wenig Parameter übergeben."Hätte nicht erwartet, dass ich im AC97 noch einen mir unbekannten Bug finde :boah:.
Da hilft wohl nur der Vorschlag von "Marsu65"

Btw:
Ohne Spezifikation sollte man grundsätzlich nicht arbeiten, da der Export dann Rechner bzw. versionsabhängig ist. Außerdem willst du ja den TAB als Trenner.

peter55
02.06.2012, 19:09
Moin Marsu,

genau das ist der Grund. Ich habe gerade mal eine andere Abfrage genommen udn dann kam die fragliche Seite. Wie kann man das mit der Datumsabfrage umgehen? Meinst Du es funktioniert auch mit der Parameterabfrage, wenn man einmal die Exportspezifikation ohne Parameterabfrage speichert und dann wieder eingibt? Ich probiere das später mal aus. Muss jetzt erst zum Bahnhof.

Danke vielmals.

Steffen0815
02.06.2012, 19:16
Hallo,
Meinst Du es funktioniert auch mit der Parameterabfrage, wenn man einmal die Exportspezifikation ohne Parameterabfrage speichert Ja, das funktioniert.

Allerdings halte ich solche Parameterabfragen für unschön, da der eingegebene Wert nicht vom Programm kontrolliert werden kann.

peter55
02.06.2012, 20:32
Moin,


Allerdings halte ich solche Parameterabfragen für unschön, da der eingegebene Wert nicht vom Programm kontrolliert werden kann.


Und was bedeutet das? Ich bin ja erst einmal froh, dass ich das Datum auswählen kann. Vielleicht lerne ich ja heute noch was? Wie könnte man das optimieren?

peter55
02.06.2012, 21:06
ich nochmal.

Ich habe die Datei

Qry_Rechnungsdatei Exportspezifikation

erzeugt. Wo wird die eigentlich gespeichert?
Kann man die auch editieren?

Steffen0815
02.06.2012, 21:35
Hallo,
das ist keine Datei, sondern liegt in der Datenbank.
Editieren kannst du sie im Assistenten auf dem gleichen Weg wie jetzt.

peter55
02.06.2012, 21:42
Moin,

Aha. Danke.
Wenn ich also das neue Query in meine Originaldatenbank kopiere, damm muss ich dort nochmal machen, damit ich dann dort die gleiche Exportspezifikation bekomme? Da habe ich heute ja ganz schön viel Neues gelernt. In der Vergangenheit habe ich nämlich immer mit den Berichten rumgehampelt und mich über die Leerstellen geärgert.

Nochmals Danke an alle.

BTW
Kann man eigentlich das Datum aus der Parameterabfrage an den Dateinamen beim Speichern anhängen? Dann könnte man schon am Dateinamen sehen, was drin steht.

ebs17
02.06.2012, 22:24
Die Imformationen der Spezifikationen liegen in Systemtabellen. Diese Systemtabellen kann man auch per VBA erzeugen und ändern, siehe Importspezifikation einer DB in VB erstellen (http://www.vbarchiv.net/tipps/details.php?id=876). Diese Tabellen sollten sich, wenn sie sichtbar gemacht werden, auch wie ganz normale Tabellen im-/exportieren lassen.

Bei der TransferText-Anweisung kann der Name der entstehenden Datei beliebig angegeben werden, also auch (sinngemäß) ...
"X:\irgendwo\Dateiname" & Format(Date, "yyyymmdd") & ".txt"

Marsu65
02.06.2012, 22:27
Erstelle ein Formular, in dem das Datum eingegeben werden kann.
(Anwender sollten nur mit Formularen arbeiten.)
Du kannst dich in der Abfrage auf den Formularwert beziehen.
Hier kannst du dann auch gleich eine Schaltfläche erstellen, die den Export (mittels der erstellten Spezi) vornimmt.
Kann man eigentlich das Datum aus der Parameterabfrage an den Dateinamen beim Speichern anhängen? Dann könnte man schon am Dateinamen sehen, was drin steht.
Da man bei der Methode
DoCmd.TransferText
einen Dateinamen übergeben kann, ist das möglich.
Edit:
Eberhard hat ja sogar schon eine konkrete Lösung gepostet.

peter55
02.06.2012, 22:46
Moin,

Danke, danke Euch allen.
Klappt alles bestens.
Ich werde das morgen mal in das Original einfügen.

Gut's Nächtle