来者有分,急急急!***300分*** QuickReport动态创建表达式的问题,在动态库中得到了传进来的DataSet,如何在QrExpr的Expressi

  • 主题发起人 主题发起人 macrowdw
  • 开始时间 开始时间
M

macrowdw

Unregistered / Unconfirmed
GUEST, unregistred user!
来者有分,急急急!***300分*** QuickReport动态创建表达式的问题,在动态库中得到了传进来的DataSet,如何在QrExpr的Expression中使用DataSet的字段信息,如:DataSet.Field1+DataSet.Field2? (300分)<br />我在做一个打印的动态库,
在动态库中得到了传进来的DataSet,
现要把DataSet中的内容以QrExpr的形式放到QrDetailBand上,
使其显示DataSet的内容或是与表达式的组合,
如何在QrExpr的Expression中使用DataSet的字段信息,
如:DataSet.Field1+DataSet.Field2?
我试了一下,结果QuickReport不识别DataSet,说是未知函数,
又试了一下QuickReport.AllDataSet.Add(DataSet);
又报错,该如何解决呢?
QuickReport中QrExpr中设置的数据库如果不是现成的Table或Query,而是
传进Dll的DataSet,应如何使用?
问题很急,提供思路就发分!
 
可以在传进去之前计算好。
qrlable.caption:=formatfloat('0.00',vlaue);
 
to ugvanxk
必须用QrExpr,因为只知道有一个表头的HDataSet,一个表体的BDataSet,
还有打印报表的格式信息(以上是传递的参数),打印的信息中包含表达式,所以决定使用
QrExpr,让QR去解析表达式,现在的问题是如何让QrExpr中的Expression支持传进来的
HDataSet及BDataSet,如:(HDataSet.Field1+100)/2
 
用过的帮帮忙!提个思路也行!
 
再放一个dataset在表单上,
dataset:=dll.dataset
不知道能不能把DATASET导出来,
如果能的话,就好办了
 
to dh12001:
我试过了,好象不行!
 
以前是用QrLable做的,现在分换成QrExpr,都要做完了,就差为QrExpr的表达式
赋值DataSet.field1时不对,QR报表是没有函数!
 
能不能修改数据库结构?
让field3=field1+field2,
这样你就可以很简单的把这个问题解决了吧
 
我也出现过类似的问题,后来我把QuickReport的DataSet属性设置成QrExpr中用到的那个数据集就OK了(也就是QuickReport的DataSet和QrExpr的表达式中用到的DataSet要一致才行)
 
to Ynhhr
终于找到了知音,问题又来了,你说的办法我也试过,但是QrExpr的内容是用在主表的
话还可以,现在要用在明细表上,可就是说,有HDataSet(主表)及BDataSet(明细表),
HDataSet的问题可以解决,BDataSet的记录要作为明细记录随DataSet中的内容显示多条,
只将QrExpr的内容设为QuickReport.DataSet,报表内容不会随记录移动!
请多多帮忙,解决马上发分!
 
to Ynhhr
是否能给个E-mail,QQ,最好是电话!我直接问一下!
我的E-mail:wangdawei@freemail.com.cn
电话:0532-5842636-362 王大伟
 
等了一晚上了!
 
明天再试!
 
这个到还的确不太会弄:(
是不是能够动态的给QuickReport的DataSet属性值(传进来的那个)?然后设置Exp的内容?
类似代码:
QuickReport1.DataSet := ADataSet;
QExp1.(什么属性忘记了:)) := fld1 + fld2;
 
