August 05, 2020, 21:06:30

Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!


Import: 2x xls -> 3 Tabellen - wie neu IDs auslesen & damit weiter importieren?

Begonnen von maddhin, Juli 09, 2020, 10:06:38

⏪ vorheriges - nächstes ⏩

maddhin

Hallo,

ich möchte Firmenstammdaten (eine .xls Datei, gehen in tbl_company) sowie Produktstammdaten und zusätzliche Produktinformationen (auch eine xls) importieren.

Der Import in tbl_Company (PK ID_Corp) ist ziemlich unkompliziert. Ich habe hier einen Button, der vor dem Import via Abfrage noch etwas normalisiert.

Schwieriger ist es bei den Produkten:

Die Produktstammdaten gehen in tbl_Product (PK ID_Product). Hier wird aber die richtige ID_Corp benötigt, damit die Produkte der richtigen Firma zugewiesen werden. D.h. die ID_Corp müsste ich irgendwie aus tbl_Company bekommen und in das ID_Corp Feld der importierten, temporären Tabelle tbl_Produkt_Import für die Produkte schreiben. Bisher mache ich diesen Schritt manuell...

Das gleiche Problem habe ich dann, wenn ich die zusätzlichen Produktinfos (in separater Tabelle tbl_Product_Zusatz mit 1:1 Beziehung über ID_Product). D.h. in einem 3. Importschritt muss ich die korrekten ID_Produkt in die tbl_Produkt_Import schreiben und dann via Abfrage die Daten an tbl_Product_Zusatz anhängen.

Ich hoffe. dass ist halbwegs verständlich. Ich habe einiges probiert und denke es könnte mit einer UPDATE-Abfrage gehen: Ich schaffe es aber nicht, dass die Abfrage etwas schreibt. Ggf. falscher Syntax oder es geht so überhaupt nicht.
Ich bin noch neu bei Access, daher wäre ich über einen Tipp, wie man das machen könnte sehr dankbar! DANKE!


maddhin

Hallo ebs17,

super, ganz lieben Dank!

Das mit SQL zu lösen ist sicherlich die richtige und elegante Lösung. Ehrlich gesagt glaube ich aber nicht, dass ich dies mit SQL schon hinbekomme. SQL ist mir gänzlich unbekannt und ich fürchte hier Tage des Herumwerkelns bis ich das verstehe und hinbekomme. Ich will das lernen, aber im Moment arbeite ich viel und mit der DB und komme nur abends dazu etwas zu "spielen".
Gibt es da ggf. noch eine "hässliche" Methode, die ich im Moment mit meinen bescheidenen Fähigkeiten (ich mache den Import im Moment über eine Kette von Abfragen, die mit Button Klick aufgerufen werden...) bewältigen kann? LOL

ebs17

Ein konkreter Vorschlag würde sich sowohl bei der SQL-Lösung wie auch bei einer hässlichen Methode an ganz konkrete Verhältnisse und konkrete Daten anlehnen müssen. Nun rate mal, wie Du dazu beitragen kannst.
Mit freundlichem Glück Auf!

Eberhard

maddhin

Lieber ebs17,

herzlichen Dank für Deine Hilfe. Anbei nun - in revidierter Form - der Importkäse, den ich im Moment mache...

Die beiden import_tbl sind die xls, die importiert wurden und tbl_Company, tbl_Produkt und tbl_Produkt_Zusatz die Zieltabellen.

Ich habe einige Abfragen gemacht, die den Import hinbekommen, wenn in richtiger Reihenfolge ausgeführt (da kommt dann ein oder mehrere Buttons). Reihenfolge ist 1a, 1b, 2a/b/c/d, 3...

Was ich grundsätzlich nicht hinbekomme ist die ID_Corp (PK tbl_company) in die Produktimporttabelle import_tbl_product zu schreiben. Das ist aber nötig, um die Produkte in der tbl_Produkt zu speichern. Ich habe das Problem ganz professionell umgangen in dem ich eine "ID_Link" Spalte in beiden Importtabellen angelegt habe und diese mit "XYZ" gefüllt habe... Jetzt gibt es natürlich eine Verbindung...

