Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

export kwerendy do pliku csv

586 views
Skip to first unread message

Jan Koc

unread,
Nov 21, 2016, 6:31:17 AM11/21/16
to
Witam
Od pewnego czasu boksuję się z wyeksportowaniem kwerendy "ExportDoDPD" do pliku csv (skoroszyt excela z polami rozdzielonymi średnikami)
próbowałem bezpośrednio

Specyfikacja exportu "Export11" do pliku tekstowego .csv

DoCmd.TransferText acExportDelim, "Export11", "ExportDoDPD", "X:\Export_DPD.csv", True

albo najpierw wysyłam plik excelowski a potem go zamieniam na csv

Dim WrksheetName As String
Dim xl As Object
Set xl = CreateObject("Excel.Application")

xl.Workbooks.Open "X:\Export_DPD.xls"
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel97, "ExportDoDPD", "X:\Export_DPD.xls", True

'Set xl = Nothing

' Dim AJ As String
' Dim AB As String
' AJ = "X:\Export_DPD.xls"
' AB = "X:\Export_DPD.csv"
' fSaveAsXlsx AJ, AB

i za każdym razem dostaję plik który jest nieczytany przez aplikację zawnętrzną.
Dopiero jak otworzę plik i polecę zapis, EXCEL poda komunikat, że zostaną utracone formuły a ja się na to zgodzę, to plik jest akceptowany.

Czy ktoś ma jakiś pomysł ?

Z góry dziękuję

Prot

unread,
Nov 21, 2016, 9:34:52 AM11/21/16
to

Użytkownik "Jan Koc" <jan.ko...@gmail.com> napisał w wiadomości
news:39d994b6-e28e-4fc2...@googlegroups.com...
Od pewnego czasu boksuję się z wyeksportowaniem kwerendy "ExportDoDPD" do
pliku csv (skoroszyt excela z polami rozdzielonymi średnikami)
...
Czy ktoś ma jakiś pomysł ?

Swego czasu wojowałem z importem poprzez VBA z csv do accessa 2003 i excela
2007 - bardzo poważne problemy miałem ... ze względu na kłopoty z kodowaniem
znaków - u mnie rozwiązałem problem poprzez zastosowanie zestawu OEM 852 ;)

MaciejF

unread,
Nov 22, 2016, 3:33:53 AM11/22/16
to
Witaj,
Pomiń wywoływanie obiektu Excel.

Proponuję użyć procedurkę VBA:


"
Public Sub exportQuery(exportSQL As String)
Dim db As DAO.Database, qd As DAO.QueryDef
Dim fd As FileDialog
Set fd = Application.FileDialog(msoFileDialogSaveAs)

Set db = CurrentDb

'Check to see if querydef exists
For i = 0 To (db.QueryDefs.Count - 1)
If db.QueryDefs(i).Name = "tmpExport" Then
db.QueryDefs.Delete ("tmpExport")
Exit For
End If
Next i

Set qd = db.CreateQueryDef("tmpExport", exportSQL)

'Set intial filename
fd.InitialFileName = "export_" & Format(Date, "mmddyyy") & ".csv"

If fd.show = True Then
If Format(fd.SelectedItems(1)) <> vbNullString Then
DoCmd.TransferText acExportDelim, , "tmpExport", fd.SelectedItems(1), False
End If
End If

'Cleanup
db.QueryDefs.Delete "tmpExport"
db.Close
Set db = Nothing
Set qd = Nothing
Set fd = Nothing

End Sub

"

Wywoływana pod przyciskiem:
Public Sub someButton_Click()
Dim queryStr as String
'Store Query Here:
queryStr = "SELECT * FROM..."

Call exportQuery(queryStr)

End Sub


źródło:
http://stackoverflow.com/questions/14700192/vba-docmd-transfertext-exporting-query-to-csv-with-user-defined-file-path

MF


MaciejF

unread,
Nov 22, 2016, 4:00:08 AM11/22/16
to
> 2007 - bardzo poważne problemy miałem ... ze względu na kłopoty z kodowaniem
> znaków - u mnie rozwiązałem problem poprzez zastosowanie zestawu OEM 852 ;)

Tak jak pisał Prot
Ustaw w funkcji transportu odpowiednie kodowanie:

https://msdn.microsoft.com/en-us/library/office/ff835958.aspx

https://msdn.microsoft.com/en-us/library/windows/desktop/dd317756(v=vs.85).aspx

MF

Jan Koc

unread,
Nov 22, 2016, 12:41:41 PM11/22/16
to

Dziękuję za podpowiedzi.
Właśnie próbowałem zaimplementować kod MaciejaF i wyskoczył mi błąd
przy deklaracji:
Dim fd As FileDialog
że ten typ jest niezdefiniowany.

Podejrzewam, że brakuje mi jakiś referencji. A mam podłączone następujące:
1.Visual Basic For Application
2.Microsoft Access 15.0 Object Library
3.OLE Automation
4.Microsoft Office 15.Access database engine Object Library
5.Microsoft ActiveX Data Objects 6.0 Library
6.Microsoft ActiveX Data Objects Recordset 6.0 Library

Czy powinienem coś dodać ?

Jan

MaciejF

unread,
Nov 22, 2016, 1:57:58 PM11/22/16
to
>
> Czy powinienem coś dodać ?
>
> Jan

Widzę że powinna być referencja do:
Microsoft Office 11.0 Object Library


Pobróbuj zmieniając też w deklaracji fd:
Dim fd As Office.FileDialog

MF

MaciejF

unread,
Nov 22, 2016, 2:11:12 PM11/22/16
to
Twoja wersja Accessa będzie miała:
Microsoft Office 15.0 Object Library
I tę podłącz.

Powodzenia!
MF

Jan Koc

unread,
Nov 22, 2016, 2:44:11 PM11/22/16
to
Mam Office 2013
oj długo szukałem tej 11-stki.

Dzięki za podpowiedź, biorę się do roboty.

Jan




Jan Koc

unread,
Nov 22, 2016, 3:07:49 PM11/22/16
to
Kod został skompilowany
i
wyskoczył błąd 3441 - Separator pól specyfikacji pliku tekstowego odpowiada separatorowi dziesiętnemu lub ogranicznikowi tekstu.

?????
i jeszcze dopytam, czy w fd.SelectedItems(1) jest zawarta jakaś konkretna ścieszka dostępu? bo potrzebuję X:\Export_DPD.csv

Jan

Jan Koc

unread,
Nov 22, 2016, 3:14:09 PM11/22/16
to

> i jeszcze dopytam, czy w fd.SelectedItems(1) jest zawarta jakaś konkretna ścieszka dostępu? bo potrzebuję X:\Export_DPD.csv
>
To znaczy zanim wywala błąd pojawia się okienko dialogowe adresu pliku,
ale czy to można zautomatyzować ?

Jan

Jan Koc

unread,
Nov 22, 2016, 3:46:46 PM11/22/16
to
wróć !!!!

nie wpisałem specyfikacji exportu i stąd ten błąd.

poprawka (czyli wpis) uruchomiła transfer tekstu, ale bez nagłówków kolumn.

Jak dodałem na końcu True to nagłówki pojawiły się. OK.

Niestety efekt był ten sam co w poprzednich moich metodach.
Tzn. plik jest nieczytany przez aplikację zewnętrzną i dopiero otwarcie pliku i zapisanie jako Export..... .csv z konieczną akceptacją, że zostaną utracone formuły daje poprawny wynik. Przy czym cały czas plik jest identyfikowany jako plik w formacie wartości oddzielonymi przecinkami Excel

