PDA

Vollständige Version anzeigen : Fehler in SELECT INTO-Anweisung


sweber
20.06.2001, 15:10
Hallo!

In untenstehender SELECT INTO-Anweisung ist
laut Access97 der Fehler:

Laufzeitfehler 3105.
Fehlender Zielfeldname in SELECT INTO-Anweisung (hotel-id).

dbs.Execute ("SELECT datum, hotel-id INTO dateiname IN ""d:\sascha"" ""Text;"" FROM Aktionen")

Leider kann ich keine Doku finden, die mir sagt, wo ich den Zielfeldnamen angeben muss.

Kann mir da jemand weiterhelfen?

Wola
20.06.2001, 15:21
Hi,
versuchs mal mit " ... [hotel-id] ..."
grüße wola

Ohnesorg
20.06.2001, 15:35
Hi Sascha,

kann es sein, dass Du versuchst mit dieser SQL Anweisung in eine Datei zu schreiben oder umgekehrt?
Ich würde Dir gerne helfen, bräuchte aber mehr Hintergrund.... Nein, ich meine nicht Deinen Bildschirmhintergrund. Mehr Info's, meine ich... :D

So wie es ausguckt, sind da mehrere Fehler in der SQL.

sweber
22.06.2001, 10:16
Hallo Ohnesorg!

> kann es sein, dass Du versuchst mit dieser SQL Anweisung in eine Datei zu schreiben oder umgekehrt?

Ja, ich will bestimmte Felder einer Tabelle aus einer externen DB als CSV in eine Datei schreiben.
Nehme ich alle Felder, also SELECT *, dann klappt das wunderbar. Ich brauche aber nur ein paar Felder und da gibt es eben Probleme. Angeblich fehlt die Angabe des Zielfeldes aber ich finde nirgendwo einen Hinweis wo ich das Zielfeld angeben muss. In dem Beispiel die hotel-id in eckige Klammern zu setzen bringt auch nichts.

Ohnesorg
22.06.2001, 10:33
Hallo Sascha,

JETZT kommen wir der Sache schon näher! ;)

dbs.Execute ("SELECT datum, hotel-id INTO dateiname IN ""d:\sascha"" ""Text;"" FROM Aktionen")

Es sollen die Felder "datum" und "hotel-id" übernommen werden.

der Teil "dbs.Execute ("SELECT datum, hotel-id INTO" stimmt schonmal.

Der Fehler liegt im Teil "dateiname IN ""d:\sascha"" ""Text;"" FROM Aktionen")"

Entferne doch mal den Eintrag mit der "hotel-id" und führe das Script nochmal aus.

wenn die Spalte in die das "datum" eingetragen wird nun "dateiname" heißt, wirst Du feststellen, dass es wie folgt heißen sollte:

dbs.Execute ("SELECT datum, hotel-id INTO feld1, feld2 IN ""d:\sascha"" ""Text;"" FROM Aktionen")

wobei feld1 und feld2 die Beiden Zielfelder sind.

Ich habe das allerdings nicht geteste, jedoch vor einiger Zeit mal SQL Beruflich programmiert. Leider nicht lange genug um darin richtig fit zu sein. Aber soweit ich mich erinnere sieht es so aus, dass Du in der Reihenfolge die Zielfelder angeben musst in der auch die Quellfelder aufgezählt sind.

Des weiteren muss auch die Anzahl und die Datentypen der Felder übereinstimmen.

Besser ist es auch vor jedem Feldnamen auf die entsprechende Tabelle zu referenzieren. Also Tabellname.Feldname, Tabellenname.Feldname2... u.s.w.

So lassen sich Fehler besser finden und beheben. Und für andere Programmierer ist der Quelltext besser lesbar. :D

P.S.: Sollten da Schreibfehler sein, ignoriere mich bitte! :D

sweber
22.06.2001, 10:48
Hallo Ohnesorg!

