Supportnet Computer
Planet of Tech

Supportnet / Forum / Datenbanken

Access 2007 2 Tabellen vergleichen, Inhalt Tabelle 2 in Tabelle 1 schreiben





Frage

Startseite > Betriebssysteme > Windows > Office > Access Top-Thema: Routing mit 2 Netzwerkkarten unter Windows u. Linux Beitrag Permanent-ID: b6f6cf8b98ab559bb817377349ba9efb Access 2007 Tabellen vergleichen Mitglied Dieser Beitrag wurde bisher 28 mal aufgerufen. Geschrieben von Wolpi25 (Dominic Wolpert) am 28.04.2008 um 09:27:27 Uhr. Gehe in den Bereich . Beitrag drucken Druckansicht Beitrag per E-Mail versenden Beitrag per E-Mail versenden Mit Freunden diskutieren Mit Freunden diskutieren Hallo, bin was Access angeht recht unerfahren. Soll aber nun für unsere Firma etwas umsetzen wo ich noch nich weiß wie ich es realisieren kann. Habe mir diesbezüglich auch Literatur gekauft, aber komme nicht weiter. Vieleicht kann mir einer helfen? Problemstellung: Wir bekommen eine txt Datei mit meheren tausend Artikeln zugesandt. Die Datei sieht in etwa so aus: BN;20080422;;;;1;0010343050280;EN;;;C13S051005;102026600;84733090; Nun soll diese Datei in Access importiert werden. Soweit so gut, das habe ich auch hinbekommen. Nun soll in Access geprüft werden, ob bestimmte Felder einen Wert aufweisen, wenn dies nicht der Fall sein sollte, so soll eine Meldung mit einem Hinweis aufgehen und wenn möglich sollte gleich der Wert eingetragen werden. Das bekomme ich mit meinen Büchern irgendwie schon hin. Mein Hauptproblem ist nun folgendes. Die txt Datei wird jeden Tag aktualisiert. Nun soll die aktualisierte Datei in Access impotiert werden, und mit den vorhanden Daten verglichen werden. Wenn nun ein Wert aktueller ist, soll dieser in die vorhandene Datenbank übernommen werden. Wie funktioniert das? Über einige Vorschläge wie ich das umsetzen kann, würde ich mich riesig freuen. Mit freundlichen Grüßen Wolpi

Antwort 1 von lorf55

Hallo Wolpi,
das Aktualisieren machst du mit einer Update-Abfrage. Dazu suchst du dir in beiden Tabellen Felder, die eindeutig sind und die gleiche Bedeutung haben, z.B. die ArtikelNummer.

Die Anweisung könnte denn vom Schema her so aussehen:
UPDATE Tabelle1 
SET Tabelle1.f1 = [NeueDaten].[f1], 
         Tabelle1.f2 = [NeueDaten].[f2]
WHERE ((Tabelle1.ArtikelNr=NeueDaten.ArtikelNr));

wobei hinter SET und in WHERE-Klausel SELECT-Anweisungen auftreten dürfen.

Gruß
lorf

Antwort 2 von wolpi27

Danke für deine Antwort.
Wo muß ich den Code den eintragen damit das funktioniert?
Wie gesagt bin was Access angeht , Grün hinter den Ohren.

Gruß
Wolpi

Antwort 3 von lorf55

Ok, vielleicht machen wir das besser zu Fuß:
- als erstes kopierst du dir erstmal die Datenbank oder besser nur die beiden Tabellen in eine extra Datenbank, wo man in Ruhe experimentieren kann,