Jan

Jan Koc

unread,
Nov 22, 2016, 4:46:39 PM11/22/16
to
I mam jeszcze jeden pomysł. Ale brak mi wiedzy jak to zrobić.

W tle po dokonaniu transferu, otworzyć utworzony plik csv, polecić zapisać go jako csv, wyrazić zgodę na utratę formuł (lub wyłączyć komunikaty) i na koniec go zamknąć.

Pewnie nie jest to elegancka droga, ale cel zostałby osiągnięty.

Jan

MaciejF

unread,
Nov 23, 2016, 1:23:54 AM11/23/16
to
skorzystaj z doświadczeń Prota:
Zmień kod w swojej procedurce:

DoCmd.TransferText acExportDelim,"Export11" , "tmpExport", fd.SelectedItems(1), True,,852


Dodałem kodowanie OEM Latin2 - 852
Zmień "Export11" jeżeli twoja specyfikacja eksportu jest inna

MF

MaciejF

unread,
Nov 23, 2016, 1:25:44 AM11/23/16
to
Tutaj zmień nazwę pliku:
fd.InitialFileName = "export_" & Format(Date, "mmddyyy") & ".csv"

np.
fd.InitialFileName = "mojCSV_" & Format(Date, "Yyyymmdd") & ".csv"

MF

Jan Koc

unread,
Nov 23, 2016, 1:29:32 AM11/23/16
to
Już to zrobiłem, nie pomogło.Raczej chodzi o to że tworzony plik obsługuje formuły, a dopiero wyłączenie formuły daje poprawną wersję csv.
Jan

Jan Koc

unread,
Nov 23, 2016, 1:31:20 AM11/23/16
to
To już mam zrobione.

Jan Koc

unread,
Nov 23, 2016, 1:43:45 AM11/23/16
to
Tzn kodowanie włączyłem i nie pomogło

Jan Koc

unread,
Nov 28, 2016, 3:57:17 PM11/28/16
to
Wracam !!
Nie udaje mi się tego poprawnie zrobić.
Kod jest następujący:
Dim db As DAO.Database, qd As DAO.QueryDef
Dim fd As FileDialog
Dim exportSQL As String
Dim i As Integer

Set fd = Application.FileDialog(msoFileDialogSaveAs)

Set db = CurrentDb
exportSQL = "SELECT FIRMA.Nazwa AS S_Name, FIRMA.Ulica AS S_Address, FIRMA.Kod AS S_Zip, FIRMA.Miasto AS S_City, FIRMA.telefon AS S_Phone, FIRMA.e_mail AS S_Email, 'Grzegorz Kociumbas' AS S_Contact_Person, [Export DPD2].P_Cat_KP, [Export DPD2].P_Cat_5, [Export DPD2].P_Cat_10, [Export DPD2].P_Cat_20, [Export DPD2].P_Cat_30, [Export DPD2].P_Cat_50, [Export DPD2].R_Name, [Export DPD2].R_Address, [Export DPD2].R_Zip, [Export DPD2].R_City, [Export DPD2].R_Phone, [Export DPD2].R_Email, [Export DPD2].R_Contact_Person, [Export DPD2].P_Courier_Name, [Export DPD2].P_Comment, [Export DPD2].P_Content, [Export DPD2].A_Terminal, [Export DPD2].P_Cod, [Export DPD2].Time FROM FIRMA, [Export DPD2] WHERE ((([Export DPD2].Wydrukowane)=2));"

'Check to see if querydef exists
For i = 0 To (db.QueryDefs.Count - 1)
If db.QueryDefs(i).Name = "tmpExport" Then
db.QueryDefs.Delete ("tmpExport")
Exit For
End If
Next i

Set qd = db.CreateQueryDef("tmpExport", exportSQL)

'Set intial filename
fd.InitialFileName = "x:\export_" & Format(Date, "yyyymmdd") & ".csv"

If fd.show = True Then
If Format(fd.SelectedItems(1)) <> vbNullString Then
DoCmd.TransferText acExportDelim, "Export Specyfikacja eksportu", "tmpExport", fd.SelectedItems(1), True, , 852
End If
End If

'Cleanup
db.QueryDefs.Delete "tmpExport"
db.Close
Set db = Nothing
Set qd = Nothing
Set fd = Nothing

I jest poprawnie wykonywany, ale w efekcie otrzymuję plik podobno typu csv, ale dopiero po jego otwarciu i zapisaniu jako csv (tu informuje, że zostaną utracone formuły), plik jest poprawnie wczytywany przez aplikację zewnętrzną. Przed tą operacją plik jest nierozpoznawalny.

W związku z tym czy ktoś mógłby mi podrzucić dalszy ciąg tzn uruchomienie w tle tego pliku, zapisanie jako csv, wyłączenie komunikatu i na koniec zamknięcie excela ??

Jan

MaciejF

unread,
Nov 29, 2016, 8:45:44 AM11/29/16
to
W dniu poniedziałek, 28 listopada 2016 21:57:17 UTC+1 użytkownik Jan Koc napisał:
> Wracam !!
> Nie udaje mi się tego poprawnie zrobić.
> Kod jest następujący:

>
> 'Set intial filename
> fd.InitialFileName = "x:\export_" & Format(Date, "yyyymmdd") & ".csv"

Może zmień na:
fd.InitialFileName = "x:\export_DPD.txt"

Wypróbuj poniższe.
Dołącz swój zmodyfikowany kod:

Dim AJ As String
Dim AB As String
AJ = "X:\Export_DPD.txt"
AB = "X:\Export_DPD.csv"
fSaveAsXlsx AJ, AB

Pozdrawiam
MF


MaciejF

unread,
Nov 29, 2016, 10:35:08 AM11/29/16
to
zamiast

> Dim AJ As String
> Dim AB As String
> AJ = "X:\Export_DPD.txt"
> AB = "X:\Export_DPD.csv"
> fSaveAsXlsx AJ, AB
>

FileCopy "X:\Export_DPD.txt", "X:\Export_DPD.csv"
End Sub

Sprawdź to rozwiązanie

Pozdrawiam ponownie
MF

Jan Koc

unread,
Nov 29, 2016, 11:29:15 AM11/29/16
to
Dziękuję za ponowną próbę ale nadal nie wychodzi.
Wygląda na to, że Excel zawsze tworząc plik csv dodaje mu możliwość tworzenia formuł i dopiero zadeklarowanie aby zapisał plik jako csv daje możliwość pozbycia się tego "bagażu".
Dlatego może dać mu tę możliwość i jak pisałem powyżej

"tzn uruchomienie w tle tego pliku, zapisanie jako csv, wyłączenie komunikatu i na koniec zamknięcie excela "

Jan


MaciejF

unread,
Nov 29, 2016, 11:50:34 AM11/29/16
to

MaciejF

unread,
Nov 29, 2016, 11:51:30 AM11/29/16
to

Jan Koc

unread,
Nov 29, 2016, 12:30:01 PM11/29/16
to
A jak Pan wykona taką operację (txt na csv), to proszę sprawdzić jak u Pana zachowa się Excel, gdy poleci mu Pan "zapisz jako csv". U mnie informuje o utracie formuł. Może mam źle ustanowione jakieś właściwości exelowskie..
Jan

MaciejF

unread,
Nov 29, 2016, 1:05:01 PM11/29/16
to
W dniu wtorek, 29 listopada 2016 18:30:01 UTC+1 użytkownik Jan Koc napisał:
> A jak Pan wykona taką operację (txt na csv), to proszę sprawdzić jak u Pana zachowa się Excel, gdy poleci mu Pan "zapisz jako csv". U mnie informuje o utracie formuł. Może mam źle ustanowione jakieś właściwości exelowskie..
> Jan

