2

セカンダリ テーブルから値を取得し、レコードごとの選択基準として使用する方法がわかりません。

Oracle 11g データベースへの ODBC 接続を介して、Windows 7 で Crystal Reports 2011 を使用しています。

次の 2 つの場所からの情報を利用する従業員名簿を作成しています。

  1. 表: 教師
  2. ビュー: PVSIS_CUSTOM_TEACHERS

教師のテーブルには、id、姓、名、電話番号、住所、都市、州、郵便番号などの予測可能なフィールドが設定されています。

ビューには、次のフィールドが使用可能です。

  1. TEACHERID
  2. フィールド名
  3. TEXT_VALUE

私が使用しているデータベース アプリケーションでは、メインの教師テーブルに関連する「カスタム フィールド」を作成できます。実際、私が作成しているフィールドは実際には別のテーブルに保存されていますが、PVSIS_CUSTOM_TEACHERS ビューからアクセスできます。データベース アプリケーションでは任意の数の「カスタム フィールド」を作成できるため、ビューには任意の数のレコードを含めることができ、教師テーブル内のレコードに結び付けることができます。

作成されたカスタム フィールドは多数ありますが、現在のプロジェクトの目的では、そのうちの 3 つだけが重要です。

  • empDirSupRecord
  • empDirSupPhone
  • empDirSupAddr

私の個人的な教師の記録のビューは次のようになります。

TeacherID Field_Name Text_Value
1 empDirSupRecord    
1 empDirSupPhone 1
1 empDirSupAddr 1
1 アナザーフィールド
1 まだ別のフィールド

(これは、自分の電話番号と住所を非表示にするように要求したことを示していますが、それでも自分の名前をディレクトリに含めたいと考えています)

ユーザーが電話番号または住所を公開しないように要求した場合、またはレコード全体を完全に非表示にする必要がある場合、これらのフィールドにはそれぞれ「1」が含まれます。

最初にレポートを開始したとき、テーブルとビューの両方をデータベース エキスパートに取り込み、teachers.id = pvsis_custom_teachers.teacherid でそれらをリンクしました。ただし、これにより、各教師の名前がビュー内の教師 ID を持つレコードごとに 1 回レポートに出力されます。これは私が望む動作ではないため、データベース エキスパートからビューを削除し、SQL 式フィールドを使用してカスタム フィールドの内容を取得しようとしました。これは私が現在立ち往生しているところです。レコードがレポートによって処理されているため、教師のレコードごとに、正しい名前のフィールドを選択する方法で 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

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;
于 2013-02-20T01:23:28.890 に答える