Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Daten übernehmen und vorbereiten

Ähnliche Präsentationen


Präsentation zum Thema: "Daten übernehmen und vorbereiten"—  Präsentation transkript:

1 Daten übernehmen und vorbereiten
Data Warehouse Daten übernehmen und vorbereiten

2 Datenstruktur im Data Warehouse
Star - Schema Snowflake - Schema Starflake - Schema

3 Star Schema Kunde Lieferanten Verkaufs- transaktionen Ort Produkte
Zeit Die Basisinformationen werden Fakten genannt. Die Daten, die die Ausprägungen der einzelnen Attribute beschreiben, werden Dimensionsdaten genannt. Fakten Dimensionsdaten

4 Snowflake Schema Fakten Snowflake Dimensionsdaten Verkaufs-
transaktionen Ort Produkte Art Die einzelnen Dimensionsdaten werden weiter unterteilt. Zeit Region Woche Farbe Oster- verkauf SSV Monat

5 Starflake Schema Fakten Dimensionsdaten Snowflake Dimensionsdaten
Lieferanten Kunde Verkaufs- transaktionen Ort Produkte Ort Art Die einzelnen Dimensionsdaten werden weiter unterteilt. Zeit Region Produkte Zeit Farbe Woche Oster- verkauf SSV Monat

6 Oracle Data Mining Architektur
OWB Client Darwin Client Data Warehouse Oracle Intelligent WebHouse Datenbank z.B. Oracle 8.0.5 OCI Net8 Oracle Warehouse Builder ODBC Darwin 8i 8.1.6 Repository Sun Solaris HP UX

7 Beispieldatenbank Quelle

8 Beispieldatenbank OWB

9 Beispieldatenbank Quelle

10 Beispieldatenbank Quelle

11 Beispieldatenbank Quelle

12 Beispieldatenbank Quelle

13 Beispieldatenbank Quelle

14 Beispieldatenbank Ziel (Warehouse Schema)

15 Beispieldatenbank OWB Ziel (Faktentabelle)

16 Beispieldatenbank OWB Ziel (Dimensionen)
Levels und Hierarchien Beispiel: Zeit H1: YearL->QuarterL->MonthL->WeekL->DayL H2: YearL->WeekL->DayL

17 Beispieldatenbank OWB Ziel (Warehouse Schema)

18 Beispieldatenbank Ziel (Warehouse Schema)

19 Tabellen ta_probant probant aufgaben_nr ergebnis_1 ergebnis_2
richtig datum ip_adresse ta_aufgaben aufgaben_nr augfaben_text loesung_1 loesung_2 loesung_3 loesung_4 kommentar_1 kommentar_2 kommentar_3 kommentar_4 richtige_loesung ta_mathetest_historie datum text ta_seite1 datum ip_adresse

20 Beispieldatenbank Quelle -> Ziel
channel product

21 Beispiel Mathetest Wie sehen die zeitlichen Verläufe aus
Wie lange braucht der einzelnen Probant pro Frage Welche Einträge sind plausibel Welche Daten der Eltern sind plausibel? Wie korrelieren die Antworten auf die Testfragen? Wie sehen die zeitlichen Verläufe aus, gibt es Zeiten, an denen viel gearbeitet wird, wie lange braucht der einzelnen Probant pro Frage, komm er öfter wieder, oder macht er alle Fragen am Stück? Welche Einträge sind plausibel und können für eine Bewertung der Testfragen herangezogen werden? Welche Daten der Eltern sind plausibel? (in den neuen Bundesländern sind Eltern sehr jung; es gab damals nur eine eigene Wohnung, wenn man mindestens ein Kind hatte) Wie korrelieren die Antworten auf die Testfragen?

22 Rohdaten Apr :28PM deeeeeeeee Apr :29PM Apr :29PM Apr :07PM Apr :41PM Jul :34PM 29.7´5429.9´ Sep :20AM Sep :05PM Oct :54PM Oct :29PM ab Jan :46PM ab Jan :57PM

23 Import der Faktendaten Sybase -> Oracle
select – insert dump - restore

24 Sybase

25

26

27