Może konwersja musi być jawna a nie tylko przez zmianę rozszerzenia.

Wygrzebałem gdzieś jeszcze to:
1. Zapisz w Module swojego Accessa taką funkcję:

Sub txt2csv()
Dim fnam As String
Dim spath As String
Dim ftxt As String
Dim wb As Workbook
Dim cel As Range
Dim txts As String
spath = "X:\"
fnam = Dir(spath & "*.txt")
Do While fnam <> ""
Open spath & fnam For Input As #1
ftxt = Input(LOF(1), 1)
Close 1
ftxt = Replace(ftxt, "|", ",")
Open spath & Replace(UCase(fnam), ".TXT", ".csv") For Output As #1
Print #1, ftxt
Close 1
Set wb = Workbooks.Open(spath & Replace(UCase(fnam), ".TXT", ".csv"))
For Each cel In wb.Sheets(1).Range("A2:A" & wb.Sheets(1).Range("A2").End(xlDown).Row)
txts = Right("0" & cel, 8)
cel = CVDate(Left(txts, 2) & "/" & Mid(txts, 3, 2) & "/" & Right(txts, 4))
Next cel
wb.Close True
fnam = Dir
Loop
End Sub

xxxxxxxxx

2. zmodyfikowany kod pod przyciskiem:
Dim db As DAO.Database, qd As DAO.QueryDef
Dim fd As FileDialog
Dim exportSQL As String
Dim i As Integer

Set fd = Application.FileDialog(msoFileDialogSaveAs)

Set db = CurrentDb
exportSQL = "SELECT FIRMA.Nazwa AS S_Name, FIRMA.Ulica AS S_Address, FIRMA.Kod AS S_Zip, FIRMA.Miasto AS S_City, FIRMA.telefon AS S_Phone, FIRMA.e_mail AS S_Email, 'Grzegorz Kociumbas' AS S_Contact_Person, [Export DPD2].P_Cat_KP, [Export DPD2].P_Cat_5, [Export DPD2].P_Cat_10, [Export DPD2].P_Cat_20, [Export DPD2].P_Cat_30, [Export DPD2].P_Cat_50, [Export DPD2].R_Name, [Export DPD2].R_Address, [Export DPD2].R_Zip, [Export DPD2].R_City, [Export DPD2].R_Phone, [Export DPD2].R_Email, [Export DPD2].R_Contact_Person, [Export DPD2].P_Courier_Name, [Export DPD2].P_Comment, [Export DPD2].P_Content, [Export DPD2].A_Terminal, [Export DPD2].P_Cod, [Export DPD2].Time FROM FIRMA, [Export DPD2] WHERE ((([Export DPD2].Wydrukowane)=2));"
'Check to see if querydef exists
For i = 0 To (db.QueryDefs.Count - 1)
If db.QueryDefs(i).Name = "tmpExport" Then
db.QueryDefs.Delete ("tmpExport")
Exit For
End If
Next i

Set qd = db.CreateQueryDef("tmpExport", exportSQL)

'Set intial filename
fd.InitialFileName = "X:\export_" & Format(Date, "yyyymmdd") & ".txt"

If fd.show = True Then
If Format(fd.SelectedItems(1)) <> vbNullString Then
DoCmd.TransferText acExportDelim, "Export Specyfikacja eksportu", "tmpExport", fd.SelectedItems(1), True, , 852
End If
End If

'Cleanup
db.QueryDefs.Delete "tmpExport"
db.Close
Set db = Nothing
Set qd = Nothing
Set fd = Nothing

' jawnie konwertowane txt na csv
Call txt2csv

End Sub


Proszę spróbować jeszcze to.
MF

Jan Koc

unread,
Nov 29, 2016, 3:41:50 PM11/29/16
to
Ok ale jutro. Teraz naprawiam piec, konkretnie komin.

Jutro dam znać co wyszło.

A tak przy okazji, na jakiej grupie exelowej można znaleść podobne przyjazne podejście jak tu gdzie jesteśmy?
Jan

Jan Koc

unread,
Nov 30, 2016, 12:28:24 AM11/30/16
to
wyrzuca mi błąd w funkcji przy deklaracji

Dim wb As Workbook

czy brakuje jakiś referencji (we wcześniejszych postachh wypisałem je) ?

Jan

MaciejF

unread,
Nov 30, 2016, 1:54:35 AM11/30/16
to
Referencja:
Microsoft Excel Object Library

przydatny link:
http://stackoverflow.com/questions/5729195/how-to-refer-to-excel-objects-in-access-vba

MaciejF

unread,
Nov 30, 2016, 2:01:52 AM11/30/16
to
Procedurka poprawiona

Sub txt2csv()
Dim fnam As String
Dim spath As String
Dim ftxt As String
Dim objExcelApp As Object
Dim wb As Object
Dim cel As Range
Dim txts As String
spath = "X:\"
fnam = Dir(spath & "*.txt")
Set objExcelApp = CreateObject("Excel.Application")
Do While fnam <> ""
Open spath & fnam For Input As #1
ftxt = Input(LOF(1), 1)
Close 1
ftxt = Replace(ftxt, "|", ",")
Open spath & Replace(UCase(fnam), ".TXT", ".csv") For Output As #1
Print #1, ftxt
Close 1
Set wb = objExcelApp.Workbooks.Open(spath & Replace(UCase(fnam), ".TXT", ".csv"))

MaciejF

