初めて質問いたします。
不慣れなため見づらい点等あるかと思いますが、ご容赦ください。
やりたいこと:
同じテーブル構成で複数のスキーマがあるDBで、VBからの帳票(バウンドレポート)出力時に接続情報を渡し指定したスキーマから対象データを出力したい。
ただし、一部パブリックシノニムを使用している。
(VB6+CrystalReport8.5からのバージョンアップで、開発コストを増やしたくないため、アンバウンドレポートへの移行は考えていません)
環境:
・Visual Basic 2013
・.NET Framework 4.5.2
・Crystal Report for Visual Studio 2013
・Oracle Database 12c
VB6+CR8.5のとき(PE関数を使用、ODBC接続)は PEGetNthTableLocation で取得した Location にシノニム以外ならスキーマ名が含まれていたので、目的のスキーマと異なればスキーマを変更していました。
(シノニムならスキーマ名が含まれないため、変更されない)
ところが、.NET+CR2013(Oracle サーバ接続)では、Location にスキーマ名が含まれていないようなのです。
'スキーマの変更
For Each tab As Table In reportDocument.Database.Tables
Dim idx As Integer = tab.Location.IndexOf(".")
If idx = -1 Then '← ここで必ず True になる
Else
If Not tab.Location.Substring(0, idx).Equals(uid) Then
tab.Location = uid.ToUpper & tab.Location.Substring(idx)
End If
End If
Next
質問1
Location にはスキーマ名が入ってこないのでしょうか。
({スキーマ名}.{テーブル名}の形式を想定していた)
それとも、接続をODBCからOracle サーバに変えたことなどが影響しているのでしょうか。
質問2
Location に {スキーマ名}.{テーブル名}の形式でセットすれば目的のスキーマのオブジェクトを参照してくれるのですが、当然のことながら、パブリックシノニムの場合はエラーになります。
パブリックシノニムの場合は Location を変更しないようにしたいのですが、VB側(CRのAPI)でパブリックシノニムとテーブルやビューを区別することは可能でしょうか。
質問3
Location に {スキーマ名}.{テーブル名}の形式でセットしたところ、スキーマ名が小文字だとエラーになりました。
ファイル {ファイル名}
5460_684_{C2FB3A66-01AD-407C-8258-8FB40E47024C}.rpt のエラー:
式 {フィールド名}:
'{テーブル名.カラム名}'
フィールド名が見つかりません。
詳細: errorKind
スキーマ名を大文字にするとエラーにならないのですが、
大文字であればOKなのでしょうか。
下記のフォーラムで
「Location を指定する際の注意ですが、テーブル名は大文字小文字が区別されるようです」
とあり、小文字もしくは混在の場合もありえるのかと思ったのですが、なにを元に区別されるのでしょうか。
https://social.msdn.microsoft.com/Forums/en-US/65079fb6-144f-44ae-819d-d78e8ce2b2aa/crystalreport-for-vs2010-?forum=vbgeneralja
長文でいろいろと質問してしまい恐縮ですが、なにか情報をお持ちの方、ご教示ください。
よろしくお願いいたします。