Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Parameter HasFieldNames scheint beim Export keine Funktion zu haben

Begonnen von HarryFox, Mai 20, 2025, 16:24:51

⏪ vorheriges - nächstes ⏩

HarryFox

Hallo zusammen,

ich habe hier mit der Suchfunktion nichts gefunden und auch Tante Google hatte keine passenden Treffer. Also liegt es wohl an mir.

Folgendes Problem ich:
Ich nutze Access 2016 (neuere Version kommt hoffentlich bald). Damit muss ich eine umfangreiche Textdatei einlesen, ein paar Änderungen vornehmen und dann alles wieder zurück in eine Textdatei schreiben. Und das alles so, dass es später jemand benutzen kann, der nicht programmieren kann.

Ich importiere die Datei mittels
DoCmd.TransferText acImportDelim, "servicecatalog", "servicecatalog_rohimport", SC_Datei, True(Der Variablen SC_Datei ist vorher der Dateiname zugewiesen worden)
Dann habe ich eine Tabelle und kann alle gewünschten Änderungen mittels Recordset durchführen. Das klappt auch. Nun will ich alles wieder in einer Textdatei speichern, also benutze ich:
DoCmd.TransferText TransferType:=acExportDelim, _
        SpecificationName:="servicecatalog", _
        TableName:="servicecatalog_export", _
        FileName:=Ordner & "\sc.csv", _
        HasFieldNames:=True, _
        Codepage:=65001
(Ich habe auf die Schreibweise mit benannten Parametern umgestellt nachdem das Problem auftrat, aber das ändert nichts)

Grundsätzlich werden die Daten abgespeichert und sehen auch so aus, wie es sein soll. Nur leider zeigt der Parameter "HasFieldNames" keinen Effekt, denn die Feldnamen stehen nicht in der ersten Zeile.

Wenn ich den Export manuell durchführe und dabei das Feld "Feldnamen in erste Zeile einbeziehen" ankreuze, dann klappt alles wie am Schnürchen. Nur per VBA eben leider nicht.

Da die Datei anschließend in eine Software importiert werden soll auf deren Importroutine ich keinen Einfluss habe, ist es aber sehr wichtig, dass die Datei vom Format her GENAU mit der ursprüglichen übereinstimmt.

Jemand eine Idee? Wenn das ein bekannter Fehler wäre, hätte ich doch sicher im Netz etwas dazu gefunden. Klar könnte ich die Namen manuell in die erste Zeile der Tabelle schreiben bevor ich dann meien Daten anfüge, aber ich hoffe darauf, dass ich nur irgendwas falsch mache.

Viele Grüße
Harry Fox

Hondo

Hallo,
learn.microsoft.com sagt zu diesem Parameter folgendes:
ZitatVerwenden Sie False (0), um die erste Zeile der Textdatei als normale Daten zu behandeln. Wenn Sie dieses Argument leer lassen, wird der Standard (False) angenommen.
Und das gilt auch beim Export.

Also einfach mal den Wert auf False setzen.
Gruß Andi

Knobbi38

Hallo Harry Fox,

das Kommando scheint richtig zu sein, das Argument für HasFieldnames mußt auf TRUE stehen und nicht auf FALSE, wie fälschlicherweise von Andi angenommen, dann werden die Feldnamen mit exportiert. Der Fehler muß also noch woanders gesucht werden.

Gruß Knobbi38

HarryFox

Zitat von: knobbi38 am Mai 20, 2025, 19:55:28Hallo Harry Fox,

das Kommando scheint richtig zu sein, das Argument für HasFieldnames mußt auf TRUE stehen und nicht auf FALSE, wie fälschlicherweise von Andi angenommen, dann werden die Feldnamen mit exportiert. Der Fehler muß also noch woanders gesucht werden.

Gruß Knobbi38


Naja, ich schreibe die geänderten Daten in eine Tabelle, die ich extra vorher leere. Wo soll ich da den Fehler suchen? Es steht ja auf True, was eigentlich funktionieren sollte.

Hast du eine Idee, an welcher Stelle ich suchen soll? Zumal es (wie im Eröffnungspost geschrieben) bei manuellem Export wunderbar klappt.

Gruß
HF

Hondo

