2010-11-23 19 views
0

私のCrystal Reportsファイルは、msaccessデータベースからデータにアクセスしています。クリスタルレポートとmsアクセスでログオン情報を動的に変更するにはどうすればよいですか?

レポートの読み込み中に、msaccessデータベースのログオン情報とvb.netのデータベース名を渡す必要があります。

私は

Dim ConnInfo As ConnectionInfo = New ConnectionInfo() 

    CRpt.ReportOptions.EnableSaveDataWithReport = False 

    ConnInfo.IntegratedSecurity = False 
    ConnInfo.ServerName = "" 
    ConnInfo.UserID = "" 
    ConnInfo.Password = "" 
    ConnInfo.DatabaseName = OLEDBLayer.GetDBLocation() 
    ConnInfo.Type = ConnectionInfoType.DBFile 

    'CCINFo.ServerName = 
    For Each CTable As Table In CRpt.Database.Tables 
     CTableLogInfo = CTable.LogOnInfo 
     CTableLogInfo.ConnectionInfo = ConnInfo 
     'CTable.Location = OLEDBLayer.GetDBLocation 
     CTable.ApplyLogOnInfo(CTableLogInfo) 
    Next 

を使用してみました。しかし働いていません。私は何が欠けていますか?

答えて

1

私は静的なデータを使用して新しいレポートを作成して自分自身をテストした後に、私は動的な解決策を得た。

私のテスト手順:
1)新しいCrystalレポートファイルを作成:
2.)の.accdbアクセス2007ファイル
3に新しいデータベース接続を作成した)
4.新しいフォームを作成し)を加えクリスタルフォーム上のレポートビューアコントロール
5.)以前に作成したレポートにレポートドキュメントを割り当てました。
)フォームのロード時にブレークポイントを設定します
7.すべての設定を読み込みます
8.)レポートドキュメント、ドキュメントテーブルログオン情報の設定をコピーしました。
9.)読み込んだ設定をプロジェクトに貼り付けました。
10)がうまく働いた... :)

マイコード:

//here crpt is a sample report document 
    Dim CTableLogInfo As TableLogOnInfo 
    Dim ConnInfo As CrystalDecisions.Shared.ConnectionInfo = New ConnectionInfo() 
    ConnInfo.Type = ConnectionInfoType.CRQE 
    ConnInfo.ServerName = DBLayer.GetAbsoluteDBPath() 
    ConnInfo.DatabaseName = "" 
    ConnInfo.UserID = "Admin" 
    ConnInfo.AllowCustomConnection = False 
    ConnInfo.IntegratedSecurity = False 

    For Each CTable As Table In CRpt.Database.Tables 
     CTable.LogOnInfo.ConnectionInfo = ConnInfo 
     CTableLogInfo = CTable.LogOnInfo 
     CTableLogInfo.ReportName = CRpt.Name 
     CTableLogInfo.TableName = CTable.Name 
     CTable.ApplyLogOnInfo(CTableLogInfo) 
    Next 

    CrystalReportViewer1.ReportSource = CRpt 
    CrystalReportViewer1.RefreshReport() 

私はサーバー名にデータベースのパスを設定することが

+0

5時間のデバッグ後、レポートにSAVE DATAオプションが有効になっているため、これが機能していないことがわかりました。このオプションを無効にすると、この方法が機能します。 ありがとうございます – roncansan

+0