Ähnlich bei dem Schreiben der ID_Product für den Import nach tbl_Produkt_Zusatz, auch diese schreibe ich nur auf Basis einer Abfrage, die Produkt-Code/Name/Beschreibung vergleicht.

D.h. mit dieser quick & dirty Methode geht das Ganze inzwischen, aber ich glaube nicht, dass das der richtige Weg ist LOL Zu verstehen, wie man das professionell lösen kann, würde mir viel bedeuten.

Lieben Dank!

ebs17

Zitatich möchte Firmenstammdaten (eine .xls Datei, gehen in tbl_company) sowie Produktstammdaten und zusätzliche Produktinformationen (auch eine xls) importieren
Ich würde einen Import + Verteilung auf originale Daten (Dateien) oder zumindest 1:1 importierte Originaldaten beziehen wollen. Deine Importtabellen machen nicht den Anschein, so etwas zu sein.

Daneben wäre die Information maßgeblich, ob der Import einmalig in leere Tabellen erfolgt oder ob ein vorhandener Datenbestand ergänzt wird. Im zweiten Fall müsste man ja Prüfung und Vermeidung von Dopplungen einbauen.
Mit freundlichem Glück Auf!

Eberhard

maddhin

Die Importtabellen wurden so importiert. Ich habe den xls bereits die richtigen Feldnamen gegeben - ich blende diese Zeile und auch ein paar Spalten aus und sperre Einiges, wenn ich sie Firmen zum ausfüllen schicke. D.h. vor dem Import in Access lösche ich "Ausfüller-Überschrift- sowie Ausfüllhinweise-Zeilen" und räume etwas auf.
D.h. die zu importierenden Dateien sind eigentlich sehr sauber und kommen dann so in Access an. D.h. ich habe hier schon Vorarbeit in Excel geleistet.

Der Import erfolgt in aktive DB. Doppelungen gibt es recht häufig, weil ich in meinem Arbeitsprozess oft die Firma schon angelegt habe und i.d.R. auch schon ein Produkt dazu angelegt habe. Dies aber dann nur mit Firmenname und Produktkategorie. Dies ist quasi eine Erinnerung daran, dass es die Firma gibt da es oft länger dauert bis die Daten per xls reinkommen. Löschen und zusammenführen mache ich im Moment manuell. Ein intelligentes System hierzu ist natürlich super, aber im Moment nicht Priorität, weil ich die reinkommenden Daten i.d.R. ohnehin dann durchgehe.

Lieben Dank!

Beaker s.a.

Hallo Martin,
Frage, - gibt es denn in der/den .xls-Sheets eine CorpID, und ist diese
auch schon bei den Produkten hinterlegt?
Dann würdest du doch gar keinen "neuen" PK benötigen, denn das muss
ja nicht zwingend ein AutoWert sein.
Da würden beim Import schon mal autom. keine doppelten reinkommen,
und die Beziehung zu den Produkten (vermutl. per n:m mit Mehrfelder-
Index über CorpID und ProdctID) kann ohne Umwege realisiert werden.
gruss ekkehard


P.S. Falls ich das Problem falsch verstanden/interpretiert habe und
deshalb meine Gedanken völlig abwegig sind, bitte ich um Entschuldigung.
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.

ebs17

@ekkehard: Primärschlüssel von außen wären nur zuverlässig einsetzbar, wenn jemand umfassend organisiert, was in der Datenbank selber und bei den parallelen Datenzuträgern passiert (Neuanlage, Verhinderung einer Änderung oder Löschung), und das bei allen zu erzeugenden Primärschlüsseln. Das dürfte in der Praxis unrealistisch sein.
Schon das Synchronisieren eines Backends mit seiner Kopie, wo in beiden getrennt Schreibvorgänge stattgefunden haben (räumliche Trennung, keine Netzwerkverbindung), ist ein Riesenproblem.


