我无法弄清楚如何从辅助表中提取值,以便在每个记录的基础上用作选择标准。
我正在使用Windows 7上的Crystal Reports 2011,通过与Oracle 11g数据库的ODBC连接。
我正在创建一个使用来自两个位置的信息的员工目录:
教师表设置了您可预测的字段:id,姓氏,名字,电话,地址,城市,州,邮编等等。
该视图包含以下字段:
我正在使用的数据库应用程序允许我创建与主教师表相关的“自定义字段”。实际上,我创建的字段实际上存储在一个单独的表中,但随后可以通过PVSIS_CUSTOM_TEACHERS视图访问。由于数据库应用程序允许创建任意数量的“自定义字段”,因此视图中可以包含任意数量的记录,这些记录可以绑定到教师表中的记录。
有许多自定义字段已创建,但就我目前的项目而言,其中只有3个很重要:
我个人教师记录的视图如下所示:
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字段是否是实现此目的的方法,所以如果我当前的方法不起作用,我肯定会接受替代建议。
谢谢你看看。 : - )
答案 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;