unread,
Nov 30, 2016, 2:11:07 AM11/30/16
to
modyfikacja (sprawdziłem funkcję u siebie

Sub txt2csv()
Dim fnam As String
Dim spath As String
Dim ftxt As String
Dim objExcelApp As Object
Dim wb As Object

MaciejF

unread,
Nov 30, 2016, 2:59:12 AM11/30/16
to
Prosze sprawdź jeszcze swoją kwerendę SQL:

Po FROM nie ma złączeń i wygląda to na iloczyn kartezjański 2-ch tabel
wprawdzie masz potem filtr w klauzuli WHERE
niemniej sprawdź jeszcze raz poprawność napisanego SQLa.

Pozdrawiam
MF

MaciejF

unread,
Nov 30, 2016, 8:55:35 AM11/30/16
to
Uproszczenie procedurki w module:

Sub txt2csv()
Dim fnam As String
Dim spath As String
Dim ftxt As String
Dim objExcelApp As Object
Dim wb As Object
spath = "X:\"
fnam = Dir(spath & "*.txt")
Set objExcelApp = CreateObject("Excel.Application")

Do While fnam <> ""
Open spath & fnam For Input As #1
ftxt = Input(LOF(1), 1)
Close 1
ftxt = Replace(ftxt, "|", ";")
Open spath & Replace(UCase(fnam), ".TXT", ".csv") For Output As #1
Print #1, ftxt
Close 1
Set wb = objExcelApp.Workbooks.Open(spath & fnam)
wb.Close True
fnam = Dir
Loop
End Sub

/
MF

Jan Koc

unread,
Nov 30, 2016, 1:01:03 PM11/30/16
to
Niestety.

Procedura działa poprawnie, tworzy plik tekstowy i zamienia go na Excela csv, ale niestety z dopiero po otwarciu, zapisaniu jako csv i ..........

Widać Excel ma wbudowaną strukturę przy tworzeniu pliku csv pozwalającą na używanie formuł i dopiero jasno zdeklarowane polecenie aby się tego "bagażu" pozbyć pozostawia plik "czystym"

Jan

chyba trzeba by uderzyć do jakiejś grupy excelowej ?

Prot

unread,
Nov 30, 2016, 3:13:03 PM11/30/16
to

Użytkownik "Jan Koc" <jan.ko...@gmail.com> napisał w wiadomości
news:3752680b-e403-4a90...@googlegroups.com...
A czy nie prościej byłoby eksportować kwerendę do pliku xls, a potem dopiero
eksportować (czy zachować jako) csv ?

Przypominam sobie moje wojowanie z importem z plików tekstowych (dokładnie
to nie był csv lecz podobny format sta - stosowany przy wyciągach
bankowych) - też stosowałem różne kombinacje pośrednie i metodą prób i
błędów zastosowałem procedurę następującą: tworzyłem plik roboczy "dest"
oraz w tle plik źródłowy "temp" utworzony z "zaimportowanego" pliku
tekstowego sta. Jeśli do tego importu zastosowałem opcję Origin:=852 - plik
temp miał już "ogonkowy" - polski format i po kilku procedurach wykonanych
na stringach wyniki zapisywałem do pliku dest.
Dopiero z tak uformowanego pliku dest mogłem importować dane do accessa.

Kod VBA wyglądał w tym fragmencie tak:

Dim dWb As Workbook: Set dWb = ThisWorkbook
Dim sWb As Workbook
Dim dWks As Worksheet: Set dWks = dWb.Sheets("dest")
Dim sWks As Worksheet

dWks.Activate
Range("intro").Select
dWks.Range("intro").ClearContents


Workbooks.OpenText Filename:=strPathFile, Origin:=852, StartRow:=1 _
, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=True, Comma:=False _
, Space:=False, Other:=False, FieldInfo:=Array(Array(0, 1)), _
TrailingMinusNumbers:=True


ActiveSheet.Name = "temp"
Set sWb = ActiveWorkbook
Set sWks = sWb.Sheets("temp")
ActiveSheet.UsedRange.Select

Zbigniew Bratko

unread,
Nov 30, 2016, 3:22:03 PM11/30/16
to
W dniu 2016-11-21 o 12:31, Jan Koc pisze:
> Witam
> Od pewnego czasu boksuję się z wyeksportowaniem kwerendy "ExportDoDPD" do pliku csv (skoroszyt excela z polami rozdzielonymi średnikami)
> próbowałem bezpośrednio
>
> Specyfikacja exportu "Export11" do pliku tekstowego .csv
>
> DoCmd.TransferText acExportDelim, "Export11", "ExportDoDPD", "X:\Export_DPD.csv", True
>

Już prawie 3-ci tydzień mija na Waszej nieustającej walce z eksportem
kwerendy ExportDoDPD do pliku *.csv w oparciu o Specyfikacje eksportu o
nazwie "Export11".

Nie wiem, czy dobrze rozumiem Twój problem?
Masz w bazie danych MS Access jakowąś tabelę(e), na której(ych) opierasz
kwerendę ExportDoDPD. Dane do tabel(i) pobrałeś (zaimportowałeś) z pliku
Excela.

Korzystając z metody DoCmd.TransferSpreadsheet zapisujesz dane w pliku
X:\Export_DPD.csv w oparciu o specyfikację "Export11"

I dalej nie bardzo wiem o co chodzi. Jakieś formatowanie, utrata formuł,
jakiś plik .txt, jakieś Replace. Zamiany pliku *.txt (lub *.xls) na *.csv.

Moim skromnym zdaniem "CÓŚ" takiego powinno zadziałać prawidłowo:

DoCmd.TransferText acExportDelim, "Export11", "ExportDoDPD",
"X:\Export_DPD.csv", True

Może specyfikacja "Export11" jest do d... (no taka nie za zbytnio ;-))

Proponuję, byś utworzył nowa bazę, a w niej prostą tabelę o kilku polach:
np. Nazwisko, data urodzenia, miasto, wiek
zapisać w niej ze trzy rekordy i spróbować wyeksportować tabelę do pliku
*.csv, zapisując wcześniej specyfikację eksportu.
Potem otworzyć zapisany plik w Notatniku i popatrzeć co się zapisało i
czy taki plik czyta Excel.

Następny etap, to korzystając z metody DoCmd.TransferSpreadsheet zapisz
dane w pliku w oparciu o zapisana, "NOWĄ" specyfikację.

I znowu popatrz co się zapisało.

> albo najpierw wysyłam plik excelowski a potem go zamieniam na csv
>
> Dim WrksheetName As String
> Dim xl As Object
> Set xl = CreateObject("Excel.Application")
>
> xl.Workbooks.Open "X:\Export_DPD.xls"
> DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel97, "ExportDoDPD", "X:\Export_DPD.xls", True
>
> 'Set xl = Nothing
>
> ' Dim AJ As String
> ' Dim AB As String
> ' AJ = "X:\Export_DPD.xls"
> ' AB = "X:\Export_DPD.csv"
> ' fSaveAsXlsx AJ, AB
>
Nie za bardzo rozumiem, o co chodziło Ci w zaremowanych linijkach.
Eksportujesz kwerendę "ExportDoDPD" do pliku "X:\Export_DPD.xls", a
potem zmieniasz rozszerzenie na *.csv i ????


> i za każdym razem dostaję plik który jest nieczytany przez aplikację zawnętrzną.
> Dopiero jak otworzę plik i polecę zapis, EXCEL poda komunikat, że zostaną utracone formuły a ja się na to zgodzę, to plik jest akceptowany.

Nie udało mi się wygenerować takiego komunikatu:
...że zostaną utracone formuły

Może więcej szczegółów.

--
Pozdrowienia
BraZby
www.faq.accdb.pl
www.accdb.pl

Zbigniew Bratko

unread,
Nov 30, 2016, 4:11:45 PM11/30/16
to
W dniu 2016-11-30 o 21:21, Zbigniew Bratko pisze:
> W dniu 2016-11-21 o 12:31, Jan Koc pisze:
>> Witam
>> Od pewnego czasu boksuję się z wyeksportowaniem kwerendy "ExportDoDPD"
>> do pliku csv (skoroszyt excela z polami rozdzielonymi średnikami)
>> próbowałem bezpośrednio
>>
>> Specyfikacja exportu "Export11" do pliku tekstowego .csv
>>
>> DoCmd.TransferText acExportDelim, "Export11", "ExportDoDPD",
>> "X:\Export_DPD.csv", True
>>

Uczyniłem, jak proponowałem:

> Proponuję, byś utworzył nowa bazę, a w niej prostą tabelę o kilku polach:
> np. Nazwisko, data urodzenia, miasto, wiek
> zapisać w niej ze trzy rekordy i spróbować wyeksportować tabelę do pliku
> *.csv, zapisując wcześniej specyfikację eksportu.
> Potem otworzyć zapisany plik w Notatniku i popatrzeć co się zapisało i
> czy taki plik czyta Excel.

Mój plik *.csv Excel czyta

> Następny etap, to korzystając z metody DoCmd.TransferSpreadsheet zapisz
> dane w pliku w oparciu o zapisana, "NOWĄ" specyfikację.
>
> I znowu popatrz co się zapisało.

Zapisało mi się takie "CÓŚ":

"ID";"Nazwisko";"Miasto";"DataUr";"Wiek"
1;"Kowalski";"Kraków";2010-11-30 00:00:00;6
2;"Nowak";"Lublin";2011-11-2 00:00:00;5
3;"Malinowski";"Warszawa";2000-11-2 00:00:00;16