@maddhin: Los geht es mit der Betrachtung des Beziehungsbildes. Hier leitet man die Reihenfolge  der Tabellen beim Aktualisieren ab, denn selbstredend muss ein Primärschlüssel erst in seiner Tabelle erzeugt worden sein, ehe er als Fremdschlüssel in einer abhängigen Tabelle verwendet werden kann.

qry_1:
INSERT INTO
   tbl_Company(
      Corp_Name,
      Corp_Street,
      Corp_ZIP,
      Corp_City
   )
SELECT DISTINCT
   Q.Corp_Name,
   Q.Corp_Street,
   Q.Corp_ZIP,
   Q.Corp_City
FROM
   import_tbl_company_info AS Q
      LEFT JOIN tbl_Company AS Z
      ON Q.Corp_Name = Z.Corp_Name
WHERE
   Z.Corp_Name IS NULL

Das DISTINCT soll Duplikate in der Datenquelle verhindern. Die ergänzte Inkonsistenzprüfung sichert ab, dass nur neue Datensätze angefügt werden. Als Schlüssel hierfür wird hier Corp_Name verwendet, auf den sollte man sich verlassen können.

qry_2: Das Vorgehen für tbl_Cat2_Product ist analog, wenn man dieses ID_Cat1_Biz ignoriert. Ist das ein Fremdschlüssel, muss man sich erst der zugehörigen Primärtabelle zuwenden. Gleichlautend müsste man aus den Importtabellen einen Datenzusammenhang zu jenen Biz-Informationen ableiten können.
Ich ignoriere, Würfeln dürfen andere.
Ein Nachschlagefeld in einer Tabelle ist zudem ausreichend Grund, den Kram zurückzugeben zur Bereinigung und derweil das Schmerzensgeld abzufeiern.
INSERT INTO
   tbl_Cat2_Product(
      Cat_Name,
      Cat_Description
   )
SELECT DISTINCT
   Q.Product_Name,
   Q.Product_Description_Short
FROM
   import_tbl_product AS Q
      LEFT JOIN tbl_Cat2_Product AS Z
      ON Q.Product_Name = Z.Cat_Name
WHERE
   Z.Cat_Name IS NULL

qry_3 betrifft tbl_Product.
Theoretisch. Denn ich bringe Product_Name und Cat_Name aus der Vortabelle nicht schlüssig zusammen, weder im Datenmodell noch in vorhandenen Daten der Importtabelle.
Daher Abbruch.
Sonst aber müsste man die beiden Importtabellen verknüpfen zu einer richtigen "Exceltabelle", weil man dort die Zuordnung Firma-Produkt hat und darüber die Fremdschlüsselkombination für die dritte Tabelle ermitteln könnte.

Die vierte Tabelle ist erst recht diskutabel. Eine Kette von Aufzählungs-Memo-Feldern mit 1:1 anzubinden ist sehr diskutabel. Memofelder als Schlüssel, wenn auch nur zwischendurch, zu verwenden ist dann ein weiteres Problem und besser schon im Ansatz großräumig zu umgehen.
Mit freundlichem Glück Auf!

Eberhard

Beaker s.a.