- Abfragen - Neu - Entwurfsansicht
dann klickst du die Tabelle an, die aktualisiert werden soll (z.B. T1)
und die Tabelle mit der aktualisiert werden soll (z.B. T2)
- jeweils Hinzufügen - Schließen
Wenn beide das selbe Feld ArtikelNr vom selben Typ haben, wird eine Verknüpfung angezeigt (die eventuell gelöscht werden muss, wenn sie falsch ist, ist aber meist richtig). Darüber werden bei der Abfrage beide Felder auf gleichen Inhalt verglichen.
- Menü Abfrage - Aktualisierungsabfrage
- dann klickst du in die Tabellenzeile eines Feldes und suchst dir T1 aus und dann dazu die zu aktualisierenden Felder aus.
- in die Zeile "Aktualisieren" musst du von Hand eine Zuordnung treffen, welche Felder in T2 denen in T1 entsprechen. Dort trägst du in ein Feld T2.Feld1, in das nächste T2.Feld2 usw. ein.
- zum Test kannst du mal auf das Ansichtsymbol unter "Datei" klicken um zu sehen, welche Felder aktualisert werden und was in denen gerade steht (um den SQL-Code dazu zu sehen, musst du da die SQL-Ansicht auswählen, denn kommt sowas wie ich oben beschrieben habe).
- denn musst du die Abfrage unter einem passenden Namen abspeichern, das Abfragefenster schließen und im Datenbankfenster unter Abfragen den Namen zum Starten doppelt anklicken.
- jetzt kriegst du eine Meldung wieviel Datensätze betroffen sind und ob du die Aktualisierung wirklich willst. Bei Klick auf OK geht die Aktualisierung denn los.
- wenn denn alles läuft wie gewünscht, öffnest du deine produktive Datenbank, klickst auf Abfragen, Rechtsklick - Importieren, wählst deine Testdatenbank, deine fertige Abfrage
und bist fertig.

Gruß
lorf

Antwort 4 von wolpi27

hallo,
ich glaube ich stelle mich zu doof an.
Hab das nach deiner anleitung durchgeführt.
bei der abfrage hat er mir nun alle daten in tabelle 1 mit dem letzten eintrag von tabelle2 überschrieben.

ich möchte ja , das wenn ein eintrag in tabelle 2 existiert, der in tabelle 1 nicht existiert, von tabelle2 in tabelle 1 kopiert wird.

Antwort 5 von lorf55

Was heißt bei dir "Eintrag"? Ist das ein Feld bzw. Spalte oder ein Datensatz?
Du musst dir schon genau klar sein, was du willst:
- Datensatz einfügen und die anderen lassen wie sie sind = INSERT oder
- Datensatz aktualisieren (Werte im Datensatz ändern) = UPDATEn

Wie wäre es, wenn du den Kopf jeder Tabelle + eine oder 2 Zeilen mal postest und dazu schreibst, welche Spalten bei beiden Tabellen zusammen gehören.

Antwort 6 von wolpi27

also,
ich habe folgende tabelle Artikel:

Artikelnr Artikelbezeichnung EK netto Warengruppe
10001 Epson Toner 25,50 A
10002 Canon Toner 26,50 B
1000n

insgesamt ca 22000 Artikel

In einer 2ten Tabelle erhalte ich täglich Updates für die Produkte. die Felder sind identisch mit der oberen Tabelle. Hier stehen in etwa 100-200 Artikel drin.

Tabelle Update:

Artikelnr Artikelbezeichnung EK netto Warengruppe
10001 Epson Toner 27,50 A
10002 Canon Toner 29,50 C

So, jetzt sollen die aktuellen Änderungen die in der Tabelle Update stehen in die Tabelle Artikel übertragen werden.

Ist das so verständlich?.

Antwort 7 von Marie

Hallo

schau doch mal hier, das ist doch dasselbe Problem:

http://www.supportnet.de/threads/1713443

Gruß Marie

Antwort 8 von wolpi27

hallo marie,

wenn ich das richtige verstanden habe, werde dann die nummern die in tabelle 2 existieren, aber nicht in tabelle 1 existieren, von tabelle 2 nach 1 angehängt, richtig?

bei mir wäre ja der fall das die selbe artikelnummer in beiden tabellen existent sein kann, und nur ein wert der zur artikelnummer gehört unterschiedlich ist, dieser soll dann von tabelle2 auf tabelle1 übertragen werden.
wie geht das?

Antwort 9 von Marie

