【问题标题】:Crystal Report formula field index changing on each new buildCrystal Report 公式字段索引在每个新版本上都会更改
【发布时间】:2017-02-28 09:22:12
【问题描述】:

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

图像公式(在Format Graphic > Picture > Graphic Location 下设置为名为@9​​87654327@ 的公式字段。

在我的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 的要求,这是显示正确字符串和图像的报告

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

这让我现在想到它与图像大小有关,但是,将其重新调整为原始大小仍然没有再次显示。

编辑 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

【问题讨论】:

  • @Bugs cReport.SetParameterValue("@imgLocation", logoPath) 给出同样的无效索引错误
  • @Crystal Reports 中的错误?我使用数据库专家选择我想要的表格,然后将字段拖到报告上。唯一的SQL 是在代码中从数据库表中获取图像位置,并将其分配给logoPath 变量
  • 只需删除我的 cmets,因为它们不再需要(不想造成混乱)。我一直在试图找到一种方法来设置图像,但我似乎找不到方法。只是想在我走另一条路之前澄清一下。您是否只在页眉中设置一个图像?我假设它是一个徽标,但只是想确认一下。
  • @Bugs 是的,报告上只会有一张图片,但不同的用户会有不同的图片,这就是我从数据库中获取它的原因
  • @Bugs 你说是参数问题还是图片问题?

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


【解决方案1】:

请注意,我的回答是针对添加参数的部分。目前,没有可用的图像占位符在我这边很难解决。

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

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

  2. 按下OK后,您的列表中应该有一个参数,如下所示:

  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. 这是输出(我已将参数添加到报告中):

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

对话框截图:

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

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

  1. 添加参数以报告和抑制:

  2. Report Field 添加为OLE Object:~=

    图形位置

  3. 运行报表并输入参数。这将相应地更改图像。查看两个屏幕截图:

SC001:

INT4303:

然而,这似乎不适用于 VB。 ReportViewer 不处理图像的变化。相反,您将获得默认图像。我不确定为什么会这样,我猜测这是 Crystal 的一个错误。如果有人知道为什么会发生这种情况,请随时发表评论。

编辑

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

【讨论】:

  • 当我在报告中没有参数时,它再次显示“无效索引”,当我添加它时,会出现一个对话框,要求我输入它的值?
  • 嗯,好的。我看不到你的整个代码,但你有cReport.RefreshReport() 或类似的东西吗?如果你这样做,会弹出一个对话框,要求你输入。
  • 我认为是.VerifyDatabase 导致了对话框。我有类似的代码,不要打电话给.VerifyDatabase。我们从来没有遇到过问题。
  • 啊,是的。是的,这正如你所料。参数会显示正确的位置,但显示的图像不正确
  • @David 是的,这是我所能得到的。我不确定 为什么 它没有改变,我仍在寻找,但看起来不太好。我希望其他人会知道原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多