2013-02-19 78 views
1

我無法確定如何從輔助表中提取值,以便在每個記錄的基礎上用作選擇條件。Crystal Reports SQL表達式

我在Windows 7上使用Crystal Reports 2011,通過ODBC連接到Oracle 11g數據庫。

我創建的兩個位置利用信息的員工目錄:

  1. 表:師範
  2. 觀點:PVSIS_CUSTOM_TEACHERS

老師表設置了您的預測字段:ID ,姓,名,電話,地址,城市,州,郵編等等等等。

該視圖有以下可用字段:

  1. TEACHERID
  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   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記錄什麼=(無論是當前正在處理teacherid) 。我不確定是否需要使用SQL表達式字段來完成此操作,因此,如果我目前的方法無效,那麼我肯定會開放替代建議。

感謝您的關注。 :-)

回答

1

你幾乎在那裏使用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 

注意,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; 
+0

感謝您的迴應!我認爲這又讓我走了! :) – 2013-02-20 19:05:02