2009-08-07 7 views
0

Ich versuche, einen Bericht in Kristall 11 Erstellen von Berichten auf der Grundlage dieser SQL-AbfrageDie Rauschunterdrückung Abschnitt in Crystal Reports mit subreport

SELECT *
      FROM (Tabelle) OM, (Tabelle) OL, (Tabelle C)
        WHERE OM.ORDER = OL.ORDER
        UND OM.COMPANY = C.COMPANY
        UND (exists (SELECT *
                        FROM (Tabelle) OSD (Tabelle) OSDD
                        WHERE OSD .ORDER = OL.ORDER
                      UND OSD.LINE = OL.LINE
                        UND OSD.REVISION = OL.REVISION
                        UND OSD.DIM = OSDD.DIM
                        UND OSDD.SHAPE = OL.SHAPE))

Ich dachte, den besten Weg zu beginnen wurde erstellt, indem der Hauptbericht mit den ersten beiden Tabellen erstellt und ein Unterbericht erstellt wurde, der den Abschnitt "EXISTS" der Abfrage verwendet und eine Verknüpfung mit dem Hauptbericht herstellt.

Mein Detailbereich enthält sowohl Daten aus dem Hauptbericht als auch aus dem Unterbericht. Ich bekomme die korrekten Ergebnisse zurück, wenn der Unterbericht einen Wert zurückgibt, aber ich möchte in der Lage sein, den Detailabschnitt des Hauptberichts zu unterdrücken, wenn der Unterbericht null ist, aber ich kann keinen Weg finden, den Unterbericht in einem von zu referenzieren die Auswahlformeln.

Ich bin offen für Vorschläge, wenn es eine bessere Möglichkeit gibt, diese Abfrage auch nachzuahmen.

Antwort

0

Ich bin, wenn welche Art von Datenbank nicht sicher, ob Sie verwenden, aber ich glaube, dass Sie wahrscheinlich so etwas wie verwenden:

select * --you probably should narrow this down instead of using a * 
from (table) OM 
inner join (table) OL on OM.ORDER = OL.ORDER 
inner join (table) C on OM.COMPANY = C.COMPANY 
inner join (table) OSD on OSD.ORDER = OL.ORDER 
    and OSD.LINE = OL.LINE 
    and OSD.REVISION = OL.REVISION 
    and OSD.DIM = OSDD.DIM 
inner join (table) OSDD on OSDD.SHAPE = OL.SHAPE 

aus der Spitze von meinem Kopf und nicht getestet, aber die Dies ist Idee ist, dass es alle Datensätze von OM, OL, C, OSD und OSDD zeigen würde, wo es Übereinstimmungen gefunden hat. Da Sie keinen linken Join im OSD oder OSDD verwenden, sollten Sie keine Nullzeilen haben.

immer Sie immer diejenigen linken Außen ändern könnte verbindet wie:

select * --you probably should narrow this down instead of using a * 
from (table) OM 
inner join (table) OL on OM.ORDER = OL.ORDER 
inner join (table) C on OM.COMPANY = C.COMPANY 
left outer join (table) OSD on OSD.ORDER = OL.ORDER 
    and OSD.LINE = OL.LINE 
    and OSD.REVISION = OL.REVISION 
    and OSD.DIM = OSDD.DIM 
left outer join (table) OSDD on OSDD.SHAPE = OL.SHAPE 

Dies Sie alle Zeilen von OM, OL und C und nur die Zeilen von OSD und OSDD geben würde, wo es eine Übereinstimmung gefunden. Dann haben Sie eine Reihe von Optionen, um die Zeilen zu unterdrücken, die Sie nicht sehen möchten, z.

Hoffe, das hilft.

+0

Das funktionierte viel besser. Vielen Dank. – Bryan

+0

Wie wäre es mit einem Upvote und der angenommenen Antwort, da dies funktioniert? :) – Dusty

1

Es gibt keinen Grund, einen Unterbericht zu verwenden, wenn Sie keine Daten sehen möchten, deren Unterbericht null ist. Sie verkomplizieren den Bericht.

Wenn Sie dies weiterhin tun möchten, erlaubt das Suppress-Attribut Ausdrücke.Sie müssten wahrscheinlich eine Variable "globalvar" verwenden, die Variable basierend auf dem Unterbericht festlegen, aber ich bezweifle, dass sie vor der Anzeige der Zeile festgelegt würde.

+0

Ich vermutete, dass ich es schwieriger machte als nötig, aber ich nahm an, dass es basierend auf dem Unterbericht einfach zu unterdrücken wäre. Die globale Variable Idee war vielversprechend, aber ich entschied mich, Ihrem ersten Vorschlag zu folgen und zu vereinfachen. – Bryan

+0

Haben Sie meine Antwort als Antwort markiert? –