PDA

Vollständige Version anzeigen : xml dateien in access importieren


keithkeith
06.11.2008, 21:48
Hi,
ich muss demnächst ca 5000 XML Dateien in eine Access Tabelle importieren. Diese Dateien enthalten Spender Daten (Name,Vorname und vorallem spendenbetrag etc).
Ich würde mich über ein paar Schlagworte zu diesem Thema freuen.
Mit Schleifen in VBA und importfunktionen habe ich mich noch nicht beschäftigt.

Folgendes soll das Script am Ende leisten:

-auf knopfdruck alle xml dateien auslesen und in tabelle xml2008 speichern.
-auf knopfdruck xml daten mit daten tabelle_mitglieder vergleichen und an ensprechender stelle (name,vorname gleich) in tabelle xml_beitraege betraege einfügen.
-Rest (name,vorname doppelt vorhanden z. b. Frank Müller) - weiteres Thema... :(

also in einer schleife die dateien importieren und dann mit der tabelle mitglieder abgleichen und den spendenbetrag in die tabelle xml_beitraege an entsprechender stelle einfügen.

uwek
06.11.2008, 22:16
Hallo Martin,

deine Anfordungen sind durchaus realisierbar, allerdings ein fertiges Script vorzulegen ist dann schon etwas schwierig.
Eine BspDb mit den benötigten Tabellen und Demodaten sowie eine Mustervorlage dieser XML-Datei (Vorraussetzung,der Aufbau ist immer gleich), wären hier von Vorteil.

ebs17
06.11.2008, 22:17
Um alle Dateien zu erfassen (die alle in einem Verzeichnis liegen?), könntest Du eine Schleife mit Dir (wie hier (http://www.ms-office-forum.net/forum/showthread.php?t=221261#3)) verwenden. Der Schleifeninhalt wäre natürlich ein anderer.
Eine Alternative wäre das File System Object.

keithkeith
06.11.2008, 22:25
Hi,
es gibt drei Arten von xml dateien, aber immer mit mindestens den Feldern
Name,Vorname und Spendenbetrag und nur um die geht es.

Ich schaue mir erstmal die DIR option und das File System Object was Ebs17 vorschlägt an, möchte soviel wie möglich verstehen und deshalb auch möglichst keine fertigen Scripts nutzen.
:) Danke schonmal für die Hinweise.

uwek
06.11.2008, 22:44
Hallo Martin,

kannst dir ja mal die DB im Anhang ansehen.
In dieser DB kann man seine privaten Nachrichten hier im MOF verwalten.
Dazu werden die Nachrichten im xml-Format gedownloadet und eingelesen.
Vielleicht ist da was brauchbares für dich dabei.

keithkeith
13.11.2008, 20:16
Hi Uwe,
leider komme ich nicht voran.
Könntest Du mir vielleicht ein Beispiel zeigen wie ich überhaupt erstmal eine einzelne Datei Importieren kann ?
Wenn ich es über Access/xml Datei importieren mache, funktioniert es wunderbar nur leider habe ich null peilung wie das in einem Script aussehen soll. Deine DB ist noch zu kompliziert für mich und in den Hilfen finde ich auch n ichts entsprechendes.
So eine xml Datei sieht ao aus:
- <sponsor>
<testMode>0</testMode>
<authCost>6.0</authCost>
<currency>EUR</currency>
<address>schlechtweg</address>
<MC_donationcert_yearly>1</MC_donationcert_yearly>
<countryString>Germany</countryString>
<AVS>0000</AVS>
<amountString>EUR6.00</amountString>
<postcode>6786767</postcode>
<name>Peter Pan</name>
<transStatus>Y</transStatus>
<desc>1cm blabla</desc>
<lang>de</lang>
<authAmountString>EUR6.00</authAmountString>
<authAmount>6.0</authAmount>
<ipAddress>216.555.55.55</ipAddress>
<cost>6.0</cost>
<MC_gift>0</MC_gift>
<country>DE</country>
<email>test@gmx.de</email>
</sponsor>
jo, das wäre super nett zumal ich an anderer stelle auch schon hänge :) und access für mich wie ein wald mit lauter bäumen ist, allerdings kenne ich wenigstens schonmal ein paar inzwischen :)

Louisleon
13.11.2008, 21:27
Hallo Martin,

was verstehst Du denn nicht an dem Code?
Hast Du Dir das Beispiel überhaupt mal angesehen?
Weißt Du in welchem Form der Button zum einlesen der XML-Datei steht?
Wenn Du dir das Beispiel ansiehst, kannst Du es sicher auch für deine Zwecke umbauen. (Du kennst den Debugger und die "Entwicklungsumgebung"?!)
Ich würde sagen du hast mal keine Angst mehr vor "dem dunklen Wald" und marschierst hier mal rein.
VBA-Entwicklungsumgebung aufmachen:
...
Formular "frm_PN_Loader"
Prozedur "cmdReadXML_Click".

Die auf diesem Button hinterlegte Prozedur ist entscheiden für Dich!!
Ich denke Du kommst damit in diesem Beispiel schon mal weiter und kannst die Prozedur deinen Bedürfnissen anpassen.
Entscheiden wird für Dich die Funktion "ReadX" (im Modul "modXML", solltest Du deinen Bedürfnissen anpassen) in Verbindung mit diesem Teil aus der Clickprozedur sein:
If lCount > 0 Then
For l = 1 To lCount
lRead = ReadX(sPath & sFile(l))
lGes = lGes + lRead
If bKill Then
Kill sPath & sFile(l)
End If
Next l
End If

Select Case lGes
Case 0
strMsg = "Es wurden keine Daten eingelesen!"
Case 1
strMsg = "Es wurde 1 Nachricht eingelesen!"
Case Else
strMsg = "Es wurden " & lGes & " Nachrichten eingelesen!"
End Select