> Der Fehler liegt im Teil "dateiname IN ""d:\sascha"" ""Text;"" FROM Aktionen")"
> Entferne doch mal den Eintrag mit der "hotel-id" und führe das Script nochmal aus.

Der Befehl
SELECT datum INTO dateiname IN "d:\sascha" "Text;" FROM Aktionen
fuehrt dann zu folgender Fehlermeldung:

"3011: Das Microsoft Jet-Datenbankmodul konnte das Objekt aktionen.txt nicht finden. ..."

Wieso der auf einmal nach aktionen.txt sucht weiss ich auch nicht.

> dbs.Execute ("SELECT datum, hotel-id INTO feld1, feld2 IN ""d:\sascha"" ""Text;"" FROM Aktionen")

Das funktioniert leider nicht. An der Stelle von feld1, feld2 muss die neue Tabelle stehen. So sagt es jedenfalls die Online-Hilfe:

SELECT feld1, feld2 INTO NeueTabelle IN Extern FROM Quelle

Ohnesorg
22.06.2001, 11:04
Hi Sascha,

das MUSS doch irgendwie gehen... lass mal kurz überlegen.
SQL ist sehr umgangssprachlich.

Probiere es doch mal mit:

SELECT [feld1], [feld2] FROM quelltabelle IN 'pfad_und_dateiname_des_zieles'

Wenn das nicht funktioniert... Ich habe mich gerade eben auch durch die OL - Hilfe geklickt... Also ich denke das sollte laufen. Wenn nicht, tut es mir leid, dann weiß ich auch nicht weiter. :confused:

holgii
22.06.2001, 11:38
Hallo Sascha,

der Befehl SELECT ... INTO ... generiert eine TABELLEN-ERSTELLUNGSABFRAGE !

Und die erwartet als Ausgabedatei 'ne .mdb-Datei, worin die Tabelle erstellt werden soll.

Lösung für Dein Problem könnte z.B. sein:
Erstelle eine "normale" Auswahlabfrage, und benutze die OutputTo-Methode.

Gruß
holgii

Birgit Dannenberg
22.06.2001, 11:45
Ja, es gibt sicher andere Möglichkeiten, den Datenexport hinzukriegen.

Aber mich interessiert jetzt mal, wie das mit dem "Select *" denn funktioniert hat. Bitte schreib mal die genaue Syntax!
Ich bekomme im günstigsten Fall den Fehler :
3027 Aktualisieren nicht möglich. Datenbank oder Objekt ist schreibgeschützt.

egal ob mit oder ohne Feldliste.


Birgit

holgii
22.06.2001, 11:59
Hallo Birgit,

hier kommt die Syntax zu SELECT...INTO...:

SELECT [Feld1], [Feld2], [Feld3] into ZielTabelle in "\\servername\freigabename\PfadDeinerZielDB\DeineZielDB.mdb"
FROM QuellTabelle;

oder für Komplett-Export in .csv-Dateien:

SELECT * INTO NichtExistierendeZielDatei IN '\\servername\freigabename\PfadDeinerCSV' 'Text;'
FROM Quelltabelle;


Um Dein Problem zu lösen, Sascha, kannst Du anstatt "FROM Quelltabelle" auch "FROM QuellAbfrage" verwenden.

Habe diesen Beitrag nach mehreren Tests (und neuen Erkenntnissen) korrigieren müssen...

Für zuvor kühn aufgestellte Behauptungen, die nicht gaaaanz richtig waren, möchte ich mich entschuldigen...

Gruß + HTH
holgii

Birgit Dannenberg
22.06.2001, 12:17
Sorry holgii,
meine Frage galt *natürlich* Sascha (sweber).

Hallo SASCHA!! Fühl Dich bitte angesprochen!! (s.o)


Birgit

sweber
22.06.2001, 13:03
Hallo Holgii!