Hallo Eberhard,
Danke für deine Erläuterungen. Hätte ich den Upload des TS nicht
übersehen (jetzt erst gesehen), und mir seine DB angeschaut :( ,
hätte ich den Post wohl nicht geschrieben.
gruss ekkehard
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.

maddhin

Hallo zusammen und bitte entschuldigt die Stille - ich war die letzten Tage sehr beschäftigt.

@ekkehard und @Beaker s.a. lieben Dank für die Hilfe!

qry 1 ist relativ einfach und am Ende habe ich es auch geschafft, die ID_Corp in die import_tabl_products zu schreiben um den Import der Produkte vorzubereiten. Wenn ich schreibe "einfach" und "geschafft", dann meine ich die komische Sequenz von Abfragen! An das VBA werde ich mich so schnell wie möglich ran setzen - hier ist der Code von Ekkehard ja schon fast fertig und ich muss das nur noch anpassen. Super, lieben Dank!

qry 2 ist aber etwas anderes. In qry 2 importiere ich die Produktdaten. Bei der Cat2-Geschichte (= Produktkategorie, vs. Cat1 = Hauptprodukt- und Firmenproduktkategorie) wird eigentlich nur der Wert mit den anderen Produktdaten importiert.
Hier habe ich eine Abfrage gemacht, die den Kategorienamen (von dem Excel-Ausfüller via Drop-Down ausgewählt) in die Kategorie-Nummer (ID_cat2_product) umwandelt, damit die Daten konsistent sind. D.h. das ist nur ein Zwischenschritt.

Das Hauptproblem bei qry 2 bzw. dem zweiten Schritt = Import der Produkte, ist die zu importierenden Produkte mit der Firma zu verbinden. D.h. ich muss eine ID_Corp den zu importierenden Produkten zuordnen.
Im Moment benutze ich hierzu eine Krücke und habe jeweils in import_tbl_company und import_tbl_product (bzw. in den entsprechenden xls) eine Spalte ID_Link gemacht und dort XYZ geschrieben und so beide Tabellen verbunden. Damit kann ich dann eine Abfrage laufen lassen, die die ID_Corp in alle Zeile der import_tbl_product schreibt und damit dann der Import möglich ist. Gibt es hier eine andere, elegante Möglichkeit sowas zu machen? Ggf. kann man die beiden "Hilfspalten" mit VBA schreiben. Wobei es die Spalten in den xls auch nicht unbedingt stören.

Das ist im Grunde das Thema "wieso nicht eine xls Tabelle?". Ich hatte eigentlich eine Tabelle mit allen Daten, aber 1. ist es besser Firmen und Produktdaten zu trennen, weil übersichtlicher (auch für den Ausfüller) und 2. die Produkt xls mache ich unterschiedlich je nach Produkt. Das erscheint mir praktischer. Wenn ich beispielsweise in dem Firmenexcel noch ein Feld hinzufügen möchte, muss ich dies nur einmal machen. Bei mehreren unterschiedlichen Produkt xls, müsste ich Änderungen dann immer in allen Dateien machen. Wie man es macht,... :)

Zitat von: ebs17 am Juli 10, 2020, 20:00:05qry_3 betrifft tbl_Product.
Theoretisch. Denn ich bringe Product_Name und Cat_Name aus der Vortabelle nicht schlüssig zusammen, weder im Datenmodell noch in vorhandenen Daten der Importtabelle.

Nein, die beiden kommen nicht gut zusammen :) Bei tbl_product sind eigentlich nur ID_Product und ID_Corp relevant. Der Rest ist nicht wichtig und/oder notwendig.

Qry 3 ist eigentlich der Import der zusätzlichen Produktdaten in tbl_product_zusatz. Das ist einfach, wenn man die ID_Product herausbekommt. Im Moment habe ich da eine Abfrage gebastelt, die Produkt Code/Name/Beschreibung mit den Daten in tbl_product vergleicht und dann die ID_Product schreibt. Dies ist eigentlich eine gute Krücke, solange in einem der Felder etwas (eindeutiges) steht...

Soviel für dem Moment :)

Liebe Grüße

Beaker s.a.

Hallo Martin,
Bitte nicht verwechseln
Eberhard = Ebs17 ("Pik Ass")
Ekkehard = Beaker s.a. ("Karo 10")
gruss ekkehard
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.

maddhin

Zitat von: Beaker s.a. am Juli 13, 2020, 16:55:32Hallo Martin,
Bitte nicht verwechseln
Eberhard = Ebs17 ("Pik Ass")
Ekkehard = Beaker s.a. ("Karo 10")
gruss ekkehard

ahh. Danke...

Na dann nochmal: lieben Dank für die Hilfe, Eberhard aka @ebs17 ! :)

Gruß Martin