Willkommen bei Entwickler-Forum.
Ergebnis 1 bis 8 von 8
  1. #1
    Neuer Benutzer
    Registriert seit
    26.02.2003
    Beiträge
    6

    Standard Daten aus verschiedenen Tabellen für Export auslesen

    Hallo liebes Forum,
    ich muß Daten aus verschiedenen Tabellen auslesen um diese zu exportieren.
    Mein Problem ist, der Export muß einer bestimmten Struktur folgen, damit die Daten in ein anderes System eingelesen werden können.
    In der einen Tabelle sind Fahrzeugrunddaten einhalten, in der anderen Tabelle steht die Fahrzeugausstattung.
    Die Schnittstelle des einlesenden Systems sieht vor, dass die Ausstattungen nur als 1 bzw 0 übergeben werden dürfen.
    1 = vorhanden
    0 = nicht vorhanden.

    Ich habe bereits mehrere Lösungswege probiert, laufe aber immer wieder vor die Wand. Daher währe ich für Eure Hilfe dankbar.

    Die Tabellen sehen grob so aus:

    Tabelle_Fahrzeug:
    Fahrgestellnummer;Kennzeichen;Zulassung; Farbe
    1;xy;01.01.2015;rot
    2;yx;05.07.2005;lila
    3;zz;16.12.2012;schwarz

    Tabelle_Ausstattung
    Fahrgestellnummer;Bezeichnung;Preis
    1;ABS;150,00
    1;SSD;657,65
    1;Alarm;1568,00
    2;Radio;253,99
    3;Radio;189,54
    3;SSD;547,48


    Die Ergebnismenge müsste lt. einlesender Schnittstelle so aussehen:

    Fahrgestellnummer;Kennzeichen;Zulassung ;ABS;SSD;Radio;Alarm;Farbe
    1;xy;01.01.2015;1;1;0;1;rot
    2;yx;05.07.2005;0;0;1;0;lila
    3;zz;16.12.2012;0;1;1;0;schwarz

  2. #2
    Stammgast
    Registriert seit
    24.10.2011
    Beiträge
    1.342

    Standard

    Vermutlich gibt es mehr Ausstattungen als hier aufgeführt? Viel mehr?
    Wie breit soll die Ergebnistabelle werden?

    Bei der Aufgabenstellung kann man relativ leicht gegen die Wand laufen. Genaugenommen ist sie per statischem SQL nur lösbar, wenn es eine feste Liste von Ausstattungen gibt oder zumindest definiert ist, welche der vielen Ausstattungen im Export berücksichtigt werden sollen. Dafür muss dann ein SQL Statement gebaut werden.

    Stichworte dazu sind Pivot oder Crosstable.
    Diese SQL Funktionen sind im übrigen bei nahezu jedem DB Hersteller unterschiedlich umgesetzt.

    Workarounds:
    SQL dynamisch zusammenbauen nach Bedarf
    oder
    Datenmenge im Client aufbereiten.
    oder
    Ein Export bzw. besser Importformat vereinbaren, dass etwas geschickter ist. (Ich würde mal vermuten, dass am anderen Ende, dem Import der bis jetzt vergeblich aufbereiteten Daten wieder das gleiche Problem existiert, aus einer breiten Liste mit sehr vielen Merkmalsspalten muss wieder eine Liste gemacht werden.
    Gruß, defo

  3. #3
    Neuer Benutzer
    Registriert seit
    26.02.2003
    Beiträge
    6

    Standard

    Hallo defo,
    danke für Deine Schnelle Antwort.

    Die Ergebnistabelle hat 159 Spalten.
    Die Liste der Ausstattungen ist durch das Importsystem fest vorgegeben.
    Leider fürchte ich, dass sich eine große deutsche Autobörse nicht wegen uns auf eine neue Schnittstelle einlassen wird.

    Gruß Dirk

  4. #4
    Stammgast
    Registriert seit
    24.10.2011
    Beiträge
    1.342

    Standard

    Zitat Zitat von Dirk Schindler Beitrag anzeigen
    Die Ergebnistabelle hat 159 Spalten.
    Die Liste der Ausstattungen ist durch das Importsystem fest vorgegeben.
    Leider fürchte ich, dass sich eine große deutsche Autobörse nicht wegen uns auf eine neue Schnittstelle einlassen wird.
    Es schadet ja hoffentlich nicht, naheliegender Fragen zu stellen.
    Z.B. ob es Sinn macht, bei jeder neuen Ausstattung eine Schnittstelle umzubauen?
    Oder noch schlimmer: Müssen viele deutsche Bürger etwa auf neue Ausstattungsmerkmale ihrer Autos verzichten, weil es nur diese Schnittstelle gibt!
    Frag sie doch mal, wie sie das so machen und wieviel Spaß dabei alle haben (auch die anderen Zulieferer).
    Man kann es natürlich als schicksalhaft ansehen. Zum Glück musste das Feuer nicht vom Menschen erfunden werden, nur die Anwendungsmöglichkeiten.

    Nagut, also nach Deinen Zusatzinfos gibt es nicht viel mehr zu sagen, folgende Lösungen:
    baue ein SQL Statement mit ca 159 joins.
    baue eine Pivot SQL mit relativ wenig joins, sofern deine nachwievor unbekannte DB das unterstützt
    baue es in Excel oder einem anderen Tool Deiner Wahl zusammen
    schreibe ein Programm, dass diese Transformation erzeugt
    Gruß, defo

  5. #5
    Neuer Benutzer
    Registriert seit
    26.02.2003
    Beiträge
    6

    Standard

    Recht hast Du, die Frage schadet nicht

    Bei der Datenbank handelt es sich um den Advantagedatabaseserver.
    Da ich kein Programmierer bin, bleibt mir nur der Zugriff über den ADS-eigenen ARC32. Daher hatte ich mich schon auf die vielen Joins eingestellt.
    Mein problem ist halt, dass ich als Ausstattung immer alle Ausstattungsmerkmale zurückbekomme und es nicht schaffe, nur abzufragen, ob das Fahrzeug zb. ABS hat.
    Damit ich in der entsprechenden Exportspalte 1 oder 0 setzen kann.

  6. #6
    Stammgast
    Registriert seit
    24.10.2011
    Beiträge
    1.342

    Standard

    Zitat Zitat von Dirk Schindler Beitrag anzeigen
    Daher hatte ich mich schon auf die vielen Joins eingestellt.
    Mein problem ist halt, dass ich als Ausstattung immer alle Ausstattungsmerkmale zurückbekomme und es nicht schaffe, nur abzufragen, ob das Fahrzeug zb. ABS hat.
    Wie sieht denn so ein SQL bei Dir derzeit aus?

    ADS kanns wohl nicht, hier ist auf die Schnelle ein Pivot Workaround.
    http://devzone.advantagedatabase.com...t-query-in-ads

    Was Du mit Deinen Worten oben genau meinst, also Dein Plan, habe ich nicht verstanden.

    Im Prinzip geht es zu Fuß so (mit 160 joins)

    Code SQL:
    SELECT festesFeld1, festesFeld2, .. m1.Ausstattung AS Alufelge, m2.Ausstattung AS BluetoothConnect, m3...
      FROM fahrezeuge f JOIN Ausstattung m1 ON f.fgnr = m1.fgnr AND m1.Ausstattung = 'Alufelge'
                        JOIN  Ausstattung m2 ON f.fgnr = m2.fgnr AND m2.Ausstattung = 'BluetoothConnect'
                        JOIN  Ausstattung m3 ON f.fgnr = m3.fgnr ...
    (nur so hingeschrieben)
    Das Statemet kann man nun nach Schema F auch von einem Programm erstellen lassen.

    Oder Du machst es Dir ganz einfach mit:
    Code SQL:
    SELECT <fahrzeugdaten felder>, <ausstattung felder> FROM fahrezeuge f JOIN Ausstattung m1 ON f.fgnr = m1.fgnr
    Das Ergebnis kippst Du in ein Spreadsheet Programm,
    machst eine Pivottabelle daraus (bedeutet im Zweifel auch ca 160 mal Spalte anklicken)
    und setzt den Datenwert auf "Anzahl von Feldinhalt'
    Dann hast Du für jedes Merkmal, das vorhanden ist, eine 1 in den Spalten stehen und automatisch alle Spalten / Ausstattungen, die Dein Select ergibt.


    Das Prinzip beruht am Ende darauf, dass Du nicht abfragst ob vorhanden, sondern alles ausgibst was da ist.
    Bei dem "künstlichen" Spaltenaufbau bleiben dann nicht vorhandene Merkmale auf NULL, das kannst Du "umrechenen" in 0.
    Vorhandene Merkmale werden einfach aufgrund ihrer Existenz in 1 umgerechnet.

    Das kannst Du auch so wiedererkennen, wenn Du gemäß Vorschlag mit Spreadsheetfunktionen arbeitest.
    Gruß, defo

  7. #7
    Stammgast
    Registriert seit
    24.10.2011
    Beiträge
    1.342

    Standard

    Zitat Zitat von defo Beitrag anzeigen
    ..
    Das Ergebnis kippst Du in ein Spreadsheet Programm,
    machst eine Pivottabelle daraus (bedeutet im Zweifel auch ca 160 mal Spalte anklicken)
    ..
    Korrektur
    160 mal klicken ist hier natürlich Blödsinn. Die 160 Spalten entstehen ja bei der Transformation aus einer einzigen, also einmal Klicken dafür.
    Die Anzahl der resultierenden Spalten leitet sich aus der Anzahl der eindeutigen Werte der Ursprungsspalte ab. Das Angenehme ist bei dieser Variante ja, dass es dynamisch ist und es keinen Unterschied macht, ob 10, 160, 1000 Spalten entstehen.
    Fraglich ist dabei allerdings, ob es sich für eine Automatisierung eignet (und ob man sich überhaupt der "Willkür" eines Spreadsheet Programms anvertraut)
    Gruß, defo

  8. #8
    Stammgast
    Registriert seit
    26.02.2003
    Beiträge
    158

    Standard

    Hallo Dirk,

    schau mal ob es im Advantage Database SQL den "list" Befehl gibt. SQLAnywhere hat ihn drin:
    z.B.
    select list(Bezeichnung) from Tabelle_Ausstattung Group by Fahrgestellnummer;

    Das Ergebnis soll dann eine Liste aller Bezeichnungen je Fahrgestellnummer in einer Zeile liefern.
    Das man dann noch auf Deine Soll-Liste hin anpassen, wäre aber schon mal die passende Richtung.

    Gruß, Uschi

 

 

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •