PDA

Vollständige Version anzeigen : Excel Import mittels INSERT INTO


Forza SGD
09.05.2011, 15:57
Hallo zusammen ... anbei mein SQL und meine Frage:

strSQL = "INSERT INTO tbl_kunden (KDNR, GA_Name, GA_Vorname, Betreuer) " & _
"SELECT T.kdnr, T.nachname_kunde, T.vorname_kunde, T.aq_name " & _
"FROM [excel 12.0 xml;hdr=yes;imex=1;DATABASE=U:\Daten\Test\" & objFile.Name & "].[Tabelle1$] AS T"

Bei der zu importierenden Exceltabelle herrscht folgendes Problem. Die Überschriften der Spalten befinden sich in der 7. Zeile und nicht in der ersten. Wie kann ich das denn Access begreiflich machen?

So erhalte ich immerzu die Fehlermeldung: 4 Parameter erwartet - zuwenig übergeben!"

Besten Dank!

ebs17
09.05.2011, 17:17
Siehe FAQ7.22 (http://www.donkarl.com?FAQ7.22)

Forza SGD
09.05.2011, 17:52
Super, funktioniert einwandfrei - hatte zwar zuvor auch schon mittels der range versucht einfluss zu hehmen, doch irgendwie immer wieder falsch!


Da du mir den Import via SQL string letzte woche nahe gelegt hast, hab ich noch eine Frage! Wieso klaptte das zuletzt, und jetzt treten diese Probleme auf? So ganz schlau bin ich aus der FAQ zugegebenermaßen nicht geworden!
Da selbt wenn cih die ersten 6 Zeilen lösche und die Tabelle quasi in Normalform bringe, kam die Fehlermeldung - erst durch angabe der range wurde das Problem gelöst!

Ich hoffe du verlierst auch in Zukunft nicht die Nerven mit mir ebs! Danke nochmal!

ebs17
09.05.2011, 18:04
Was hat ein eventueller Schreibschutz mit Lesen von Daten zu tun?
Die Überschriften der Spalten befinden sich in der 7. Zeile und nicht in der ersten.
Für eine Abfrage benötigt man schon eine ordentliche Tabelle. Die Anforderungen sind etwas höher als dass sich alles irgendwie in Zeilen und Spalten befindet.

Forza SGD
09.05.2011, 18:28
So weit schon klar - deswegen meint ich ja - ich hatte mal zum Test die tabelle in eine "ordentliche Form gebracht". Aber was mich wunderte war, dass die Fehlermeldung erneut auftrat. Bzw. hätte ich nicht damit gerechnet.

Die Tabellenform finde ich ebenfalls höhst unkomfortabel, doch liegt das nicht in meiner Macht dies zu ändern - in den ersten 6 Zeilen stehen halt die nötigen bzw. unnötigen Legenden!

ebs17
09.05.2011, 19:03
Zur "ordentlichen" Tabelle gehört auch:
- einzeilige Titelleiste
- keine Leer- und Sonderzeichen in den Bezeichnungen (oder Behandlung mit [])
- keine verbundenen Zellen
- keine Leerzeilen
- pro Spalte nur Werte gleicher Datentypen (in Excel gibt es nur Formate)

Die gestalterischen Möglichkeiten in Excel werden sehr gerne genutzt, was dann eine Vielzahl an Stolpersteinen bietet.

Als Variante könnte man nur die Daten (ohne Titelzeile, hdr=no) abgreifen, als Ersatzfeldnamen für die Quelltabelle ergeben sich dann F1, F2, F3, ... - das ist analog zur Behandlung mit TransferSpreadsheet. Hier wäre man aber auf eine richtige und konstante Reihenfolge der Spalten im Excelsheet angewiesen.

Forza SGD
11.05.2011, 17:39
Jut - meine Rückmeldung ließ etwas auf sich warten - soweit funktioniert alles und ich hab die Empfehlung an den Gestallter besagter Tabellen weitergeleitet.

Nochmals besten Dank ebs!

Eine Frage hat sich noch ergeben: Es gibt der gleichnamige Spalten namens Ergebnis, welche sich immer auf die vorgestellt Spalte Anruf 1 ... 3 beziehen. Kann ich die Spalten in der Form voneinander differenzieren, oder müssen die Spalten zwangsläufig in Ergebnis 1 bis 3 umbenannt werden?

ebs17
11.05.2011, 17:49
Namen müssen eindeutig sein.
Konstellationen wie "Sieh mal in die vorhergehende Spalte" sind in SQL nicht darstellbar, weil es eben keine Reihenfolge gibt. Daher verwendet man ja Spaltenbezeichnungen zur Identifizierung.
Du hättest wie oben genannt die Alternative, die Titelzeile ganz weg zu lassen.

Forza SGD
11.05.2011, 17:53
Danke für die schnelle Antwort - ich hatte gehoft das man die spalte vielleicht nich mittel des Position im Sheet bennen könnte - dann müssen die Herrschaften ihre Tabellen ändern.

Noch ne blöde Frage zur Variante ohne Titelzeile. Muss ich dann automatisch alle Zeilen übernehmen oder kann ich jene dann selektieren? Beispielsweise F1 F4 F13 etc.

ebs17
11.05.2011, 18:13
F1 F4 F13 ... sind die Ersatzspaltenbezeichner (Bezeichner der Spalten, nicht der Zeilen). Die kannst Du dann wieder frei auswählen.

Als Test könntest Du ein Recordset auf Deine Exceltabelle erstellen und Dir die Feldnamen mal zur Übersicht ausgeben (in allen Varianten, mit und ohne Titelzeile). Da sieht man, was "ankommt". Verkürzte Prinzipdarstellung:
Set rs = CurrentDb.Openrecordset("SELECT * FROM [excel 12.0 xml;hdr=yes...]")
For i = 0 To rs.Fields.Count - 1
Debug.Print rs.Fields(i).Name
Next

Forza SGD
12.05.2011, 15:01
Hallo ebs,

Wenn ich explizit die Spaltentitel anspreche funktioniert alles. Nun wollt ich ja vermeiden, dass jemand die 200 Excel Tabellen umbenennen muss, und hab mich mal an deinem Vorschlag eines Imports ohne Spaltentitel herangewagt. Allerdings ohne Erfolg:

Zunächst habe ich die Spaltenposition ermittelt, da in den Exceltabellen ne Menge Spalten ausgeblendet waren bzw. sind:

Dim rs As DAO.Recordset
Dim i As Integer
Dim anzahl As Integer

Set rs = CurrentDb.OpenRecordset("SELECT * FROM [excel 12.0 xml;hdr=no;imex=0;DATABASE=U:\Daten\Test\Kundendatei GA Mammen, Björn - KW. 18.xlsx].[Tabelle1$A7:BF300]")
For i = 0 To rs.Fields.Count - 1
anzahl = anzahl + 1
Debug.Print rs.Fields(i).Name, anzahl
Next

Im nächsten Schritt wollte ich die Spalten mit dem Ersatzspaltenbezeichner ansprechen:

For Each objFile In objFolder.Files

If objFSO.GetExtensionName(objFile) Like "xlsx" Then
anzahl = anzahl + 1
strSQL = "INSERT INTO tbl_kunden (KDNR, Kunde_nachname, Kunde_vorname, Betreuer, Anruf_1) " & _
"SELECT T.F4, T.F7, T.F8, T.F19, T.F44 " & _
"FROM [excel 12.0 xml;hdr=no;imex=0;DATABASE=U:\Daten\Test\" & objFile.Name & "].[Tabelle1$A7:BF300] AS T " & _
"WHERE T.F4 <> 0"
CurrentDb.Execute strSQL, dbFailOnError
End If
Next