Hallo,
falls du auf die Schnelle eine Lösung brauchst, kannst du auch mit der "Open For Output" Methode die Textdatei schreiben. Kommt darauf an um wieviele Datensätze es sich handelt. Sind es zig tausende dann vergiss das mal schnell.

Beispiel:
Dim f As Integer
Dim rs AS DAO.Recordset
Set rs = Currentdb.OpenRecordset("Select Feld1, Feld2, Feld3 From Tabelle1", dbopenSnapshot)
f = freefile

Open "c:\meineDatei.txt" for Output As f
Print #f, "Feldname1;Feldname2;Feldname3"
Do While not rs.eof
    Print #f, rs!Feld1 & ";" & rs!Feld2 & ";" & rs!Feld3
    rs.moveNext
loop

Close #f
rs.close
set rs = nothing

Ungetestet, sollte aber funktionieren.

Gruß Andi

HarryFox

Ich habe es jetzt so "gelöst", dass ich in die frische Tabelle nach dem Leeren erstmal einen Datensatz mit den eigenen Feldnamen schreibe. Das geht ganz einfach so, egal wie viele Spalten die Tabelle hat:
Set rsW = CurrentDb.OpenRecordset("servicecatalog_export")
rsW.AddNew
    For Each feld In rsW.Fields
        feld = feld.Name
    Next feld
rsW.Update
Er sortiert das dann zwar später irgendwo in die Tabelle, aber beim Export ist die Zeile dann wieder oben.

Ich habe auch schon überlegt, ob ich die Datei "von Hand" schreibe, aber diese Lösung war einfacher :-)

Nur erklärt das alles nicht, warum es mit dem dafür vergesehenen Parameter nicht funktioniert. Kann das vielleicht mal jemand mit einer neueren Access-Version testen bzw. wäre es interessant, ob der Fehler überhaupt bei anderen auch auftritt.

HarryFox

#6
Ich hatte grade selber einfach mal eine eigene kleine Testdatenbank gestrickt, die nur eine Tabelle mit 100 Datensätzen und zufällig generierten Daten enthält.

Das VBA besteht nur aus dem hier:Private Sub Befehl0_Click()

datei = "p:\text.csv"

DoCmd.TransferText TransferType:=acExportDelim, _
                   SpecificationName:="specs", _
                   TableName:="Tabelle1", _
                   FileName:=datei, _
                   HasFieldNames:=False, _
                   CodePage:=65001

End Sub
Und siehe da, der Parameter "HasFieldNames" macht genau was er soll. Wenn ich ihn auf True setze habe ich gewünschte erste Zeile.

Leider erklärt das nicht, warum es in meiner eigentlichen Datenbank nicht klappt...

EDIT: Es hat mir keine Ruhe gelassen und ich habe noch ein wenig expirimentiert, aber zunächst hat nichts geholfen. Dann habe ich die Export-Spezifikationen nochmal neu abgespeichert und obwohl ich nichts daran geändert habe, geht es jetzt plötzlich.
Natürlich freue ich mich, dass es jetzt kappt. aber es hinterlässt natürlich ein unschönes Gefühl, wenn man letztlich nicht weiß, woran es lag. Aber damit muss man wohl leben, wenn man MS-Produkte nutzt :-)

Danke euch, für die Unterstützung!

Bitsqueezer

Hallo,

wenn Du eine Import-Spezifikation gespeichert hast, ist es sehr wahrscheinlich, daß Informationen daraus weitere Parameter von "TransferText" überschreiben.

Hier gibt es Infos, wie Du die Specs auslesen kannst:
https://anthonysmoak.com/2018/04/10/how-to-fix-an-import-specification-error-in-microsoft-access/

Weiteres von MS selbst:
https://support.microsoft.com/de-de/topic/speichern-der-details-eines-import-oder-exportvorgangs-als-spezifikation-6b94e183-2b10-4333-a31a-001fe75321b5

Gruß

Christian

markusxy

In eine Excel datei kann man auch per SQL Insert Befehl schreiben.
Benötigt nur einen Bruchteil der Zeit wie Automatisation.
Beispiel habe ich grad nicht zur Hand, sollte aber im WWW zu finden sein.
Bei Interesse kann ich mal eines Posten.