Crystal Reports SQL表达式

时间:2013-02-19 23:48:12

标签: sql crystal-reports

我无法弄清楚如何从辅助表中提取值,以便在每个记录的基础上用作选择标准。

我正在使用Windows 7上的Crystal Reports 2011,通过与Oracle 11g数据库的ODBC连接。

我正在创建一个使用来自两个位置的信息的员工目录:

  1. 表:教师
  2. 查看:PVSIS_CUSTOM_TEACHERS
  3. 教师表设置了您可预测的字段:id,姓氏,名字,电话,地址,城市,州,邮编等等。

    该视图包含以下字段:

    1. TEACHERID
    2. FIELD_NAME
    3. TEXT_VALUE
    4. 我正在使用的数据库应用程序允许我创建与主教师表相关的“自定义字段”。实际上,我创建的字段实际上存储在一个单独的表中,但随后可以通过PVSIS_CUSTOM_TEACHERS视图访问。由于数据库应用程序允许创建任意数量的“自定义字段”,因此视图中可以包含任意数量的记录,这些记录可以绑定到教师表中的记录。

      有许多自定义字段已创建,但就我目前的项目而言,其中只有3个很重要:

      • empDirSupRecord
      • empDirSupPhone
      • empDirSupAddr

      我个人教师记录的视图如下所示:

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

      (这表示我已经要求我的手机和地址被禁止,但仍然希望我的名字被包含在目录中)

      如果用户询问他们的电话号码或地址未发布,或者我们需要完全取消整个记录,则这些字段将包含“1”。

      当我第一次开始报告时,我将表格和视图都拉到数据库专家中,并将它们与teachers.id = pvsis_custom_teachers.teacherid链接在一起。但是,这会导致每个教师的姓名在报告中打印一次,并在视图中显示他们的教师ID。由于这不是我想要的行为,我从数据库专家中删除了视图,并尝试使用SQL表达式字段来检索自定义字段的内容。这是我目前陷入困境的地方。我需要以一种方式编写sql,以便在报告处理记录时为每个教师记录选择正确命名的字段。

      目前,我的sql表达式语句写为:

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

      我需要做的是弄清楚如何让报告智能地选择teacherid =的记录(无论当前正在处理的是什么教师)。我不确定SQL Expression字段是否是实现此目的的方法,所以如果我当前的方法不起作用,我肯定会接受替代建议。

      谢谢你看看。 : - )

1 个答案:

答案 0 :(得分:1)

你几乎就在那里使用SQL Expression。您可以使用双引号字段名称返回主查询。所以你要找的是:

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

请注意,CR可能会在没有null检查和使用max()的情况下抱怨,因为它希望确保只返回一个标量。

替代方案,可能性能较低的方法是加入表格和视图,就像您最初描述的那样。然后,您可以按{teacher.id}进行分组,并通过变量跟踪视图中的每个字段名称。但这需要更多的工作和更多的公式。像这样的东西,例如:

//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;