动态报表及DBGRID字段显示、打印的困惑!(100分)

  • 主题发起人 主题发起人 oceanwave
  • 开始时间 开始时间
O

oceanwave

Unregistered / Unconfirmed
GUEST, unregistred user!
我的报表有五十三个字段,在运行时根据使用者的需要选择需要的字段。我试了几种方法
,但不得要领:
我把SQL语句分成二部分,SELECT和FROM——显示字段部分strSelect,WHERE一查询条件
部分strWhere,由于窗体版面大小,我把显示字段设置和查询条件分别做了两个窗体,来
返回strSelect和strWhere,然后合并提来执行查询。在DBGRID中根据SQL生成的字段显示。
问题出来了,因为各字段的宽度都不相同,总不成让使用者去手工调整吧?不然,五十
三个字段的代码也够让我头大。
只好到这请各位大侠们指教了,有什么更好的做法或者现成的代码,谢谢!
(有代码再加50分)
 
应该有个数据字典什么的预先定义各个字段的属性,输出时根据字段名找到相应的属性...
 
做个循环根据字段名或字段类型来对DisplayFormat来进行设置:
 
各位大侠,能说得更详细一点儿吗?谢谢!
 
我作过几个项目,也遇到过这样的问题,我的解决办法是把所有的字段导出到EXCEL中然后进行
处理,即可!
 
其实您可以使用一个循环,来动态的调整各列的宽度,不过此方法有点烦,我简单说下:
Procedure AutoWidth;
var
i,j:integer;
fld:TField;
clm:Tcolumn;
s:string;
begin
DBGrid1.Columns.Clear;
j:=Query1.Fields.Count-1;
for i:=0 to j do
begin
fld:=Query.Fields;
s:=fld.FieldName;
clm:=DBGrid1.Columns.Add;
if s='Field1Name' then //您可以在Field1Name中指定您程序中的字段名
begin
clm.Width:=120; //width为您自己认为可以的宽度
//FloatFieldFormat(fld):='¥#,##0.00' 您可以进行类似的格式限定
Continue; //进行下一个字端的调整。
end;
if s='Field2Name' then
begin
clm.Width:=80;
Continue;
end;
...... //将对比重复,好在您可以使用拷贝的方法,也不需要自己敲代码哦
end;
end;

有了上面的过程,您就可以在打开结果集后调用该方法来调整DBGrid各列的宽度了。
这是我原来经常使用的方法。不过我是直接在此敲入的,可能会有些小问题,不过思路就
是这样了。
希望能够对您有所帮助。
 
我解决了,方法如下:
在DBGRID中设置好所有的字段显示属性,根据CHECKBOX的选择与否写事件如下:
if chkContractNo.Checked then
begin
if strField='' then //strField为SELECT子句中字段部分
strField:=' C.ContractNo'
else
strField:=strField+',C.ContractNo';
end
else
begin
frmContractList.Printable01:=false; //Printable01,02为确定如果缺少某个
frmContractList.Printable02:=false; //打印必需的字段时,使打印该报表的
//功能不可用。
end;
然后把SELECT子句完成:
frmContractList.strSelect:='SELECT DISTINCT'+strField+
' FROM Contracts AS C INNER JOIN'+
'(SELECT Ls.*,Ps.PName FROM Products AS Ps INNER JOIN '+
'ContractLists AS Ls ON Ps.PNo = Ls.PNo) AS L '+
'ON C.ContractNo = L.ContractNo ';
最后把SQL合并成句:
if strSelect='' then
strSelect:='Select DISTINCT C.* '+
' FROM Contracts AS C INNER JOIN'+
'(SELECT Ls.*,Ps.PName FROM Products AS Ps INNER JOIN '+
'ContractLists AS Ls ON Ps.PNo = Ls.PNo) AS L '+
'ON C.ContractNo = L.ContractNo ';
strSQL:=strSelect+strWhere;
q.DisableControls;
q.Close;
q.SQL.Clear;
q.SQL.Add(strSQL);
q.Open;
q.EnableControls;
搞定:)
 
多人接受答案了。
 
后退
顶部