> der Befehl SELECT ... INTO ... generiert eine TABELLEN-ERSTELLUNGSABFRAGE !
> Und die erwartet als Ausgabedatei 'ne .mdb-Datei, worin die Tabelle erstellt werden soll.

Das muss keine mdb-Datei sein, da bin ich mir ziemlich sicher. Es klappt ja auch, wenn ich alle Felder der Tabelle exportieren will.

sweber
22.06.2001, 13:06
Hallo Birgit!

> Aber mich interessiert jetzt mal, wie das mit dem "Select *" denn funktioniert hat. Bitte schreib mal die genaue Syntax!

dbs.Execute ("SELECT * INTO mein_export IN ""d:\sascha"" ""Text;"" FROM Aktionen")

Danach habe ich in d:\sascha\mein_export einen CSV-Export der kompletten Tabelle "Aktionen", in der ersten Zeile stehen die Feld-Bezeichner und in den nachfolgenden Zeilen die Datensaetze.

holgii
22.06.2001, 13:06
Hallo,

habe meinen Beitrag oben nochmal überarbeitet...

Deswegen: Nach oben damit !

holgii

sweber
22.06.2001, 13:26
Hallo Holgii!

> Um Dein Problem zu lösen, Sascha, kannst Du anstatt "FROM Quelltabelle" auch "FROM QuellAbfrage" verwenden.

Wenn Du mir jetzt noch sagst, wie ich der Abfrage beibringe, dass sie ueber eine Tabelle in einer externen Access-DB geht... :-)
Es sind im uebrigen unterschiedliche Tabellen und unterschiedliche Felder zu exportieren.
Somit brauche ich den Kram generisch. Ich habe aber auch nichts dagegen mir eine Funktion zu bauen, die dann temporaer die entsprechende Abfrage erstellt (wenn ich es schon geschafft habe dynamische Forms mit Code zu bauen, wird das mit der Abfrage auch klappen).

holgii
22.06.2001, 13:37
Hallo,

SELECT * (oder Feld1, Feld2 usw.) FROM Tabelle IN "C:\Pfad\DB.MDB"

sollte funktionieren.

Gruß
holgii

Birgit Dannenberg
25.06.2001, 07:34
Hallo, Ihr Lieben!

Da ich den Datenexport bislang immer recht aufwendig programmiert habe, mit Exportspezifikationen für jede Variante, finde ich diese Methode ziemlich interessant.

Doch leider scheitert es bei mir weiterhin an dem Fehler
>> 3207: Aktualisieren nicht möglich. ... (s.o.)
Mein sqlstring sieht folgendermaßen aus:
>> "select * into test1 in 'C:\temp\' 'text;' from tab1"

Was mache ich denn nur falsch???

Gruss Birgit

holgii
25.06.2001, 08:57
Hallo Birgit,

eine Datei "Test1" bzw "Test1.txt" sollte in "C:\Temp" noch nicht existieren.

Ansonsten unterscheidet sich Dein SELECT-Statement nur durch den "\" am Ende von "c:\temp\" von meinem Statement, was fehlerfrei funktionierte...

Versuch doch mal:

"SELECT * INTO 'Test1' in 'C:\TEMP' 'Text;' from Tab1"


Gruß
holgii

A.S.
25.06.2001, 09:07
Moin Moin,

kann es sein das jeweils das abschließende Semikolon am Ende des SQL-Strings fehlt? ;)

Gruß

Arno

Birgit Dannenberg
25.06.2001, 09:27
Nein, das Semikolon ist nicht nötig und der Backslash macht auch keinen Unterschied, ich habe beides ausprobiert.

Allerdings habe ich inzwischen noch einen anderen Beitrag zu diesem Thema gefunden (Stichwort: Fehler 3027), weiß aber nicht so recht wie ich das verstehen soll bzw. was ich tun kann, um den Fehler zu umgehen.