Alternativ könntest Du im Code-Archiv auch dieses (http://www.ms-office-forum.net/forum/showthread.php?t=216281)finden.


Gruß

LL

keithkeith
13.11.2008, 22:27
Hi Luisleon,
leider funktioniert das Beispiel aus dem Codearchiv bei mir nicht, hängt sich auf sobald ich eine xml anklicke.

Was Uwes DB angeht ist es für einen Anfänger nicht so einfach, den ganzen code zu verstehen.
Ich schau' nochmal :)

keithkeith
14.11.2008, 17:09
Hi, ich habe jetzt paar prozeduren gefunden um zumindest dateien in access sehen zu können.
Private Sub Befehl0_Click()
On Error GoTo Err_Befehl0_Click

Datei1 = Dir("D:\xml\*.xml")
Datei2 = Dir
MsgBox (Datei1)
MsgBox (Datei2)

Dim sFile As String
Dim nCount As Long

sFile = Dir$("D:\xml\*.xml")
While sFile <> ""
If sFile <> "." And sFile <> ".." Then
nCount = nCount + 1
End If
sFile = Dir$
Wend

MsgBox CStr(nCount) & " Dateien gefunden."

'******Pfad1 loop*******
Pfad1 = "D:\xml\*.xml"""
Name1 = Dir(Pfad1)
Do While Name1 <> ""
If Name1 <> "." And Name1 <> ".." Then
Me!dateien = Name1
End If
Name1 = Dir
Loop

Exit_Befehl0_Click:
Exit Sub

Err_Befehl0_Click:
MsgBox Err.Description
Resume Exit_Befehl0_Click

End Sub

Is' bisschen durcheinander:)
Sind verschiedene Möglichkeiten und im Moment lasse ich mir Variablen usw. in MsgBoxen ausgeben um sehen zu können obe auch was ankommt.
Dazu gleich ne Frage, ich kann (3 Teil "Pfad1) Loop die Dateien in einem Textfeld darstellen, aber immer nur eine datei, wie funktioniert das denn das sich alle im Ordner befindlichen dateien in diesem Textfeld darstellen, also:
Datei 1
Datei 2
etc. ?

keithkeith
15.11.2008, 10:48
Hallo,
könnte mir nicht jemand Stück für Stück helfen ? Is bestimmt auch für Andere interessant :)

keithkeith
15.11.2008, 13:59
Hi, ich habe jetzt ein script gefunden welches ich fast verstehe !
'XML-Import
Public Function ReadAndWriteXMLData() As Long

Dim dbs As DAO.Database

' Benötigte XML-Objekte
Dim xml_obj As MSXML2.DOMDocument ' Datei
Dim xml_list As MSXML2.IXMLDOMNodeList ' Liste
Dim xml_nod As MSXML2.IXMLDOMNode ' Element

Dim sSql As String

On Error GoTo ReadAndWriteXMLData_Err

Set dbs = CurrentDb()

Set xml_obj = New MSXML2.DOMDocument

With xml_obj
' Asynchronausführung
.async = False
' XML-Datei laden
.Load CurrentProject.Path & "\kundenliste.xml"
' Kundenliste zuordnen
Set xml_list = .selectNodes("Kundenliste/Land/Kunde")
' Schleife über alle Kunden in der Kundenliste
For Each xml_nod In xml_list
With xml_nod
' Anfügeabfrage zusammenbasteln
sSql = "Insert Into tblKunden ( Kundennr, Firma, Kontaktperson, Strasse, PLZ, Ort, Telefon, Land ) "
sSql = sSql & "Values ("
' Auslesen der einzelnen Node-Elemente im Knoten Kunden
sSql = sSql & MakeQuotes(.childNodes(0).Text) & ", "
sSql = sSql & MakeQuotes(.childNodes(1).Text) & ", "
sSql = sSql & MakeQuotes(.childNodes(2).Text) & ", "
sSql = sSql & MakeQuotes(.childNodes(3).Text) & ", "
sSql = sSql & MakeQuotes(.childNodes(4).Text) & ", "
sSql = sSql & MakeQuotes(.childNodes(5).Text) & ", "
sSql = sSql & MakeQuotes(.childNodes(6).Text) & ", "
' Auslesen des übergeordneten Elementes Land
sSql = sSql & MakeQuotes(.parentNode.Attributes(0).Text) & ")"
End With
' Abfrage ausführen
dbs.Execute sSql, dbFailOnError
Next xml_nod
End With

' Speicher freigeben
If Not dbs Is Nothing Then dbs.Close: Set dbs = Nothing
If Not xml_nod Is Nothing Then Set xml_nod = Nothing
If Not xml_list Is Nothing Then Set xml_list = Nothing
If Not xml_obj Is Nothing Then Set xml_obj = Nothing

' Alles in Ordnung
MsgBox "Der Import wurde erfolgreich durchgeführt!", _
vbInformation, "Hinweis"


ReadAndWriteXMLData_Exit:
On Error GoTo 0
ReadAndWriteXMLData = True
Exit Function

ReadAndWriteXMLData_Err:
ReadAndWriteXMLData = Err
MsgBox "Fehler " & Err.Number & ": " & _
Err.Description, vbCritical, _
"modXmlImport.ReadAndWriteXMLData"
Resume ReadAndWriteXMLData_Exit

End Function

nun muß ich es aber in einer schleife ablaufen lassen da ich ja nicht eine xml mit mehreren kunden habe, sondern viele xml dateien mit je einem kunden !
kann mir jemand helfen ? muß die funktion als schleife laufen, oder innerhalb der funktion eine schleife ?

ebs17
15.11.2008, 14:29
Hallo Martin,

Du müsstest die Funktion innerhalb der Schleife aufrufen, dabei aber den jeweiligen ermittelten Dateinamen der Funktion als Parameter übergeben, etwa so ...
While sFile <> ""
ReadAndWriteXMLData Pfad & sFile
...
Wend
Die Funktion müsste entsprechend angepasst werden ...
Public Function ReadAndWriteXMLData(XMLDatei As String) As Long
...
' XML-Datei laden
.Load XMLDatei
...

uwek
15.11.2008, 14:37
Hallo Martin,

und hier nochmal ein Bsp. einer Dateisuche und - darstellung.
Daran anlehnend kannst du ja dann das vorrausgehende Einbauen.

keithkeith
15.11.2008, 14:41
mensch klasse, das sind genau die beiden dinge die noch fehlten, mal sehenob ich das irgendwie zusammen bekomme :)

keithkeith
15.11.2008, 19:06
Hi, leider bekomme ich das nicht hin, kannste mir nochma' helfen ?

ich habe eine xml Datei:contract_klein.xml mit folgendem Inhalt:
- <sponsor>
<test>20081106T132239</test>
</sponsor>


Dann habe ich eine tblneu mit einem Feld (test) darauf liegt auch der Primärschlüssel. Tabelle is' leer.

nun habe ich den Code an entsprechender Stelle auf folgendes reduziert:

.....SET usw .....
With xml_obj
' Asynchronausführung
.async = False
' XML-Datei laden
.Load CurrentProject.Path & "\contract_klein.xml"
' Kundenliste zuordnen
Set xml_list = .selectNodes("sponsor")
' Anfügeabfrage zusammenbasteln
sSql = "Insert Into tblneu ( test ) "
sSql = sSql & "Values ("
' Auslesen der einzelnen Node-Elemente im Knoten Kunden
sSql = sSql & MakeQuotes(.childNodes(0).Text) & ", "
' Abfrage ausführen
dbs.Execute sSql, dbFailOnError
End With

...........'speicher frei.............

wenn ich das nun im direktfenster ausführe bekomme ich:
Fehler 3134 Syntaxfehler in der INSERT INTO Anweisung
Was mach ich denn falsch ?

keithkeith
15.11.2008, 19:37
Ich denke mir das so :) Wenn ich erstmal eine Datei in eine Tabelle importieren kann, hab ich wenigstens das schonmal verstanden und kann mich dann mit der schleife beschäftigen

ebs17
15.11.2008, 19:41
sSql = sSql & MakeQuotes(.childNodes(0).Text) & ")"
Wenn Du Dir die SQL-Anweisung ins Direktfenster ausgeben lässt, kannst Du diese leicht überprüfen.

keithkeith
15.11.2008, 19:56
geht nicht, da stimmt was mit den anführunszeichen, oder so nicht ?
ungültiger überwachungsausdruck ?

Louisleon
15.11.2008, 20:11
Hallo Mártin,

mach es Dir nicht so kompliziert.
Der SQL-String ist noch nicht so unübersichtlich das Du Ihn aufteilen mußt.
Versuch es mal damit:
' Auslesen der einzelnen Node-Elemente im Knoten Kunden
sSql = "Insert Into tblneu ( test ) Values (" & MakeQuotes(.childNodes(0).Text) & "); "

und schau dir im Direktfenster an was er daraus macht.
Es sollte mit ?sSql im Direktfenster eigentlich das rauskommen:
Insert Into tblneu ( test ) Values (20081106T132239);
Und wenn die Tabelle "tblneu" und das Feld "test" existiert sollte er das auch eintragen.

Gruß

LL

keithkeith
15.11.2008, 20:29
Hi,
sollte :D tuts aber leider nicht :)
hier nochmal der ganze code
es gibt die datei contract_klein.xml im gleichen verzeichnis, darin enthalten ist der code:
- <sponsor>
<test>20081106T132239</test>
</sponsor>
Dann gibt es die Tabelle tblneu mit dem feld test(text)


'XML-Import
Public Function ReadAndWriteXMLData() As Long

Dim dbs As DAO.Database

' Benötigte XML-Objekte
Dim xml_obj As MSXML2.DOMDocument ' Datei
Dim xml_list As MSXML2.IXMLDOMNodeList ' Liste
Dim xml_nod As MSXML2.IXMLDOMNode ' Element