Ergebnis ist die altbekannte Fehlermeldung: 5 Parameter wurder erwartet - zuwenige erhalten!

ebs17
12.05.2011, 15:22
Das Verhalten bei ausgeblendeten Spalten habe ich nicht ausgetestet. Du kannst ja die erwähnte Recordsetschleife mal verwenden, was da an Ersatzfeldbezeichnern wirklich verwendet wird und somit in der Abfrage verwendbar ist.
Nun wollt ich ja vermeiden, dass jemand die 200 Excel Tabellen umbenennen muss
Wenn es hilft, kannst Du das machen. Ein Programmierer würde dazu eine kleine Prozedur schreiben.

Ich kenne die Struktur und Verwendung dieser Exceltabellen natürlich nicht, aber: Manchmal könnte man in den Excelmappen zusätzliche Sheets anlegen, die genau die Daten anzeigen, die man benötigt. Als Titel kann man dort eigene funktionale verwenden.
Zur Wertebereitstellung in diesen Excelsheets verwendet man SVerweis oder andere Excelmethoden (evtl. auch interne Makros, also VBA). Es kommt eben ganz darauf an.

Als Ausweg, wenn man dann doch kein SQL anwenden kann (die TransferSpreadsheet-Methode versagt da dann auch), bleibt dann immer noch die zeilenweise Datenübernahme. Prinzip:
- Mappe per Automation öffnen
- Variantvariable = Datenbereich (Array wird erzeugt)
- Array zeilenweise in Recordset schreiben

