Regel toevoegen aan export naar .txt

Status
Niet open voor verdere reacties.

Visara

Gebruiker
Lid geworden
10 mrt 2019
Berichten
217
Goededag,
Ik exporteer een queryresultaat naar een .txt file met de code hier onder. Dat lukt.
Code:
DoCmd.TransferText transferType:=acExportDelim, SpecificationName:="ExportBestelling", TableName:="[COLOR="#008000"][B]QueryNaam[/B][/COLOR]", FileName:="C:\test\File.txt", hasfieldnames:=False

De .txt-file moet er zo uit komen te zien, maar de query geeft alleen de (in dit voorbeeld) 7 middelste regels. Elke regel bevat een bestelnummer en aantal.
Mijn vraag is: hoe voeg ik de eerste en laatste regel toe aan de export, zodat de .txt-file er zo uit komt te zien?

OH3563 E01 120
OE0000000003560000010.000+
OE0000000004050000002.000+
OE0000000003169000001.000+
OE0000000003916000006.000+
OE0000000003118000003.000+
OE0000000003465000001.000+
OE0000000003060000001.000+

end
De 7 regels in het midden lukken me dus, dat zijn query resultaten.
Maar hoe voeg ik de eerste en de laatste regel toe? Dit is statische tekst, altijd hetzelfde.

Ik zou 3 update of append queries kunnen maken die een leeggemaakte tabel vullen. De eerste query plaatst de eerste regel, de tweede is de query die de 7 groene regels plaatst, en de laatste query plaatst 'end'. En dan exporteer ik die tabel naar een .txt file.
Maar ik hoop dat het makkelijker kan...

Met vriendelijke groet,
Visara
 
Laatst bewerkt:
Misschien dat je wat hebt aan aan voorbeeld van hoe ik dat doe met bestaande tekst bestanden:
Code:
Sub Aanvullen()
    [COLOR="#008000"]'Tools -> References -> Microsoft Scripting Runtime[/COLOR]
    Dim fso As New FileSystemObject
    Dim txt As TextStream
    Dim all_text As String
    Dim Bestand As String

    Bestand = "C:\test\File.txt"
    Set txt = fso.OpenTextFile(Bestand)
    all_text = "[COLOR="#FF0000"]OH3563 E01 120[/COLOR]" & vbCrLf & txt.ReadAll & "[COLOR="#FF0000"]end[/COLOR]"
    txt.Close

    Open Bestand For Output As #1
    Print #1, all_text
    Close #1
End Sub
 
Ik zie niet helemaal hoe je exportquery is opgebouwd; het ziet er uit als één veld, met de waarden dus in de 7 regels. Als alles in één veld staat, hoef je geen strapatsen uit te halen, maar kan het met één query (en een hulpquery). Die moet je dan op deze manier uitbreiden:
PHP:
SELECT Distinct "OH3563 E01 120" AS Expr1 , 1 As SortOrder FROM tbl_RndStr 
Union
[B][COLOR="#0000FF"]SELECT RndStr, 2 As SortOrder FROM tbl_RndStr 
[/COLOR][/B]Union
SELECT Distinct "End" AS Expr1, 3 As SortOrder FROM tbl_RndStr 
Order By SortOrder

De blauwe regel bevat dan jouw eigen query. Je krijgt er een extra kolom bij, die je nodig hebt om te sorteren. Dat is een beetje vervelend, want die wil je natuurlijk niet in je output hebben. Vandaar dat dit dan de hulpquery is. Je kunt nu een nieuwe query maken op basis van deze query, Waar je dan het uitvoerveld in zet, en de sorteerkolom niet. En die query kun je dan prima zonder extra functies uitvoeren.
 
Mochten het wél meerdere velden zijn, dan kun je natuurlijk ook een paar extra lege velden in de eerste en derde query van de hulptabel zetten. Het probleem bij een Union is, dat alle gebruikte tabellen hetzelfde aantal velden hebben. Vandaar dat één veld een makkie is :).
 
