【问题标题】:Parse strange field in Crystal Reports在 Crystal Reports 中解析奇怪的字段
【发布时间】:2009-08-12 23:43:34
【问题描述】:

我正在使用适用于 Visual Studio 2008 的 Crystal Reports Basic 从数据库生成报告。在数据库中有一个称为数据的“结构化数据”字段。 它是一种表示 Hashtable 的方式,格式为:

XLLLKeyYMMMValue 在哪里: X 是 Key 的长度 L 是 Key 的长度 Y是Value的长度 M 是值的长度

如果我要编码

姓名 = 约翰·罗伯特·奥克斯利 可怜的小开发者年龄 = 27

我会的。

名称(L = 4 因此 X = 1) 约翰·罗伯特·奥克斯利 (M = 17 因此 Y = 2) 可怜的小开发者的年龄(L = 28 因此 X = 2) 27(M = 2 因此 Y = 1)

因此该记录的字段将包含

14姓名223约翰·罗伯特·奥克斯利228贫穷小开发者的时代1227

我知道报告中有许多我想要的字段。但是,它们可能不在表中的数据字段中。现在回答我的问题

  • 我猜我必须创建一个自定义函数 parseStructuredData(data, field),它返回我想要的字段,如果不存在则返回 null。
  • 网络上是否有任何关于自定义函数的资源或我应该为 Crystal Reports 购买的书籍(最好是电子书),因为我的经验很少?
  • 那我是否使用“公式字段”将其放在报表上?

更新这是在 MS SQL 服务器上运行,但我不想使用存储过程来解析数据,因为我不想修改数据库。

【问题讨论】:

  • 我正在努力不让这成为“为我做我的工作”的问题
  • 什么数据库平台?我认为编写一个存储过程来进行解析并将其用于水晶中的数据源会更容易和更好。不管你在哪里解析,我都不希望在大表上表现出色。

标签: crystal-reports


【解决方案1】:

我在您的编辑中看到您不想修改数据库,但是如果没有存储过程将其转换为更多的表格视图,即使不是不可能,获得您正在寻找的输出也将非常困难。即使您能够在 Crystal 中执行此操作,我想您也必须使用循环和字符串操作,在每一行上执行这些计算会非常缓慢并且需要大量处理器。

我建议您在存储过程中使用 T-SQL 或临时表来格式化数据,而不是尝试在 Crystal 中进行。当然,在 SQL Server 中使用游标可能会更慢,我相信它会比在 Crystal 中快得多。

编辑:我错过了您所说的使用 VS2008 执行此操作的部分。如果您不想在 SP 中执行此操作,因为您不想更改数据库,那么您可以创建一个函数来执行此操作,该函数将 ArrayList 或 DataTable 作为报告数据源传递。

我将尝试重新调查一下并编辑我的答案,以提供我如何在存储过程或函数中执行此操作。

【讨论】:

  • +1 这不是你真正想要在水晶中做的事情。你可以,但除非你了解很多 CR,否则它会很笨拙且难以理解。
【解决方案2】:

这是我的功能。它比罪恶更丑陋,我为将其发布在互联网上而感到羞耻。但它有效。以前没有正确使用过VB,所以这里是:

Function ParseStructData (struct As String, key As String) As String
    Dim leng As Number
    Dim ll As Number
    Dim data As String
    Dim rest As String
    Dim kk As String

    rest = struct

    Do
        ll = Val(Left(rest, 1))
        If ll < 1 Then
            Exit Function
        End If
        rest = Right(rest, Len(rest) - 1)
        leng = Val(Left(rest, ll))
        rest = Right(rest, Len(rest)-ll)
        kk = Left(rest, leng)
        rest = Right(rest, Len(rest)-leng)
        ll = Val(Left(rest, 1))
        rest = Right(rest, Len(rest)-1)
        leng = Val(Left(rest, ll))
        rest = Right(rest, Len(rest)-ll)

        data = Left(rest, leng)
        If kk = key Then
            ParseStructData = data
            Exit Function
        End If
        rest = Right(rest, Len(rest)-leng)
    Loop Until Len(rest) <= 0

End Function

如果有人可以提出更好的功能,请给出答案。

【讨论】:

    猜你喜欢
    • 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
    相关资源
    最近更新 更多