2009-08-07 6 views
0

Je suis en train de créer un rapport dans Crystal Reports 11 basé sur cette requête SQLsection supprimant dans Crystal Reports avec subreport

SELECT *
      DE (tableau) OM, (tableau) OL, (tableau) C
        OÙ OM.ORDER = OL.ORDER
        ET OM.COMPANY = C.COMPANY
        ET (EXISTS (SELECT *
                        DE (tableau) OSD (tableau) OSDD
                        OÙ OSD .ORDER = OL.ORDER
                      ET OSD.LINE = OL.LINE
                        ET OSD.REVISION = OL.REVISION
                        ET OSD.DIM = OSDD.DIM
                        ET OSDD.SHAPE = OL.SHAPE))

Je pensais que la meilleure façon de commencer était en créant le rapport principal en utilisant les deux premières tables et en créant un sous-rapport en utilisant la section "EXISTS" de la requête et en reliant le rapport principal.

Ma section de détails contient à la fois les données du rapport principal et du sous-rapport. Je récupère les résultats corrects pour l'endroit où le sous-rapport renvoie une valeur, mais je veux pouvoir supprimer la section de détail du rapport principal si le sous-rapport est nul, mais je ne trouve pas de moyen de référencer le sous-rapport dans les formules de sélection.

Je suis ouvert aux suggestions s'il y a une meilleure façon d'imiter cette requête.

Répondre

0

Je ne sais pas si ce type de base de données que vous utilisez, mais je crois que vous pouvez probablement utiliser quelque chose comme:

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 

Ceci est du haut de ma tête et non testé, mais le L'idée est de montrer tous les enregistrements de OM, OL, C, OSD et OSDD où ils ont trouvé des correspondances. Puisque vous n'utilisez pas une jointure à gauche sur OSD ou OSDD, vous ne devriez pas avoir de lignes nulles.

Cependant, vous pouvez toujours changer les OUTER gauche rejoint comme:

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 

Cela vous donnera toutes les lignes de l'OM, ​​OL, et C et seules les lignes de l'OSD et OSDD où il a trouvé un match. Ensuite, vous avez un certain nombre d'options pour supprimer les lignes que vous ne souhaitez pas voir telles que l'utilisation de la formule de suppression dans la section expert comme suggéré.

Espérons que cela aide.

+0

Cela a fonctionné beaucoup mieux. Merci. – Bryan

+0

Que diriez-vous d'un upvote et la réponse acceptée depuis que cela a fonctionné? :) – Dusty

1

Il n'y a pas de raison d'utiliser un sous-rapport si vous ne voulez pas voir de données où le sous-rapport est nul. Vous compliquez trop le rapport.

Si vous voulez toujours faire cela, l'attribut Suppress permet les expressions.Vous devrez probablement utiliser une variable globalvar, définissez la variable en fonction du sous-rapport, mais je doute qu'il soit défini avant l'affichage de la ligne.

+0

Je me doutais que je le rendais plus difficile que nécessaire, mais je supposais qu'il serait simple de supprimer en fonction du sous-rapport. L'idée de variable globale était prometteuse, mais j'ai décidé de suivre votre première suggestion et de la simplifier. – Bryan

+0

Mind marquant ma réponse comme réponse? –