Juli 10, 2020, 09:42:52

Neuigkeiten:

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


XML Export von Tabellen via VBA

Begonnen von sellrich, November 01, 2018, 15:29:40

⏪ vorheriges - nächstes ⏩

sellrich

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.

Lachtaube

Eine Parameterabfrage lässt sich mittels Funktion (siehe FAQ 3.15) oder ab Access-Version 2010 mittels 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.
Grüße von der (⌒▽⌒)

sellrich

November 05, 2018, 09:07:34 #2 Letzte Bearbeitung: November 05, 2018, 09:14:12 von sellrich
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.

Lachtaube

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
Grüße von der (⌒▽⌒)

sellrich

November 05, 2018, 13:53:39 #4 Letzte Bearbeitung: November 05, 2018, 13:58:13 von sellrich
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



Beaker s.a.

@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
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.

Lachtaube

Da habe ich heute Morgen etwas geschludert - aber Ekkehard hat die Sache ja ins rechte Licht gerückt.
Grüße von der (⌒▽⌒)

sellrich

@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.

Lachtaube

Hier habe ich auch noch einen Punkt unterschlagen. >:(
Do Until .EOF
Grüße von der (⌒▽⌒)

sellrich

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?

Lachtaube

Grüße von der (⌒▽⌒)

sellrich

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