[CrystalReports] 公式欄位~固定欄位數,執行期間~動態改變顯示資料庫欄位

  • 13529
  • 0
  • 2010-10-29

2 . 需求 :
2-1 . 當程式在執行期間,報表以顯示預設的群組欄位分類顯示,而使用者希望能夠
自定要分類顯示的群組項目。
2-2 . 報表上已規劃3個 欄位 顯示資料庫的資料,使用者希望能夠自行選取要顯示的欄位

請先參考 [CrystalReports]執行期間~動態改變群組 ,此篇將會延續上一篇繼續擴充

1 . 環境 : 同上一篇

2 . 需求 :

2-1 . 當程式在執行期間,報表以顯示預設的群組欄位分類顯示,而使用者希望能夠

         自定要分類顯示的群組項目。

2-2 . 報表上已規劃3個 欄位 顯示資料庫的資料,使用者希望能夠自行選取要顯示的欄位

3 . 範例資料 : 同上一篇,參考(圖一)

(圖一)

4 . 報表設計階段畫面 :

4-1 . 選取資料來源 : 同上一篇,參考(圖二)

(圖二)

4-2 . 選取資料表 : 參考(圖三)

4-3 . 規劃並設計報表畫面(參考圖四)

4-3.1 . 建立文字欄位並設定標題。

(圖四)

* 重點設定

4-3.2 . 將目前由 [ 資料庫欄位 ] 拉到細項區塊顯示的欄位,用 [ 公式欄位 ] 代替

在--> 欄位總管窗格 --> 公式欄位 --> 右鍵 --> 新增 ,3個公式欄位

依序設定其 [ 公式欄位 ] 名稱 item1 ,item2  item3,參考(圖五)

並在新增畫面 [ 使用編輯器 ],會跳到 [ 公式工作區 ] 畫面,請直接關閉而

此 [ 公式欄位 ] 的公式將會在執行期間利用,程式碼動態去完成和改變。

(圖五)

PS : 因為是動態選取欄位顯示,故無法預知使用者所選取的欄位大小,而決定報表 [ 公式欄位 ] 的寬度

方法以下 : 設定 [ 公式欄位 ] --> 自動調大

在報表內設定公式欄位自動增大(參考下圖),報表編輯畫面--> 按住 Ctrl  --> 複選公式欄位 -->右鍵

--> 多重物件格式設定 --> 格式編輯器 --> 將自動調大選項打勾

4-3.3 . 設定預設的群組欄位 : 同上一篇(參考圖六)

(圖六)

5 . UI畫面和程式碼

5-1 . UI畫面,主視窗 Form2(設定群組)視窗 ,主要利用 ComBobox 選擇要做為群組分類的欄位,

並將原 Form2 的 Button1,改為呼叫下一步,並顯示 Form3 (設定欄位)視窗

而新稱 Form3 (設定欄位)視窗做為群組欄位選取,報表顯示在 Form1 (參考圖七)。

(圖七)

5-2 . 程式碼階段

主視窗 Form2(設定群組)視窗變更

參考如下完整程式碼

 


Public Class Form2

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim SetFieldForm As New Form3
        SetFieldForm.Show()
    End Sub

    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ComboBox1.SelectedIndex = 0
    End Sub
End Class

Form3 (設定欄位)視窗


'加入 CrystalReports.Engine 參考
Imports CrystalDecisions.CrystalReports.Engine
Imports CrystalDecisions.Shared
Imports System.Collections

初始值


Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim oRpt As CrystalReport1 = New CrystalReport1

        ListBox1.Items.Clear()

        '動態抓取目前報表載入的資料表,所有欄位名稱

        For Each FielDef As DatabaseFieldDefinition In oRpt.Database.Tables.Item(0).Fields
            '顯示在 ListBox1
            ListBox1.Items.Add(FielDef.Name)
        Next

    End Sub

顯示報表按鈕(Button1)


'顯示報表
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If ListBox2.Items.Count > 0 Then
            '建立新的報表物件
            Dim oRpt As CrystalReport1 = New CrystalReport1

            If Form2.ComboBox1.SelectedIndex > 0 Then
                '設定群組

                Dim FieldDef As FieldDefinition '宣告報表欄位定義

                '抓取ComBobox1.Text 在符號 [ - ] 之後的字串
                Dim GroupStr As String = Strings.Split(Form2.ComboBox1.Text, "-")(1)

                '設定 FileDef 所代表的在資料庫內的欄位 
                FieldDef = oRpt.Database.Tables.Item(0).Fields.Item(GroupStr)

                '設定報表群組的欄位定義 
                oRpt.DataDefinition.Groups.Item(0).ConditionField = FieldDef
            End If

            For i As Integer = 0 To ListBox2.Items.Count - 1
                '設定公式欄位的屬性 Text == 公式欄位的公式字串
                oRpt.DataDefinition.FormulaFields.Item(CStr("item" & (i + 1))).Text = "{客戶." & ListBox2.Items(i) & "}"

                '在報表編輯畫面拉欄位到細項區塊,會自動在頁首區塊新稱 TextObject 
                '顯示其所設定的欄位名稱
                '依照選取的欄位改變顯示在頁首的 TextObject 字串
                CType(oRpt.ReportDefinition.ReportObjects.Item(CStr("Text" & (i + 1))), TextObject).Text = ListBox2.Items(i)
            Next

            '重新載入報表
            Form1.CrystalReportViewer1.ReportSource = oRpt

            If Form1.Visible = True Then
                Form1.Focus()
                Form1.Select()
            Else
                Form1.Show()
                Form1.Select()
            End If
        Else
            MsgBox("請選取要顯示的資料庫欄位 ^@^")
        End If

    End Sub

* 說明重點

 '設定公式欄位的屬性 Text == 公式欄位的公式字串
  oRpt.DataDefinition.FormulaFields.Item(CStr("item" & (i + 1))).Text = "{客戶." & ListBox2.Items(i) & "}"

利用在報表設定的公式名稱(item1)(item2)(item3),去存取其欄位的公式 ,並設定其公式

等於 {資料表名稱.欄位名稱}。以顯示欄位,相對何言此處的公式是可以自己組合的範例如下

一個公式欄位顯示 2個資料庫欄位公式 "{客戶.國家} + Chr(13) + Chr(10) + {客戶.地區}"

其餘部份程式碼,在此不多撰述

6 . 執行階段畫面預覽 : (參考圖八~九)

 

7 . 以上請多指導

8 . 下一篇將會介紹 [Crystal Rpeots] 累加值欄位 代替 群組內 資料錄編號


==================================================== 
有些事就該把它當作一種回憶...
一種放在記憶中任隨時間慢慢的侵蝕慢慢的隨風漂泊........
 ===================================================
~~~請支持 點部落 格,點點下方的廣告吧~~~