Dim sSql As String

On Error GoTo ReadAndWriteXMLData_Err

Set dbs = CurrentDb()

Set xml_obj = New MSXML2.DOMDocument

With xml_obj
' Asynchronausführung
.async = False
' XML-Datei laden
.Load CurrentProject.Path & "\contract_klein.xml"
' Kundenliste zuordnen
Set xml_list = .selectNodes("sponsor")
' Anfügeabfrage zusammenbasteln
sSql = "Insert Into tblneu ( test ) Values (" & MakeQuotes(.childNodes(0).Text) & "); "
' Abfrage ausführen
dbs.Execute sSql, dbFailOnError
End With

' Speicher freigeben
If Not dbs Is Nothing Then dbs.Close: Set dbs = Nothing
If Not xml_nod Is Nothing Then Set xml_nod = Nothing
If Not xml_list Is Nothing Then Set xml_list = Nothing
If Not xml_obj Is Nothing Then Set xml_obj = Nothing

' Alles in Ordnung
MsgBox "Der Import wurde erfolgreich durchgeführt!", _
vbInformation, "Hinweis"


ReadAndWriteXMLData_Exit:
On Error GoTo 0
ReadAndWriteXMLData = True
Exit Function

ReadAndWriteXMLData_Err:
ReadAndWriteXMLData = Err
MsgBox "Fehler " & Err.Number & ": " & _
Err.Description, vbCritical, _
"modXmlImport.ReadAndWriteXMLData"
Resume ReadAndWriteXMLData_Exit

End Function

wenn ich nun (woßte garnicht das es geht :) danke für den tipp)
?sSql ins direktfenster eingebe springt der cursor zwei zeilen tiefer, das war es :eek:

keithkeith
15.11.2008, 20:32
Hab die Dateien mal angehängt.

keithkeith
15.11.2008, 23:36
Also, ich schaffe es einfach noch nicht. wäre toll, wenn mir noch jemand helfen könnte :)

ebs17
16.11.2008, 00:37
Es sollte mit ?sSql im Direktfenster eigentlich das rauskommen:
Das war wohl ein falscher Zungenschlag. Eher ...
' Abfrage ausführen
Debug.Print sSQL
' dbs.Execute sSql, dbFailOnError

In der Anlage ein Miniprojekt, dass beim Urheber funktioniert hat. Ich kann es aber selber mit Acc2000 nicht nachvollziehen - XML-Fähigkeiten kamen erst mit Acc2003.

Louisleon
16.11.2008, 09:51
@Eberhard
Das war wohl ein falscher Zungenschlag. Eher ...

Na Eberhard, der kam wohl eher von Dir ;-)
? ist im Direktfenster = Debug.Print im Code!

Hallo Martin,

deine Dateien sind keine XML-Dokumente!!
Das ist der Grund warum Du mit jeder Methode hier aufschlägst.
Entweder Du hast "wohlgeformte" XML-Dateien oder Du mußt die Tags manuell auslesen.

Sehen die Dateien wirkklich so aus??
Ein "wohlgeformtes" XML-Dokument hast Du in Eberhards Anhang.

Gruß

LL

keithkeith
16.11.2008, 09:58
Hi,
die xml-Dateien sehen tatsächlich so aus, sind im Moment ca 4000, bis ende des Jahres dann wahrscheinlich 5000. Es handelt sich um Spenderdaten und die müssen in einer DB zusammen mit Mitgliederdaten usw am Jahresende ausgelesen werden zwecks Spendenquittung.
Was meinste denn mit manuell auslesen ?
Über den Daten/Im-Export Access (Ribbon) funktioniert es doch auch ?

Louisleon
16.11.2008, 11:36
Hallo Martin,

habe leider übersehen das Du Access 2007 verwendest!
Ich kann damit keine Gewähr für funktionierenden Code abgeben da kein ACC2007 vorhanden ist.
Wenn es über den Daten/Im-Export Access (Ribbon) funktioniert, sollte es eigentlich Möglichkeiten geben diese Funktionalität per VBA anzusprechen.

Unter manuell meinte ich das "normale" File-Handling von Textdateien mit "OPEN" und den Text nach den Tags parsen und die Werte in die DB schreiben. Ich gehen davon aus das die Dateien immer die gleichen Tags haben.

Gruß

LL

P.S.: bei mir (ACC02) funktioniert der Import deiner Datei zumindest nicht als XML-Dokument!
Meldung: Microsoft Acces kann keine Tabelle(n) unter Verwendung der Informationen erstellen, die in den zu importierenden Dokumenten vorliegen.

ebs17
16.11.2008, 11:41
Über den Daten/Im-Export Access (Ribbon) funktioniert es doch auch ?
In den vorhergehenden Accessversionen ist es so, dass man Menübefehle mit dem DoCmd-Objekt nachbilden kann. Vertiefe Dich mal in den Objektkatalog, welche Methoden dazu angeboten werden.

keithkeith
17.11.2008, 18:46
Hi,
ich habe jetzt etwas gefunden.
Private Sub btn_XML_Importieren_Click()

Dim fso As Object
Dim sDatei As String
Dim sPfad As String
Dim sName As String
sPfad = "d:\" ' Pfad setzen aus der die XML geholt wird
sName = Dir(sPfad & "\*contract_klein.xml") ' Name der Datei ermitteln

sDatei = sPfad & "\" & sName ' Gesamt URL erstellen

MsgBox sDatei & vbCrLf & "wird importiert!"

Application.ImportXML DataSource:=sDatei, ImportOptions:=acStructureAndData

MsgBox "Der Feedback Import ist abgeschlossen!", vbOKOnly, "Statusmeldung"


End Sub
Ich verstehe den Code sogar einigermaßen :eek:
Nur ist es jetzt so das ich zwar EINE Datei contract_klein.xml imortieren kann und sogar sofort eine Tabelle daraus entsteht, aber wie bekomme ich jetzt alle Dateien in die selbe Tabelle ?
Die Zeile: acStructureAndData lässt darauf schließen das sowohl die Struktur, als auch der Inhalt der xml Datei imortiert wird, das möchte ich aber nur beim ersten DS, danach nur die Daten !?! Gibt es dazu sowas wie:acData ? ich finde leider nichts in der Hilfe und auch meine Bücher geben nichts darüber her.
Also, wenn mir da jetzt jemand helfen könnte ?!?
Danach, sollte ich es hinbekommen wäre dann noch das Problem mit der Schleife, denn es sind ja mehrere tausend Dateien.

keithkeith
17.11.2008, 19:08
Hab' doch noch was gefunden !

Access-Entwicklerreferenz
AcImportXMLOption (Aufzählung)
Gibt an, welche Aktion beim Importieren einer XML-Datei mithilfe der ImportXML-Methode ausgeführt werden soll.
Name Wert Beschreibung
acAppendData 2 Importiert die Daten in eine vorhandene Tabelle.
acStructureAndData 1 Importiert die Daten in eine neue Tabelle basierend auf der Struktur der angegebenen XML-Datei.
acStructureOnly 0 Erstellt eine neue Tabelle basierend auf der Struktur der angegebenen XML-Datei.