Mój kod:

Private Sub Polecenie0_Click()
Dim strFullPath As String
Const conFileNameCSV As String = "TestCsv.csv"
Const conTblName As String = "tblTestCsv"
Const conSpecyficationName As String = "MojaSpecyfikacja"

strFullPath = CurrentProject.Path & "\" & conFileNameCSV
DoCmd.TransferText acExportDelim, conSpecyficationName, conTblName,
strFullPath, True

End Sub

Plik *.csv zapisany zostanie w katalogu bazy.

MaciejF

unread,
Dec 1, 2016, 3:05:11 AM12/1/16
to
Jeżeli dobrze zrozumiałem Jana to chciałby zrzucić wynik kwerendy do pliku csv.
Może najpierw utwórz tabelę tymczasową tmpTmpExpDPD.
I z niej zrzucaj do pliku csv tak jak napisał Zbigniew Bratko.
Popracuj nad prawidłową specyfikacją eksportu.
Dla uproszczenia tylko 3 pola.


strDel = "DELETE * FROM tblTmpExpDPD"

strINS = "INSERT INTO tblTmpExpDPD (S_Name, S_Address, S_Zip) SELECT FIRMA.Nazwa AS S_Name, FIRMA.Ulica AS S_Address, FIRMA.Kod AS S_Zip FROM FIRMA, [Export DPD2] WHERE ((([Export DPD2].Wydrukowane)=2));"

DoCmd.Execute strDel
DoCmd.Execute strINS


Dim strFullPath As String
Const conFileNameCSV As String = "TestCsv.csv"
Const conTblName As String = "tblTmpExpDPD"
Const conSpecyficationName As String = "MojaSpecyfikacja"

strFullPath = CurrentProject.Path & "\" & conFileNameCSV
DoCmd.TransferText acExportDelim, conSpecyficationName, conTblName,
strFullPath, True

MF

MaciejF

unread,
Dec 1, 2016, 3:14:17 AM12/1/16
to
poprawnie będzie tak:

Dim db As Database
Dim strDel As String
Dim strINS As String

Set db = CurrentDb


strDel = "DELETE * FROM tblTmpExpDPD"

strINS = "INSERT INTO tblTmpExpDPD (S_Name, S_Address, S_Zip) SELECT FIRMA.Nazwa AS S_Name, FIRMA.Ulica AS S_Address, FIRMA.Kod AS S_Zip FROM FIRMA, [Export DPD2] WHERE ((([Export DPD2].Wydrukowane)=2));"

Db.Execute strDel
Db.Execute strINS


Dim strFullPath As String
Const conFileNameCSV As String = "TestCsv.csv"
Const conTblName As String = "tblTmpExpDPD"
Const conSpecyficationName As String = "MojaSpecyfikacja"

strFullPath = CurrentProject.Path & "\" & conFileNameCSV
DoCmd.TransferText acExportDelim, conSpecyficationName, conTblName,
strFullPath, True

Poprzednio były błędy.

MF

Zbigniew Bratko

unread,
Dec 1, 2016, 4:50:28 AM12/1/16
to
W dniu 2016-11-30 o 22:11, Zbigniew Bratko pisze:
> W dniu 2016-11-30 o 21:21, Zbigniew Bratko pisze:
>> W dniu 2016-11-21 o 12:31, Jan Koc pisze:
>>> Witam
>>> Od pewnego czasu boksuję się z wyeksportowaniem kwerendy "ExportDoDPD"
>>> do pliku csv (skoroszyt excela z polami rozdzielonymi średnikami)
>>> próbowałem bezpośrednio
>>>
>>> Specyfikacja exportu "Export11" do pliku tekstowego .csv
>>>
>>> DoCmd.TransferText acExportDelim, "Export11", "ExportDoDPD",
>>> "X:\Export_DPD.csv", True
>>>

Być może najłatwiej będzie zaimportować Arkusz roboczy do tabeli,
utworzyć kwerendę pobierającą potrzebne dane i tą kwerendę wyeksportować
do pliku *.csv.

Call ImportFromExcel("tblTestCsvBis", CurrentProject.Path & "\" & _
"TestCsv.xlsx", "DaneTestCsv")

'___________________________________________________
Private Sub ImportFromExcel(strTableName As String, _
strFilePath As String, _
strWorksheet As String)

CurrentDb.Execute "DELETE * FROM " & strTableName
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel97, _
strTableName, strFilePath, True, strWorksheet & "$"

End Sub

i w poniższej procedurze zmienić wartość stałej Const conTblName As
String na "qryJakiasNazwa"


Najpierw zrób próbny eksport i zapisz specyfikację eksportu by z niej
skorzystać w procedurze.
Wszystko będzie miało sens jeżeli czynności są powtarzalne, tzn. dotyczą
takiego samego zestawu danych

Jan Koc

unread,
Dec 1, 2016, 5:32:48 AM12/1/16
to
Jeszcze raz. Problemem nie jest export z Accesa ale plik który powstaje po stronie Excela. Wszystkie dotychczasowe próby (te trzy tygodnie boksowania się z problemem) w wyniku tworzą poprawny plik Excel.csv . Problemem jest jego struktura, która zawiera możliwość tworzenia wewnątrz formuł. i dopiero otwarcie pliku i polecenie zapisania go jako csv likwiduje tę możliwość. Dopiero taki "czysty" plik jest czytany przez aplikację klienta (firma kurierska). Spróbujcie otworzyć nawet pusty plik xls zapisać go jako csv a (ja tak mam) otrzymacie komunikat że w wyniku tego procesu zostaną utacone formuły.
I problem jest w tym, że tak samo jest z plikiem wyeksportowanym z Accesa. Mimo że to plik z rozszerzeniem csv, to dopiero procedura "zapisz jako ....csv" zapisuje plik jako csv bez "bagażu" potencjalnych formuł.

Również pliki już "czyste" csv poddane procedurze "zapisz jako ...csv" w trakcie tego procesu informują o utracie formuł.
A ja chciałem to zautomatyzować i nie mieć tej konieczności otwierania przygotowanego przez Accesa pliku.
Jan

Zbigniew Bratko

unread,
Dec 1, 2016, 12:10:22 PM12/1/16
to
W dniu 2016-12-01 o 11:32, Jan Koc pisze:
> [...] Wszystkie dotychczasowe próby (te trzy tygodnie boksowania się z problemem) w wyniku tworzą poprawny plik Excel.csv . Problemem jest jego struktura, która zawiera możliwość tworzenia wewnątrz formuł. i dopiero otwarcie pliku i polecenie zapisania go jako csv likwiduje tę możliwość. Dopiero taki "czysty" plik jest czytany przez aplikację klienta (firma kurierska). Spróbujcie otworzyć nawet pusty plik xls zapisać go jako csv a (ja tak mam) otrzymacie komunikat że w wyniku tego procesu zostaną utacone formuły.

Próba zapisu pustego, nowego skoroszytu skutkuje u mnie utworzeniem
pustego pliku tekstowego z rozszerzenie *.csv, bez jakichkolwiek
komunikatów. Również arkusz z danymi jest prawidłowo zapisany i
prawidłowo otwierany przez Excela.

> I problem jest w tym, że tak samo jest z plikiem wyeksportowanym z Accesa. Mimo że to plik z rozszerzeniem csv, to dopiero procedura "zapisz jako ....csv" zapisuje plik jako csv bez "bagażu" potencjalnych formuł.

Plik *.csv zapisany przez MS Access