Also zuerst mal ist Deine Tabelle zwei deine Tabelle Update, das heisst es sind die neuesten Daten immer?

Zitat:
ich möchte ja , das wenn ein eintrag in tabelle 2 existiert, der in tabelle 1 nicht existiert, von tabelle2 in tabelle 1 kopiert wird.


Hier schreibst Du dann doch exakt denselben Wortlaut, wie bei dem oben genannten thread von mir!

Also wenn ich Dich richtig verstanden habe willst Du zwei unterschiedliche Sachen: Zum einen die nicht vorhandenen Artikel anhängen, das geht dann wie oben in 1713443 beschrieben.

Ferner möchtest Du bereits vorhandene Artikel (gleiche Artikelnummer) mit dem neuesten Daten überschreiben?

Zitat:
Hab das nach deiner anleitung durchgeführt.
bei der abfrage hat er mir nun alle daten in tabelle 1 mit dem letzten eintrag von tabelle2 überschrieben.

Zitat:
ein wert der zur artikelnummer gehört unterschiedlich ist, dieser soll dann von tabelle2 auf tabelle1 übertragen werden.
wie geht das?


Nun verstehe ich nicht wo der Unterschied ist zu den beiden obigen Aussagen?
Da ist doch genau das passiert was Du wolltest? Erklär mal bitte den Unterschied zwischen dem, was oben überschrieben wurde und dem was Du willst, ich seh keinen.

Du musst halt mehrere Abfragen machen, einmal noch nicht vorhandene Artikel anhängen und einmal Änderungen updaten.

Gruß Marie

Antwort 10 von wolpi27

Hallo Marie,

sorry wenn ich mich so blöd anstelle.
Ich habe es soweit hinbekommen das neue Artikelnummern von der Update-Tabelle in die Haupttabelle angefügt werden.

Was ich nun nicht verstehe, ist wie ich den Update Befehl durchführen muß.

Folgendes habe ich in der Hilfe gelesen:
Mehrere Felder können gleichzeitig geändert werden. Im folgenden Beispiel wird der Wert für Order Amount um 10 % erhöht, und die Freight werden für Lieferanten im Vereinigtes Königreich um 3 % erhöht:


UPDATE Bestellungen
SET Bestellmenge = Bestellmenge * 1.1,
Frachtkosten = Frachtkosten * 1.03
WHERE BestimmungslandRegion = 'UK';

Wie gebe ich an, das in der Update-Tabelle das Feld mit der identischen Artikelnummer in die Haupttabelle aktualisiert wird?

LG
Wolpi

Antwort 11 von Marie

T2 ist Tabelle 2, T1 ist Tabelle 1, Nummer ist das Feld Artikelnr. F1 F2 und F3 sind die Tabellenfelder die abgeglichen werden sollen, es wird eiinfach der Inhalt von Tabelle 2 eingefügt:


UPDATE T2 INNER JOIN T1 ON T2.Nummer = T1.Nummer SET T1.F1 = [T2]![F1], T1.F2 = [T2]![F2], T1.F3 = [T2]![F3];



Gruß Marie

Antwort 12 von Marie

UPDATE Tabelle2 INNER JOIN Tabelle1 ON Tabelle2.Artikelnr = Tabelle1.Artikelnr SET Tabelle1.Artikelbezeichnung = [Tabelle2]![Artikelbezeichnung], Tabelle1.EK = [Tabelle2]![EK], Tabelle1.Warengruppe = [Tabelle2]![Warengruppe];


Antwort 13 von wolpi27

Hallo Marie,

werd das gleichmal ausprobieren und Rückmeldung erstatten.
Danke erstmal für deine Geduld mit mir :-)

Gruß Wolpi

Antwort 14 von wolpi27

Hi Marie,

hab nun alles soweit ausprobiert, funktioniert auch alles.