Wenn mir jetzt noch jemand beim zusammenbau helfen könnte, dazu bin ich noch zu schlecht in VBA :(

ebs17
17.11.2008, 19:52
Die Ausführung einer Anweisung (bzw. mehrerer Anweisungen) innerhalb einer Schleife, die nacheinander alle Dateien (mit Filter) eines Verzeichnisses erfasst, hatten wir schon. Lies mal dieses Dein Thema.

Die Frage ist nur: Erhältst Du durch den direkten Import in eine bestehende Tabelle die Datenstruktur, die Du benötigst.

Alternativ würde man jede Datei in eine eigene (temporäre) Tabelle importieren, den Datensatz per Anfügeabfrage in die eigentliche Zieltabelle verschieben sowie die Temptabelle löschen.

Louisleon
18.11.2008, 07:50
Hallo,

also wenn das bei Dir funktioniert, kann es keine XML-Datei sein wie Du sie hier vorgestellt hast.
Auch diese Methode erwartet eine wohlgeformte XML-Datei.

Eine Schleife mußt Du eigentlich nur über die FileSystem-Objekte machen.
Dazu liest Du z.B. den Inhalt eines Ordners in eine Tabelle ein und bedienst daraus deine Schleife.

Gruß

LL

keithkeith
18.11.2008, 11:15
Ich habe die DB und zwei Beispiele mal angehängt.
Du musst nur die Pfadangaben im VBA umstellen,bzw. einstellen, dann das Formular öffnen und zuerst button A drücken, dann B.
Bei mir in AC2007 werden dann zuerst A und dann B in die Tabelle importiert.

Gleich mal ne Frage, ich bekomme es einfach nicht hin die Dateien ins gleiche Verzeichnis wie die DB zu legen und den Pfad dorthin zu führen !?!
Also alle drei Dateien ins gleiche Verzeichnis.

Im Grunde ist es jetzt so wie Eberhard es vorgeschlagen hat , temporäre Tabelle, dann Anfügeabfrage und dann löschen der temporären Tabelle.

Jetzt guck' ich mir mal das FileSystem-Objekt an.

ebs17
18.11.2008, 11:38
Dein Code ist jetzt nichts anderes als das Beispiel in #23. Allerdings hast Du die Dir-Schleife weggenommen und beziehst Dich auf eine konkrete Datei, statt einen Filter (*.xml) zu verwenden.
Über den Rest brauchst Du Dich dann nicht zu wundern.

Wo die DB liegt, ist egal. Die zu importierenden Dateien müssen - wegen des einfachen Automatismus - im gleichen Verzeichnis liegen. Dieses wird dann berücksichtigt.
' zum Beispiel
sPfad = "d:\XMLDATEN\"

' Pfad und Dateiname sind durch einen Backslash zu trennen
' Windowsgrundlagen !!
sName = Dir(sPfad & "\test_A.xml")

Wie die Importdateien in das vorgesehene Verzeichnis kommen (Kopieren, Importroutine o.ä.) hat mit dem Importieren an sich nichts zu tun. Das ist eine organisatorische Maßnahme.

keithkeith
18.11.2008, 11:48
Und hier beide Varianten:
Über Das Formular frm_Search_Tbl die Dateien suchen und in eine Tabelle speichern (tbl_files), anschließend dann mit der Importfunktion die Tabelle auslesen und die dateien importieren.
Das Prinzip ist mir ja klar, nur die umsetztung :)

Ich muss eine Prozedur schreiben in der auf Knopfdruck die Werte(Pfade zu xml_Dateien) der Tabelle tbl_Files nacheinander an eine Funktion
z. B. "import_xml" übergeben werden.

In dieser Funktion muss der Wert dazu genutzt werden:
-Inhalt der Datei auszulesen
-eine temporäre Datei erstellen
-Daten in temporärer Datei speichern
-per Anfügeabfrage übergeben an bestehende Tabelle (sponsoren)
-temporäre Tabelle wieder löscht.

Ich will nicht aufgeben ;)

ebs17
18.11.2008, 11:58
Das Einlesen der Dateinamen in eine Tabelle halte ich für überflüssig - außer für eine Dokumentation. Dann genügt aber eine einfache Anfügeabfrage im Rahmen der Schleife.

Ansonsten hast Du die gesamte notwendige Funktionalität im mehrfach erwähnten Beispiel. Eine weitere Wiederholung erspare ich mir.

Sascha Trowitzsch
18.11.2008, 12:09
Ich würde immer noch die Dateien über MSXML einlesen, nicht über die Importfunktion von Access, weil man so mehr Kontrolle über den Vorgang hat.
(Beispielsweise ist das oben gezeigte Beispiel mit dem test-Element ja ein Datum. Über die Konvertierung dessen Werts kann man in VBA gezielt Funktionen einsetzen.)
Das Einlesen per MSXML ist doch kein Problem?! Die Dateien sind zwar so, wie sie vorliegen, nicht gültig, weil sie dieses "-" am Anfang haben, aber das lässt sich ja eliminieren:

Dim strXML As String
Dim F As Integer
F = Freefile
Open strFileXML For Binary Access Read As F
strXML = String (LOF(F),0)
Get F,, strXML
Close F

strXML = Mid(strXML,3) ' "-" entfernen !
xml_obj.validateOnParse
xml_obj.loadXML strXML
...

Ciao, Sascha

keithkeith
18.11.2008, 12:19
Hi Sascha,
sorry aber jetzt verstehe ich nur Bahnhof :) Welches datum ?
Nicht vergessen, ich bin Anfänger !

Sascha Trowitzsch
18.11.2008, 12:22
Das ist ein Datum:
- <sponsor>
<test>20081106T132239</test>
</sponsor>
Aber darum geht's ja gar nicht.

Ciao, Sascha

keithkeith
18.11.2008, 12:35
Im Beispiel # 34 ist es eine größere xml,
die mit dem Datum war der einfachheit halber nur so klein! sorry, mein Fehler.

Jetzt erst habe ich Eberhards Beispiel verstanden und auch warum er mich immer wieder darauf hingewiesen hat.
Diese Beispiel importiert ja schon sämtliche xml Dateien und verschiebt dann (wahrscheinlich weil der Dateizeiger immer auf die erste Datei in einem ordner zeigt) die importierte Datei in einen neuen Ordner. Ohhh Man :( Aber bin eben Anfänger ! Jetzt muss ich nur statt bei 4000 Dateien, 4000x den Button zu drücken es schaffen eben diese Schleife solange durchlaufen zu lassen, bis keine Datei mehr im Ordener liegt, richtig ?

@ Eberhard, sorry aber ich bin halt wirklich ein Anfänger !

@Sascha, Du wohnst in meiner nähe :) Darf ich Dich mal besuchen ? Is' auch für 'nen Guten Zweck ! evtl wäre auch eine Beratungspauschale machbar :)

ebs17
18.11.2008, 12:42
Die Schleife im Beispiel (ohne Deine "kreativen" Eingriffe) durchläuft jede Datei, die im angegebenen Verzeichnis dem Filter ("*.xml" = alle XML-Dateien) entsprechen, ohne erneute Buttonklicke.

keithkeith
18.11.2008, 13:00
dazu muss ich aber das hier auskommentieren:
'MsgBox sDatei & vbCrLf & _
"wird importiert!"

:)
Vielen Dank für Deine Geduld

keithkeith
18.11.2008, 14:06
@Eberhard ! Diese Filterfunktion (*), könnte ich damit auch drei Tabellen bedienen ?
Also,
wenn Struktur von *.xml gleich Struktur Tabelle A dann Insert into Tabelle A
wenn Struktur von *.xml ungleich Struktur Tabelle A dann Insert into Tabelle B

Wo sollte ich prüfen ?

ebs17
18.11.2008, 14:21
Das Sternchen ist ein Platzhalter und wirkt in Verbindung mit den weiteren Zeichen als Filter ...
*.xml ... alle XML-Dateien
*kuss*.* ... alle Dateien, die "kuss" enthalten usw.

Wenn die unterschiedlichen Strukturen durch ein passendes Muster im Dateinamen abgebildet werden, dann ist es einfach (pro Struktur eigene Schleife mit passender Zieltabelle).

keithkeith
18.11.2008, 14:37
Nee, der Unterschied ist innerhlab der Dateien zu finden.

Es gibt aber eindeutige "Überschriften" in den Dateien.

