kurz vor dem Wochenende benötige ich nochmals Hilfe in einer Sache, die mich
schon lange beschäftigt und ich keine Lösung dazu finde.
Ich importiere Daten aus Excel nach Access mit dem Befehl:
DoCmd.TransferSpreadsheet.
Das funktioniert auch wunderbar.
Nun bin ich aber auf der Suche nach einer Möglichkeit, bei der ich die nun
existente Tabelle in Access immer wieder per Button aktualisieren kann.
Die Exceltabelle enthält dabei wöchentlich neue und alte DS in gemischter
Form. Und ich möchte nun die bereits vorhandenen Daten in Access unberührt
lassen und nur die Neuen (Zeilen) in Excel anfügen. Mit einer Anfügeabfrage
funktioniert es deshalb nicht sicher, weil es sich um SAP-Daten handelt, die
auch gerne mal den Datentyp ändern. Das führt dann automatisch zu einer
Fehlermeldung...
Gibt es ein SQL-Befehl in Access, bei dem ich nur auf die neuen DS in Excel
zugreife, diese auslese und in die Access-Tabelle einpflege??
Danke für die Hilfe!! Ich verzweifele daran schon seit Tagen...
Schöne Grüße,
Holger
------------------------
in Excel:
J:\DATA\Transfertabelle.xls > Tabellenblatt Kopfdaten
in Access:
Tabelle: tbl_Kopfdaten
im SQL-Befehl könnte das Kriterium heißen... from * where
Auftragsnummer>tbl_Kopfdaten.Auftragsnummer ...
Holger D. wrote:
> Ich importiere Daten aus Excel nach Access mit dem Befehl:
> DoCmd.TransferSpreadsheet.
>
> Das funktioniert auch wunderbar.
> Nun bin ich aber auf der Suche nach einer M锟絞lichkeit, bei der ich die nun
> existente Tabelle in Access immer wieder per Button aktualisieren kann.
>
> Die Exceltabelle enth锟絣t dabei w锟絚hentlich neue und alte DS in gemischter
> Form. Und ich m锟絚hte nun die bereits vorhandenen Daten in Access unber锟絟rt
> lassen und nur die Neuen (Zeilen) in Excel anf锟絞en. Mit einer Anf锟絞eabfrage
> funktioniert es deshalb nicht sicher, weil es sich um SAP-Daten handelt, die
> auch gerne mal den Datentyp 锟絥dern. Das f锟絟rt dann automatisch zu einer
> Fehlermeldung...
>
> Gibt es ein SQL-Befehl in Access, bei dem ich nur auf die neuen DS in Excel
> zugreife, diese auslese und in die Access-Tabelle einpflege??
Du suchst nicht nach einem Befehl, sondern nach einem Konzept. Ich wuerde
so vorgehen:
- Excel-Daten per TransferSpreadsheet in temporaere Tabelle einlesen.
- Alle neuen DS per Anfuegeabfrage in die "echte" Tabelle schreiben.
Beispiel:
INSERT INTO PermanenteTabelle
SELECT * FROM TempTabelle AS T1
LEFT JOIN PermanenteTabelle AS T2 ON T1.ID=T2.ID
WHERE T2.ID Is Null
Gruss - Peter
--
Mitglied im http://www.dbdev.org
FAQ: http://www.donkarl.com
danke für die schnelle Antwort und ja, es funktioniert sicher, wenn da nicht
noch ein Problem wäre... Denn beim Ausführen erscheint immer die
Fehlermeldung:
Laufzeitfehler 3061: 2 Parameter wurden erwartet, aber es wurden zu wenig
Parameter übergeben.
Hättest du dort eine Möglichkeit, woran das liegt??
Das wäre super! Ich hänge mal bei, was ich gecodet habe.
Schönen Gruß,
Holger
-----------------------
Set db = CurrentDb
sqlstr = "INSERT INTO Haupttabelle SELECT * FROM TabtmpLink AS T1 LEFT
JOIN Haupttabelle AS T2 ON T1.Auftragsnummer=T2.Auftragsnummer WHERE
T2.Auftragsnummer is Null"
Debug.Print sqlstr
CurrentDb.Execute sqlstr
"Peter Doering" wrote:
> Hallo,
>
> Holger D. wrote:
>
> > Ich importiere Daten aus Excel nach Access mit dem Befehl:
> > DoCmd.TransferSpreadsheet.
> >
> > Das funktioniert auch wunderbar.
> > Nun bin ich aber auf der Suche nach einer Möglichkeit, bei der ich die nun
> > existente Tabelle in Access immer wieder per Button aktualisieren kann.
> >
> > Die Exceltabelle enthält dabei wöchentlich neue und alte DS in gemischter
> > Form. Und ich möchte nun die bereits vorhandenen Daten in Access unberührt
> > lassen und nur die Neuen (Zeilen) in Excel anfügen. Mit einer Anfügeabfrage
> > funktioniert es deshalb nicht sicher, weil es sich um SAP-Daten handelt, die
> > auch gerne mal den Datentyp ändern. Das führt dann automatisch zu einer
Holger D. wrote:
> danke f�r die schnelle Antwort und ja, es funktioniert sicher, wenn da nicht
> noch ein Problem w�re... Denn beim Ausf�hren erscheint immer die
> Fehlermeldung:
>
> Laufzeitfehler 3061: 2 Parameter wurden erwartet, aber es wurden zu wenig
> Parameter �bergeben.
>
> H�ttest du dort eine M�glichkeit, woran das liegt??
>
> Das w�re super! Ich h�nge mal bei, was ich gecodet habe.
> -----------------------
>
> Set db = CurrentDb
> sqlstr = "INSERT INTO Haupttabelle SELECT * FROM TabtmpLink AS T1 LEFT
> JOIN Haupttabelle AS T2 ON T1.Auftragsnummer=T2.Auftragsnummer WHERE
> T2.Auftragsnummer is Null"
>
> Debug.Print sqlstr
> CurrentDb.Execute sqlstr
Erstmal solltest du die Konstante fuer die Fehlerausgabe angeben, sonst
werden nicht alle Fehler angezeigt. Schluesselverletzungen wuerden z.B.
unterdrueckt. Also ...
CurrentDb.Execute sqlstr, dbFailOnError
Zur Fehlermeldung, die kommt, wenn im SQL-String Angaben fehlen oder falsch
geschrieben sind. Heissen die Tabellen Haupttabelle und TabtmpLink? Gibt es
in beiden das Feld Auftragsnummer? Stimmt die Anzahl Felder bzw. die
Feldnamen beider Tabellen ueberein? Letzteres ist bei dieser Syntax
Voraussetzung. Falls nicht, musst du jedes Feld angeben:
sqlstr = "INSERT INTO Haupttabelle ( Auftragsnummer, Feld2, Feld3, ... )
SELECT Auftragsnummer, Feld2, Feld3, ... FROM ...
nochmals herzlichen Dank!!
Folgenden Code habe ich nun kreiert:
Set db = CurrentDb
sqlstr = "INSERT INTO Haupttabelle" & _
" SELECT T2.* FROM (Kopfdaten_xls AS T1 LEFT JOIN Haupttabelle AS T2" & _
" ON T1.Auftrag = T2.Auftrag)" & _
" WHERE T2.Auftrag is Null "
Debug.Print sqlstr
CurrentDb.Execute sqlstr, dbFailOnError
Dabei habe ich zuvor nochmals die Tabellennamen und Feldnamen geändert und
angepasst. Nun kommt zwar keine Fehlermeldung mehr, er kreiert auch neue DS
(genau die Anzahl, die in Excel neu vorhanden sind) in der Access-Tabelle,
jedoch sind keine Werte in Access vorhanden. Die erzeugten Datensätze sind
also alle leer...
Hättest du da noch eine Idee zu??
DANKE schön!
Gruß,
Holger
"Peter Doering" wrote:
> Hallo,
>
> Holger D. wrote:
>
> > danke für die schnelle Antwort und ja, es funktioniert sicher, wenn da nicht
> > noch ein Problem wäre... Denn beim Ausführen erscheint immer die
> > Fehlermeldung:
> >
> > Laufzeitfehler 3061: 2 Parameter wurden erwartet, aber es wurden zu wenig
> > Parameter übergeben.
> >
> > Hättest du dort eine Möglichkeit, woran das liegt??
> >
> > Das wäre super! Ich hänge mal bei, was ich gecodet habe.
Holger D. wrote:
> "Peter Doering" wrote:
>> Holger D. wrote:
>>
>>> danke f�r die schnelle Antwort und ja, es funktioniert sicher, wenn da nicht
>>> noch ein Problem w�re... Denn beim Ausf�hren erscheint immer die
>>> Fehlermeldung:
>>>
>>> Laufzeitfehler 3061: 2 Parameter wurden erwartet, aber es wurden zu wenig
>>> Parameter �bergeben.
>>>
>>> H�ttest du dort eine M�glichkeit, woran das liegt??
>>>
>>> Das w�re super! Ich h�nge mal bei, was ich gecodet habe.
>>> -----------------------
>>>
>>> Set db = CurrentDb
>>> sqlstr = "INSERT INTO Haupttabelle SELECT * FROM TabtmpLink AS T1 LEFT
>>> JOIN Haupttabelle AS T2 ON T1.Auftragsnummer=T2.Auftragsnummer WHERE
>>> T2.Auftragsnummer is Null"
>>>
>>> Debug.Print sqlstr
>>> CurrentDb.Execute sqlstr
>>
>> Erstmal solltest du die Konstante fuer die Fehlerausgabe angeben, sonst
>> werden nicht alle Fehler angezeigt. Schluesselverletzungen wuerden z.B.
>> unterdrueckt. Also ...
>>
>> CurrentDb.Execute sqlstr, dbFailOnError
>>
>> Zur Fehlermeldung, die kommt, wenn im SQL-String Angaben fehlen oder falsch
>> geschrieben sind. Heissen die Tabellen Haupttabelle und TabtmpLink? Gibt es
>> in beiden das Feld Auftragsnummer? Stimmt die Anzahl Felder bzw. die
>> Feldnamen beider Tabellen ueberein? Letzteres ist bei dieser Syntax
>> Voraussetzung. Falls nicht, musst du jedes Feld angeben:
>>
>> sqlstr = "INSERT INTO Haupttabelle ( Auftragsnummer, Feld2, Feld3, ... )
>> SELECT Auftragsnummer, Feld2, Feld3, ... FROM ...
>
> Folgenden Code habe ich nun kreiert:
>
> Set db = CurrentDb
> sqlstr = "INSERT INTO Haupttabelle" & _
> " SELECT T2.* FROM (Kopfdaten_xls AS T1 LEFT JOIN Haupttabelle AS T2" & _
> " ON T1.Auftrag = T2.Auftrag)" & _
Die Klammern kannst du weglassen.
> " WHERE T2.Auftrag is Null "
>
> Debug.Print sqlstr
> CurrentDb.Execute sqlstr, dbFailOnError
>
> Dabei habe ich zuvor nochmals die Tabellennamen und Feldnamen ge�ndert und
> angepasst. Nun kommt zwar keine Fehlermeldung mehr, er kreiert auch neue DS
> (genau die Anzahl, die in Excel neu vorhanden sind) in der Access-Tabelle,
> jedoch sind keine Werte in Access vorhanden. Die erzeugten Datens�tze sind
> also alle leer...
>
> H�ttest du da noch eine Idee zu??
Vermutlich haben die Felder unterschiedliche Datentypen.