"KluczID";"Nazwisko";"Miasto";"DataUr";"Wiek"
1;"Kowalski";"Kraków";2010-11-30 00:00:00;6
2;"Nowak";"Lublin";2011-11-2 00:00:00;5
3;"Malinowski";"Warszawa";2000-11-2 00:00:00;16

Plik *.csv zapisany przez MS Excel

KluczID;Nazwisko;Miasto;DataUr;Wiek
1;Kowalski;Kraków;2010-11-30 00:00;6
2;Nowak;Lublin;2011-11-02 00:00;5
3;Malinowski;Warszawa;2000-11-02 00:00;16


>
> Również pliki już "czyste" csv poddane procedurze "zapisz jako ...csv" w trakcie tego procesu informują o utracie formuł.
> A ja chciałem to zautomatyzować i nie mieć tej konieczności otwierania przygotowanego przez Accesa pliku.


Niestety, Excel to nie moja działka, więc nie mogę Ci pomóc.

Spróbuj zadać pytanie na: http://www.coderscity.pl/forum46.html


CIEKAWOSTKA.

Spróbujcie zapisać jako plik *.csv arkusz w którym pierwsza komórka
nazwana jest ID, lub zaczyna się od liter ID.

Otrzymacie przykładowy plik *csv.
ID;Nazwisko
1;Kowalski
2;Nowak

i spróbujcie go otworzyć za pomocą Excela

Pojawi się komunikat:

Plik, który próbujesz otworzyć (nazwa pliku), ma inny format niż
określony przez rozszerzenie pliku.
Plik może być uszkodzony lub pochodzić z niezaufanego źródła ...bla bla bla

A potem jeszcze kilka okienek z komunikatami.
m.in. że jest to plik SYLK i nie może go załadować .... albo w pliku są
błędy albo nie jest to plik SYLK ....

Po prostu, pierwsza komórka nie może zaczynać się od ID
Troszkę inaczej reaguje Excel, gdy pierwsza komórka nazwana jest np.
IDentyfikator.

Jan Koc

unread,
Dec 1, 2016, 2:28:15 PM12/1/16
to
Nie wiem czy to będzie ciekawostka ale zapraszam Pana Bratko oraz towarzyszącego mi w zmaganiach Pana MaciejaF do próby znalezienia (pewnie mojego) błędu
Poniżej jest kod tworzący niezbędną tabelę i wpisujący jakieś tam dane.
Proszę po uruchomieniu z przycisku dodać specyfikację exportu do dowolnego z nazwy pliku csv, z zastrzeżeniem, że separatorami ma być średnik i należy transportować nagłówki kolumn. Po dokonaniu exportu proszę wejdźcie na stronę
https://www.sendit.pl/logowanie

utworzyłem tam konto

login:jan...@onet.eu
hasło"123456

zalogujcie się, a potem :
-NADAJ PACZKĘ
-IMPORTUJ DANE Z CSV
-WYBIERZ
tu wybieramy nasz utworzony plik CSV
-WYŚLIJ

Jeśli plik i dane są poprawne to otrzymujemy skrótową informację o adresie odbiorcy
w przeciwnym razie na czerwono wyświetla się komunikat o błędach.
Jeśli nie macie błędów to ja coś mieszam, bo ja tu mam błąd.

Bez zamykania aplikacji SENDIT otwórzcie Wasz plik csv i zróbcie to o czym pisałem : "zapisz jako ... csv" . Po zamknięciu powróćcie do aplikacji i jeszcze raz wybierzcie teraz już zmieniony plik csv, a potem WYŚLIJ.

Jeśli uzyskacie poprawny wynik to należałoby na tym zakończyć i nie robić następnych kroków, aby w firmie SENDIT nie zrobić zbędnych bałaganów, gdyż konto jet fikcyjne.

I o to chodzi.

Jan
----------------------
'
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim fldAddr1 As DAO.Field, fldAddr2 As DAO.Field, fldAddr3 As DAO.Field
Dim fldAddr4 As DAO.Field, fldAddr5 As DAO.Field, fldAddr6 As DAO.Field
Dim fldAddr7 As DAO.Field, fldAddr8 As DAO.Field, fldAddr9 As DAO.Field
Dim fldAddr10 As DAO.Field, fldAddr11 As DAO.Field, fldAddr12 As DAO.Field
Dim fldAddr13 As DAO.Field, fldAddr14 As DAO.Field, fldAddr15 As DAO.Field
Dim fldAddr16 As DAO.Field, fldAddr17 As DAO.Field, fldAddr18 As DAO.Field
Dim fldAddr19 As DAO.Field, fldAddr20 As DAO.Field, fldAddr21 As DAO.Field
Dim fldAddr22 As DAO.Field, fldAddr23 As DAO.Field, fldAddr24 As DAO.Field
Dim fldAddr25 As DAO.Field, fldAddr26 As DAO.Field
Set db = CurrentDb
On Error Resume Next

Set tdf = db.CreateTableDef("Export_DPD")

Set fldAddr1 = tdf.CreateField("S_Name", dbText)
Set fldAddr2 = tdf.CreateField("S_Address", dbText)
Set fldAddr3 = tdf.CreateField("S_Zip", dbText)
Set fldAddr4 = tdf.CreateField("S_City", dbText)
Set fldAddr5 = tdf.CreateField("S_Phone", dbText)
Set fldAddr6 = tdf.CreateField("S_Email", dbText)
Set fldAddr7 = tdf.CreateField("S_Contact_Person", dbText)
Set fldAddr8 = tdf.CreateField("P_Cat_KP", dbLong)
Set fldAddr9 = tdf.CreateField("P_Cat_5", dbLong)
Set fldAddr10 = tdf.CreateField("P_Cat_10", dbLong)
Set fldAddr11 = tdf.CreateField("P_Cat_20", dbLong)
Set fldAddr12 = tdf.CreateField("P_Cat_30", dbLong)
Set fldAddr13 = tdf.CreateField("P_Cat_50", dbLong)
Set fldAddr14 = tdf.CreateField("R_Name", dbText)
Set fldAddr15 = tdf.CreateField("R_Address", dbText)
Set fldAddr16 = tdf.CreateField("R_Zip", dbText)
Set fldAddr17 = tdf.CreateField("R_City", dbText)
Set fldAddr18 = tdf.CreateField("R_Phone", dbText)
Set fldAddr19 = tdf.CreateField("R_Email", dbText)
Set fldAddr20 = tdf.CreateField("R_Contact_Person", dbText)
Set fldAddr21 = tdf.CreateField("P_Courier_Name", dbText)
Set fldAddr22 = tdf.CreateField("P_Comment", dbText)
Set fldAddr23 = tdf.CreateField("P_Content", dbText)
Set fldAddr24 = tdf.CreateField("A_Terminal", dbText)
Set fldAddr25 = tdf.CreateField("P_Cod", dbLong)
Set fldAddr26 = tdf.CreateField("Time", dbText)


tdf.Fields.Append fldAddr1
tdf.Fields.Append fldAddr2
tdf.Fields.Append fldAddr3
tdf.Fields.Append fldAddr4
tdf.Fields.Append fldAddr5
tdf.Fields.Append fldAddr6
tdf.Fields.Append fldAddr7
tdf.Fields.Append fldAddr8
tdf.Fields.Append fldAddr9
tdf.Fields.Append fldAddr10
tdf.Fields.Append fldAddr11
tdf.Fields.Append fldAddr12
tdf.Fields.Append fldAddr13
tdf.Fields.Append fldAddr14
tdf.Fields.Append fldAddr15
tdf.Fields.Append fldAddr16
tdf.Fields.Append fldAddr17
tdf.Fields.Append fldAddr18
tdf.Fields.Append fldAddr19
tdf.Fields.Append fldAddr20
tdf.Fields.Append fldAddr21
tdf.Fields.Append fldAddr22
tdf.Fields.Append fldAddr23
tdf.Fields.Append fldAddr24
tdf.Fields.Append fldAddr25
tdf.Fields.Append fldAddr26