Datei A enthält z. B. <AVS>2222</AVS>
Datei B enthält z. B. <Contract-ID>123123123</Contract-ID>

keithkeith
18.11.2008, 19:38
Hallo,
ich habe fast alle 4000 Dateien importiert, paar sind übrig (fehlerhaft)
Es gibt nun das Problem das z. B. das ß falsch dargestellt wird.
Auch die Umlaute.
Was könnte denn da jetzt falsch gelaufen sein ?

keithkeith
18.11.2008, 19:39
Ach und ne Statusanzeige wäre auch genial, wie könnte ich denn umsetzten ?
Es dauert schon etwas, ca 30 Minuten :) kann man sich den aktuellen Status anzeigen lassen ?

keithkeith
18.11.2008, 19:42
Das mit den Zeichen kommt nur teilweise vor, die meißten Datensätze haben die richtigen Umlaute etc.

keithkeith
26.11.2008, 17:20
Hallo Eberhard,
hab' jetzt doch noch eine Frage zu Deinem Code:
' Daten werden in neue Tabelle geschrieben
Application.ImportXML _
DataSource:=sDatei, _
ImportOptions:=acAppendData

' Anfügeabfrage starten
CurrentDb.Execute "INSERT INTO tblsponsor " _
& "SELECT sponsor.* FROM sponsor;"
zwischen dem Application.Import und dem Anfügen der Datensätze brauche ich eine Abfrage nach z.B. dem Zeichen & , denn beim Einlesen der xml Daten gibt es im Falle des Auftauchens eines solchen Zeichen eine Fehlermeldung.

Mir ist die "Funktion" nicht ganz klar !?! So verstehe ich es:
- Application.ImportXML = sozusagen die schon vorhandene Funktion xml Dateien einlesen zu können.
- DataSource:=sDatei = um welche Datei es sich handelt und der Pfad dorthin.
-ImportOptions:=acAppendData = in dem Fall nur Daten importieren.

Woher weiß Access wohin nun die Daten geschrieben werden, bzw. in welcher Variablen liegen denn die Daten ?
Hier heißt es doch:
CurrentDb.Execute "INSERT INTO tblsponsor " _
& "SELECT sponsor.* FROM sponsor;"
Füge in tblsponsor ALLES ein, was in sponsor vorhanden ist.

Wäre toll, wenn Du mir das nochmal näher erklären könntest. :)

ebs17
26.11.2008, 18:47
Hallo Martin,

auf meine mangelnden XML-Fähigkeiten wegen fehlender Praxis und diesbezüglich unfähigem Programm (Acc2000) hatte ich schon hingewiesen.
Den Befehl ImportXML und die Bedeutung der einzelnen Parameter musst Du schon mal selbst in der Access-VBA-Hilfe nachlesen (das musst Du sowieso, egal, was Dir hier erzählt wird - eine leicht kritische Haltung ist immer angeraten: die größte Bank kann (und wird?) Pleite gehen, der größte Experte kann sich irren).

Das, was ich verstanden habe: In der wohlgeformten XML-Datei steht drin, wie die zu importierende Tabelle heißt, wie die Felder definiert sind und welche Daten wohin kommen. Das Ergebnis dieses Imports kannst Du ja betrachten.

Füge in tblsponsor ALLES ein, was in sponsor vorhanden ist.
Genau das macht eine Anfügeabfrage ohne einschränkende Kriterien.

Das "Umschichten" der Datensätze in eine Zieltabelle macht Sinn, wenn
- man einen gleichbleibenden Namen der Tabelle benötigt (was durch den Import nicht abgesichert werden kann)
- man in der Tabelle bestimmte Formatierungen benötigt, die der Import nicht mitbringt
- eigene Schlüsselfelder (ID´s), Indexe, Beziehungen zu anderen Tabellen benötigt werden (was der Normalzustand ist)
- beim Import eine gleichnamige Tabelle entsteht, die mit der bereits vorhandenen kollidiert (am Ende geht es um Daten, nicht um die Tabelle)

zwischen dem Application.Import und dem Anfügen der Datensätze brauche ich eine Abfrage nach z.B. dem Zeichen &
Das musst Du präziser beschreiben. Ein Zeichen pro Feld kann man im Rahmen der Anfügeabfrage korrigieren (Replace bzw. Replace-Ersatzfunktion), bei mehreren ist es sinnvoller, pro Korrektur eine Aktualisierungsabfrage ablaufen zu lassen.

keithkeith
26.11.2008, 22:00
Hallo Eberhard,
es geht darum das in einigen xml Dateien umlaute und Sonderzeichen vorkommen und deshalb der Import abgebrochen wird. Bei anderen Dateien allerdings funktioniert es ohne Probleme obwohl Umlaute enthalten sind.

Sicher ist das es Probleme mit dem & Zeichen gibt. Es liegt zum Teil glaube ich an den nicht immer wohlgeformten xml Dateien, denn es gibt ja drei verschiedene Sorten. Also, ich muß jetzt von zwei Seiten an das Problem.

Auf der einen Seite der xml "Erzeuger" werden jetzt "wohlgeformte" xml Dateien erzeugt.
Auf meiner Seite muß ich zumindest etwas "gegen" die &'s unternehmen. Ich habe mal durch suchen/ersetzten alle "&" durch "und" ersetzt und siehe da, es funktioniert.
Allerdings ist das nur eine schlechte Lösung, besser wäre es, wenn ich schon während des Imports jedes "&" durch ein (keine ahnung) "utf8 &", oder "chr...&" ersetzten könnte. Ich blicke das mit den Formaten ganz ehrlich noch nicht so :rolleyes:

ebs17
27.11.2008, 01:02
Wenn die XML-Dateien selber schon die Fehler beim Import verursachen, kannst Du ja dem Import diese Funktion vorschalten:
Public Function ChangeFile(File As String) As String
Dim F As Integer
Dim sInhalt As String

' Prüfen, ob Datei existiert
If Dir$(File, vbNormal) <> "" Then
F = FreeFile
Open File For Binary As #F
sInhalt = Space$(LOF(F))
Get #F, , sInhalt
sInhalt = Replace(sInhalt, "RAUS1", "REIN1")
' sInhalt = Replace(sInhalt, "RAUS2", "REIN2")

Put #F, 1, sInhalt
Close #F
Else
sInhalt = ""
End If

ChangeFile = sInhalt

End Function
Dabei fiel mir aber auf, dass diese große Ähnlichkeit zu dem Vorschlag von Sascha in #36 hat, so daß Du die Replace-Anweisungen auch gleich dort einbauen könntest.

keithkeith
27.11.2008, 01:51
Hi Eberhard,
da muss ich mal gucken. Deine Version hab' ich ja wenigstens im Ansatz verstanden, hier und in #36 versteh' ich im Moment eigentlich nicht wirklich irgendetwas :(
Muss noch lernen :) Aber trotzdem erstmal danke :)

keithkeith
09.01.2009, 19:43
Hallochen Eberhard,
ich brauch' nun doch nochmals Deine Hilfe.Etwas unschön habe ich es fertig gebracht Dateien die, warum auch immer nicht importiert werden können in ein anderen Ordner als den eigentlichen zu verschieben.

Also:

Ordner(xmldaten) = alle .xml Dateien
Ordner(xml_verschieben) = alle importierten .xml Dateien
Ordner(xml_verschieben/fehlerhafte) = alle .xml dateien die nicht importiert werden können.

Ich habe noch nicht rausfinden können was genau nicht stimmt mir den Dateien,
es sind immerhin 800 von ca 4500

Option Compare Database
Option Explicit
Private Sub btn_XML_Importieren_Click()
On Error GoTo Err_btn_XML_Importieren_Click


