Windows 7 - A2003: XML Datei in Datenbank importieren

Asked By Peter Wenzel on 13-Nov-08 05:05 PM
Hallo,

wir bekommen wöchentlich eine XML-Datei mit unseren Produktionsdaten.
Bislang habe ich diese Datei durch ein Excel-Makro in "Tabellenform" bringen lassen, damit ich die
Daten in  die Datenbank importieren kann. Ich möchte aber gerne die XML direkt importieren können.
Nun habe ich im Netz bei der Helma Spona ( http://www.helma-spona.de/hsp/oartikel01.htm ) ein
Codebeispiel gefunden welches die XML so ausliest, wie ich denke, dass es für meine Zwecke dienlich
ist. Leider schreibt das Codebeispiel die Daten der XML in das Direktfenster des VBA-Editors.

Was muss ich anstellen, die Daten in die Tabellen der DB zu schreiben?
Kann mir da jemand einen Schubs geben?

Die Struktur der XML sieht so aus:

Die Daten aus dem ersten Bereich Auftraege gehört in tblBeilagen, der Rest in tblProduktion, die
ersten Felder unter Produktion in tblAuftraege.

+ Produktion
+ Auftraege
+ Auftrag
/ Auftrag
/Auftraege
+ ZSP
+ Kennung
+ Auftraege
/ Auftraege
+ ZBN
/ ZBN
/ Kennung
/ ZSP
/ Produktion

Vielen Dank schon mal
Gruß
Peter




--
Bitte alle Antworten hier in die Newsgroup.
Mails nur nach Rücksprache zusenden.




Peter Wenzel replied on 13-Nov-08 05:09 PM
Ich vergas:

Es geht um das Listing 2 bei Helma Spona!


--
Bitte alle Antworten hier in die Newsgroup.
Mails nur nach Rücksprache zusenden.
Peter Doering replied on 13-Nov-08 07:53 PM
Hallo,



Ohne die Datei genauer angeschaut zu haben: probier mal mit
Application.ImportXML.

Evtl. brauchst du eine XSD, die du dir halt selbst erstellen musst.

Gruss - Peter

--
Mitglied im http://www.dbdev.org
FAQ: http://www.donkarl.com
Klaus Oberdalhoff replied on 13-Nov-08 07:56 PM
Hi,



Nun ja, Ein ganz normales DAO.Recordset (oder ADO) öffnen und dann halt
statt debug.print die entsprechenden DAO/ADO Befehle setzen, das hat ja nix
mehr mit XML zu tun sondern ist "ganz normales" VBA Handling; das musst du
allerdings beherrschen ...
Der Wert hinter dem Debug.Print ist halt immer der Feldname, der den
XML-Wert beinhaltet...
Kommt ja drauf an, was du machen willst ...

Am Anfang halt

Dim db as DAO.
Dim rst as dao.recordset

set db = currentdb
set rst = db.openrecordset("SELECT * FROM DeineOutrputTabelle;")

und dann statt debug.print irgendwas wie

with rst
.Addnew
.Fields("Feldname").Value = xmlTmpElem.nodeName    ''  ( oder
xmlTmpElem.firstChild.nodeValue oder "" oder oder oder )

.Update
End With

und am Ende

rst.close
set rst = Nothing

Sowas in der Art halt


wenn's auch englische Artikel sein dürfen, vielleicht helfen die ja auch
weiter  ...

http://www.aspfree.com/c/a/Microsoft-Access/Importing-XML-into-MS-Access-2003/

http://msdn.microsoft.com/en-us/library/aa662944(office.11).aspx

mfg

Klaus
Jens Schilling replied on 14-Nov-08 12:51 AM
Hallo, Peter


Schau mal hier :

http://kulpa-online.com/tipps-access-kommunikation-5001.html

Dort findest Du Erläuterungen und Code-Beispiele .

--
Gruss
Jens
______________________________
FAQ: http://www.donkarl.com
Peter Wenzel replied on 08-Dec-08 03:17 AM
Hallo zusammen,

ich habe mir etwas Mühe gegeben und folgendes erreicht:
Die XML wird nun rekursiv gelesen und die Daten in eine (temporäre) Tabelle geschrieben.
Da durch den immer wiederkehrenden Selbstaufruf der Prozedur es schwierig ist mit Variablen zu
arbeiten, ich möchte auch möglichst auf globale Variablen verzichten, habe ich mich mit dieser
Lösung angefreundet.
In der Tabelle gibt es 3 Datenfelder: Tabelle, Feldname, Feldwert
Tabelle gibt wieder, in welche Tabelle der DB die Daten später gelangen sollen. Feldname und
Feldwert eben das selbige der jeweiligen Tabelle. Nach dem Import werden die Daten dann im zweiten
Schritt aufgeteilt.

Nun habe ich mit diesem Code noch ein kleines Problem:
Der Import braucht sehr lange (1 - 2 Minuten). Außerdem macht es währenddessen den Eindruck, Access
hätte sich aufgehängt.
Vielleicht habt ihr ja Lust euch das mal anzuschauen und mir Anregungen zu geben, wie sich solch ein
Import tunen lässt.

Die Struktur der XML habe ich hier visualisiert:
http://img122.imageshack.us/img122/4082/xmlstrukturnw1.jpg

Und hier der von mir angepasste Code von www.Helma-Spona.de (Ihr sei an dieser Stelle auch gedankt).

Vielen Dank
Gruß
Peter


Sub XmlZweigLesen(XmlNode As MSXML.IXMLDOMNode)
Dim xmlTmp As MSXML.IXMLDOMNode
Dim XmlTmpElem As MSXML.IXMLDOMElement
Dim Feldname As String, Feldwert As String, Tabelle As String
Dim db As DAO.Database, rs As DAO.Recordset
Set db = CurrentDb

On Error GoTo Fehler
If XmlNode.nodeType = NODE_ELEMENT Then
Set XmlTmpElem = XmlNode
If XmlTmpElem.parentNode.baseName <> "" Then
Tabelle = XmlTmpElem.parentNode.baseName
Else
Tabelle = XmlTmpElem.baseName
End If
Select Case Tabelle
Case "Produktion"
Tabelle = "tblTempAuftragswoche"
Case "Auftrag"
Tabelle = "tblTempBeilagen"
Case "ZSP"
Tabelle = "tblTempZSP"
Case "Kennung"
Tabelle = "tblTempKennung"
Case "Auftraege"
Tabelle = "tblTempKennung"
Case "ZBN"
Tabelle = "tblTempZBN"
End Select
If XmlTmpElem.baseName <> XmlNode.ownerDocument.documentElement.baseName Then
'Debug.Print XmlTmpElem.NodeName;
Feldname = XmlTmpElem.NodeName
If XmlTmpElem.hasChildNodes Then
If XmlTmpElem.firstChild.nodeType = NODE_TEXT Then
'Debug.Print ": " & XmlTmpElem.firstChild.NodeValue
Feldwert = XmlTmpElem.firstChild.NodeValue
Else
'Debug.Print ""
End If
Else
'Debug.Print ""
End If
End If
End If

If Feldname <> "" And Feldwert <> "" Then
Set rs = db.OpenRecordset("tblXMLImport", dbOpenDynaset)
With rs
.AddNew
!Tabelle = Tabelle
!Feldname = Feldname
!Feldwert = Feldwert
.Update
End With
End If
Set rs = Nothing
Set db = Nothing

If XmlNode.hasChildNodes = True Then
For Each xmlTmp In XmlNode.childNodes()
XmlZweigLesen xmlTmp
Next xmlTmp
End If
Exit Sub
Fehler:
MsgBox Err.Number & vbLf & Err.Description
End Sub


--
Bitte alle Antworten hier in die Newsgroup.
Mails nur nach Rücksprache zusenden.