- PR -

ODBC経由ではないCrystalReportsのDBへの接続

投稿者投稿内容
りんご
ベテラン
会議室デビュー日: 2006/12/21
投稿数: 51
投稿日時: 2007-06-06 15:17
引用:
Fill する条件となる SQL コマンドがすべてです。ここで結合された DataTable になるようにすれば良いだけですよね。View で実現できるならば、もう 1 つ View を作って対応しても良いでしょう。(動的な条件であれば、SQL コマンドになります)



つまり、SQLコマンドでCREATE VIEW〜を作成した方がいいということでしょうか?

あと、CrystalReportのデザイナ画面上でTAB423(テーブル)とTAB401SEL、TAB104SEL(ビュー)の
フィールドのリンクは張りました。
その上で、実行しても結果はやはり、TAB423のGOODSCDのみの場合だけ上手くいきまして、
他にTAB401SEL.GOODSKJNAMEのフィールドをもってきても、タイトルの表示だけでした・・

また、
コード:
Dim daa As New DataSet1.DataTable1DataTable
Dim rowCount As Integer = _da.Fill(daa)


としても、SetDataSourceにはDataSetしか指定できないみたいだし・・


コード:
Dim i, j As Integer
      For i = 0 To _ds.Tables(0).Rows.Count() - 1
      For j = 0 To _ds.Tables(0).Columns.Count() - 1
               Debug.Write(_ds.Tables(0).Rows(i)(j) & ControlChars.Tab)
           Next
           Debug.Write(ControlChars.NewLine)
      Call CrystalReportsHelper.SetFormulaFieldsText(crReportDocument, "aaa", _ds.Tables(0).Rows(i)("GOODSKJNAME"))
      Next



↑上記を行うと、当然ながら詳細セクションに配置された"aaa"フィールドは1行だけで、データは最終レコードが反映されているだけでした・・・(もう何をどうすりゃいいのだ状態ですw)

また、ActiveReportsの方がデバッグしやすいことも述べたのですが、、
たとえランタイムフリーでも、現場でデバッグする場合に、使えないという結論になったのでした・・・・

引用:
私の方でりんごさんが伝えたかった内容を正しく解釈できなかったようです。これに関しては謝罪致します。



いえいえ、私の方こそ説明が悪かったみたいで申し訳ないです。
わざわざご丁寧にありがとうございます。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-06-06 15:34
引用:

りんごさんの書き込み (2007-06-06 15:17) より:

つまり、SQLコマンドでCREATE VIEW〜を作成した方がいいということでしょうか?


SQL コマンドでというよりは DBMS 側に最初から用意しておくという意味です。それも 「可能ならば」 程度の意味合いです。多くの帳票処理の結合 / 抽出条件は 「動的な条件」 になりますから、SQL コマンドで WHERE や テーブル結合やらをやることになるでしょう。

引用:

あと、CrystalReportのデザイナ画面上でTAB423(テーブル)とTAB401SEL、TAB104SEL(ビュー)のフィールドのリンクは張りました。その上で、実行しても結果はやはり、TAB423のGOODSCDのみの場合だけ上手くいきまして、他にTAB401SEL.GOODSKJNAMEのフィールドをもってきても、タイトルの表示だけでした・・


先にも述べたとおり、双方のテーブルの関係が CrystalReports にはわからないからです。CrystalReports Engine は人口知能を搭載していませんから、こちらから 「こうしなさい」 と命令せざるを得ません。

こればかりはしょうがないですね。バウンド レポートも実際には SQL クエリを使っています。(内部的に)

引用:

コード:

Dim daa As New DataSet1.DataTable1DataTable
Dim rowCount As Integer = _da.Fill(daa)


としても、SetDataSourceにはDataSetしか指定できないみたいだし・・


? 型付はダメだったということでしょうか? daa をただの System.Data.DataTable にしておけば問題ないかもしれません。SetDataSource メソッドには DataTable を引数に持つオーバーロードも存在しています。参考になると思います。

引用:

↑上記を行うと、当然ながら詳細セクションに配置された"aaa"フィールドは1行だけで、データは最終レコードが反映されているだけでした・・・(もう何をどうすりゃいいのだ状態ですw)


式フィールドを繰り返しデータに利用するのはダメですよね。パフォーマンスにも影響します。

引用:

また、ActiveReportsの方がデバッグしやすいことも述べたのですが、、たとえランタイムフリーでも、現場でデバッグする場合に、使えないという結論になったのでした・・・・


そもそも実行環境に開発環境を入れるのは環境バグの温床になりますよ。どうしてもデバッグしたい場合は、ノートパソコンなどで持ち込むのが定石です。最近はこれすらセキュリティの都合上難しいようですが... 私の場合、端末が持ち込めない場合はロギングなどを利用しています。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
りんご
ベテラン
会議室デビュー日: 2006/12/21
投稿数: 51
投稿日時: 2007-06-06 16:38
引用:
型付はダメだったということでしょうか? daa をただの System.Data.DataTable にしておけば問題ないかもしれません。SetDataSource メソッドには DataTable を引数に持つオーバーロードも存在しています。



わぁ。本当ですね。明日この方法で試してみます。

本日は時間がなくなったため、CREATE VIEW NEW_URIAGE2・・・を作成して、
DataSet2を新たに作成し、以下の方法でやっとうまくいきました・・(涙)

コード:
Public m_hcon As FirebirdSql.Data.FirebirdClient.FbConnection = Nothing
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        'DATA PROVIDER経由
        If fOpen_XML("STDMST_F", m_hcon) = 0 Then
            MessageBox.Show("DATA PROVIDER STDMST_F 接続成功♪")

            Dim fbconnection1 As New FirebirdSql.Data.FirebirdClient.FbConnection(m_hcon.ConnectionString)
             Dim bbstr As String = ""
            bbstr = bbstr & "SELECT * FROM NEW_URIAGE2"
            If fbconnection1.State = ConnectionState.Closed Then
                fbconnection1.Open()
            End If

            Dim _da As New FirebirdSql.Data.FirebirdClient.FbDataAdapter
            _da = New FirebirdSql.Data.FirebirdClient.FbDataAdapter(bbstr, fbconnection1)
            Dim _ds As New DataSet2()
            _da.Fill(_ds, "NEW_URIAGE2")

            Dim crReportDocument = New CrystalReport1()
            crReportDocument.SetDataSource(_ds)
            CrystalReportViewer1.ReportSource = crReportDocument

        End If
    End Sub




引用:
そもそも実行環境に開発環境を入れるのは環境バグの温床になりますよ。どうしてもデバッグしたい場合は、ノートパソコンなどで持ち込むのが定石です。最近はこれすらセキュリティの都合上難しいようですが... 私の場合、端末が持ち込めない場合はロギングなどを利用しています。



具体的な例をあげていただきまして、ありがとうございます。
上司に相談してみます。

今回は、CrystalReportsで初めて帳票を作成したのですが、とてもとても勉強になりました。

じゃんぬねっと様、長々とお付き合い下さいまして、本当にありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)