@edmoor Bedankt voor je reactie.
Ik kende die mogelijkheid niet, maar ik probeer het hier gelijk in de query te regelen.

@Octafish
Bedankt voor uw reactie.
Het lukt me wel én niet.
Wat lukt wel:
Een query opslaan als .txt waar alleen de GROENE REGELS uit mijn oorspronkelijke vraag in staan.
Dankzij uw hulp lukt het me nu ook om in een Union-Query ("qVerzendingOdinRegels1") de RODE REGELS toe te voegen:
Code:
SELECT Distinct "[B][COLOR="#FF0000"]OH3563       E01          120[/COLOR][/B]" AS Regels , 1 As SortOrder FROM tblBestelling2 

UNION SELECT [B][COLOR="#008000"]"OE" & Left("0000000000000",13-Len([bestelnummer])) & [bestelnummer] & Left("000000",6-Len([aantal])) & [aantal] & ".000+"[/COLOR][/B] AS Regels, 2 As SortOrder
FROM 1039_Odin INNER JOIN tblBestelling2 ON [1039_Odin].[bestelnummer] = tblBestelling2.[besteld2]
WHERE (((tblBestelling2.aantal)>0))

UNION SELECT Distinct "[COLOR="#FF0000"][B]end[/B][/COLOR]" AS Regels, 3 As SortOrder FROM tblBestelling2
ORDER BY SortOrder;
Zo ziet het resultaat er uit:
UnionQueryResultaat.jpg
Om dit als .txt op te slaan zonder de tweede kolom heb ik een tweede query gemaakt, "qVerzendingOdinRegels2" deze vist de gewenste kolom uit bovenstaande query.
Code:
SELECT qVerzendingOdinRegels1.Regels
FROM qVerzendingOdinRegels1;

Ik kan "qVerzendingOdinRegels2" niet opslaan als .txt-bestand :(
Code:
Public Sub cmdTxt_Click()
    DoCmd.TransferText transferType:=acExportDelim, SpecificationName:="ExportBestelling", TableName:="qVerzendingOdinRegels2", FileName:="C:\test\" & "Odin_" & Format(Date, "yyyymmdd") & "_" & Format(Now(), "HhNnSs") & ".txt", hasfieldnames:=False
End Sub
OpslaanError.jpg
De foutmelding zegt dat hij het object niet kan vinden. Wat een rare foutmelding, want dit is de bestandsnaam die hij nu zelf aan moet maken :s

Nog vreemder vind ik, dat als ik de TableName verander, dat het dan wél lukt. (...)TableName:="qVerzendingOdinRegels"(...) ipv "qVerzendingOdinRegels2" lukt wel.

Ziet u wat ik fout doe? Of is het niet mogelijk het resultaat van een UnionQuery op te slaan als .txt-file? En geeft Access nou eenmaal een rare foutmelding als je het toch probeert?
Moet ik het gewenste eindresultaat in een Tabel plaatsen en van daaruit exporteren?
 
Laatst bewerkt:
Je laatste vraag zouden een antwoord kunnen zijn; in dat geval maak je dus een tijdelijke tabel aan voor de export. Dat zou zeker moeten werken. Ik zal nog eens testen :).
 
Ook wanneer ik het via een Append-Query in een tabel plaats kan ik die tabel niet als .txt opslaan.

Dit kan ik als als .txt opslaan dmv
Code:
DoCmd.TransferText transferType:=acExportDelim
Code:
SELECT "OE" & Left("0000000000000",13-Len([bestelnummer])) & [bestelnummer] & Left("000000",6-Len([aantal])) & [aantal] & ".000+" AS Regel
FROM 1039_Odin INNER JOIN tblBestelling2 ON [1039_Odin].[bestelnummer] = tblBestelling2.[besteld2]
WHERE (((tblBestelling2.aantal)>0));

