1

asp.net Web アプリケーションに VS-2008 を使用しています。ただし、VS 2005 でレポートを開発しました (他のプロジェクトで開発されたレポートを再利用しています)。

画像フィールドが表示されないことを除いて、レポートは正常に機能します。画像フィールドは、データベースの「VARBINARY(MAX)」フィールドです。Crystal Report を .pdf にエクスポートすると、画像が .pdf ファイルに表示されることに注意してください。

(* 「Firebug」で画像の URL を確認できますが、「画像の読み込みに失敗しました」というメッセージが表示されます)

Crystal Report の DataSource として「TypedDataset」を使用しています。

データベースからデータを取得し、「DataSet.WriteXML(filename,WriteMode.WriteSchema)」を実行します

コードは次のとおりです。

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Dim rgx As Regex = New Regex("[^a-zA-Z0-9 -]")
    strComp = rgx.Replace(strComp, "")
    strFile = "tempXML" + strComp + ".xml"
    Dim dsTemp As New DataSet
    dsTemp.Clear()
    dsTemp.Tables.Clear()
    Dim rptengine As New CrystalDecisions.CrystalReports.Engine.ReportDocument
    rptengine.Load(Session("rptname"))
    sdate = CType(Session("sdate"), Date)
    edate = CType(Session("edate"), Date)
    rptHeading = Session("rptHead")

    If IO.File.Exists(Server.MapPath("~/" + strFile)) Then
        dsTemp.ReadXml(Server.MapPath("~/" + strFile), XmlReadMode.ReadSchema)
        'IO.File.Delete(Server.MapPath("~/" + strFile))
        Try
            If Session("rptname").ToString.Substring(Session("rptname").ToString.LastIndexOf("\") + 1) _
                = "Rptemp.rpt" Then
                Dim dsReport As New DDL.dsEmpList
                dsReport.Tables("dtEmpList").Merge(dsTemp.Tables(0))
                rptengine.SetDataSource(dsReport.Tables(0))
            ElseIf Session("rptname").ToString.Substring(Session("rptname").ToString.LastIndexOf("\") + 1) _
                = "rptDailyAttendance.rpt" Then
                Dim dsReport As New DDL.dsDailyReoprt
                dsReport.Tables("dtDailyReport").Merge(dsTemp.Tables(0))
                rptengine.SetDataSource(dsReport.Tables(0))
            End If
        Catch ex As Exception
            ShowMsg1("Exception : " & ex.Message)
        End Try


        '**********************assigning CR-ParameterFields*****************************
        Dim crParameterFieldDefinitions As ParameterFieldDefinitions
        Dim crParameterFieldDefinition As ParameterFieldDefinition
        Dim crParameterValues As ParameterValues
        Dim crParameterDiscreteValue As ParameterDiscreteValue
        Dim parameterToDefine As Boolean = False

        crParameterFieldDefinitions = rptengine.DataDefinition.ParameterFields

        For Each crParameterFieldDefinition In crParameterFieldDefinitions
            crParameterDiscreteValue = New ParameterDiscreteValue
            crParameterValues = crParameterFieldDefinition.CurrentValues
            Select Case crParameterFieldDefinition.Name
                Case "sdate"
                    parameterToDefine = True
                    crParameterDiscreteValue.Value = sdate
                Case "edate"
                    parameterToDefine = True
                    crParameterDiscreteValue.Value = edate
                Case "heading"
                    parameterToDefine = True
                    crParameterDiscreteValue.Value = rptHeading
                Case Else
                    parameterToDefine = False
            End Select

            If parameterToDefine Then
                Try
                    crParameterValues.Add(crParameterDiscreteValue)
                    crParameterFieldDefinition.ApplyCurrentValues(crParameterValues)
                Catch ex As Exception
                    objdata.writelog(ex.Message, "frmRptEngine", "frmRptEngine_Load", Server.MapPath("~/Reports"))
                    ShowMsg1("Error in report generation.")
                    Exit Sub
                End Try
            End If
        Next

        rptViewer.ReportSource = Nothing
        rptViewer.ReportSource = rptengine
        rptViewer.Enabled = True
        rptViewer.DataBind()
    Else
        ShowMsg1("Invalid attempt.")
    End If
End Sub
4

1 に答える 1

2

.Net 4.0 以下から 4.5+ に移行されたプロジェクトを実行している私たちのために、私は観察を行いました。ビューアーを含むページがサブディレクトリにある場合、画像の URL は Web アプリケーションのルートではなく、そのページに対して相対的に生成されているようです。たとえば、ページが /gl/accounts.aspx の場合、画像は /gl/crystalimagehandler.aspx のようになります.asax

protected void Application_BeginRequest(object sender, EventArgs e)
        {
            var p = Request.Path.ToLower().Trim();
            if (p.EndsWith("/crystalimagehandler.aspx") && p!= "/crystalimagehandler.aspx")
            {
                var fullPath=Request.Url.AbsoluteUri.ToLower();
                var index = fullPath.IndexOf("/crystalimagehandler.aspx");
                Response.Redirect(fullPath.Substring(index));
            }
        }
于 2014-09-22T23:01:45.217 に答える