使用 vb.net 对 Crystal 报告数据进行排序

Sorting on Crystal Reports Data using vb.net

现在我正在处理 crystal 报告以显示销售详细信息。我使用 adodb 连接和数据集在我的 crystal 报告中动态填充数据。

我的输出喜欢显示这种格式,

Inv.No     Vendor   Salevalue  Tax   Total

 R1          xxx       10000    100   10100
 R10         yyy       15000    500   15500
 R2          zzz       1000      10    1010
 R3          vvv       2500      50    2550

预期输出是,

  Inv.No     Vendor   Salevalue   Tax   Total

  R1          xxx       10000    100   10100
  R2          zzz       1000      10    1010
  R3          vvv       2500      50    2550
  R10         yyy       15000    500   15500

实际上我在报告中使用了 Inv.No 明智的排序选项。

看起来列 "Inv.No" 是字符串类型,排序是 "correct" 因为这是字符串排序的方式。您可以有一个仅包含 "Inv.No" 数值的背景列并按其排序。 第二种但不太优雅的解决方案是按具有值

的字段排序
Right("              " & {Inv.No},15)

所以它像数字一样对齐,但我不推荐它。

由于您的 Inv. No 列包含字符串文本,因此它按字母顺序对列进行排序,将 R10 放在 R1 和 R2 之间。要更正此问题并按数字对它们进行排序,您将需要创建一个仅包含数字数据的新数据列。

如果您的 Inv. No 数据始终采用 1 个字符后跟数字的格式,您可以使用具有以下公式的公式字段来捕获数字数据,然后使用此对记录进行排序公式字段。

ToNumber(Mid ({Table.Inv_No}, 2));

但是,如果数据有可能不是数字,那么这只会引发错误。

解决此问题的最佳方法是在 VB.NET 或 SQL 中编辑您的数据源,以包含一个数字列来控制您的排序。公式方法可以在紧要关头起作用,但如果您的发票编号的结构发生变化,那么如果它与公式有任何冲突,它可能会破坏报告。

如果我处在您的位置,我不会在 Crystal 报告中进行操作,而是通过 sql 进行操作,这将为我提供所需的准确排序顺序。稍后我会将相同的数据移动到 Crystal 报告,并显示列值。

select
 CAST(SUBSTRING(yourColName, PATINDEX('%[0-9]%', yourColName), 
 LEN(yourColName)) AS INT) RL_Num
FROM TableName
ORDER BY  RL_Num

这将是您在 SQL 中的输出,所以在 Crystal 报告中。

以下公式与 R. McMillan 的回答大致相同,但进行了一些错误检查 即使发票号为空或格式不同,报告也不会中断。

If Not IsNull({yourTable.InvNo}) Then
    If IsNumeric(Replace({yourTable.InvNo}, "R","")) Then
        ToNumber(Replace({yourTable.InvNo}, "R",""))
    Else
        -1
Else
    -1

(不同格式的发票将显示在顶部。)