Wanneer ik deze SQL uitbreidt zoals hierboven uitgelegd door OctaFish kan ik het NIET als .txt opslaan:
Code:
SELECT Distinct "OH3563       E01          120" AS Regels , 1 As SortOrder FROM tblBestelling2 

UNION SELECT "OE" & Left("0000000000000",13-Len([bestelnummer])) & [bestelnummer] & Left("000000",6-Len([aantal])) & [aantal] & ".000+" AS Regels, 2 As SortOrder
FROM 1039_Odin INNER JOIN tblBestelling2 ON [1039_Odin].[bestelnummer] = tblBestelling2.[besteld2]
WHERE (((tblBestelling2.aantal)>0))

UNION SELECT Distinct "end" AS Regels, 3 As SortOrder FROM tblBestelling2
ORDER BY SortOrder;

Als ik een query maak die de benodigde regel er uitvist en in een tabel zet kan ik die tabel nog steeds NIET exporteren naar .txt:
Code:
INSERT INTO tblVoorExport ( Regels )
SELECT qVerzendingOdinRegels1.Regels
FROM qVerzendingOdinRegels1;
OpslaanError.jpg

Ik begrijp het niet...
De foutmelding is raar, want die klacht dat de file niet bestaat slaat nergens op. Het is een file die gecreëerd moet worden, ik ben geen Import-functie aan het uitvoeren.
Áls het dan zo is dat Access het ingewikkeld vindt om de resultaten van een Union Query te exporteren, hoezo kunnen die resultaten dan nog steeds niet geëxporteerd worden nadat ze via een Append-query in een tabel zijn gezet?
Dit is wel heel zorgelijk voor mij, want mijn hele project is gemaakt om deze export te genereren...
 
Laatst bewerkt:
Ik zou zeggen (want ik heb geen zin om jouw situatie na te bouwen): doe er eens een voorbeeldje bij. En maak ondertussen je query wat simpeler:
Niet:
Code:
Left("0000000000000",13-Len([bestelnummer])) & [bestelnummer]
Maar
Code:
Right("0000000000000" & [bestelnummer],13)
 
Laatst bewerkt:
Visara,

Een voorbeeld van de database zou wel meer licht kunnen werpen op het geheel, nu is het maar kijken en raden op niets af.

bv dit: een export is altijd een tabel, deze is niet terug te vinden in de screen die u heeft gemaakt.

Maak er even wat werk van en kom met een database voorbeeld met de juiste formulieren, tabellen en querie's.

Meer ogen kunnen misschien dan voor u een oplossing zien.

Gr. Cor.
 
@OctaFish: Bedankt voor het laten zien van de kortere code. Ga ik in mijn bestand gebruiken :)

@Beiden
Ik heb mijn bestand uitgekleed en van gevoelige informatie ontdaan (alle prijzen zijn veranderd)

Hier een afbeelding die duidelijkheid over de situatie zou moeten geven.
Twee knoppen in Formulier "fHoofdmenu": het probleem zit 'm in de werking van de rechter knop, het Exporteren.
Uitleg fHoofdmenu.jpg
Deze knop doet het wel/niet:
WEL BIJ: Query: qVerzendingOdinRegels
NIET BIJ: Queries: qVerzendingOdinRegels1 & qVerzendingOdinRegels2 & Tabel: tblVoorExport
Deze 4 objecten zijn allemaal probeersels van mij die hetzelfde doel hebben: gegevens uit tblBestelling2 dusdanig aanpassen dat het geschikt is voor het export-bestand.
Zie de code van de knop:
Code.jpg
Wat er nu staat doet het. Maar dit resultaat is niet goed genoeg, het resultaat moet er uitzien zoals in tblVoorExport. En dát krijg ik niet voor elkaar om te exporteren.

Ik hoop niet te onduidelijk en niet te uitgebreid te zijn geweest. Altijd een lastige balans :)
Als iemand me kan helpen zou ik dat zeer waarderen. Laat me weten als er iets niet duidelijk is.

N.B.
Heb een ImportBestand toegevoegd die je kan importeren wanneer je de linker knop uitprobeerd. Klik de linker knop en selecteer dit ImportBestand via de popup (FileDialog). Is niet van belang voor de vraag, maar misschien wil je een breder beeld hebben.
Met vriendelijke groet,
Visara
 

Bijlagen

  • VisaraUnionQueryExporterenNaarText.zip
    371,9 KB · Weergaven: 11
  • ImportBestand.txt
    141 bytes · Weergaven: 15
Laatst bewerkt:
Bij mij doet de export het op de manier zoals ik 'm beschreef: de Union query (met de twee velden) gebruik je om een nieuwe query te maken, en die nieuwe query kun je prima exporteren.
Code:
Dim sPath As String, sFileName As String
    
    Path = CurrentProject.Path & "\"
    sFileName = sPath & "Odin_" & Format(Date, "yyyymmdd") & "_" & Format(Now(), "HhNnSs") & ".txt"
    DoCmd.TransferText acExportDelim, "ExportBestelling", "qVerzendingOdinRegels2", sFileName
 
En hier het werkende voorbeeld.
 

Bijlagen

  • VisaraUnionQueryExporterenNaarText2.zip
    358 KB · Weergaven: 12
En maak ondertussen je query wat simpeler:
Code:
Dim [COLOR=#FF0000]s[/COLOR]Path As String, sFileName As String
    
    [COLOR=#FF0000]s[/COLOR]Path = CurrentProject.Path & "\"
    sFileName = sPath & "Odin_" & Format(Date, "yyyymmdd") & "_" & Format(Now(), "HhNnSs") & ".txt"
    DoCmd.TransferText acExportDelim, "ExportBestelling", "qVerzendingOdinRegels2", sFileName

Code:
sFilename =  CurrentProject.Path & "\Odin_"& Format(Now();"yyyymmdd _ hhnnss")& ".txt"
:D

Maar leuke vraag en mooie oplossing.:thumb:
 
Laatst bewerkt:
Dankjulliewel voor de moeite!

Ik krijg mijn bestand nog steeds niet werkend, maar die van OctaFish doet het.
Waarom mijn bestand niet werkt is me niet duidelijk, ondanks dat ik alles (denk ik) verander naar hoe uw bestand er uit ziet (codes en queries kopiëren). Hoewel ik het 't prettigst vind om te snappen waarom iets werkt (en waarom niet), laat ik het nu zitten.

Ik heb vanuit uw bestand mijn applicatie weer opgebouwd. Het uitgeklede voorbeeldbestand weer aangekleed, zeg maar. En deze keer.... met de werkende export!

Mijn dank is groot!
 
Ik zag nog een klein probleempje met jouw query, en de manier waarop jij het nummer genereerde (waarvoor ik de verkorte versie in bericht #8 heb gezet). Als ik mijn variant in jouw query zette, dan kreeg ik maar één record in de output, wat dus niet klopte. Dat komt omdat ik vergeten was om LEFT te vervangen door RIGHT :(. Een kleine aanpassing in de UNION gaf wél het juiste resultaat:
PHP:
SELECT Distinct "OH3563       E01          120" AS Regel , 1 As SortOrder FROM MSysResources
UNION SELECT "OE" & Right("0000000000000" & [bestelnummer],13) & Right("000000" & [aantal],6) & ".000+" AS Regel, 2 AS SortOrder
FROM 1039_Odin INNER JOIN tblBestelling2 ON [1039_Odin].[bestelnummer] = tblBestelling2.[besteld2]
WHERE (((tblBestelling2.aantal)>0))
UNION SELECT Distinct "End" AS Regel, 3 As SortOrder FROM MSysResources
ORDER BY SortOrder;
Let daar dus op als je hem zelf namaakt :).
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan