DBGridEh空件的使用问题(50分)

  • 主题发起人 主题发起人 xuejinlong
  • 开始时间 开始时间
X

xuejinlong

Unregistered / Unconfirmed
GUEST, unregistred user!
DBGridEh有n列
0 1 2 3 4 5 ......n
如下列所对应的字段相同
1=2 3=4 5=6......n-1 = n
所有字段为整型数据
奇数列显示字段值,偶数列显示相对应奇数列的值除以0列值所得的百分数
如果某个数据为0则显示为空白相应的百分数列也为空白。
对于各个列的显示我已经做了OnGetText
但是每列的合计(Footer)该如何办呢?主要是百分数的列,在合计时如何写代码?

用过的朋友指点一下。我现在急用。谢谢!
 
请高人指导!我自己写的OnGetText也不行呀,如何实现我的想法呢?

总人数 A人数 A比例 B人数 B比例 C人数 C比例........
100 9 9% 11 11% 10 10% .......
50 7 14% 12 24% 3 6%.........
........................................................
 
(1)这是一个GetText的例子
procedure TfrmZwclZzKmzz.q1amt_debitGetText(Sender: TField;
var Text: String; DisplayText: Boolean);
begin
if sender.AsCurrency =0 then
text:=''
else
text:=format('%.2f',[sender.ascurrency]);
if sender.AsCurrency <0 then text:=format('%.2f',[0-sender.ascurrency]);
end;
(2)一个Footer值显示的例子
with frmdm.dq1 do
begin
sql.Clear;
sql.Add('select sum(this_od),sum(this_oc) from tmpview where acc_index=1');
open;
dbgeh.Columns[4].Footer.value:=format('%.2f',[fields[0].ascurrency]);
dbgeh.Columns[5].Footer.value:=format('%.2f',[fields[1].ascurrency]);
end;
(3)合计:先建一计算字段对象,即FieldKind为fkCalculated 示例如下:
procedure TfrmZwclJcszJcsz.Q1CalcFields(DataSet: TDataSet);
var
thecurr:currency;
begin
//偶数列显示相对应奇数列的值除以0列值所得的百分数
if thecurr>0 then q1.FieldByName('sum_od').ascurrency:=thecurr;
end;
 
关键问题是,如果 A人数 A比例 两列应该如何连接FieldName
如果用一个字段,则OnGetText计算比例并显示后, A人数这一列也显示成比例数了。
如果给不同的字段,我的表也没有那么多空余(不参与统计显示)字段呀。
 
得,给你写个例子,已经测试通过。

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DB, ADODB, Grids, DBGridEh;
type
TForm1 = class(TForm)
DBGridEh1: TDBGridEh;
ADOQuery1: TADOQuery;
DataSource1: TDataSource;
ADOQuery1zrs: TIntegerField;
ADOQuery1Ars: TIntegerField;
ADOQuery1Brs: TIntegerField;
ADOQuery1SumA: TCurrencyField;
ADOQuery1SumB: TCurrencyField;
Button1: TButton;
ADOQuery2: TADOQuery;
procedure ADOQuery1CalcFields(DataSet: TDataSet);
procedure Button1Click(Sender: TObject);
procedure ADOQuery1SumAGetText(Sender: TField; var Text: String;
DisplayText: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ADOQuery1CalcFields(DataSet: TDataSet);
begin
DataSet.FieldByName('SumA').AsString:=format('%.2f',[DataSet.fieldbyname('Ars').AsCurrency/DataSet.fieldbyname('Zrs').AsCurrency]);
DataSet.FieldByName('SumB').AsString:=format('%.2f',[DataSet.fieldbyname('Brs').AsCurrency/DataSet.fieldbyname('Zrs').AsCurrency]);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if not adoquery1.Active then adoquery1.Open;
with adoquery2 do
begin
close;
sql.Text:='select sum(Zrs),sum(Ars),sum(Brs) from cal';
open;
dbgrideh1.Columns[2].Footer.value:=format('%.2f',[(fields[1].ascurrency/fields[0].ascurrency)*100])+'%';
dbgrideh1.Columns[4].Footer.value:=format('%.2f',[(fields[2].ascurrency/fields[0].ascurrency)*100])+'%';
end;
end;

procedure TForm1.ADOQuery1SumAGetText(Sender: TField; var Text: String;
DisplayText: Boolean);
begin
Text:=floattostr(Sender.AsCurrency*100)+'%';
end;

end.
 
如果还不清楚,给我邮箱,源码给你发过去。^_^
 
分数还是给你吧,我表达的不是很清楚,害你受苦了。你的答案不是我想要的。不好意思。

谢谢你的帮助,问题我已经解决了。

祝你好运
 
呵呵,不用客气,也祝你好运。
 
后退
顶部