Kann mir da vielleicht jemand auf die Sprünge helfen??
(Einen Eingriff in die Registry möchte ich nur im äußersten Notfall vornehmen!)

Gruss Birgit

holgii
25.06.2001, 13:32
Hallo Birgit,

teste mal dieses Statement:

"SELECT * INTO [Test1.csv] in 'C:\TEMP' 'Text;' from Tab1"

Dann wird der Text-Datei die Endung .csv mitgegeben, damit hätte man den FAQs von Donkarl entsprochen und eine registrierte Datei-Endung verwendet...

Gruß
holgii

Birgit Dannenberg
26.06.2001, 07:11
Super, holgii, so geht's! (Ohne die eckigen Klammern brachte die Dateierweiterung einen Fehler.)

Viele Dank, Birgit

sweber
26.06.2001, 07:47
Hallo Holgii,

> SELECT * (oder Feld1, Feld2 usw.) FROM Tabelle IN "C:\Pfad\DB.MDB" sollte funktionieren.

Kann ich mir gut vorstellen, da das Ausgabe-Ziel wieder eine Access-DB ist.
Ich muss den Kram aber in einer Text-Datei im CSV-Format stehen haben.

holgii
26.06.2001, 11:44
Hallo Sascha,

diese Abfrage:

SELECT * (oder Feld1, Feld2 usw.) FROM Tabelle IN "C:\Pfad\DB.MDB"

speicherst Du in Deiner Datenbank, wo auch Dein VBA-Code gespeichert ist, ab (z.B. "qryExportdatenAusQuellDB").

Mit dieser Syntax bekommst Du Daten aus einer externen QuellDB angezeigt.

Anschließend kannst Du Dein VBA-Modul anwerfen, das sinngemäß wie folgt den csv-Export dieser Daten durchführt:

dbs.Execute("SELECT * INTO [Test1.csv] in 'C:\TEMP' 'Text;' from qryExportdatenAusQuellDB")

Das Abfrage-Ergebnis aus "qryExportdatenAusQuellDB" wird von Access wie eine Tabelle behandelt. Da mit "SELECT *" abgefragt wird, kommt seitens Access keine Meckerei (habbich getestet A97/SR-2)

Gruß
holgii

Ohnesorg
27.06.2001, 10:08
Hi,

wollen wir das mal richtig heftig machen... :D

Ich habe zwei Datenbanken, die im Grunde genommen nichts miteinander zu tun haben. Nennen wir diese Datenbank "A" und "B".

In Datenbank A habe ich eine Tabelle, die dubliziert, gelöscht und anschließend neu erstellt werden soll.

In Datenbank B habe ich ein Script, das diese Aktion durchführen soll.

Es geht jetzt nur darum die Tabelle aus Datenbank A von Datenbank B aus zu dublizieren.

Leider bekomme ich ein Problem, weil die Quelltabelle ebenfalls in einer externen Datenbank zugrunde liegt.

holgii
27.06.2001, 11:17
Hallo Ohnesorg,

in Deinem Fall, duplizieren einer Tabelle INNERHALB einer externen DB, würde sich doch vielleicht die CopyObject-Methode anbieten ?

Dim appAccess As Access.Application

Sub FormularAnzeigen()
Const strConPfadZuDenBeispielen = "C:\Programme" _
& "\MSOffice\Access\Beispiel\"

Dim strDB As String

' Die Zeichenfolge initialisieren, die den Pfad
' der Datenbank angibt.
strDB = strConPfadZuDenBeispielen & "Nordwind.mdb"
' Eine neue Instanz von Microsoft Access erstellen.
Set appAccess = _
CreateObject("Access.Application.8")

' Die Datenbank im Microsoft Access-Fenster öffnen.
appAccess.OpenCurrentDatabase strDB
' Das Formular "Bestellungen" öffnen.
appAccess.DoCmd.CopyObject, "NeuerName", acTable, "AlterName"
End Sub

Gruß
holgii