Forza SGD
12.05.2011, 15:32
Sind ja Möglichkeiten über Möglchkeiten :upps: - aber ich hab`s jetzt zum Laufen bekommen. Ich hatte die alte range noch drin, und da setzte er halt wieder bei A7 an. Also lieferte er mir im Resultat genau das selbe wie bei hdr = yes - Ohne die Range liefert er die F1 F2 etc. als Feldnamen.

Aber nochmal vielen Dank ebs ...


In Frage muss ich dir noch stellen. Diese gehört zwar nocht hier her, aber da ich Dresdner im Exil bin und Du ja quasi um die Ecke lebst muss das mal sein. Besteht Interesse am lokalen Fussball?

Dann hab ich doch noch ne Frage: Ich hatte mal zum Test hdr=No, aber auch eine Range angegeben - zurückgeliefert hatte er mir die Werte der ersten Zeile der angegebenen Range - aber bei hdr=No werden diese Werte doch nicht als Spaltenüberschrift interpretiert, und die Hilfsbezeicher gibt Access nicht aus! Wäre das so ein Fall, bei welchen man mit SQL nicht weiterkommt?

ebs17
12.05.2011, 16:15
So extrem habe ich das nicht ausgetestet, und würde das auch nur in einem Fall extremen Interesses oder extremer eigener Schmerzen tun.
Primär würde ich mein Interesse und Bestreben dahin legen, ordentliche und standardisierte (in der Struktur gleichbleibende) Tabellen zu bekommen und eben nicht Datenmüll, verarbeitungsbetrachtet. Die einfachen Abläufe sind immer noch die besten (und schnellsten und fehlerunanfälligsten).

//OT:
Besteht Interesse am lokalen Fussball?Ja, aber kein übersteigertes. Wenn es mit Schwarz-Gelb mal richtig aufwärts gehen würde, wäre das eine große Freude. Aber die Führung und ein Teil der Fans wissen das erfolgreich zu verhindern. Man scheint doch lieber gegen Energie II zu spielen. So gilt ein Teil meines Interesses auch dem westfälischen Schwarz-Gelb (hat mit dem Name Sammer und mit ehemaligen beruflichen Verbindungen zu tun) - und da gibt es seit längerer Zeit Anlass für helle Begeisterung.

Forza SGD
12.05.2011, 16:22
Gut Kommando zurück - er gibt jetzt doch die alternativen Spaltentiel zurück, auch bei Verwendung einer Range und hdr=no - k.A. was ich da schon wieder vormasselt habe.

Mit den "ordentlichen" Tabellen bin ich ganz deiner Meinung - leider ist es mir bisher nicht recht gelungen jene die diese erstellen dafür zu sensibilisieren.

Mit dynamo haste da sicherlich Recht - Dynamo stand sich seit der wende zumeist selbst im Wege und fordert ne Menge Leidensfähigkeit! - was man auf den Mitgliederversammlungen jahr für jahr erlebt wäre eigentlich recht amüsant, wenns nicht so traurig wäre - aber die Hoffnung stirbt bekanntlich zuletzt - mal sehen ob wir die relegation erreichen - da es keinen Verkauf für auswärtige Vereinsmitglieder gab steh ich jetzt ohne Ticket da - obwohl Offenbach quasi um die Ecke ist!

Back to topic - also, funktionieren tut es jetzt trotz aller Umstände - vielen Dank!