2013-02-19 7 views
1

Je n'arrive pas à trouver comment extraire une valeur d'une table secondaire pour l'utiliser comme critère de sélection pour chaque enregistrement.Crystal Reports SQL Expression

Je travaille avec Crystal Reports 2011 sur Windows 7, via une connexion ODBC à une base de données Oracle 11g.

Je crée un répertoire des employés qui utilise des informations provenant de deux endroits:

  1. Tableau: ENSEIGNANTS
  2. Vue: PVSIS_CUSTOM_TEACHERS

Le tableau des enseignants est mis en place avec vos champs prévisibles: id , nom, prénom, téléphone, adresse, ville, état, zip, etc. etc.

La vue a les champs suivants disponibles:

  1. TEACHERID
  2. FIELD_NAME
  3. TEXT_VALUE

L'application de base de données J'utilise me permet de créer des "champs personnalisés" qui sont liés à la table principale des enseignants. En réalité, les champs que je crée sont en fait stockés dans une table séparée, mais sont ensuite accessibles via la vue PVSIS_CUSTOM_TEACHERS. Étant donné que l'application de base de données permet de créer un nombre quelconque de "champs personnalisés", la vue peut contenir n'importe quel nombre d'enregistrements qui peuvent être liés aux enregistrements de la table des enseignants.

Il y a beaucoup de champs personnalisés qui ont été créés, mais dans le cadre de mon projet actuel, seulement trois d'entre eux la matière:

  • empDirSupRecord
  • empDirSupPhone
  • empDirSupAddr

La vue de mon dossier personnel d'enseignant ressemblerait à ceci:

 
TeacherID Field_Name   Text_Value 
1   empDirSupRecord  
1   empDirSupPhone  1 
1   empDirSupAddr  1 
1   AnotherField  another_value 
1   YetAnotherField yetanother_value 

(Ceci indiquerait que je l'ai demandé mon téléphone et l'adresse à supprimer, mais il veut toujours que mon nom soit inclus dans le répertoire)

Ces champs contiendront chacun un « 1 » si le l'utilisateur a demandé que son numéro de téléphone, ou son adresse ne soit pas publié, ou si nous devons supprimer complètement l'enregistrement complet. Lorsque j'ai commencé mon rapport, j'ai attiré à la fois la table et la vue dans l'expert de base de données et les ai liés avec teachers.id = pvsis_custom_teachers.teacherid. Cependant, cela entraîne l'impression du nom de chaque enseignant sur le rapport une fois pour chaque enregistrement avec l'ID de l'enseignant dans la vue. Comme ce n'est pas le comportement que je souhaite, j'ai supprimé la vue de l'expert de base de données et essayé d'utiliser des champs d'expression SQL pour extraire le contenu du champ personnalisé. C'est là que je suis actuellement coincé. Je devrais écrire le sql d'une manière qui sélectionne le champ correctement nommé, pour chacun des dossiers de l'enseignant que l'enregistrement est traité par le rapport.

Actuellement, ma déclaration expressions sql est écrit que:

(SELECT text_value FROM pvsis_custom_teachers WHERE field_name = 'empDirSupRecord' AND teacherid = '1') 

Ce que je dois faire est de comprendre comment obtenir le rapport pour sélectionner intelligemment le record de teacherid = (quel que soit teacherid est actuellement en cours de traitement) . Je ne suis pas sûr si les champs d'expression SQL sont la voie à suivre pour accomplir ceci, donc je suis certainement ouvert à d'autres suggestions si mon approche actuelle ne fonctionne pas.

Merci d'avoir regardé. :-)

Répondre

1

Vous êtes presque là avec l'expression SQL. Vous pouvez revenir à la requête principale avec des noms de champs entre guillemets. Donc ce que vous cherchez est:

case when "teacher"."id" is null then null 
else (SELECT max(text_value) 
     FROM pvsis_custom_teachers 
     WHERE field_name = 'empDirSupRecord' AND teacherid = "teacher"."id") 
end 

Notez que CR se plaindra probablement sans le contrôle nul et l'utilisation de max(), car il veut être sûr que seul un scalaire sera jamais retourné.

L'alternative, et sans doute moins performante pour ce faire, est de rejoindre la table et la vue comme vous l'avez décrit en premier. Ensuite, vous pouvez regrouper par {teacher.id} et garder une trace de chaque nom de champ dans la vue via des variables. Cela nécessitera plus de travail et plus de formules, cependant. Quelque chose comme ceci, par exemple:

//Place this formula in the Group Header 
whileprintingrecords; 
stringvar empDirSupRecord:=""; 

//Place this formula in the Details section 
whileprintingrecords; 
stringvar empDirSupRecord; 
if {pvsis_custom_teachers.field_name} = 'empDirSupRecord' 
     then empDirSupRecord:={pvsis_custom_teachers.text_value} 

//Place this formula in the Group Footer 
whileprintingrecords; 
stringvar empDirSupRecord; 
+0

Merci pour la réponse! Je pense que ça me fait recommencer! :) –