CrystalReports: Verknüpfen von Tabellen: Unterschied zwischen den Versionen
(→Beispiel 4: Verknüpfungen einer Auftragsliste zum Drucken wie ein Lieferschein) |
|||
(12 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 5: | Zeile 5: | ||
== Hintergrund == | == Hintergrund == | ||
− | Die Datenbank von [[REFLEX]] bzw. [[GEVAS-Professional]] ist eine sog. '''"[http://de.wikipedia.org/wiki/Relationale_Datenbank Relationale Datenbank]"'''. Vereinfacht gesagt bedeutet das, dass die Tabellen der Datenbank nicht "festdrahtet" miteinander verbunden sind, sondern durch '''Verknüpfungen''' (Relationen) miteinander verbunden werden. Das bedeutet, dass man bei einer '''Abfrage''' der Daten festlegen kann, wie die Daten verknüpft werden sollen. Je nach Aufgabenstellung kann die Verknüpfung anders sein! | + | Die Datenbank von [[REFLEX]] bzw. [[GEVAS-Professional]] ist eine sog. '''"[http://de.wikipedia.org/wiki/Relationale_Datenbank Relationale Datenbank]"'''. Vereinfacht gesagt bedeutet das, dass die Tabellen der Datenbank nicht "festdrahtet" miteinander verbunden sind, sondern durch '''Verknüpfungen''' (Relationen) dynamisch miteinander verbunden werden. Das bedeutet, dass man bei einer '''Abfrage''' der Daten festlegen kann, wie die Daten verknüpft werden sollen. Je nach Aufgabenstellung kann die Verknüpfung anders sein! |
== Verknüpfung == | == Verknüpfung == | ||
Zeile 51: | Zeile 51: | ||
Wir wollen eine Liste der vorhandenen Aufträge. Auf der Liste sollen die Auftragskopfdaten stehen, aber auch die Positionen. Welche Tabelle ist hier die "führende"? | Wir wollen eine Liste der vorhandenen Aufträge. Auf der Liste sollen die Auftragskopfdaten stehen, aber auch die Positionen. Welche Tabelle ist hier die "führende"? | ||
− | Nun, da es um die ausgegebenen Auftrags-Daten geht, ist es die Tabelle der Aufträge (MAUFKO). Um die geht es! Weil wir im Report aber die Auftragspositionen sehen wollen, müssen wir den Auftragskopf (MAUFKO) mit der Tabelle der Auftragspositionen (MAUFPO) verknüpfen: | + | Nun, da es um die ausgegebenen Auftrags-Daten geht, ist es die Tabelle der Aufträge (MAUFKO). '''Um die geht es!''' Weil wir im Report aber die Auftragspositionen sehen wollen, müssen wir den Auftragskopf (MAUFKO) mit der Tabelle der Auftragspositionen (MAUFPO) verknüpfen: |
+ | |||
+ | [[Datei:CrystalReport_Bsp_Verknuepfung_MAUFKO.jpg]] | ||
Die Beziehung ist dabei '''von''' MAUFKO zu '''MAUFPO'''. Das heißt: Es wird ein Auftrag eingelesen, danach werden anhand der [[Auftragsnummer]] die zugehörigen Auftragspositionen eingelesen. | Die Beziehung ist dabei '''von''' MAUFKO zu '''MAUFPO'''. Das heißt: Es wird ein Auftrag eingelesen, danach werden anhand der [[Auftragsnummer]] die zugehörigen Auftragspositionen eingelesen. | ||
+ | |||
+ | ==== Beispiel 3: Verknüpfungen eines Lieferschein-Formulars ==== | ||
+ | |||
+ | Beim Verknüpfen der Tabellen in einem Lieferschein-Formular werden diese Tabellen miteinander verknüpft: | ||
+ | |||
+ | [[Datei:CrystalReports_Formular_Bsp_Lieferschein_Verknuepfungen.jpg]] | ||
+ | |||
+ | * Es beginnt beim Lieferschein-Kopf ("LSCHKO"). Alle anderen Tabellen hängen an dieser Tabelle oder an damit verknüpften Tabellen. | ||
+ | |||
+ | [[Datei:CrystalReports_Formular_Bsp_Lieferschein_Verknuepfungen_Schaubild.jpg]] | ||
+ | |||
+ | * Die Lieferschein-Positionen ("LSCHPO") sind mit dem Kopf durch die Lieferschein-Nummer ("LIEFSCHNR") verknüpft. | ||
+ | ** In der Sortierung sollte man in Crystal angeben, dass nach LSCHPO.POSNR sortiert werden soll. Somit kommen die Positionen in der Reihenfolge, in der sie ausgegeben wurden. | ||
+ | * Damit man von der jeweiligen Position auf die '''Einzelartikel-Daten''' zugreifen kann, wird die Tabelle der Positionen mit den Einzelartikeln ("MARTEINZ") verknüpft. Dazu verwendet man die Felder: | ||
+ | ** LSCHPO.LIEFSCHNR --> MARTEINZ.LIEFSCHNR | ||
+ | ** LSCHPO.POSNR --> MARTEINZ.LIEFPOSNR | ||
+ | * '''Achtung! Nicht mit ARTNR verknüpfen, da diese in einem Lieferschein ja mehrfach vorkommen kann'''! | ||
+ | * Damit man von der jeweiligen Position auf die '''Auftragspositionen''' zugreifen kann, wird die Tabelle der Lieferschein-Positionen mit den Auftrags-Positionen ("MAUFPO") verknüpft. Dazu verwendet man die Felder: | ||
+ | ** LSCHPO.AUFTRNR ---> MAUFPO.AUFTRNR | ||
+ | ** LSCHPO.AUFTRPOSNR ---> MAUFPO.POSNR (nicht LSCHPO.POSNR, das ist die laufende Positions-Nummer des '''Lieferschein-Positionen''', nicht die der Auftrags-Positionen)! | ||
+ | ** LSCHPO.AUFTRUNTPOSNR ---> MAUFPO.UNTPOSNR | ||
+ | * Damit man auf die '''Auftragskopfdaten''' zugreifen kann, wird die Tabelle des Lieferscheins mit dem Auftrags-Kopf ("MAUFKO") verknüpft. Dazu verwendet man die Felder: | ||
+ | ** LSCHPO.AUFTRNR ---> MAUFKO.AUFTRNR | ||
+ | |||
+ | * Von dort aus werden dann Adressdaten ("ADR"), Ansprechpartner ("ADRANSPR") und Bearbeiter ("PERS") verknüpft. | ||
+ | |||
+ | ==== Beispiel 4: Verknüpfungen einer Auftragsliste zum Drucken wie ein Lieferschein ==== | ||
+ | |||
+ | Dieses Beispiel zeigt, wie man eine '''Auftragsliste''' für das Druck-Dialogfenster "Lieferschein drucken" erstellt. Die Besonderheiten: | ||
+ | |||
+ | * Normalerweise wird in der Lagerausgabe ein '''Lieferschein''' gedruckt! Ein Lieferschein bezieht sich auf eine bestimmte Lieferschein-Nummer, nicht (direkt) auf eine Auftragsnummer. An einen Lieferschein schickt [[REFLEX]] also eine Selektionsformel, die den Druck auf eine bestimmte '''Lieferschein-Nummer''' begrenzt: | ||
+ | |||
+ | {LSchKo.LiefSchNr}=1000 | ||
+ | |||
+ | * Eine '''Auftragsliste''' bezieht sich auf einen bestimmten '''Auftrag''', unabhängig von dem/den Lieferscheinen, die es für ihn gibt. Deshalb wird eine Auftragsliste auch nicht aus der Lagerausgabe heraus gedruckt, sondern aus der Auftragsverwaltung heraus. Ein Angebot oder eine Auftragsbestätigung ist im Grunde genommen nichts anderes als eine Auftragsliste. | ||
+ | |||
+ | * An eine Auftragsliste schickt [[REFLEX]] eine Selektionsformel, die den Druck auf eine bestimmte '''Auftrags-Nummer''' begrenzt. | ||
+ | |||
+ | {MAufKo.AuftrNr}=50000 | ||
+ | |||
+ | '''Wie kann man nun eine Auftragsliste aus der Lagerausgabe heraus drucken?''' | ||
+ | |||
+ | Der Trick liegt in der Verknüpfung der Tabellen: | ||
+ | |||
+ | * Man muss weiterhin die Lieferschein-Kopf-Tabelle im Bericht haben, weil sonst die Selektionsformel <code>{LSchKo.LiefSchNr}=1000</code>, die [[REFLEX]] erzeugt, zu einem Fehler führen würde. Diese Tabelle wird jedoch nur für die Verknüpfung benötigt, es stehen '''keine Felder''' des Lieferscheins im Bericht! | ||
+ | |||
+ | [[Datei:CrystalReports_Formular_Bsp_Auftragsliste_Verknuepfungen_Schaubild.jpg]] | ||
+ | |||
+ | * Auch '''muss''' man die Tabelle '''Auftragskopf''' (<code>"MAufKo"</code>) im Bericht haben! Im Berichtskopf stehen die Felder dieser Tabelle (Kunde, Veranstaltung usw.). | ||
+ | |||
+ | * Entscheidend ist nun, dass man den Lieferschein-Kopf direkt mit dem Auftrags-Kopf über die Auftragsnummer (<code>"AuftrNr"</code>)verknüpft! Da zu jedem Lieferschein '''ein''' Auftrag gehört bewirkt nun die Selektionsformel: | ||
+ | |||
+ | {LSchKo.LiefSchNr}=1000 | ||
+ | |||
+ | indirekt eigentlich: | ||
+ | |||
+ | {MAufKo.AuftrNr}=50000 | ||
+ | |||
+ | Es werden also diese Tabellen miteinander verknüpft: | ||
+ | |||
+ | [[Datei:CrystalReports_Formular_Bsp_Auftragsliste_Verknuepfungen.jpg]] | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | Beachten Sie die Hinweise des Artikels '''[[CrystalReports:_Standard-Verknüpfungen]]'''. | ||
=== Verknüpfungsoptionen === | === Verknüpfungsoptionen === | ||
Zeile 61: | Zeile 129: | ||
Es ist eine etwas lästige Angewohnheit einer Verknüpfung, dass die Abfrage nur dann Daten zurückliefert, wenn es in '''allen''' verknüpften Tabellen Daten gibt. Liefert auch nur eine der verknüpften Tabelle keine Daten, wird die '''gesamte Abfrage''' keine Daten zeigen! | Es ist eine etwas lästige Angewohnheit einer Verknüpfung, dass die Abfrage nur dann Daten zurückliefert, wenn es in '''allen''' verknüpften Tabellen Daten gibt. Liefert auch nur eine der verknüpften Tabelle keine Daten, wird die '''gesamte Abfrage''' keine Daten zeigen! | ||
− | * Standardmäßig werden die Verknüpfungen so eingerichtet, dass nur die Abfrage nur dann ein Ergebnis liefert, wenn es in '''allen''' Tabellen der Verknüpfung Daten gibt. Gibt die Verknüpfung einer der Tabellen '''kein Ergebnis'', werden überhaupt keine Daten zurückgeliefert! | + | * Standardmäßig werden die Verknüpfungen so eingerichtet, dass nur die Abfrage '''nur dann ein Ergebnis liefert''', wenn es in '''allen''' Tabellen der Verknüpfung '''Daten gibt'''. Gibt die Verknüpfung '''einer einzigen''' der Tabellen '''kein Ergebnis''', werden '''überhaupt keine Daten''' zurückgeliefert! |
Um dieses Verhalten zu ändern, klicken Sie mit der rechten Maustaste auf die Linie der Verknüpfung... | Um dieses Verhalten zu ändern, klicken Sie mit der rechten Maustaste auf die Linie der Verknüpfung... | ||
Zeile 81: | Zeile 149: | ||
Der Auftragskopf (MAUFKO) wird mit dem Auftragsfuß (MAUFFU) verknüpft und den Auftragspositionen (MAUFPO). Zusätzlich werden die Adress-Ansprechpartner (ADRANSPR) verknüpft, damit man z.B. die Telefonnummer des Ansprechpartners aufführen kann. | Der Auftragskopf (MAUFKO) wird mit dem Auftragsfuß (MAUFFU) verknüpft und den Auftragspositionen (MAUFPO). Zusätzlich werden die Adress-Ansprechpartner (ADRANSPR) verknüpft, damit man z.B. die Telefonnummer des Ansprechpartners aufführen kann. | ||
− | Wenn Sie den Report ausführen, werden manchmal überhaupt keine Daten angezeigt! Warum? | + | Wenn Sie den Report ausführen, werden '''manchmal''' überhaupt keine Daten angezeigt! '''Warum?''' |
Der Grund liegt in der oben beschriebenen Eigenheit von Verknüpfungen. Wenn Sie eine Auftrag ausgeben, in dem bei dem Kunden kein Ansprechpartner vorhanden ist, werden keine Daten angezeigt! Wenn es einen Ansprechpartner gibt, werden auch die Auftragsdaten angezeigt. Wenn Sie die Verknüpfungsoptionen ändern wie oben beschrieben, funktioniert alles! | Der Grund liegt in der oben beschriebenen Eigenheit von Verknüpfungen. Wenn Sie eine Auftrag ausgeben, in dem bei dem Kunden kein Ansprechpartner vorhanden ist, werden keine Daten angezeigt! Wenn es einen Ansprechpartner gibt, werden auch die Auftragsdaten angezeigt. Wenn Sie die Verknüpfungsoptionen ändern wie oben beschrieben, funktioniert alles! |
Aktuelle Version vom 19. März 2013, 20:55 Uhr
Inhaltsverzeichnis
1 Allgemeines
Das Verknüpfen von Tabellen in einem Report ist eine der schwierigsten Aufgaben beim Erstellen eines Reports! Nur wenn man die Systematik und Logik verstanden hat, kann man einen Report mit mehreren Tabellen richtig aufbauen. Wenn man die Tabellen falsch verknüpft, können schwere Fehler passieren!
2 Hintergrund
Die Datenbank von REFLEX bzw. GEVAS-Professional ist eine sog. "Relationale Datenbank". Vereinfacht gesagt bedeutet das, dass die Tabellen der Datenbank nicht "festdrahtet" miteinander verbunden sind, sondern durch Verknüpfungen (Relationen) dynamisch miteinander verbunden werden. Das bedeutet, dass man bei einer Abfrage der Daten festlegen kann, wie die Daten verknüpft werden sollen. Je nach Aufgabenstellung kann die Verknüpfung anders sein!
3 Verknüpfung
Eine Verknüpfung bestimmt, wie die Daten zueinander in Beziehung stehen. Beispiel:
Wenn man sich einen Auftrag anschaut, so besteht er im Wesentlichen aus drei Tabellen:
- Auftragskopf
- Positionen
- Auftragsfuß
Zu einem Auftragskopf gibt es mehrere Positionen. Die Anzahl der Positionen ist variabel. Man spricht hier von einer 1:n-Relation: Zu einer Auftragsnummer gibt es eine variable Anzahl (n) von Positionen.
Zu einem Auftragskopf gibt es immer einen Auftragsfuß. Man spricht hier von einer 1:1-Relation. Zu einer Auftragsnummer gibt es immer nur einen Fuß-Datensatz.
3.1 Verknüpfungen sind dynamisch!
Was heißt das?
Nun, in der Datenbank sind die Tabellen untereinander nicht verknüpft. Erst bei der Abfrage der Daten wird bestimmt, in welcher Beziehung die Tabellen zueinander stehen. Das ist ein mächtiges Werkzeug, macht die Sache aber etwas schwieriger. Wie soll man wissen, wie man die Tabellen verknüpft?
Entscheidend ist immer die Frage, welche Tabelle die "führende" ist, also welche Information steht im Mittelpunkt der Abfrage (im Detailbereich des Reports). Danach muss man sich fragen:
- Welche Informationen will man zusätzlich haben.
- In welchen Tabellen stehen die zusätzlichen Daten?
- Mit welchem Feld kann man die Daten verknüpfen?
Versuchen wir, uns der Sache mit Beispielen zu nähern.
3.1.1 Beispiel 1: Liste ausgegebener Artikel
Wir wollen eine Liste der aktuell ausgegebenen Einzel-Artikel. Auf der Liste sollen die Artikeldaten stehen, aber auch Teile der Auftragsdaten. Welche Tabelle ist nun die "führende"?
Nun, da es um die ausgegebenen Einzelartikel-Daten geht, ist es die Tabelle der Einzelartikel (MARTEINZ). Um die geht es! Weil wir im Report aber auch Teile der Auftragsdaten sehen wollen (z.B. den Kunden, den Veranstaltungsort usw.), müssen wir den Auftragskopf (MAUFKO) mit der Tabelle der Einzelartikel (MARTEINZ) verknüpfen:
Die Beziehung ist dabei von MARTEINZ zu MAUFKO. Das heißt: Es wird ein Einzelartikel eingelesen, danach wird anhand der Auftragsnummer der zugehörige Auftragskopf eingelesen.
3.1.2 Beispiel 2: Auftragsliste
Wir wollen eine Liste der vorhandenen Aufträge. Auf der Liste sollen die Auftragskopfdaten stehen, aber auch die Positionen. Welche Tabelle ist hier die "führende"?
Nun, da es um die ausgegebenen Auftrags-Daten geht, ist es die Tabelle der Aufträge (MAUFKO). Um die geht es! Weil wir im Report aber die Auftragspositionen sehen wollen, müssen wir den Auftragskopf (MAUFKO) mit der Tabelle der Auftragspositionen (MAUFPO) verknüpfen:
Die Beziehung ist dabei von MAUFKO zu MAUFPO. Das heißt: Es wird ein Auftrag eingelesen, danach werden anhand der Auftragsnummer die zugehörigen Auftragspositionen eingelesen.
3.1.3 Beispiel 3: Verknüpfungen eines Lieferschein-Formulars
Beim Verknüpfen der Tabellen in einem Lieferschein-Formular werden diese Tabellen miteinander verknüpft:
- Es beginnt beim Lieferschein-Kopf ("LSCHKO"). Alle anderen Tabellen hängen an dieser Tabelle oder an damit verknüpften Tabellen.
- Die Lieferschein-Positionen ("LSCHPO") sind mit dem Kopf durch die Lieferschein-Nummer ("LIEFSCHNR") verknüpft.
- In der Sortierung sollte man in Crystal angeben, dass nach LSCHPO.POSNR sortiert werden soll. Somit kommen die Positionen in der Reihenfolge, in der sie ausgegeben wurden.
- Damit man von der jeweiligen Position auf die Einzelartikel-Daten zugreifen kann, wird die Tabelle der Positionen mit den Einzelartikeln ("MARTEINZ") verknüpft. Dazu verwendet man die Felder:
- LSCHPO.LIEFSCHNR --> MARTEINZ.LIEFSCHNR
- LSCHPO.POSNR --> MARTEINZ.LIEFPOSNR
- Achtung! Nicht mit ARTNR verknüpfen, da diese in einem Lieferschein ja mehrfach vorkommen kann!
- Damit man von der jeweiligen Position auf die Auftragspositionen zugreifen kann, wird die Tabelle der Lieferschein-Positionen mit den Auftrags-Positionen ("MAUFPO") verknüpft. Dazu verwendet man die Felder:
- LSCHPO.AUFTRNR ---> MAUFPO.AUFTRNR
- LSCHPO.AUFTRPOSNR ---> MAUFPO.POSNR (nicht LSCHPO.POSNR, das ist die laufende Positions-Nummer des Lieferschein-Positionen, nicht die der Auftrags-Positionen)!
- LSCHPO.AUFTRUNTPOSNR ---> MAUFPO.UNTPOSNR
- Damit man auf die Auftragskopfdaten zugreifen kann, wird die Tabelle des Lieferscheins mit dem Auftrags-Kopf ("MAUFKO") verknüpft. Dazu verwendet man die Felder:
- LSCHPO.AUFTRNR ---> MAUFKO.AUFTRNR
- Von dort aus werden dann Adressdaten ("ADR"), Ansprechpartner ("ADRANSPR") und Bearbeiter ("PERS") verknüpft.
3.1.4 Beispiel 4: Verknüpfungen einer Auftragsliste zum Drucken wie ein Lieferschein
Dieses Beispiel zeigt, wie man eine Auftragsliste für das Druck-Dialogfenster "Lieferschein drucken" erstellt. Die Besonderheiten:
- Normalerweise wird in der Lagerausgabe ein Lieferschein gedruckt! Ein Lieferschein bezieht sich auf eine bestimmte Lieferschein-Nummer, nicht (direkt) auf eine Auftragsnummer. An einen Lieferschein schickt REFLEX also eine Selektionsformel, die den Druck auf eine bestimmte Lieferschein-Nummer begrenzt:
{LSchKo.LiefSchNr}=1000
- Eine Auftragsliste bezieht sich auf einen bestimmten Auftrag, unabhängig von dem/den Lieferscheinen, die es für ihn gibt. Deshalb wird eine Auftragsliste auch nicht aus der Lagerausgabe heraus gedruckt, sondern aus der Auftragsverwaltung heraus. Ein Angebot oder eine Auftragsbestätigung ist im Grunde genommen nichts anderes als eine Auftragsliste.
- An eine Auftragsliste schickt REFLEX eine Selektionsformel, die den Druck auf eine bestimmte Auftrags-Nummer begrenzt.
{MAufKo.AuftrNr}=50000
Wie kann man nun eine Auftragsliste aus der Lagerausgabe heraus drucken?
Der Trick liegt in der Verknüpfung der Tabellen:
- Man muss weiterhin die Lieferschein-Kopf-Tabelle im Bericht haben, weil sonst die Selektionsformel
{LSchKo.LiefSchNr}=1000
, die REFLEX erzeugt, zu einem Fehler führen würde. Diese Tabelle wird jedoch nur für die Verknüpfung benötigt, es stehen keine Felder des Lieferscheins im Bericht!
- Auch muss man die Tabelle Auftragskopf (
"MAufKo"
) im Bericht haben! Im Berichtskopf stehen die Felder dieser Tabelle (Kunde, Veranstaltung usw.).
- Entscheidend ist nun, dass man den Lieferschein-Kopf direkt mit dem Auftrags-Kopf über die Auftragsnummer (
"AuftrNr"
)verknüpft! Da zu jedem Lieferschein ein Auftrag gehört bewirkt nun die Selektionsformel:
{LSchKo.LiefSchNr}=1000
indirekt eigentlich:
{MAufKo.AuftrNr}=50000
Es werden also diese Tabellen miteinander verknüpft:
Beachten Sie die Hinweise des Artikels CrystalReports:_Standard-Verknüpfungen.
3.2 Verknüpfungsoptionen
Dies ist sehr wichtig!
Es ist eine etwas lästige Angewohnheit einer Verknüpfung, dass die Abfrage nur dann Daten zurückliefert, wenn es in allen verknüpften Tabellen Daten gibt. Liefert auch nur eine der verknüpften Tabelle keine Daten, wird die gesamte Abfrage keine Daten zeigen!
- Standardmäßig werden die Verknüpfungen so eingerichtet, dass nur die Abfrage nur dann ein Ergebnis liefert, wenn es in allen Tabellen der Verknüpfung Daten gibt. Gibt die Verknüpfung einer einzigen der Tabellen kein Ergebnis, werden überhaupt keine Daten zurückgeliefert!
Um dieses Verhalten zu ändern, klicken Sie mit der rechten Maustaste auf die Linie der Verknüpfung...
...und wählen Verknüpfungsoptionen aus.
Dann wählen Sie diese Option:
Beispiel:
In einem Auftragsformular haben Sie diese Tabellen und Verknüpfungen:
Der Auftragskopf (MAUFKO) wird mit dem Auftragsfuß (MAUFFU) verknüpft und den Auftragspositionen (MAUFPO). Zusätzlich werden die Adress-Ansprechpartner (ADRANSPR) verknüpft, damit man z.B. die Telefonnummer des Ansprechpartners aufführen kann.
Wenn Sie den Report ausführen, werden manchmal überhaupt keine Daten angezeigt! Warum?
Der Grund liegt in der oben beschriebenen Eigenheit von Verknüpfungen. Wenn Sie eine Auftrag ausgeben, in dem bei dem Kunden kein Ansprechpartner vorhanden ist, werden keine Daten angezeigt! Wenn es einen Ansprechpartner gibt, werden auch die Auftragsdaten angezeigt. Wenn Sie die Verknüpfungsoptionen ändern wie oben beschrieben, funktioniert alles!
4 Standard-Verknüpfungen
Der Artikel CrystalReports: Standard-Verknüpfungen beschreibt eine Auswahl von Standard-Verknüpfungen, die von der Aufgabenstellung abhängen.