1

我最近继承了一个旧的 Visual Basic 6/ Crystal Reports 项目,它连接到一个 sql server 数据库。当我尝试运行项目时收到的错误消息(错误# -2147191803 A String is required here)似乎缩小到以下代码中的 .Printout 命令:

        '登录数据库
        设置表 = Report.Database.Tables
        设置表 = Tables.Item(1)

        Table.SetLogOnInfo ConnName, DBName, user, pass
        域名 = CStr(已选择)
        '设置参数字段
            '声明参数持有者
            设置 ParamDefs = Report.ParameterFields
            '存储参数对象
            对于 ParamDefs 中的每个 ParamDef
                使用 ParamDef
                    MsgBox("域名:" + 域名)
                    选择案例 .ParameterFieldName
                        案例“公司名称”
                        .SetCurrentValue 域名

                    结束选择

                    选择案例.名称
                         案例“{?公司名称}”
                         .SetCurrentValue 域名
                    结束选择
                    '标记以查看分配给当前值的内容
                    MsgBox("paramdef:" + ParamDef.Value)
                结束于
            下一个

        Report.EnableParameterPrompting = False

        Screen.MousePointer = vbHourglass
        'CRViewer1.ReportSource = 报告
        'CRViewer1.ViewReport


        测试 = 1
        **报告.打印输出**

        测试 = 测试 + 3

        当前时间 = Str(现在)
        当前时间=替换(当前时间,“/”,“-”)
        当前时间=替换(当前时间,“:”,“-”)
        域名=替换(域名,“。”,“”)

        startName = mPath + "\crysta~1.pdf"
        endName = mPath + "\" + DomainName + "\" + DomainName + " " + currenttime + ".pdf"
        rc = MsgBox("等待 PDF 作业完成", vbInformation, "H/W Report")

        名称 startName 作为 endName
        Screen.MousePointer = vbDefault
    万一

在运行期间,表单显示,ParamDef 变量设置“公司名称”,当它到达提示打印的Report.PrintOut行时,它会抛出错误。我猜水晶报告没有收到“公司名称”来正确运行水晶报告。有谁知道如何诊断这个......无论是在vb6还是水晶报告方面来确定我在这里遗漏了什么?

更新:

  • 插入 CStr(selected) 以强制 DomainName 为字符串
  • 将 msgboxes 插入到 .setcurrentvalue 行上方和下方的 for 循环中
  • 插入 Case "{?Company Name}" 语句以查看是否有助于设置值
  • 尝试了其他论坛网站建议的 .AddCurrentValue 和 .SetCurrentValue 函数
  • 排除这是我的开发环境..将它加载到另一台机器上,在 winxp prof sp2 上运行完全相同的 vb6 水晶报告 8.5 并出现相同的错误。

当我运行 MsgBox(ParamDef.Value) 时,它也会出现相同的缺失字符串错误。我也找不到关于 craxdrt.ParameterFieldDefinition 类的任何文档,以查看还有哪些其他隐藏函数可用。当我看到方法和属性变量的列表时,它没有将 SetCurrentValue 列为函数之一。对此有什么想法吗?

4

6 回答 6

1

selected is a string variable input taken from a form with a drop down select box. I previously put a message box there to ensure there the variable is passing through right before the Report.Printout and it does come up. DomainName variable is also declared as a string type.

于 2008-09-19T16:26:43.547 回答
1

这是我在 Crystal 中设置参数的方法(.NET 附带的——不知道它是否对你有帮助)。

Dim dv As New ParameterDiscreteValue
dv.Value = showphone
rpt.ParameterFields("showphone").CurrentValues.Add(dv)
于 2008-09-19T18:20:10.560 回答
1

您选择的变量的值是多少?

Table.SetLogOnInfo ConnName, DBName, user, pass
DomainName = selected
'设置参数字段

如果它不是字符串,那么这可能是问题所在。Crystal 需要一个字符串变量,当它没有收到预期的内容时,它会抛出错误。

于 2008-09-19T16:13:58.383 回答
0

如果您更改了在报表中使用的字符串列的长度,使其超过 255 个字节,这可能会在 Crystal 报表 8.5 中发生。如果将列类型从 varchar 更改为 nvarchar(双字节字符串!),也会发生这种情况

原因是 Crystal 报告 8.5 将所有超过 255 字节的字符串视为备注字段。

我建议你升级到 Crystal Reports XI——API 没有太大变化。

于 2008-09-22T09:55:09.033 回答
0

从我的角度来看,如果您在 Crystal Reports 设计器中打开报表并切换到预览模式,您应该会收到相同的错误消息。设计器还应该向您显示问题的确切位置的消息,例如不能被视为字符串的字段。

问题不在于无法打印超过 255 个字节的字段。问题是不能在公式中使用超过 255 个字节的字段作为排序标准......

于 2008-09-25T07:13:15.120 回答
0

这是一个设置我们使用的参数的实时示例:

For Each CRXParamDef In CrystalReport.ParameterFields
  Select Case CRXParamDef.ParameterFieldName
    Case "@start"
      CRXParamDef.AddCurrentValue CDate("1/18/2002 12:00:00AM")
    Case "@end"
      CRXParamDef.AddCurrentValue Now
  End Select
Next

这实际上是用 VBScript 编写的用于打印 Crystal 8.5 报表的示例,但语法与 VB6 相同

于 2008-10-21T22:32:56.017 回答