[VBA] Mehrfache Datensätze löschen

06/10/2009 - 16:05 von Raphael Boos | Report spam
Hallo zusammen

"System"-Beschreibung:
Access 2003

Meine Datenbank liest Daten aus einer grösseren "Datenbank" (per
EDP-Verbindung) aus. Daraus wird die Artikelnummer und der Lieferant / die
Lieferanten des Produktes ausgelesen. Diese Daten kommen in eine
Importtabelle (tblImportProdukte) mit den Feldern Produkt (=Artikelnummer)
und Lieferant1 - Lieferant5 (da es in der grösseren Datenbank 5 Lieferanten
drinhaben kann). Das funktioniert soweit mit dem reinschreiben.
Diese Importtabelle ist mit den Feldern ID (Autowert, PK), Produkt (Text,
wieso Text? Ganz einfach, da die Artikelnummern mit 00 anfangen können und
Bindestriche drin haben können) und Lieferant 1 - 5 (Long Integer)
ausgestattet.
In dieser Datenbank hat es eine verknüpfte Tabelle aus einer anderen
grösseren Access-Datenbank. Dort sollen die Daten reinkommen (Tabelle:
Produkt_Partner). Diese Tabelle ist mit den Feldern PKProdukt (Text, da
Artikelnummer) und PKAdresse (Double) ausgestattet. Allerdings hat sie KEIN
AutoWert und auch keinen Primàrschlüssel.
Dies kann man auch nicht àndern, da die Tabelle so bleiben muss wie sie ist
(abgesehen der Daten darin) und nicht veràndert werden darf (vom Hersteller
der DB so festgelegt).
Wàre dies möglich, wàre es kein Problem, aber genau deshalb brauche ich hier
Hilfe.

Nun weiter zum hauptsàchlichen Punkt. Die Produkte, die mehrere Lieferanten
haben, werden einzeln in der Tabelle geschrieben, d.h. ein Produkt und ein
Lieferant haben einen Datensatz (Artikelnummer - Lieferant):
122-220-222 - 500000
122-220-222 - 450500
133-455-312 - 500000
133-455-312 - 563100

so soll das am Schluss aussehen. Das Problem an meinem Code ist, dass er den
ersten Datensatz in die Tabelle reinschreibt und der Zweite auch. Aber sobald
er das zweite Mal durch den Code làuft, erstellt es den zweiten Lieferanten
doppelt, also etwa so:

122-220-222 - 500000
122-220-222 - 450500
122-220-222 - 450500
133-455-312 - 500000
133-455-312 - 563100
133-455-312 - 563100

Dies ist aber schlecht und möchte ich gerne unterdrücken. Wie kann ich das
in VBA / SQL (VBA wàr mir lieber) realisieren, dass es das zweite Produkt nur
aktualisiert und keinen neuen macht? Oder wie kann ich im Nachhinein durch
die Tabelle durch, und die doppelten/mehrfachen Datensàtze löschen (Beachte:
es ist in der Endtabelle KEIN Primàrschlüssel vorhanden!)?

Hier noch der Code zum Einlesen in die Endtabelle (ich hoffe, da kommt einer
draus ^^):

'-- Beginn --
Set Db = DBEngine(0)(0)
strSQL = "SELECT * FROM [tblImportProdukte]"
Set rst1 = Db.OpenRecordset(strSQL)

If Not rst1.EOF Then
With rst1
.MoveFirst
Do Until .EOF
strSQL = "SELECT * FROM [Produkt_Partner] WHERE [PKProdukt] = '" &
rst1! Produkt & "'"
Set rst2 = Db.OpenRecordset(strSQL)

'-- Neuer Datensatz, wenn es das Produkt schon gibt --
If rst2.EOF Then
rst2.AddNew
rst2.Fields("PKProdukt") = rst1.Fields("Produkt")
rst2.Fields("PKAdresse") = rst1.Fields("Lieferant1")
rst2.update

'-- Hier werden die weiteren Lieferanten hinzugefügt

For I = 2 To 5
If rst1.Fields("Lieferant" & I) <> "" Then
rst2.AddNew
rst2.Fields("PKProdukt") = rst1.Fields("Produkt")
rst2.Fields("PKAdresse") = rst1.Fields("Lieferant" & I)
rst2.update
End If
Next I

'--

Else

'-- Gibt es den Datensatz schon, wird er nur aktualisiert

rst2.Edit
rst2.Fields("PKProdukt") = rst1.Fields("Produkt")
rst2.Fields("PKAdresse") = rst1.Fields("Lieferant1")
rst2.update

'-- Hier werden die weiteren Lieferanten hinzugefügt

For I = 2 To 5
If rst1.Fields("Lieferant" & I) <> "" Then
rst2.AddNew
rst2.Fields("PKProdukt") = rst1.Fields("Produkt")
rst2.Fields("PKAdresse") = rst1.Fields("Lieferant" & I)
rst2.update
End If
Next I

'--

End If
rst2.Close
.MoveNext
Loop
End With
End If
rst1.Close

'Code Snipp Ende

Ich hoffe, jemand kann mir helfen, bin schon den ganzen Tag dran.

Mit freundlichen Grüssen
Raphael Boos
 

Lesen sie die antworten

#1 Stefan Hoffmann
06/10/2009 - 16:29 | Warnen spam
hallo Raphael,

Raphael Boos wrote:
In dieser Datenbank hat es eine verknüpfte Tabelle aus einer anderen
grösseren Access-Datenbank. Dort sollen die Daten reinkommen (Tabelle:
Produkt_Partner). Diese Tabelle ist mit den Feldern PKProdukt (Text, da
Artikelnummer) und PKAdresse (Double) ausgestattet. Allerdings hat sie KEIN
AutoWert und auch keinen Primàrschlüssel.


Daten in eine Tabelle ohne PK einfügen? Mehr als gewagt.

so soll das am Schluss aussehen. Das Problem an meinem Code ist, dass er den
ersten Datensatz in die Tabelle reinschreibt und der Zweite auch. Aber sobald
er das zweite Mal durch den Code làuft, erstellt es den zweiten Lieferanten
doppelt, also etwa so:

122-220-222 - 500000
122-220-222 - 450500
122-220-222 - 450500


Nutze eine lokale Hilfstabelle, dort kannst du ohne Probleme mit einem
Primàrschlüssel arbeiten.

Die andere Methode: Prüfe vor dem Schreiben. Was am geschicktesten ist
hàngt von der Datenmenge ab. Ich würde es entweder mit einem lokalen
Array probieren oder anstatt mit einem Recordset mit einem SQL*) arbeiten.
Wobei letzteres von der Performance her schlechter ist.

*) ungefàhr
INSERT INTO tabelle(lieferant, produkt)
SELECT Lieferant1, produkt
FROM ImportTabelle IT
WHERE NOT EXISTS (
SELECT *
FROM Tabelle
WHERE Lieferant = IT.Lieferant1
AND Produkt = IT.Produkt
)



mfG

Access-FAQ http://www.donkarl.com/
KnowHow.mdb http://www.freeaccess.de
Newbie-Info http://www.doerbandt.de/Access/Newbie.htm

Ähnliche fragen