db.TableDefs.Append tdf

db.TableDefs.Refresh
Application.RefreshDatabaseWindow


Set fldAddr1 = Nothing
Set fldAddr2 = Nothing
Set fldAddr3 = Nothing
Set fldAddr4 = Nothing
Set fldAddr5 = Nothing
Set fldAddr6 = Nothing
Set fldAddr7 = Nothing
Set fldAddr8 = Nothing
Set fldAddr9 = Nothing
Set fldAddr10 = Nothing
Set fldAddr11 = Nothing
Set fldAddr12 = Nothing
Set fldAddr13 = Nothing
Set fldAddr14 = Nothing
Set fldAddr15 = Nothing
Set fldAddr16 = Nothing
Set fldAddr17 = Nothing
Set fldAddr18 = Nothing
Set fldAddr19 = Nothing
Set fldAddr20 = Nothing
Set fldAddr21 = Nothing
Set fldAddr22 = Nothing
Set fldAddr23 = Nothing
Set fldAddr24 = Nothing
Set fldAddr25 = Nothing
Set fldAddr26 = Nothing

Set tdf = Nothing
Set db = Nothing
'wpis danych
Dim strSQL As String
strSQL = "INSERT INTO Export_DPD ( R_Name, R_Address, S_Email, R_Zip, R_City, R_Phone, R_Email, R_Contact_Person, P_Cat_KP, P_Courier_Name, S_Name, S_Address, S_Zip, S_City, S_Phone, S_Contact_Person, [Time] ) SELECT 'Jan Mróz' AS Wyr1, 'Sztokcholmska' AS Wyr2, 'a...@wp.pl' AS Wyr17, '71-234' AS Wyr3, 'Kasina Wielko' AS Wyr4, '123456789' AS Wyr5, 'Cos...@wp.pl' AS Wyr6, 'Jan Mróz' AS Wyr7, 1 AS Wyr8, 'DPD' AS Wyr9, 'Jakaś firma' AS Wyr15, 'Okrągła' AS Wyr14, '02-223' AS Wyr13, 'Warsaawa' AS Wyr12, '123456789' AS Wyr11, 'AAA' AS Wyr10, 'normal' AS Wyr16;"

DoCmd.RunSQL strSQL


Zbigniew Bratko

unread,
Dec 1, 2016, 3:04:47 PM12/1/16
to
W dniu 2016-12-01 o 20:28, Jan Koc pisze:
> Nie wiem czy to będzie ciekawostka ale zapraszam Pana Bratko oraz towarzyszącego mi w zmaganiach Pana MaciejaF do próby znalezienia (pewnie mojego) błędu
> Poniżej jest kod tworzący niezbędną tabelę i wpisujący jakieś tam dane.
> Proszę po uruchomieniu z przycisku dodać specyfikację exportu do dowolnego z nazwy pliku csv, z zastrzeżeniem, że separatorami ma być średnik i należy transportować nagłówki kolumn. Po dokonaniu exportu proszę wejdźcie na stronę

Z poziomu Access Wyeksportowałem dane do pliku *.csv.

> https://www.sendit.pl/logowanie

[...]


> Jeśli plik i dane są poprawne to otrzymujemy skrótową informację o adresie odbiorcy
> w przeciwnym razie na czerwono wyświetla się komunikat o błędach.
> Jeśli nie macie błędów to ja coś mieszam, bo ja tu mam błąd.

Za pierwszym razem miałem błąd, ponieważ separatorem tekstu w Accessie
był domyślnie "" (cudzysłów) i aplikacja zgłosiła błąd o polu "S_Name".

Ponownie wyeksportowałem, ale bez separatorów tekstu i wszystko poszło OK.

>
> Bez zamykania aplikacji SENDIT otwórzcie Wasz plik csv i zróbcie to o czym pisałem : "zapisz jako ... csv" . Po zamknięciu powróćcie do aplikacji i jeszcze raz wybierzcie teraz już zmieniony plik csv, a potem WYŚLIJ.

Otworzyłem Excelem zapisany plik *.csv i zapisałem go jako inny plik
*.csv. Żadnych komunikatów o błędach.
Anulowałem poprzedni wpis w SENDIT, zaimportowałem nowy plik po
konwersji przez Excela i też jest OK.

Odczytane przez SENDIT dane poniżej:

Nr Odbiorca Adres Pobranie Dodatkowe
ubezpieczenie Nr dok.
sprzedaży Cena
Nr 1 Jan Mróz Sztokcholmska, 71-234 Kasina Wielko - - - 14.49 zł

>
> Jeśli uzyskacie poprawny wynik to należałoby na tym zakończyć i nie robić następnych kroków, aby w firmie SENDIT nie zrobić zbędnych bałaganów, gdyż konto jet fikcyjne.


[...]

Windows 7 64bit, Excel 2016 64 bit, Access 2007 32-bit

Jan Koc

unread,
Dec 1, 2016, 4:06:08 PM12/1/16
to
W dniu czwartek, 1 grudnia 2016 21:04:47 UTC+1 użytkownik Zbigniew Bratko napisał:
> W dniu 2016-12-01 o 20:28, Jan Koc pisze:

> Z poziomu Access Wyeksportowałem dane do pliku *.csv.
>
>
> Za pierwszym razem miałem błąd, ponieważ separatorem tekstu w Accessie
> był domyślnie "" (cudzysłów) i aplikacja zgłosiła błąd o polu "S_Name".

błąd "S_Name" (nazwa pierwszej kolumny) pojawia się gdy plik nie jest czytany przez aplikację (moje doświadczenia)
>
> Ponownie wyeksportowałem, ale bez separatorów tekstu i wszystko poszło OK.
>

> Otworzyłem Excelem zapisany plik *.csv i zapisałem go jako inny plik
> *.csv. Żadnych komunikatów o błędach.
a nie miał Pan tu komunikatu o utracie formuł ?

i sedno sprwy
Zrobił Pan to z czym walczę od więcej niż trzech tygodni. Zapisany przez Accesa plik csv ponownie w Excela zapisał Pan jako csv. Po łacinie takie tłumaczenie tego samego przez to samo nazywano IDEM PER IDEM. Jak już mam plik csv to po co ta operacja. Bo jeśli Pan tego nie zrobi to Excel dołącza "coś" do tgo pliku i aplikacja pocztowa źle, niepoprawnie to odczytuje. Ja oczekiwałem, że jak już Acces dał mi plik csv to mogę go przetwarzać dalej bez tej zbędnej kołomyji.
Więc ponieważ przez trzy tygodnie nie udało się w żaden sposób "prawdziwego" pliku csv z Accesa otrzymać, to proponowałem czy nie można by w tle po utworzeniu przez Accesa pliku cvs otworzyć go Excelam i w tle zapisać jako csv. Czyli to co Pan zrobił ręcznie i co ja też ręcznie robię codziennie.


Serdecznie pozdrawiam i miło wspominam Pana pomoc kilka lat temu w pracy nad programem dla stolarni w której pracowałem.

Jan Kociumbas

Jan Koc