Dim fso As Object
Dim sDatei As String
Dim sPfad As String
Dim sName As String
sPfad = "d:\xmldaten" ' Pfad setzen aus der die XML geholt wird
sName = Dir(sPfad & "\*.xml") ' Name der Datei ermitteln

Do While sName <> "" ' Schleife beginnen
sDatei = sPfad & "\" & sName ' Gesamt URL erstellen



' Daten werden in neue Tabelle geschrieben
Application.ImportXML _
DataSource:=sDatei, _
ImportOptions:=acAppendData

' Anfügeabfrage starten
CurrentDb.Execute "INSERT INTO tblsponsor " _
& "SELECT sponsor.* FROM sponsor;"

' Erzeugte Tabelle wieder löschen
DoCmd.DeleteObject acTable, "sponsor"

' XML-Datei verschieben
Set fso = CreateObject("Scripting.FileSystemObject")
fso.MoveFile sDatei, "d:\xml_verschieben" & "\" & sName

sName = Dir
Me!anz_datei = sName ' Datei in Bezeichnungsfeld bez_datei anzeigen
Loop

MsgBox "Der Feedback Import ist abgeschlossen!", vbOKOnly, "Statusmeldung"

Err_btn_XML_Importieren_Click:
Set fso = CreateObject("Scripting.FileSystemObject")
fso.MoveFile sDatei, "d:\xml_verschieben\fehlerhafte" & "\" & sName
Me!anz_datei = sName
MsgBox sDatei & vbCrLf & "muss in Ordner: fehlerhafte verschoben werden !"
' ***Hier, bzw. vor der MsgBox soll wieder gestartet werden ***
End Sub

Wie Du siehst, verschiebe ich die Dateien sobald ein Fehler auftritt in den Ordner fehlerhafte.
Nun soll aber die Sub weiterlaufen und das bekomme ich nicht hin.
Ich habe es schon mit GoTo versucht und call "sub", aber irgendwie funktioniert das nicht.

könntest Du mir da noch einen Tipp geben ?

Also statt der MsgBox möchte ich die Private Sub wieder starten, sonst muss ich 800 x ok drücken um wenigstens erstmal die Fehlerhaften dateien zu isolieren.
:)

Louisleon
09.01.2009, 20:02
Hallo KeithKeith,

setz doch mal anstatt der MsgBox einen:
Resume Next

und schau Dir die Hilfe zu "Resume" an.

Gruß

LL

ebs17
09.01.2009, 20:40
Hallo Martin,

Du benötigst eine etwas flexiblere Fehlerbehandlung, um den "planmäßigen" Fehler gesondert zu behandeln. Dieser Importfehler betrifft sicher die Zeile Application.ImportXML ...
Vorab ermittelst Du mal durch Auskommentieren von On Error GoTo Err_btn_XML_Importieren_Click die Fehlernummer des Fehlers (ist hoffentlich nur einer). Und dann könnte es so aussehen:
Private Sub btn_XML_Importieren_Click()
On Error GoTo Err_btn_XML_Importieren_Click

Dim fso As Object
Dim sDatei As String
Dim sPfad As String
Dim sName As String

Set fso = CreateObject("Scripting.FileSystemObject")
sPfad = "d:\xmldaten" ' Pfad setzen aus der die XML geholt wird
sName = Dir(sPfad & "\*.xml") ' Name der Datei ermitteln

Do While sName <> "" ' Schleife beginnen
sDatei = sPfad & "\" & sName ' Gesamt URL erstellen

On Error Resume Next
' Daten werden in neue Tabelle geschrieben
Application.ImportXML _
DataSource:=sDatei, _
ImportOptions:=acAppendData

If Err.Number = XXX Then
fso.MoveFile sDatei, "d:\xml_verschieben\fehlerhafte" & "\" & sName
Me!anz_datei = sName
'MsgBox sDatei & vbCrLf & "muss in Ordner: fehlerhafte verschoben werden !"
Err.Clear


Else

On Error GoTo Err_btn_XML_Importieren_Click
' Anfügeabfrage starten
CurrentDb.Execute "INSERT INTO tblsponsor " _
& "SELECT sponsor.* FROM sponsor;"

' Erzeugte Tabelle wieder löschen
DoCmd.DeleteObject acTable, "sponsor"

' XML-Datei verschieben

fso.MoveFile sDatei, "d:\xml_verschieben" & "\" & sName

sName = Dir
Me!anz_datei = sName ' Datei in Bezeichnungsfeld bez_datei anzeigen
End If
Loop

MsgBox "Der Feedback Import ist abgeschlossen!", vbOKOnly, "Statusmeldung"

Exit_btn_XML_Importieren_Click:
Set fso = Nothing
Exit Sub
Err_btn_XML_Importieren_Click:
MsgBox Err.Number & ": " & Error.Description
Resume Exit_btn_XML_Importieren_Click:
End Sub

Anmerkung: Die sonstige Fehlerbehandlung darfst Du wegen des einen "planmäßigen" nicht streichen.

keithkeith
09.01.2009, 21:23
Guten Abend und Danke :)
Hab das Script jetzt so wie Eberhard vorgeschlagen hat eingefügt und als fehlernummer die 424 angegeben in:
If Err.Number = 424 Then

Jetzt markiert Access bei der Fehlermeldung die Zeile:
MsgBox Err.Number & ": " & Error.Description gelb.

Es werden keine xmls importiert.

Woran kann das denn nu liegen ?:)

ebs17
09.01.2009, 21:39
MsgBox Err.Number & ": " & Err.Description
Der Code war nur so ins Blaue geschrieben, kleine Fehler können da immer sein so ohne Test.

keithkeith
09.01.2009, 22:17
okay,
nun kommt der Fehler:
3078:Das MS Office Access Datenbankmodul findet die Eigabetabelle oder Abfrage 'Sponsor' nicht. Stellen Sie sicher, dass sie vorhanden ist und der Name richtig eingegeben wurde.

hmmmm
Was mir nicht ganz klar ist:
Muß nicht die Abfrage nach dem speziellen Fehler (424) vor die Abfrage "allgemein" nach Fehlern ?

und direkt nach beginn der Schleife ist eine resume anweisung ? unterbricht sie denn dort nicht direkt alles ?

Louisleon
09.01.2009, 22:54
Hallo KeithKeith,

ich denke die flexiblere Fehlerbehandlung die eberhard meinte sollte evtl. so aussehen (ungetestet):
Option Compare Database
Option Explicit
Private Sub btn_XML_Importieren_Click()
On Error GoTo Err_btn_XML_Importieren_Click


Dim fso As Object
Dim sDatei As String
Dim sPfad As String
Dim sName As String
sPfad = "d:\xmldaten" ' Pfad setzen aus der die XML geholt wird
sName = Dir(sPfad & "\*.xml") ' Name der Datei ermitteln

Do While sName <> "" ' Schleife beginnen
sDatei = sPfad & "\" & sName ' Gesamt URL erstellen



' Daten werden in neue Tabelle geschrieben
Application.ImportXML _
DataSource:=sDatei, _
ImportOptions:=acAppendData

' Anfügeabfrage starten
CurrentDb.Execute "INSERT INTO tblsponsor " _
& "SELECT sponsor.* FROM sponsor;"

' Erzeugte Tabelle wieder löschen
DoCmd.DeleteObject acTable, "sponsor"

' XML-Datei verschieben
Set fso = CreateObject("Scripting.FileSystemObject")
fso.MoveFile sDatei, "d:\xml_verschieben" & "\" & sName

sName = Dir
Me!anz_datei = sName ' Datei in Bezeichnungsfeld bez_datei anzeigen
Loop

MsgBox "Der Feedback Import ist abgeschlossen!", vbOKOnly, "Statusmeldung"

Exit_btn_XML_Importieren_Click:
Set fso = Nothing
Exit Sub
Err_btn_XML_Importieren_Click:

If Err.Number = 424 Then
fso.MoveFile sDatei, "d:\xml_verschieben\fehlerhafte" & "\" & sName
Me!anz_datei = sName
'MsgBox sDatei & vbCrLf & "muss in Ordner: fehlerhafte verschoben werden !"
'Err.Clear 'denke der ist beim Resume Next überflüssig
Resume Next
Else
MsgBox Err.Number & ": " & Err.Description
Resume Exit_btn_XML_Importieren_Click:
Endif

Gruß

LL

kama
09.01.2009, 23:31
Hallo
Nachdem das Ganze hier soweit gediehen ist, hier mal ein Vorschlag der einen Ansatz ohne VBA, also Importspezifikation (Anhang) und SQL
Bitte die _ durch < ersetzen, läßt sich hier nicht darstellen
SELECT IIf([id] Mod 2=1,[id],[id]-5) AS SatzID,
IIf([Bezeichnung]="_authAmount","Spendenbetrag","Name") AS Feldname, Left([Inhalt],InStr([Inhalt],"_")-1) AS Feldinhalt
FROM Test
WHERE ((([bezeichnung]="_authAmount")=-1)) OR ((([bezeichnung]="_name")=-1));


TRANSFORM First(Abfrage1.Feldinhalt) AS ErsterWertvonFeldinhalt
SELECT Abfrage1.SatzID
FROM Abfrage1
GROUP BY Abfrage1.SatzID
PIVOT Abfrage1.Feldname;

keithkeith
10.01.2009, 00:16
Ich habe jetzt mal diese kleine Beispiel DB angehängt inkl zwei xml dateien die typisch sind.

Vielleicht könnt ihr euch die ja mal angucken, ich bekomme das nicht hin ?!? :(

ebs17
10.01.2009, 12:43
Bei meinem Vorschlag wurde die Schleife bei Fehler nicht fortgeführt.
Louisleons Vorschlag greift auch etwas kurz, da bei Importfehler die für die Anfügeabfrage notwendige Tabelle noch nicht angelegt ist und somit Folgefehler auftreten (betrifft dann auch noch das Dateiverschieben).

Was der Fehler 424 aussagt, habe ich nicht geprüft, jedoch hatte ich es mit einem anderen zu tun:
Fehler 31592 - ungültiges Zeichen in XML-Schema

Die folgende Anweisung lief bei mir fehlerfrei durch. Hier wird aber der Einfachheit halber bei jedem Fehler die XML-Datei aussortiert, sauberer wäre eine Reaktion nur auf die relevanten Fehler beim Import. Die Ermittlung dieser erspare ich mir an dieser Stelle, zumal eine fehlerhafte XML-Datei in dieser Richtung nicht aussagekräftig genug ist.
(Achtung: Buttonbezeichnung und Ordner abweichend)
Private Sub Befehl4_Click()
On Error GoTo Err_Befehl4_Click

Dim fso As Object
Dim sDatei As String
Dim sPfad As String
Dim sName As String

Set fso = CreateObject("Scripting.FileSystemObject")
sPfad = CurrentProject.Path & "\xmldaten" ' Pfad setzen aus der die XML geholt wird
sName = Dir(sPfad & "\*.xml") ' Name der Datei ermitteln

Do While sName <> "" ' Schleife beginnen
sDatei = sPfad & "\" & sName ' Gesamt URL erstellen

On Error Resume Next
' Daten werden in neue Tabelle geschrieben
Application.ImportXML _
DataSource:=sDatei, _
ImportOptions:=acAppendData

If Err.Number <> 0 Then
fso.MoveFile sDatei, CurrentProject.Path & "\xml_fehlerhafte" & "\" & sName
Me!anz_datei = sName
Err.Clear
On Error GoTo Err_Befehl4_Click

Else

On Error GoTo Err_Befehl4_Click
' Anfügeabfrage starten
CurrentDb.Execute "INSERT INTO tblsponsor " _
& "SELECT sponsor.* FROM sponsor;"

' Erzeugte Tabelle wieder löschen
DoCmd.DeleteObject acTable, "sponsor"

' XML-Datei verschieben
fso.MoveFile sDatei, CurrentProject.Path & "\xml_verschieben" & "\" & sName
Me!anz_datei = sName ' Datei in Bezeichnungsfeld bez_datei anzeigen
End If
sName = Dir
Loop

MsgBox "Der Feedback Import ist abgeschlossen!", vbOKOnly, "Statusmeldung"

Exit_Befehl4_Click:
Set fso = Nothing
Exit Sub
Err_Befehl4_Click:
MsgBox Err.Number & ": " & Err.Description
Resume Exit_Befehl4_Click:
End Sub

Louisleon
10.01.2009, 13:48
Hallo,

wie Eberhard richtig bemerkte (ungetestet!) war das auch nicht das gelbe vom Ei.
Bei mir läuft folgende Variante mit deinen Testdaten (getestet):
Private Sub btn_XML_Importieren_Click()
On Error GoTo Err_btn_XML_Importieren_Click


Dim fso As Object
Dim sDatei As String
Dim sPfad As String
Dim sName As String
sPfad = BrowseForFolder("Bitte Ordner wählen", CurrentProject.Path & "\xmldaten") ' Pfad setzen aus der die XML geholt wird
sName = Dir(sPfad & "\*.xml") 'Dateinamen ermitteln
Set fso = CreateObject("Scripting.FileSystemObject")

Do While sName <> "" ' Schleife beginnen
sDatei = sPfad & "\" & sName ' Gesamt URL erstellen
' Daten werden in neue Tabelle geschrieben
Application.ImportXML _
DataSource:=sDatei, _
ImportOptions:=acAppendData
' Anfügeabfrage starten
CurrentDb.Execute "INSERT INTO tblsponsor " _
& "SELECT sponsor.* FROM sponsor;"

' Erzeugte Tabelle wieder löschen
DoCmd.DeleteObject acTable, "sponsor"

' XML-Datei verschieben
fso.MoveFile sDatei, CurrentProject.Path & "\xml_verschieben" & "\" & sName

Me!anz_datei = sName ' Datei in Bezeichnungsfeld bez_datei anzeigen
sName = Dir(sPfad & "\*.xml") ' Nächsten Dateinamen ermitteln
GoTo End_Loop

Exit_btn_XML_Importieren_Click:
Set fso = Nothing
Exit Sub
Err_btn_XML_Importieren_Click:

If Err.Number = -1072896749 Then
fso.MoveFile sDatei, CurrentProject.Path & "\xml_verschieben\fehler\" & sName
Me!anz_datei = sName
sName = Dir(sPfad & "\*.xml") ' Nächsten Dateinamen ermitteln
'MsgBox sDatei & vbCrLf & "muss in Ordner: fehlerhafte verschoben werden !"
Resume End_Loop
Else
MsgBox Err.Number & ": " & Err.Description
Resume Exit_btn_XML_Importieren_Click:
End If
End_Loop:
Loop
Set fso = Nothing
MsgBox "Der Feedback Import ist abgeschlossen!", vbOKOnly, "Statusmeldung"
End Sub


wobei mich die unterschiedlichen Fehlernummern bei allen ein wenig irritieren (evtl. Versionsunterschiede??)

Gruß

LL

ebs17
10.01.2009, 14:24
wobei mich die unterschiedlichen Fehlernummern bei allen ein wenig irritieren
Da liege ich ja mit Err.Number <> 0 auf der sicheren Seite.
Es wäre wohl sinnvoll, bei der genannten Anzahl an fehlerhaften Dateien (800) Dateiname und Fehler per Anfügeabfrage in einer zusätzliche Logtabelle zu erfassen, um den Importfehler (oder die Importfehler) zu erfassen und letztendlich durch geeignete Korrekturmaßnahmen auf 0 runterzufahren.

keithkeith
10.01.2009, 14:32
Hi Eberhard und Louisleon,
Eberhards Version habe ich angepasst und sie läuft auch durch.
Louisleons Version bekomme ich nicht zum laufen (noch nicht).
Hab' Access 2007 aber die DB speicher ich als 2003.
Von insg. 4500 Dateien bleiben ca.480 übrig.
Mir ist nicht ganz klar warum, aber immerhin habe ich sie jetzt isoliert.

Die Idee mit der Ordnerwahl am anfang usw finde ich super, aber jetzt muss ich erstmal gucken warum die Dateien nicht importiert werden :)
Aber bis hier alles klasse, danke :)

