2

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

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

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

  1. 表:教师
  2. 视图:PVSIS_CUSTOM_TEACHERS

教师表设置有您可预测的字段:id、lastname、firstname、telephone、address、city、state、zip 等等等。

该视图具有以下可用字段:

  1. 教师ID
  2. FIELD_NAME
  3. TEXT_VALUE

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

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

  • empDirSupRecord
  • empDirSupPhone
  • empDirSupAddr

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

TeacherID Field_Name Text_Value
1 empDirSupRecord    
1 empDirSupPhone 1
1 empDirSupAddr 1
1 另一个字段 another_value
1 YetAnotherField yetanother_value

(这表明我已要求隐藏我的电话和地址,但仍希望我的名字包含在目录中)

如果用户要求不公开他们的电话号码或地址,或者如果我们需要完全隐藏整个记录,这些字段将包含一个“1”。

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

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

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

我需要做的是弄清楚如何让报告智能地选择teacherid =的记录(无论当前正在处理什么teacherid)。我不确定 SQL 表达式字段是否是完成此任务的方法,因此如果我当前的方法不起作用,我绝对愿意接受其他建议。

谢谢参观。:-)

4

1 回答 1

3

您几乎可以使用 SQL 表达式。您可以使用双引号字段名称引用主查询。所以你要找的是:

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

请注意,如果没有空值检查和使用 max(),CR 可能会抱怨,因为它希望确保只返回一个标量。

另一种方法(可能是性能密集度较低的方法)是像您第一次描述的那样加入表和视图。然后,您可以{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;
于 2013-02-20T01:23:28.890 回答