Ein Problem hab ich aber noch, vielleicht kannst du mir dabei auch helfen.
Ich habe nun festgestellt, das ich teilweise mehere gleiche Artikelnummer habe. Deren Felder sind alle gleich bis auf das Feld " Gültigkeit". Hier Steht ein Datum im Zahlenformat z.B. 20080325 .
Ich muß nun die Artikelnummern löschen bei der das Feld Gültigkeit älter ist als wie bei der identischen Artikelnummer.

Artikelnr Artikelbezeichnung EK netto Warengruppe Gültigkeit
10001 Epson Toner 25,50 A 20080430
10001 Epson Toner 25,50 A 20080505

in diesem Fall müßte nun die erste Position gelöscht werden.
Hast du einen Rat für mich?

Gruß
Wolpi

Antwort 15 von Marie

Dann machst Du wieder zwei Abfragen.

SELECT Tabelle1.Artikelnr, Max(Tabelle1.Gültigkeit) AS [Max von Gültigkeit]
FROM Tabelle1
GROUP BY Tabelle1.Artikelnr;


Diese Abfrage listet Dir alle Datensätze auf die Du nicht löschen willst. Ich nenne sie jetzt "QryLetzteDaten".

Dann löschst Du alle Datensätze, die in Tabelle 1 sind, aber nicht in "QryLetzteDaten".

DELETE Tabelle1.Artikelnr, Tabelle1.Gültigkeit, QryLetzteDaten.Artikelnr
FROM Tabelle1 LEFT JOIN QryLetzteDaten ON (Tabelle1.Gültigkeit = QryLetzteDaten.[Max von Gültigkeit]) AND (Tabelle1.Artikelnr = QryLetzteDaten.Artikelnr)
WHERE (((QryLetzteDaten.Artikelnr) Is Null));


Gruß Marie

Antwort 16 von wolpi27

Hallo Marie,

wenn ich das so richtig verstehe, habe ich als Resultat die Arikeln mit dem höheren Gültigkeitswert, richtig?
Ich bräuchte als Endergebnis, die Atikelnummer die noch innerhalb des Gültigkeitswertes liegen.

Vielleich habe ich mich falsch ausgedrückt. Ich versuche es nochmal.


Artikelnr Artikelbezeichnung EK netto Warengruppe Gültigkeit
10001 Epson Toner 25,50 A 20080430
10001 Epson Toner 25,50 A 20080505
10001 Epson Toner 26,00 A 20080605

Es kann möglich sein, das eine Artikelnummer mehrmals vorkommt. Nun muß ich prüfen ob das aktuelle Datum gleich oder kleiner dem Gültigkeitswert ist. Ist das aktuelle Datum kleiner wie der Gültigkeitswert, darf dieser Artikel nicht gelöscht werden.

Im Endresultat darf von den 3 gleichen Artikelnummern nur der kleinere angezeigt werden. Die beiden anderen mit dem höheren Gültigkeitswert liegen ja in der Zukunft und intressieren mich erst wenn das aktuelle Datum kleiner gleich ist. Tritt dieser Fall ein, müßte die Artikelnummer mit dem kleinsten Gültigeitswert dann gelöscht werden, und die Artikelnummer mit dem derzeit gültigen Feld muß ich dann wieder in meiner aktuellen Abfrage stehen haben.

Hoffe das ich es jetzt etwas genauer erklären konnte.

Liebe Grüße
Wolpi

Antwort 17 von Marie

Na das hattest Du aber oben nicht geschrieben, aber so langsam müsstest Du ja auch mal eine Abfrage alleine hinkriegen. Du musst doch nur den Zusatz machen,

Zitat:
Ist das aktuelle Datum kleiner wie der Gültigkeitswert, darf dieser Artikel nicht gelöscht werden


dass Du die Datensätze, die nicht gelöscht werden dürfen, aus der Abfrage rausnimmst. Wenn Du das gar nicht gepeilt kriegst, dann machst Du als erstes eine zusätzliche Abfrage und die "QryLetzteDaten" basiert dann nicht auf Tabelle 1 sondern auf der zusätzlichen, wo die Datensätze, die in keinem Fall gelöscht werden dürfen, schon rausgeworfen sind.

Gruß marie