keithkeith
10.01.2009, 14:35
Bei einigen Dateien gibt es doppelte Feldnamen.
Soweit der Anfang :(
Also<bla>utf8</bla><bla>hallo</bla>
Das ist Problem nr 1

Sascha Trowitzsch
10.01.2009, 15:02
Nur mal für dein oben gepostetes test_fehlerhaft_contract.xml...
Inkorrekt ist laut VS2008 die Stelle:
Uert, Wertr & Company GmbH
Fehler 1 Unzulässige Syntax. Ein gültiges Zeichen am Anfang des Namens wird erwartet.und
Fehler 2 Das Zeichen ' ', Hexadezimalwert 0x20, ist in einem XML-Namen nicht zulässig.

Vorschlag:
Hole dir mal einen tauglichen XML-Viewer, wie etwa das kostenlose XML-Notepad:
http://www.microsoft.com/downloads/details.aspx?familyid=72d6aa49-787d-4118-ba5f-4f30fe913628&displaylang=en
Da kannst du die fehlerhaften XMLs reinladen und auf Fehler parsen.
Danach kannst du den XML-Ersteller darauf hinweisen, welche Fehler das sind und bitten, vielleicht mal korrekte Tools für den XML-Export zu verwenden bzw. sowas wie "Name" nicht als Feldnamen zu verwenden.
Denn bei 480 falschen Dateien ist das Vorhaben doch witzlos, oder?

Ciao, Sascha

Louisleon
10.01.2009, 15:36
Eberhards Version habe ich angepasst und sie läuft auch durch.
Louisleons Version bekomme ich nicht zum laufen (noch nicht).

Na, wenn Du eine lauffähige Version hast ;)
Aber wo hängst Du bei meiner Version?
Ich habe hier nur Acc2003 und habe den Test mit deinen beiden Versionen laufen lassen. Allerdings habe ich jetzt feststellen müssen, das keine Daten in die Tabelle importiert wurden ??
Das XML kommt bereits nur mit den Feldnamen rein, keine Daten :( (??)
Da kann ich dann auch nur Sascha zustimmen mit seinem Hinweis aus #36!
Aber wie gesagt, mich würde nur interessieren wo es bei Dir hängt?

Gruß

LL

keithkeith
10.01.2009, 16:46
Also, wenn ich einfach deinen Code einfüge, ins ereignis meiner schaltfläche, kommt als erstes dieser fehler
'Fehler beim Kompilieren'
'Sub, oder Funktion nicht definiert'

Dann markiert Acc mir diesen Teil:
***BrowseForFolder***

Liegt wohl an meiner Acc Version ?

ebs17
10.01.2009, 17:01
BrowseForFolder ist keine Standardfunktion, sondern ein eigendefinierter Verzeichnisauswahldialog. Da muss das entsprechende Modul (ein paar Win-API´s sind enthalten) ergänzt werden.

keithkeith
10.01.2009, 17:05
HI Sascha,
danke für den Tipp.
Ich habe mir mal das Notepad inst.
Leider kann ich nicht die xml dateien ins programm laden, macht es nicht, allerdings hab ich auf Umwegen herausgefunden das es wohl am & und @ liegt.
zumindest sind das schonmal Fehler.
Allerdings brauche ich in den Daten zumindest das @ Zeichen in den Emailadressen.
Ist es Möglich das es sich um einen anderen Schriftsatz (Format ) handelt und aber trotzdem als @ zeichen angezeigt wird ?
Wenn ich das originale @ und & durch @ und & aus dem Notepad verwende kann ich die datei ins Notepad ohne probleme laden.

ich habe mal eine datei inkl dieser zeichen angehängt.

keithkeith
10.01.2009, 17:07
@Eberhard, danke für den Hinweis.

keithkeith
10.01.2009, 18:12
AAAAlso, ich denke ich habe den Fehler gefunden.
Es geht um sämtliche Sonderzeichen und Umlaute.
@&ß üöä (bei denen ist es sicher)

Die Zeichen scheinen in einem fremden (auch mir fremden :rolleyes: ) Format zu sein.

Ich könnte jetzt alle durch suchen/ersetzen - ersetzen und dem Hersteller davon berichten :) So werde ich es wohl auch machen, aber so richtig verstehe ich nicht warum ein z. B. @ gleich aussieht, aber doch unterschiedlich zu sein scheint.

Hab jetzt aber doch noch 'ne Frage dazu !
Gibt es die Möglichkeit sich das tatsächliche Format anschauen zu können, oder ein Programm welches mir zeigt wie das Zeichen nun wirklich aussieht ?

ebs17
10.01.2009, 18:25
Wenn Du die Position eines fraglichen Zeichens kennst, kannst Du den Wert laut Zeichsatztabelle ermitteln:
Zugriff auf XML-Datei über Textdateizugriff (hatten wir weiter vorn schon).
Dim Zeichencode As Long
Zeichencode = Asc(Mid(sText, Position, 1))
Zeichencodetabelle (http://www.asphelper.de/referenz/asciiansi.asp)

Sascha Trowitzsch
10.01.2009, 18:48
Ich denke, dass es sich ausschließlich um das & handelt. Das wird wie in HTML als Operator zur Codierung von Sonderzeichen verwendet.
Und ein Zeichen & mit folgendem Leerzeichen (char(32)) gibt es eben nicht, weshalb das Datum ungültig ist.
Korrekt müsste da z.B. stehen:

Melly & amp; Hayri blabla
(& amp ohne Leerzeichen dazwischen; muss es hier so schreiben, weil's das Forum sonst eben als HTML interpretiert)
D.h., du könntest alle Dateien vorbehandeln, indem das & durch & amp; ersetzt wird.

Ciao, Sascha

Louisleon
10.01.2009, 19:10
Dann markiert Acc mir diesen Teil:
***BrowseForFolder***

Die Funktion habe ich deiner DB File_und_import entnommen.
Sorry, dachte du hast die Module mit drin.

Gruß

LL

keithkeith
10.01.2009, 20:54
Hi Sascha,
leider betrifft es doch alle angesprochenen Zeichen, nicht nur das &
hmmm, was könnte man da noch machen ?

Wie kann ich mir das anzeigen lassen ?

keithkeith
10.01.2009, 21:34
Hi,
also irgendwas stimmt da nicht,
wenn ich in einer datei "per hand" z. B. das ö durch ö ersetze wird die datei erkannt und importiert.
mache ich das für alle dateien, durch suchen/ersetzen, funnktioniert es nicht ?!?

andere dateien werden obwohl sie auch ein ö enthalten, oder ß, & etc trotzdem importiert ?

Dann finden sich in der Tabelle der importierten xmls folgende Varianten ?
Arenbergerstraße ,Kurze Straße usw.

oje :(

keithkeith
11.01.2009, 22:26
Hi, ein weiteres Problem dabei ist das ich die Daten der Tabelle mittels Abfrage reduzieren muß und mir auch das nicht gelingt.
Durch einfaches Gruppieren und bilder der Summe an entsprechender Stelle sollte es ja möglich sein, ist es aber nicht, wegen dieser anscheinend versteckten Zeichen ?!?

Vielleicht noch jemand einen Tipp :) für mich übrig ?