- PR -

コーディング方法 共通モジュールの作成

1
投稿者投稿内容
chiroru
ベテラン
会議室デビュー日: 2008/10/02
投稿数: 59
投稿日時: 2009-02-17 19:26
言語:Microsoft Visual Studio 2008
データベース:SQL Server 2005 非接続型のデータアクセスです。
ツール:ActiveReports for .NET 3.0J SP2 Pro

何度もお世話になります。
ActiveReportsで帳票を作成しています。
レポートの余白設定を、コード上で動的に設定しています。
下記のコードだと、"strNO"が増える度にどんどん同じようなコードが増えて行くので、"strNO"を引数にして共通モジュールに移したいと思っています。
(***の中を共通モジュールにしたい)
Dim rpt As New rpt100()
rpt.PageSettings.Margins.Top = rpt100.CmToInch(PrtInfo.MarginTop)
の"rpt100"をどのように記述すればよいでしょうか?
また、戻ってきた時のrpt.Run()のrptも・・・
ご教授お願いします。


Private Sub btnPreview_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPreview.Click
Dim f As New frm01()
Select Case strNO
Case "100"
’**************************************************************
Dim RptInfo As New clsReportInfo
Dim PrtInfo As New PrintInfo
Dim rpt As New rpt100()
'レポート情報取得
RptInfo.getPrtInformation(strNO, PrtInfo)
'余白の設定
rpt.PageSettings.Margins.Top = rpt100.CmToInch(PrtInfo.MarginTop)
rpt.PageSettings.Margins.Bottom = rpt100.CmToInch(PrtInfo.MarginBottom)
rpt.PageSettings.Margins.Left = rpt100.CmToInch(PrtInfo.MarginLeft)
rpt.PageSettings.Margins.Right = rpt100.CmToInch(PrtInfo.MarginRight)
’**************************************************************
rpt.Run()
f.Viewer.Document = rpt.Document
End Select
f.ShowDialog()
f.Dispose()
End Sub
passol
常連さん
会議室デビュー日: 2008/12/12
投稿数: 20
投稿日時: 2009-02-18 01:18
こんばんは、passolです。

こんな、感じの事を期待していますか?(的外れでしたら、申し訳ありません。)
コード:
Imports DataDynamics.ActiveReports

Public Class Form2

Dim strNO As String

Private Sub btnPreview_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPreview.Click
Dim f As New Frm01
Select Case strNO
Case "99"
Dim rpt As DataDynamics.ActiveReports.ActiveReport3
rpt = New rpt99
setMargin(strNO, rpt)
rpt.Run()
f.Viewer.Document = rpt.Document
Case "100"
Dim rpt As DataDynamics.ActiveReports.ActiveReport3
rpt = New rpt100
setMargin(strNO, rpt)
rpt.Run()
f.Viewer.Document = rpt.Document
End Select
f.ShowDialog()
f.Dispose()
End Sub

'余白を設定するメソッド
Public Sub setMargin(ByVal strNO As String, ByRef rpt As ActiveReport3)
Dim RptInfo As New clsReportInfo
Dim PrtInfo As New PrintInfo
RptInfo.getPrtInformation(strNO, PrtInfo)
rpt.PageSettings.Margins.Top = ActiveReport3.CmToInch(PrtInfo.MarginTop)
rpt.PageSettings.Margins.Bottom = ActiveReport3.CmToInch(PrtInfo.MarginBottom)
rpt.PageSettings.Margins.Left = ActiveReport3.CmToInch(PrtInfo.MarginLeft)
rpt.PageSettings.Margins.Right = ActiveReport3.CmToInch(PrtInfo.MarginRight)
End Sub

End Class

Public Class clsReportInfo
Public Sub getPrtInformation(ByVal strNO As String, ByRef PrtInfo As PrintInfo)
'ここで、余白情報をPrintInfoに入れている?
End Sub
'ここで他のことを何かしている?
End Class

Public Class PrintInfo
Public MarginTop As Single '本当はプロパティー?
Public MarginBottom As Single '本当はプロパティー?
Public MarginLeft As Single '本当はプロパティー?
Public MarginRight As Single '本当はプロパティー?
'ここで他のことを何かしている?
End Class



必ず、帳票を出す(もしくは、case文の中で、Exit Subを利用して帳票を入れる前にイベントメソッドを抜ける)なら、btnPreview_Click内は下記の方がいいと思います。(警告が嫌ならば、setMargin(strNO, rpt)はcase文内に入れてください。)

コード:
    Private Sub btnPreview_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPreview.Click

Dim f As New Frm01
Dim rpt As DataDynamics.ActiveReports.ActiveReport3
Select Case strNO
Case "99"
rpt = New rpt99
Case "100"
rpt = New rpt100
End Select
setMargin(strNO, rpt)
rpt.Run()
f.Viewer.Document = rpt.Document
f.ShowDialog()
f.Dispose()
End Sub



以上です。

[追記]
書こうと思って忘れていたんですが、クラス, メソッド, 変数等の名前付け(その言語の標準の命名規則の意識する。)を意識すると上達が早くなると思いますよ。(自分の事は、あえて棚にあげて書きます・・・)

余計な事を追記してすいませんでした。
頑張って下さい。
[/追記]

[ メッセージ編集済み 編集者: passol 編集日時 2009-02-18 01:31 ]
デューン
大ベテラン
会議室デビュー日: 2004/04/21
投稿数: 174
お住まい・勤務地: Tokyo
投稿日時: 2009-02-18 05:18
passolさんのを元に(というかほとんど同じですが)私も書いてみました。
ビルドはしてません。

生成用のメソッド用意すればよいのではないかと思います。
これぐらいイベントとレポート作成を分離しておくと、他の個所から呼びやすくなるかと。

コード:

Private Sub btnPreview_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnPreview.Click

' strNOも大域変数よりここで取得したほうがいいかと
' Dim strNO As String = GetReportNo()

Dim f As New Frm01
Dim rpt As DataDynamics.ActiveReports.ActiveReport3 = Nothing

rpt = ReportFactory(strNO)

IF rpt <> Nothing Then
rpt.Run()
f.Viewer.Document = rpt.Document
END IF

f.ShowDialog()
f.Dispose()

End Sub

''' <summary>レポートの生成</summary>
Private Function ReportFactory(ByVal strNO As String)

Dim rpt As DataDynamics.ActiveReports.ActiveReport3 = Nothing

Select Case strNO

Case "99"
rpt = New rpt99

Case "100"
rpt = New rpt100

Case Else
rpt = Nothing

End Select

IF rpt <> Nothing Then
SetMargin(strNO, rpt)
END IF

Return rpt
End Function


''' <summary>レポートの余白設定</summary>
Private Sub SetMargin(ByVal strNO As String, ByVal rpt As ActiveReport3)
' rptはByValで多分大丈夫だと思います。
' VB6の頃とはByRefがちょっと違うので。

IF strNO = Nothing OrElse rpt = Nothing Then
Return
End IF


Dim RptInfo As New clsReportInfo
Dim PrtInfo As New PrintInfo

RptInfo.getPrtInformation(strNO, PrtInfo)

rpt.PageSettings.Margins.Top = ActiveReport3.CmToInch(PrtInfo.MarginTop)
rpt.PageSettings.Margins.Bottom = ActiveReport3.CmToInch(PrtInfo.MarginBottom)
rpt.PageSettings.Margins.Left = ActiveReport3.CmToInch(PrtInfo.MarginLeft)
rpt.PageSettings.Margins.Right = ActiveReport3.CmToInch(PrtInfo.MarginRight)

End Sub






[ メッセージ編集済み 編集者: デューン 編集日時 2009-02-18 05:22 ]
masa
大ベテラン
会議室デビュー日: 2004/10/28
投稿数: 161
投稿日時: 2009-02-18 09:22
条件に応じて処理を切り替えたい場合には「デリゲート」を使う方法があります。


' レポート生成処理に渡す引数
public class ReportCreationArgs
  ReportNumber as string
end class

' レポートを生成するメソッドを表すデリゲート
public delegate function ReportCreation( args as ReportCreationArgs ) as Report

' レポート番号をキー、生成処理を値とするディクショナリ
private reportFactory as Dictionary(of ReportCreationArgs, ReportCreation )

' レポート生成処理をあらかじめ準備
reportFactory.Add( "100", addressof CreateReport100 )
reportFactory.Add( "200", addressof CreateReport200 )

private function CreateReport100( args as ReportCreationArgs ) as Report
  dim rpt as rpt100
  rpt = new rpt100
  '個別の処理があればここで
  return rpt
end function

private function CreateReport200( args as ReportCreationArgs ) as Report
  dim rpt as rpt200
  rpt = new rpt200
  '個別の処理があればここで
  return rpt
end function



Private Sub btnPreview_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPreview.Click

  dim creation as ReportCreation

  ' レポート番号に対応する生成処理を取得
  if ( not reportFactory.TryGetValue( strNO, creation ) ) then
    ' 生成処理が登録されていないときの処理
  end if

  ' 引数を生成
  dim args as ReportCreationArgs = new ReportCreationArgs()
  args.ReportNumber = strNO

  ' レポートを生成
  dim rpt as Report = creation( args )

  'レポート情報取得
  RptInfo.getPrtInformation(strNO, PrtInfo)

  '余白の設定
  rpt.PageSettings.Margins.Top = rpt100.CmToInch(PrtInfo.MarginTop)
  rpt.PageSettings.Margins.Bottom = rpt100.CmToInch(PrtInfo.MarginBottom)
  rpt.PageSettings.Margins.Left = rpt100.CmToInch(PrtInfo.MarginLeft)
  rpt.PageSettings.Margins.Right = rpt100.CmToInch(PrtInfo.MarginRight)

  rpt.Run()
  f.Viewer.Document = rpt.Document
  End Select
  f.ShowDialog()
  f.Dispose()

End Sub

chiroru
ベテラン
会議室デビュー日: 2008/10/02
投稿数: 59
投稿日時: 2009-02-18 10:37
みなさんありがとうございます。
いろんな方法あり大変勉強になりました。
1

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