to macrodw:
QRSubDetail1中的QrExpr的内容不必设为QuickReport.DataSet
以下是我简单测试的例子(Unit1.dfm文件和Unit1.pas文件的部分)。
Unit1.dfm文件:
object Form1: TForm1
Left = 192
Top = 107
Width = 544
Height = 375
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
Scaled = False
OnShow = FormShow
PixelsPerInch = 96
TextHeight = 13
object QuickRep1: TQuickRep
Left = -50
Top = 65
Width = 794
Height = 1123
Frame.Color = clBlack
Frame.DrawTop = False
Frame.DrawBottom = False
Frame.DrawLeft = False
Frame.DrawRight = False
DataSet = Table1
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -13
Font.Name = 'Arial'
Font.Style = []
Functions.Strings = (
'PAGENUMBER'
'COLUMNNUMBER'
'REPORTTITLE')
Functions.DATA = (
'0'
'0'
'''''')
Options = [FirstPageHeader, LastPageFooter]
Page.Columns = 1
Page.Orientation = poPortrait
Page.PaperSize = A4
Page.Values = (
100
2970
100
2100
100
100
0)
PrinterSettings.Copies = 1
PrinterSettings.Duplex = False
PrinterSettings.FirstPage = 0
PrinterSettings.LastPage = 0
PrinterSettings.OutputBin = Auto
PrintIfEmpty = True
SnapToGrid = True
Units = MM
Zoom = 100
object DetailBand1: TQRBand
Left = 38
Top = 78
Width = 718
Height = 40
Frame.Color = clBlack
Frame.DrawTop = False
Frame.DrawBottom = False
Frame.DrawLeft = False
Frame.DrawRight = False
AlignToBottom = False
Color = clMoneyGreen
ForceNewColumn = False
ForceNewPage = False
Size.Values = (
105.833333333333
1899.70833333333)
BandType = rbDetail
object QRExpr1: TQRExpr
Left = 152
Top = 8
Width = 161
Height = 17
Frame.Color = clBlack
Frame.DrawTop = False
Frame.DrawBottom = False
Frame.DrawLeft = False
Frame.DrawRight = False
Size.Values = (
44.9791666666667
402.166666666667
21.1666666666667
425.979166666667)
Alignment = taLeftJustify
AlignToBand = False
AutoSize = True
AutoStretch = False
Color = clWhite
ResetAfterPrint = False
Transparent = False
WordWrap = True
Expression = '''C ustNo: '' + Table1.CustNo'
FontSize = 10
end
end
object ColumnHeaderBand1: TQRBand
Left = 38
Top = 38
Width = 718
Height = 40
Frame.Color = clBlack
Frame.DrawTop = False
Frame.DrawBottom = False
Frame.DrawLeft = False
Frame.DrawRight = False
AlignToBottom = False
Color = clWhite
ForceNewColumn = False
ForceNewPage = False
Size.Values = (
105.833333333333
1899.70833333333)
BandType = rbColumnHeader
end
object QRSubDetail1: TQRSubDetail
Left = 38
Top = 118
Width = 718
Height = 40
Frame.Color = clBlack
Frame.DrawTop = False
Frame.DrawBottom = False
Frame.DrawLeft = False
Frame.DrawRight = False
AlignToBottom = False
Color = clWhite
ForceNewColumn = False
ForceNewPage = False
Size.Values = (
105.833333333333
1899.70833333333)
Master = QuickRep1
DataSet = Table2
PrintBefore = False
PrintIfEmpty = True
object QRExpr2: TQRExpr
Left = 208
Top = 16
Width = 371
Height = 17
Frame.Color = clBlack
Frame.DrawTop = False
Frame.DrawBottom = False
Frame.DrawLeft = False
Frame.DrawRight = False
Size.Values = (
44.9791666666667
550.333333333333
42.3333333333333
981.604166666667)
Alignment = taLeftJustify
AlignToBand = False
AutoSize = True
AutoStretch = False
Color = clWhite
ResetAfterPrint = False
Transparent = False
WordWrap = True
Expression = '''OrderNo: '' + Table2.OrderNo+'' SaleDate: ''+Table2.SaleDate'
FontSize = 10
end
end
end
object DataSource1: TDataSource
DataSet = Table1
Left = 104
Top = 16
end
object Table1: TTable
Active = True
DatabaseName = 'BCDEMOS'
TableName = 'customer.db'
Left = 152
Top = 16
end
object Table2: TTable
Active = True
DatabaseName = 'BCDEMOS'
IndexName = 'CustNo'
MasterFields = 'CustNo'
MasterSource = DataSource1
TableName = 'orders.db'
Left = 200
Top = 16
end
object DataSource2: TDataSource
DataSet = Table2
Left = 288
Top = 16
end
end
在Uunit1.pas中加入OnShow事件:
procedure TForm1.FormShow(Sender: TObject);
begin
Table1.Open;
Table2.Open;
QuickRep1.Preview;
end;
 
to ynhhr
谢谢您的热心帮助!
您的程序我看了一下,与我要的程序不同之处在于:
您的程序在窗体上直接放了两个Table,所以程序直接能取出来,
而我的程序是在做打印的DLL,具体实现如下:
1、在Formula one 中定义好打印的格式信息,保存在数据库中
2、在打印时调用我写的DLL文件
1)读出Formula One的格式信息
2)根据Formula One的格式动态创建QurickRep
3)DLL传入参数其中有两个是表头的HDataSet及表体的BDataSet
4)根据DataSet的内容,设置QuickRep中的QrExpr.Expression
5)设置QuickRep.DataSet:=BDataSet
6)QrExpr的表达式如何写:是BDataSet.Field1? 报错!
不管怎么说还是感谢你!
 
是不是你传进来的HDataSet和BDataSet的Master/Detail关系没设定好?建议你确认一下。
传进来的和直接在窗体上放DataSet应该没什么区别。
还有你的HDataSet和BDataSet是否给它们分配了实际的内存?
 
呵呵,我来拿分了,不过因为教育网比较慢,这地方比较少来

打印前动态生成QrExpr的Expression字串
如果知道dataset的名字,如:query1,query2,就
QrExpr.Expression := 'query1.a+query2.b'(a,b是field的名)
如果不知道就用
QrExpr.Expression := dataset1.name+'.'+dataset1.fields[1].name+'+dataset2.name+'.'+dataset2.fields[2].name
大概思路就那样,具体的自己实现吧
 
少数不多,请见谅!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部