私は古いスレッドをresurectingしたくありません。しかし、あなたが私を助けることができる可能性はありますか?私はあなたが言及したことを試してみました(あなたのコードをC#に変換しましたが、私のデータベースにパスワードがあるということが問題です。 – GrafixMastaMD

+0

私は1つの問題があります 私はあなたの方法を使いました。私はMDBに接続しました。すべてのレポートは水晶でMDBで開発されていますが、一部のユーザーは使用しています。 SQL。また、いくつかのレポートにはサブレポートがあります。 – GrafixMastaMD

1

実行時にレポートの特定の接続の詳細を適用するには、次のコードを使用できます。
申し訳ありませんが、C#のコードです。
レポートrptファイルを読み込んだ直後、印刷/エクスポート/表示する前にこのメソッドを使用してください。

public static void CrystalReportLogOn(ReportDocument reportParameters, 
              string serverName, 
              string databaseName, 
              string userName, 
              string password) 
    { 
     TableLogOnInfo logOnInfo; 
     ReportDocument subRd; 
     Sections sects; 
     ReportObjects ros; 
     SubreportObject sro; 

     if (reportParameters == null) 
     { 
      throw new ArgumentNullException("reportParameters"); 
     } 

     try 
     { 
      foreach (CrystalDecisions.CrystalReports.Engine.Table t in reportParameters.Database.Tables) 
      { 
       logOnInfo = t.LogOnInfo; 
       logOnInfo.ReportName = reportParameters.Name; 
       logOnInfo.ConnectionInfo.ServerName = serverName; 
       logOnInfo.ConnectionInfo.DatabaseName = databaseName; 
       logOnInfo.ConnectionInfo.UserID = userName; 
       logOnInfo.ConnectionInfo.Password = password; 
       logOnInfo.TableName = t.Name; 
       t.ApplyLogOnInfo(logOnInfo); 
       t.Location = t.Name; 
      } 
     } 
     catch 
     { 
      throw; 
     } 

     sects = reportParameters.ReportDefinition.Sections; 
     foreach (Section sect in sects) 
     { 
      ros = sect.ReportObjects; 
      foreach (ReportObject ro in ros) 
      { 
       if (ro.Kind == ReportObjectKind.SubreportObject) 
       { 
        sro = (SubreportObject)ro; 
        subRd = sro.OpenSubreport(sro.SubreportName); 
        try 
        { 
         foreach (CrystalDecisions.CrystalReports.Engine.Table t in subRd.Database.Tables) 
         { 
          logOnInfo = t.LogOnInfo; 
          logOnInfo.ReportName = reportParameters.Name; 
          logOnInfo.ConnectionInfo.ServerName = serverName; 
          logOnInfo.ConnectionInfo.DatabaseName = databaseName; 
          logOnInfo.ConnectionInfo.UserID = userName; 
          logOnInfo.ConnectionInfo.Password = password; 
          logOnInfo.TableName = t.Name; 
          t.ApplyLogOnInfo(logOnInfo); 
         } 
        } 
        catch 
        { 
         throw; 
        } 
       } 
      } 
     } 
    } 
+0

申し訳ありませんが、どちらも動作していません... – KoolKabin

+0

どの部分が正しく動作していませんか? – Ahmed

+0

私のデータベースは、servername、databasename、userid、passwordの代わりに何を使うべきですか? – KoolKabin

1

がこれを試してみていることを解決するだろうとの点を得ました:

 Dim CTableLogInfo As TableLogOnInfo 
     Dim ConnInfo As CrystalDecisions.Shared.ConnectionInfo = New ConnectionInfo() 
     Dim CRpt As New ReportDocument 
     String filename = "rptSales.rpt" 

     ConnInfo.Type = ConnectionInfoType.CRQE 
     ConnInfo.ServerName = AppSettings("server") 
     ConnInfo.DatabaseName = AppSettings("dbNm") 
     ConnInfo.UserID = AppSettings("username") 
     ConnInfo.Password = AppSettings("pas") 
     ConnInfo.AllowCustomConnection = False 
     ConnInfo.IntegratedSecurity = False 

     CRpt.Load(AppSettings("reppath") & filename) 

     For Each CTable As Table In CRpt.Database.Tables 
      CTable.LogOnInfo.ConnectionInfo = ConnInfo 
      CTableLogInfo = CTable.LogOnInfo 
      CTableLogInfo.ReportName = CRpt.Name 
      CTableLogInfo.TableName = CTable.Name 
      CTable.ApplCTableLogInfo) 
     Next 
関連する問題