28 Faktentabelle drop table ta_zeitreihe; create table ta_zeitreihe(
schluessel number(6) not null, probant char(24) not null, aufgaben_nr number(3) not null, ergebnis_1 number(1) null, ergebnis_2 number(2) null, ergebnis_3 number(1) null, ergebnis_4 number(4) null, richtig char(1) not null, datum date null, ip_adresse char(15) null, jahrestag char(7) null );

29 select - insert Faktentabelle
"insert into ta_zeitreihe values (sq_zeitreihe.nextval,"+"'" +probant+"',"+convert(char(2),aufgaben_nr)+"," +convert(char(1),isnull(ergebnis_1,0))+"," +convert(char(1),isnull(ergebnis_2,0))+"," +convert(char(1),isnull(ergebnis_3,0))+"," +convert(char(1),isnull(ergebnis_4,0))+",'"+richtig +"',to_date('"+convert(char(12),datum,104)+convert(char(8),datum,108) +"','dd.mm.yyyy hh24:mi:ss')" +",'"+ip_adresse+"');" from ta_probant

30 SQL*Loader Übersicht Loader Control File Input Datenfiles SQL*Loader
Log File Bad File Daten bank Discard File Input Datenfiles: Die in die Datenbank einzuführenden Daten liegen im ASCII Format vor. Loader Control File: Steuerinformationen für den SQL*Loader. Hier werden die benötigten Dateien beschrieben. Weiterhin werden die Strukturen der Eingabedaten, Fehlerbehandlungen und Filter für die Eingabedaten beschrieben. Log File: Ladeprotokoll. Bad Files: Liste der fehlerhaften Eingabedatensätze. Fehler können vom SQL*Loader erkannt werden, wenn die Struktur der Eingabezeile nicht der definierten Struktue entspricht. Weiterhin können Fehler von der Datenbank erkannt werden, wenn die einzufügenden Daten nicht den in der Datenbank definierten Integritätsregeln genügen. Diese Liste kann korrigiert werden und dann als neuer Input Datenfile benutzt werden. Discard File: Liste der zurückgewiesenen Eingabedatensätze. Es ist möglich, durch angegebene Filter bestimmte Datensätze einzufügen. Datenbank: Die in den Input Datenfiles vorhandenen Daten werden in die Datenbank eingefügt. Dabei werden eventuell vorhandene Indizes gepflegt und in der Datenbank vorhande Integritätsregeln geprüft.

31 Funktionen von SQL*Loader
Mehrere Eingabedateien gleichzeitig SQL-Funktionen für die Eingabefelder Laden mehrerer Tabellen in einem Lauf Zusammenfassen mehrerer Zeilen zu einem logischen Datensatz Generierung von Schlüsseln Eingabe von Platte, Band, named pipes Mehrere Eingabedateien gleichzeitig: Es ist möglich, dass in einem Lauf des SQL*Loader mehrere Eingabedateien nacheinander bearbeit werden. Dabei können sich die Dateien auf unterschiedlichen Medien befinden. Feste Satzlänge: Jede Spalte hat eine vorgegebene Länge. Begrenztes Format: Jeder Datensatz wird durch < cr><lf> abgeschlossen. Er kann vor Erreichen des letzten definierten Feldes abgeschlossen werden. Variable Satzlänge: Die einzelnen Felder können kürzer als die definierte maximale Länge sein. Das Ende eines Feldes wird durch ein Trennzeichen angegeben. SQL-Funktionen für die Eingabefelder: Die Eingabefelder können mit SQL-Zeichenkettenfunktionen bearbeitet werden Laden mehrerer Tabellen in einem Lauf: Es können z.B. bei hierarchischen Beziehungen gleichzeitig die Vater- und Kind-Tabelle beschrieben werden. Zusammenfassen mehrerer Zeilen zu einem logischen Datensatz: Mehrere aufeinanderfolgende Eingabezeilen können zu einem logischen Datensatz zusammengefasst werden. Generierung von Schlüsseln: SQL*Loader kann fortlaufende Nummern zur Identifizierung erzeugen. Eingabe von Platte, Band, named pipes: Die Dateien können sich auf unterschiedlichen Medien befinden.

32 Control file Enthält wird beim Aufruf übergeben
Pfade für Eingabe, Log, fehlerhafte Datensätze, verworfene Datensätze Struktur der Eingabedaten Feldprüfungen Zieltabellen Vorschriften zur Fehlerbehandlung wird beim Aufruf übergeben Die Angaben im Control File werden in einer eigenen Sprache, der SQL*Loader DDL (Date Definition Language) angegeben. SQL*Loader ist ein Batch Programm, das aus einem DOS-Eingabefenster aufgerufen wird.

