Crystal Report公式字段索引在每个新构建

时间:2017-02-28 09:22:13

标签: vb.net indexing crystal-reports formula crystal-reports-2008

我有一个我在CR2008制作的Crystal报表,我正在从vb.net应用程序打印。在此报告中,我有一个图像和一个公式字段。

图像公式(在格式图形>图片>图形位置下设置为名为@imgLocation的公式字段。

在我的vb.net代码中,我有以下块来从数据库中选择保存的文件路径,然后使用此值填充@imgLocation,以设置正在显示的图像。

Try
   Dim logoPath As String = ds.Tables(0).Rows(0).Item("reportLogoPath") & ""

   If logoPath = "" Then
      MessageBox.Show("No logo path has been defined in the System Settings. Please set " & _
                       "one and try again.", "Load Report Failed", MessageBoxButtons.OK)
      Exit Sub
   Else
     cReport.DataDefinition.FormulaFields.Item(2).Text = Chr(34) & logoPath & Chr(34)
   End If

Catch ex As Exception
   errorLog(ex)
End Try

我见过这个工作两次。当我有FormulaFields.Item(2)时,我想要的图像替换了占位符图像,但随后我调整了图像大小并且它不起作用。然后我更改了索引的值,它与FormulaFields.Item(4)一起使用,但在我调整图像大小时再次停止工作。

为什么索引会发生变化,它的方法是什么?

我尝试使用命名参数选项,但FormulaFields.Item("@imgLocation")给了我错误

  

索引无效

修改

根据@Bugs请求,这是显示正确字符串和图像的报告

enter image description here

然后,删除并重新保存图像后(但尺寸略大),参数仍然正确传递,但显示的是占位符图像。

enter image description here

这让我觉得现在它与图像尺寸有关,但是,将其重新调整为原始尺寸仍然没有再显示它。

编辑2

我是否正在加载一个包含报表查看器的新表单,而不是从同一表单中打开它?

 cReport.RecordSelectionFormula = selectionFormula
 Me.Cursor = Cursors.Default
 Dim f As New frmReportViewer(con, cReport, 0)
 f.Show()

Private Sub frmReportViewer_Load(sender As Object, e As EventArgs) Handles MyBase.Load

  Try
     setFormSizes(Me, con)
     Me.Location = New Point((Screen.PrimaryScreen.WorkingArea.Width / 2) - (Me.Width / 2), 10)
     Me.Text = "Report Viewer"

     Dim logOnInfo As New TableLogOnInfo()
     Dim i As Integer

     For i = 0 To cReport.Database.Tables.Count - 1
          logOnInfo.ConnectionInfo.DatabaseName = "comm_db"
          logOnInfo.ConnectionInfo.Password = "Acplus2016!"
          cReport.Database.Tables.Item(i).ApplyLogOnInfo(logOnInfo)
     Next i

     cReport.VerifyDatabase()

      crViewer.ReportSource = cReport
      crViewer.ToolPanelView = CrystalDecisions.Windows.Forms.ToolPanelViewType.None
      crViewer.Zoom(87)

  Catch ex As Exception
      errorLog(ex)

  End Try
End Sub

1 个答案:

答案 0 :(得分:1)

  

请注意我的答案是解决有关添加参数的部分。目前,无可用图像占位符证明难以解决。

要添加参数,请按以下步骤操作:

  1. 在Crystal Reports中添加名为 imageLocation 的参数:

    enter image description here

  2. 确定后,您的列表中应该有如下参数:

    enter image description here

  3. 以下代码会将值传递给参数:

    Dim cReport As New ReportDocument
    cReport.Load("C:\Report.rpt")
    
    If cReport.ParameterFields.Item("imageLocation") IsNot Nothing Then
        cReport.SetParameterValue("imageLocation", "\\SAGE200FS\Sage\StockImages\sc002.jpg")
    End If
    
    reportViewer.ReportSource = cReport
    
  4. 这是输出(我已将参数添加到报告中):

    enter image description here

  5.   

    请注意,如果您传递参数并且它们显示在报告中,请确保您没有cReport.VerifyDatabase()。这通常会抛出一个询问参数值的对话框。

    对话框的屏幕截图:

    enter image description here

    如果不调用cReport.VerifyDatabase(),则会停止显示对话框。

    现在,通过Crystal Reports,您可以使用参数设置图形位置。为此,请将参数添加到报表中并禁止显示该字段(因为您不想看到它)。然后,您可以添加Report Field作为位置。

    1. 将参数添加到报告并禁止显示:

      enter image description here

    2. Report Field添加OLE Object作为图形位置:〜​​=

      enter image description here

    3. 运行报告并输入参数。这将相应地改变图像。请参见两个屏幕截图:

    4. <强> SC001:

      enter image description here

      <强> INT4303:

      enter image description here

        

      然而,这似乎不适用于VB。 ReportViewer无法处理图像的更改。而是留下默认图像。我不确定为什么会这样,我猜测它是Crystal的一个错误。如果有人知道为什么会发生这种情况,请随时发表评论。

      编辑

      在讨论了聊天中的较小点之后,我们似乎已经知道问题是由于文件路径而产生的。由于\\server\...\...\image.png没有显示,因此将其保存到数据库中,但在将其更改为Z:\...\...\image.png之后,它每次都运行良好。这是因为文件路径一直以来。