unread,
Dec 1, 2016, 4:25:41 PM12/1/16
to
I może jeszcze tak pracyzyjniej
Czy podpisałby się Pan pod następującym kodem:

DoCmd.TransferText acExportDelim, "nowyexport", "Export_DPD", "X:\Export_dpd.csv", True

Msgbox "A teraz drogi użytkowniku, aby wysłać zlecenie do firmy kurierskiej, musisz samodzielnie utworzony u Ciebie plik X:\Export_dpd.csv otworzyć Excelem i zapisać jako (nomen omen) csv. Bo mi to nie wychodzi."

Przepraszam za trochę sarkazmu, ale o to mi chodzi.
Jan

Zbigniew Bratko

unread,
Dec 1, 2016, 4:42:24 PM12/1/16
to
W dniu 2016-12-01 o 22:06, Jan Koc pisze:
> W dniu czwartek, 1 grudnia 2016 21:04:47 UTC+1 użytkownik Zbigniew Bratko napisał:
>> W dniu 2016-12-01 o 20:28, Jan Koc pisze:
>
>> Z poziomu Access Wyeksportowałem dane do pliku *.csv.
>>
>>
>> Za pierwszym razem miałem błąd, ponieważ separatorem tekstu w Accessie
>> był domyślnie "" (cudzysłów) i aplikacja zgłosiła błąd o polu "S_Name".
>
> błąd "S_Name" (nazwa pierwszej kolumny) pojawia się gdy plik nie jest czytany przez aplikację (moje doświadczenia)

I tak jest. Nie jest czytany ponieważ domyślnie (jeżeli nie usuniemy w
specyfikacji ""- cudzysłowiu jako znacznika tekstu, to otrzymamy ten
błąd. Więc ponownie z poziomu Accessa wyeksportowałem tabelę, ale w
specyfikacji eksportu wybrałem jako kwalifikator tekstu {brak} ew. można
usunąć średnik z tego pola.

I utworzony z poziomu Accessa plik *.csv był czytany przez SENDIT
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>
>> Ponownie wyeksportowałem, ale bez separatorów tekstu i wszystko poszło OK.
>>
>

>> Otworzyłem Excelem zapisany plik *.csv i zapisałem go jako inny plik
>> *.csv. Żadnych komunikatów o błędach.
> a nie miał Pan tu komunikatu o utracie formuł ?

Żadnych komunikatów.

> i sedno sprwy
> Zrobił Pan to z czym walczę od więcej niż trzech tygodni. Zapisany przez Accesa plik csv ponownie w Excela zapisał Pan jako csv.

Ale na wyraźne żądanie, by przeprowadzić test. W/g mnie pliki *.csv
Accessowy (bez kwalifikatora tekstu) i Excelowy są takie same.

Po łacinie takie tłumaczenie tego samego przez to samo nazywano IDEM PER
IDEM. Jak już mam plik csv to po co ta operacja.
Bo jeśli Pan tego nie zrobi to Excel dołącza "coś" do tgo pliku i
aplikacja pocztowa źle, niepoprawnie to odczytuje. Ja oczekiwałem, że
jak już Acces dał mi plik csv to mogę go przetwarzać dalej bez tej
zbędnej kołomyji.

Ale oba pliki były poprawnie czytane przez SENDIT. Plik *.csv Accessowy
bez kwalifikatora tekstu był czytany poprawnie, i tenże plik otwarty
przez Excela i ponownie zapisany pod inną nazwą.


> Więc ponieważ przez trzy tygodnie nie udało się w żaden sposób "prawdziwego" pliku csv z Accesa otrzymać, to proponowałem czy nie można by w tle po utworzeniu przez Accesa pliku cvs otworzyć go Excelam i w tle zapisać jako csv. Czyli to co Pan zrobił ręcznie i co ja też ręcznie robię codziennie.

Jeszcze raz powtórzę:

Plik *.csv utworzony przez MS Access, gdzie w specyfikacji został
usunięty Kwalifikator tekstu, był czytany poprawnie.
W pliku *.csv pierwsze pole zostało zapisane jako S_Name, a nie jako
"S_Name" (w cudzysłowiu) z którym to zapisem SENDIT nie dawał rady.

Po prostu Excel zapisuje plik *.csv nie stosując kwalifikatora tekstu. W
Accessie domyślnie używany jest "" cudzysłów i to właśnie musimy zmienić
(usunąć go)!


>
> Serdecznie pozdrawiam i miło wspominam Pana pomoc kilka lat temu w pracy nad programem dla stolarni w której pracowałem.

Miło mi.

Zbigniew Bratko

unread,
Dec 1, 2016, 4:50:53 PM12/1/16
to
W dniu 2016-12-01 o 22:25, Jan Koc pisze:
Absolutnie NIE. Pisałem o tym w poprzednim poście.

Tytułem testu proszę w bazie ustawić w opcjach by Access pokazał
wszystkie obiekty systemowe. Otworzyć tabelę MSysIMEXSpecs, znaleźć tam
zapisaną specyfikację "nowyexport" i w polu TextDelim usunąć pojedynczy
znak cudzysłowiu i wyeksportować tabelę.

DoCmd.TransferText acExportDelim, "nowyexport", "Export_DPD",
"X:\Export_dpd.csv", True

Msgbox "A teraz drogi użytkowniku,możesz wysłać zlecenie do firmy
kurierskiej. Wszystko jest OK"

Zbigniew Bratko

unread,
Dec 1, 2016, 4:52:55 PM12/1/16
to
W dniu 2016-12-01 o 22:42, Zbigniew Bratko pisze:
> W dniu 2016-12-01 o 22:06, Jan Koc pisze:
>> W dniu czwartek, 1 grudnia 2016 21:04:47 UTC+1 użytkownik Zbigniew
>> Bratko napisał:
>>> W dniu 2016-12-01 o 20:28, Jan Koc pisze:
>>
>>> Z poziomu Access Wyeksportowałem dane do pliku *.csv.
>>>
>>>
>>> Za pierwszym razem miałem błąd, ponieważ separatorem tekstu w Accessie
>>> był domyślnie "" (cudzysłów) i aplikacja zgłosiła błąd o polu "S_Name".
>>
>> błąd "S_Name" (nazwa pierwszej kolumny) pojawia się gdy plik nie jest
>> czytany przez aplikację (moje doświadczenia)
>
> I tak jest. Nie jest czytany ponieważ domyślnie (jeżeli nie usuniemy w
> specyfikacji ""- cudzysłowiu jako znacznika tekstu, to otrzymamy ten
> błąd. Więc ponownie z poziomu Accessa wyeksportowałem tabelę, ale w
> specyfikacji eksportu wybrałem jako kwalifikator tekstu {brak} ew. można
> usunąć średnik z tego pola.

Oczywiście że znak " (cudzysłów), a nie średnik ;

Jan Koc

unread,
Dec 1, 2016, 5:13:15 PM12/1/16
to
Panie Zbigniewie !!!

Działa.
Ponad trzy tygodnie boksowania się. Ale albo źle to tłumaczyłem, albo należało już na początku udostępnić całość tego problemu w postaci tabeli i dostępu do SENDIT-a. Kombinowałem z kwantyfikatorem teksty, ale separatora nie tknąłem.
Pięknie, że mam to za sobą.
Dziękuje Panu, a także Panu MaciejowiF za poświęcony czas. Dużo mi dał kontakt z jego postami.

Msgbox "Drogi użytkowniku. Świat nie jest taki zły. Jest pełno przyjaznych, chętnych do pomocy ludzi. Avanti"

Dziękuję GURU
0 new messages