我正在使用MySQL和Delphi XE4构建一个应用程序。
数据库中有大量数据,我在查询中使用了FORMAT函数来应用千位分隔符!

SELECT Field1,FORMAT((Field2 * Coef), 0) AS blabla FROM MyTable WHERE .....

一切都很好,但是当我试图在fastreport中添加SUM函数时,发生了一个逻辑错误!
FORMAT函数以字符串形式返回结果,SUM函数连接字符串!!!
SUM(frxDBDataset1."blabla",MasterData1)

Product1| 123,500,000
Product2| 1,455,999,100
________________________________
SUM = 123,500,000-1,455,999,100

在DBGrid中显示千位分隔符的最佳方式是什么!
我正在考虑在“OnGetText”事件中应用千位分隔符。当recordcount>5000时,这种方法是否会导致延迟在DBGrid中显示数据?
你有什么建议吗?

最佳答案

在查询中格式化结果确实是个坏主意。该查询应用于检索信息。。。报告应该在别处处理。在本例中,我将使用(实际上,我确实使用)DisplayFormat,如注释中所建议的。
如果您不总是希望在设计时将字段添加到TDataSet,也可以编写一些代码来自动格式化:

DataSet.Open;
For I := 0 To DataSet.Fields.Count - 1 Do Begin
    If DataSet.Fields[I] Is TFloatField Then
        (DataSet.Fields[I] As TNumericField).DisplayFormat := '###,###,##0.00'
    Else If DataSet.Fields[I] Is TIntegerField Then
        (DataSet.Fields[I] As TNumericField).DisplayFormat := '###,###,##0';
End;

这应该适合你的实际需要。。。例如,您可以从BD读取元数据(这取决于BD)来决定精度。
在FastReport中,也可以使用DisplayFormat,或者也可以使用备忘录中的format函数:[Format('%.2n', [<DataSet."Field">])],其中.2表示要使用的精度。
编辑:为了解决负号出现在右边的问题,我相信您确实需要使用BiDiMode = bdRightToLeft事件。我想你自己已经找到了这个解决办法,但为了完整起见,我还是把它包括在内:
procedure TForm1.FieldGetText(Sender: TField; var Text: String; DisplayText: Boolean);
var
  FmtStr: string;
  F: Double;
begin
  F := Sender.AsFloat;
  FmtStr := TNumericField(Sender).DisplayFormat;
  if Sign(F) = -1 then
    Text := '-' + FormatFloat(FmtStr, Abs(F))
  else
    Text := FormatFloat(FmtStr, F)
end;

关于mysql - DBGrid中的千位分隔符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21549666/

10-13 09:40