33 Control file Beispiel LOAD DATA INFILE 'example.dat' INTO TABLE emp
(empno POSITION(01:04) INTEGER EXTERNAL, ename POSITION(06:15) CHAR, job POSITION(17:25) CHAR, mgr POSITION(27:30) INTEGER EXTERNAL, sal POSITION(32:39) DECIMAL EXTERNAL, comm POSITION(41:48) DECIMAL EXTERNAL, ... Die Eingabedatei heißt example.dat Die Zieltabelle heißt emp Die Spalten sind exakt positioniert Integer external: Zahlen, die als Zeichenkette dargestellt werden

34 Control file Beispiel LOAD DATA INFILE * INTO TABLE DEPT
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' (DEPTNO, DNAME, LOC) BEGINDATA 12,RESEARCH,"SARATOGA" 10,"ACCOUNTING",CLEVELAND 11,"ART",SALEM 21,"SALES",PHILA. 22,"SALES",ROCHESTER 42,"INT'L","SAN FRAN" INFILE * Die Eingabe steht in der Kontrolldatei Die einzelnen Felder werden durch , getrennt. Die Zeichenketten können mit ““ eingeschlossen werden. Es gibt keine Angabe der Feldlänge. BEGINDATA Es folgen die Eingabedaten

35 Control file Beispiel load data infile 'example.dat' "fix 11"
badfile 'example.bad' discardfile 'example.dsc' discardmax 999 truncate into table example (rown position(1-5), cmnt position(6-10)) badfile 'example.bad‘ Ausgabedatei für fehlerhafte Datensätze: Die Feldprüfung ergibt einen Fehler discardfile 'example.dsc' Ausgabedatei für abgewiesene Datensätze: Die Auswahlklausel (where-Klausel) weist diesen Datensatz ab discardmax 999 Nach maximal 999 abgewiesenen Datensätzen wird das Einlesen abgebrochen. Truncate Vor den Einlesen vorhandene Tabelleninhalte werden mit dem Befehl Truncate gelöscht.

36 Filtern der Datensätze
Eingabe SQL*Loader Feldprüfung Discard File Bad File SQL*Loader Auswahl DBMS Die Eingabe kann aus mehreren Zeilen bestehen, die zu einer logischen Eingabezeile zusammengefasst wird. Feldprüfung: Syntaktische Prüfung der Eingabe, z.B. richtiger Datentyp Auswahl: Prüfen der vorhandenen Regel, ob der Datensatz in die Datenbank übernommen werden soll. DBMS: Das Datenbankmanagementsystem prüft, ob der eingefügte Datensatz den Integritätsregeln entspricht. Wenn nicht, wird das Einfügen verworfen. Daten bank

37 Syntax control file -- comment OPTIONS (options) LOAD CONTINUE_LOAD
DATA READBUFFERS n infile_clause comment: Kommentar kann an jeder Stelle stehen, ausser in den Eingabedaten. Ein Kommentar wird durch -- eingeleiten. OPTIONS: Laufzeitargumente können vorbesetzt werden und dann bei Bedarf durch die Eingabezeile überschrieben werden. LOAD: leitet die Definition der Einagbedaten ein. DATA: optional infile_clause: Beschreibt die Eingabedatei(en). Es ist möglich, nacheinander mehrere Eingabedateien zu lesen und in die Datenbank zu überrtragen. INSERT: Standardeinstellung; Die zu füllende Tabelle muß leer sein. Ist das nicht der Fall, bricht SQL*Loader mit einer Fehlermeldung ab. APPEND: Fügt Daten in eine leere oder bereits gefüllte Tabelle ein. Es werden nur ganze Zeilen mit dem insert-Befehl eingefügt, keine bestehenden Zeilen mit dem update-Befehl geändert. REPLACE: Bestehende Daten werden aus der Tabelle gelöscht. Diese Option benötigt DELETE-Rechte für die entsprechende Tabelle. concatenation_clause: Beschreibt, ob und wie mehrere Eingabezeilen zu einer Ausgabezeile verbunden werden. PRESERVE BLANKS: Führende Leerzeichen werden in die Datenbank übernommen. Ohne diesen Parameter werden führende Leerzeichen ausgeblendet. into_table_clause: Beschreibt die zu füllenden Datenbanktabelle(n). BEGINDATA: Die einzulesenden Daten folgen dieser Zeile INSERT APPEND Concatenation_clause REPLACE into_table_clause PRESERVE BLANKS BEGINDATA

38 Syntax control file infile_clause::= INFILE input_filename * BADFILE
bad_file_name INFILE: Leitet die Beschreibung einer Eingabedatei ein. Für jede Eingabedatei wird eine eigene Beschreibung, beginnend mit INFILE erwartet. input_filename: Dateiname auf der Ebene des Betriebssystems. *: Die Eingabe befindet sich in dieser Datei und fängt nach dem Schlüsselwort BEGINDATA an. BADFILE: Angabe einer Ausgabedatei, die fehlerhafte Datensätze enthält. Die Zeilen dieser Datei können korrigiert werden und in einem zweiten Lauf von SQL*Loader mit APPEND in die Datenbanktabelle eingefügt werden. DISCARDFILE: Angabe einer Ausgabedatei, die zurückgewiesene Datensätze enthält. Ein Datensatz wird zurückgewiesen, wenn er syntaktisch korrekt ist, Prüfregeln von SQL*Loader ihn aber nicht zur Übergabe in die Datenbank zulassen. DISCARDS DISCARDMAX n: Nach n zurückgewiesenen Datensätzen wird die Datenübernahme abgebrochen. DISCARDS oder DISCARDMAX kann für jede Eingabedatei getrennt angegeben werden. Wenn der Parameter nur einmal angegeben wird, wird die Datenübernahme abgebrochen, wenn die Summe aller Zurückweisungen n übersteigt. Beispiel: LOAD DATA INFILE 'BEISPIEL4.DAT' BADFILE 'BEISPIEL4.BAD' DISCARDFILE 'BEISPIEL4.DSC' DISCARDMAX 20000 DISCARDFILE discard_file_name DISCARDS n DISCARDMAX

39 Syntax control file concatenation_clause::= n CONCATENATE (n)
COTINUEIF pos_spec_operator ‘ char_string‘ THIS ( ) CONCATENATE n: Jeweils n aufeinander folgende Eingabezeilen bilden eine logische Zeile, die in die Datenbank eingefügt wird. CONTINUEIF: Wenn die folgende Bedingung zutrifft, werden aufeinanderfolgende Zeilen zu einer logischen Zeile zusammengefügt und in die Datenbank eingefügt. THIS: Wenn die Bindung in dieser Zeile zutrifft, wird die darauffolgende Zeile zu dieser Zeile hinzugefügt. NEXT: Wenn die Bedingung in der folgenden Zeile zutrifft, wird die folgende Zeile zu der aktuellen Zeile hinzugefügt. pos_spec_operator: Beschreibt die Position, an der die Bedingung für das Zusammenfügen von Eingabezeilen steht. char_string: Beschreibt die Zeichenkette, an der erkannt wird, ob mehrere aufeinanderfolgende Zeilen zusammengehören. Beispiel: CONTINUEIF THIS CONTINUEIF NEXT (1:2) = ‘%%‘ (1:2) = ‘%%‘ %%aaaaaa.. ..aaaaaa.. %%bbbbbb.. %%bbbbbb.. ..cccccc.. %%cccccc.. %%dddddd.. ..dddddd.. %%eeeeee.. %%eeeeee.. ..ffffff.. %%ffffff.. Ergibt: aaaaaa..bbbbbb..cccccc.. dddddd..eeeeee..ffffff.. NEXT

40 Syntax control file pos_spec_operator::= ( start ) = : end != -
<> Ø= start: Spaltennummer der ersten Spalte des Folgekennzeichens, beginnt bei 1. end: Spaltennummer der letzten Spalte des Folgekennzeichens.

41 Syntax control file into_table_clause::= INTO TABLE tablename INSERT
APPEND REPLACE AND FIELDS delimiter_spec WHEN field_condition , INTO TABLE tablename: Beschreibt die Datenbanktabelle(n), in die die Daten eingefügt werden sollen. Es ist möglich, in einem SQL*Loader Lauf mehrere Tabellen zu beschreiben. WHEN AND field_condition: gibt die Bedingungen an, unter der diese Tabelle beschrieben wird. FIELDS delimiter_spec: Beschreibt, wie die einzelnen Felder getrennt werden. column_name: Spaltenname in der zu beschreibenden Datenbanktabelle. column_spec: Beschreibung der Spaltenattribute in der Datenbanktabelle. Beispiel: INTO TABLE TA_GROSS WHEN (8:8) != BLANKS AND (8:8) != '-' AND (8:8) != 'G' ( column_name column_spec )

42 Syntax control file delimiter_spec::= termination_spec enclosure_spec
OPTIONALLY TERMINATED WHITESPACE termination_spec: Beschreibung des Trennzeichens zwischen den Spalten enclosure_spec: Beschreibung des Zeichens, das eine Zeichenkette einschließt. WHITESPACE: Leerzeichen oder Tabulatorzeichen Beispiel: INTO TABLE TA_ANGEBOT FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY "'" by ‘ char‘ ENCLOSED ‘ char‘ by AND ‘ char‘

43 Syntax control file column_spec::= POSITION pos_spec datatype_spec ( *
) +n POSITION: Schlüsselwort zur Beschreibung der Spaltenposition *: Das beschriebene Feld folgt direkt der momentanen Position +n: Das beschriebene Feld folgt n Zeichen nach der momentanen Position NULLIF: Wenn die folgende Bedingung erfüllt ist, wird die NULL-Marke in die Datenbank eingefügt DEFAULTIF: Wenn die folgende Bedingung für eine numerische Spalte erfüllt ist, wird die Ziffer 0 in die Datenbank eingefügt. sql_string: SQL-Zeichenkettenfunktionen können für die Bearbeitung der Eingabezeile herangezogen werden. Beispiele: ENAME POSITION (1:20)CHAR EMPNO POSITION (22-26) INTEGER EXTERNAL ALLOW POSITION (*+2) INTEGER EXTERNAL TERMINATED BY “/“ DEPT POSITION (30-33) CHAR “UPPER(:DEPT)“ NULLIF field_condition DEFAULTIF field_condition “ sql_string“

44 Syntax control file datatype_spec::= INTEGER delimiter_spec FLOAT
EXTERNAL (length) DECIMAL ( precision ) , scale EXTERNAL (length) EXTERNAL: Die Zahlen werden als Zeichenketten angegeben (im Gegensatz zur binären Repräsentation) length: Diese Angabe ist optional. Wenn sie vorhanden ist, überschreibt sie die POSITION - Angabe. precision: Anzahl der Stellen scale: Anzahl der Stellen nach dem Komma mask: Maske für das Entschlüsseln des eingegebenen Datums Beispiel: INTO TABLE TA_TERMIN ( DATUM POSITION(1:16) DATE "dd.mm.yyyy hh24:mi", THEMA POSITION(18:37) CHAR) CHAR (length) DATE (length) “ mask“

45 Aufruf des SQL*Loader SQLLDR80 schlüsselwort=wert [, schlüsselwort=wert ] Gültige Schlüsselworte: USERID - ORACLE userid/password CONTROL - controlfile LOG - logfile BAD - badfile DATA - datafile LOAD - Anzahl der einzulesenden logischen Datensätze ERRORS - Anzahl der erlaubten Fehler SQL*Loader wird aus dem DOS-Eingabefenster aufgerufen. Das dazu gehörende ausführbare Programm steht unter ORACLE_HOME = W:\Database\Oracle\ora817 ORACLE_HOME/BIN/SQLLDR80.EXE Beispiele stehen unter ORACLE_HOME/RDBMS80/LOADER Beispiel: sqlldr80 USERID=pc31/pc31, control=uebung1.ctl

46 Mathetest

47 Mathetest Auswertung pro Stunde
select to_char(datum,'hh24'), count(*) from ta_zeitreihe group by to_char(datum,'hh24') order by to_char(datum,'hh24');

48 Mathetest

49 Mathetest Auswertung pro Wochentag
select to_char(datum,'day'), count(*), to_char(datum,'d') from ta_zeitreihe group by to_char(datum,'day'), order by to_char(datum,'d');

50 Mathetest

51 Mathetest

52 Mathetest Faktentabelle Dimensionstabelle
Alle Einträge der Originaltabelle und zusätzlich ein eindeutiger Zähler und Tagesnummer Dimensionstabelle Jeder Tag seit Beginn des Tests mit: fortlaufende Nummer, Tagesnummer, Monat, Jahr, Datum zu jedem Eintrag in der Faktentabelle: Wochentag, Stunde, Tagesnummer

53 Dimensionstabelle TAG DATUM JAHREST MONAT

54 Datumsfunktionen von Oracle
ADD_MONTHS Syntax ADD_MONTHS(d,n) Purpose Returns the date d plus n months. The argument n can be any integer. If d is the last day of the month or if the resulting month has fewer days than the day component of d, then the result is the last day of the resulting month. Otherwise, the result has the same day component as d.

55 Datumsfunktionen von Oracle
LAST_DAY Syntax LAST_DAY(d) Purpose Returns the date of the last day of the month that contains d. You might use this function to determine how many days are left in the current month.

56 Datumsfunktionen von Oracle
NEXT_DAY Syntax NEXT_DAY(d, char) Purpose Returns the date of the first weekday named by char that is later than the date d. The argument char must be a day of the week in your session's date language-either the full name or the abbreviation. The minimum number of letters required is the number of letters in the abbreviated version; any characters immediately following the valid abbreviation are ignored. The return value has the same hours, minutes, and seconds component as the argument d.

57 Datumsfunktionen von Oracle
ROUND Syntax ROUND(d[,fmt]) Purpose Returns d rounded to the unit specified by the format model fmt. If you omit fmt, d is rounded to the nearest day. See "ROUND and TRUNC" for the permitted format models to use in fmt.

58 Datumsformate in Oracle

59 Datumsfunktionen von Sybase
dateadd - adds an interval to a specified date. It takes three arguments-- the datepart, a number, and a date. The result is a datetime value equal to the date plus the number of date parts. select newpubdate = dateadd(day, 21, pubdate) from titles

60 Datumsfunktionen von Sybase
datediff - calculates the number of date parts between two specified dates. It takes three arguments. The first is a date part. The second and third are dates, either datetime or smalldatetime values. The result is a signed integer value equal to date2 - date1, in date parts. select newdate = datediff(day, pubdate, getdate()) from titles

61 Datumsfunktionen von Sybase
datename - produces the specified datepart (the first argument) of the specified date (the second argument) as a character string. Takes either a datetime or smalldatetime value as its second argument. select datename(month getdate())   November

62 Datumsfunktionen von Sybase
datepart - produces the specified datepart (the first argument) of the specified date (the second argument) as an integer. Takes either a datetime or smalldatetime value as its second argument. select datepart(month getdate())   11

63

64 Datenkonvertierung Sybase
convert (datatype [(length) | (precision[, scale])], expression[, style]) Converts between a wide variety of datatypes and reformats date/time and money data for display purposes.

65

66 Dimensionstabelle TAG DATUM JAHREST MONAT

67 Dimensionstabelle drop table ta_Dim_zeit_1;
create table ta_dim_zeit_1( tag_nr number(3) not null, Datum date null, jahrestag char(7), monat number(2) ); select to_number(to_char(max(datum),'J')) - to_number(to_char(min(datum),'J'))+1 from ta_zeitreihe; insert into ta_dim_zeit_1 (tag_nr) select schluessel from ta_zeitreihe where schluessel <= 382

68 Dimensionstabelle select to_char(min(datum),'J'), min(datum)
from ta_zeitreihe; update ta_dim_zeit_1 set datum = to_date(to_char( tag_nr,' '),'J'); set jahrestag = to_char(datum,'YYYY')||to_char(datum,'ddd'), monat = to_char(datum,'MM');

69 Auswertung pro Tag select to_char(d1.datum, 'yy.mm.dd'), count(z.schluessel) "Anzahl" from ta_dim_zeit_1 d1, ta_zeitreihe z where d1.jahrestag = z.jahrestag (+) group by to_char(d1.datum, 'yy.mm.dd'), d1.jahrestag order by to_char(d1.datum, 'yy.mm.dd');

70


Herunterladen ppt "Daten übernehmen und vorbereiten"

Ähnliche Präsentationen


Google-Anzeigen