Hallo ihr Lieben,
momentaner Ist-Zustand :
Ich exportiere 3 Tabellen in ein XML-File mit Hilfe von VBA.
Public Sub Export_XML()
Dim objAdditionalData As AdditionalData
Set objAdditionalData = Application.CreateAdditionalData
objAdditionalData.Add "Versanddaten"
objAdditionalData.Add "Positionsdaten"
Application.ExportXML acExportTable, "Auftragskopfdaten", CurrentProject.Path & "\MVP_Export.xml", _
AdditionalData:=objAdditionalData
End Sub
Das konnte ich mit viel Google, bereits genutzte Themen und Handbücher herausfinden.
Jetzt allerdings stoße ich sowohl mit meinen Ideen als auch mit meinen Recherchekünsten am meine Grenzen.
Ich möchte gerne, dass diese Abfrage immer nur einen Datensatz auswählt, exportiert und dann zu dem nächsten Datensatz springt und wieder ein neues XML-File exportiert. Das ganze solange (sprich soviele XML´s ausgeben) wie Datensätze in der Tabelle vorhanden sind.
Eine Parameterabfrage lässt sich mittels Funktion (siehe FAQ 3.15 (http://www.donkarl.com/FAQ/FAQ3TAbfragen.htm#3.15)) oder ab Access-Version 2010 mittels DoCmd.SetParameter() (https://docs.microsoft.com/en-us/office/vba/api/access.docmd.setparameter) in einer Schleife filtern. In dieser Schleife fütterst Du die Parameter aus einem vorher über Deine Tabelle geöffneten Recordset. Zusätzlich musst Du Dir etwas zu den Dateinamen einfallen lassen, die ja alle anders lauten müssten, wenn die Geschichte Sinn ergeben soll.
Hallo,
danke für die schnelle Antwort!
ZitatZusätzlich musst Du Dir etwas zu den Dateinamen einfallen lassen, die ja alle anders lauten müssten, wenn die Geschichte Sinn ergeben soll.
Das ist kein Problem. Der Dateiname wird mit ner Kundennummer + Uhrzeit/Datum versehen, damit jeder Export einzigartig ist.
Allerdings bin ich extremer Neueinsteiger und habe leider wenig Ahnung von Recordsets oder Parameterabfragen. Auch nach einigen Stunden Googlen mit deinen Schlüsselwörtern kam ich nicht weiter.
Hi,
hier ist ein mögliches Schema, um die Sache zu bewältigen:
'Statt die Tabelle 'Auftragskopfdaten' direkt zu verwenden, legst
'Du eine Auswahlabfrage über die 'Auftragskopfdaten' an, in der
'das Schüsselfeld als Bedingung mit einem Parameter in Form einer
'Funktion versehen ist.
'
'siehe. http://www.donkarl.com/FAQ/FAQ3TAbfragen.htm#3.15
'
'in einem globalen VBA-Modul:
Public pAkdId As Variant
Public Function GetAuftragsKopfDatenId()
GetAuftragsKopfDatenId = pAKD_ID
End Function
'Annahme für den Schlüsselfeldnamen: akd_id <= Namen anpasesn
'als Parameter verwende ich eine globale Funktion, die sich den
'Rückgabewert aus einer globalen Variablen (pAkdId) zieht.
'
'eine Abfrage 'qryAuftragsKopfDaten' könnte dann so aussehen
'
'SELECT a.*
'FROM Auftragskopfdaten AS a
'WHERE a.akd_id = GetAuftragsKopfDatenId()
'
Public Sub Export_XML()
'nur das Schlüsselfeld in Auftragskopfdaten auswählen
Const QRY As String = "SELECT akd_id FROM Auftragskopfdaten"
Dim ExportPath As String
Dim ad As AdditionalData
ExportPath = CurrentProject.Path & "\" & Format$(Now(), "yyyymmddhhnnss_")
Set ad = CreateAdditionalData
ad.Add "Versanddaten"
ad.Add "Positionsdaten"
'ein Recordset über die Abfrage in QRY erzeugen
With DBEngine(0)(0).OpenRecordset(QRY, dbOpenSnapshot)
'bis das Ende des Recordsets erreicht ist
Do Until EOF
'die Variable befüllen
pAKD_ID = !akd_id
ExportXML acExportTable, "qryAuftragskopfdaten", _
ExportPath & !akd_id & ".xml", _
AdditionalData:=objAdditionalData
'zum nächsten Datensatz gehen
.MoveNext
Loop
'Recordset schließen
.Close
End With
End Sub
Vielen Dank soweit ! Die Abfrage habe ich zum Laufen bekommen. Kann es sein das hier :
Zitat'siehe. http://www.donkarl.com/FAQ/FAQ3TAbfragen.htm#3.15
'
'in einem globalen VBA-Modul:
Public pAkdId As Variant
Public Function GetAuftragsKopfDatenId()
GetAuftragsKopfDatenId = pAKD_ID
End Function
Public
pAkdId eigentlich
pAkD_ID sein soll?
Des Weiteren bekomme ich bei der Durchführung von Code Nr. 2 (Public Sub Export_XML() )folgendes angezeigt :
"Fehler beim Kompilieren:
Argument ist nicht optional"
Der Fehler taucht direkt beim ausführen aus. Auch bei Einzelschritten beim ersten F8 kommt der Fehler.
Hab es erst mit umbenennen versucht- o.g Fehler.
Dann habe ich habe meine Tabelle entsprechend den Namen in der Abfrage angepasst. Ebenfalls der gleiche Fehler.
Code :
Public Sub Export_XML()
Const QRY As String = "SELECT akd_id FROM Auftragskopfdaten"
Dim ExportPath As String
Dim ad As AdditionalData
ExportPath = CurrentProject.Path & "\" & Format$(Now(), "yyyymmddhhnnss_")
Set ad = CreateAdditionalData
ad.Add "Versanddaten"
ad.Add "Positionsdaten"
With DBEngine(0)(0).OpenRecordset(QRY, dbOpenSnapshot)
'bis das Ende des Recordsets erreicht ist
Do Until EOF
'die Variable befüllen
pAkD_ID = !akd_id
ExportXML acExportTable, "qryAuftragskopfdaten", _
ExportPath & !akd_id & ".xml", _
AdditionalData:=objAdditionalData
.MoveNext
Loop
.Close
End With
End Sub
@sellrich
ZitatPublic pAkdId eigentlich pAkD_ID sein soll?
Ja, das stimmt; - nur ein Tippfehler.
Zur Fehlermeldung:
Du musst der Methode natürlich das Objekt übergeben nicht den Namen
des Parameters
AdditionalData:=ad
gruss ekkehard
Da habe ich heute Morgen etwas geschludert - aber Ekkehard hat die Sache ja ins rechte Licht gerückt.
@beaker s.a. vielen Dank.
Du meinst sicherlich diesen Teil
ExportXML acExportTable, "qryAuftragskopfdaten", _
ExportPath & !akd_id & ".xml", _
AdditionalData:=ad
Habe ich geändert zu "ad" allerdings ohne Erfolg.
Fehlermeldung bleibt die gleiche.
Hier habe ich auch noch einen Punkt unterschlagen. >:(
Do Until .EOF
Leute vielen lieben Dank für die Hilfe!
ZitatHier habe ich auch noch einen Punkt unterschlagen. >:(
Do Until .EOF
Danke dir! Wäre ich nicht so ein Anfänger, hätte ich selber erkennen müssen, dass da ein Punkt fehlt.
ExportXML acExportQuery, "qryAuftragskopfdaten", _
ExportPath & !akd_id & ".xml", _
AdditionalData:=ad
Was ich aber herausgefunden habe ist, dass das acExportQuery stehen muss, statt Table. Da ich ja die Abfrage ausgeben möchte. Richtig?
Da wirst Du Recht haben. :)
Guten Morgen liebe Helfer,
ich weiß, dass gehört vermutlich nicht in ein Access Forum. Aber ihr seid alle so Fit und antwortet so zügig, ich dachte ich versuch mal mein Glück.
Die oben exportierten XML-Files müssten alle um jeweils eine oberste und eine unterste Zeile erweitert werden. Automatisiert.
<order>
"Inhalt"
</order>
Kann man das beim erstellen/exportieren des XML-Files irgendwie verwirklichen?
Ich bin was XML´s angeht noch weniger im Bilde als VBA. :-X