一个关于FastReport的问题。

sisssoft 2019-10-12 03:25:01
如题,我是用FastReport做的一个dll,用来打印的。

我在主程序中,处理好了多个数据集,然后再调用dll。
代码大概如下:

function TSysPrint.xpprint(order_code: string; bo: boolean = true): Integer;
var
sql, sl, s2, s, youhui: string;
qry, qry1, qry2, qry4: TSynQry;

i: Integer;
DataSet: TClientDataSet;
json: tjson;
list: TStringList;
plist: TStrings;
begin
if Syssetup.Printbool = false then
begin
Exit;
end;
if FmoneyCom.bool then
syssdk.OpenUSBMoneyBox;
try
try
qry := FTReport.Query;
qry1 := FTReport.Query;
qry2 := FTReport.Query;

qry4 :=FTReport.Query;
list := TStringList.Create;

i := 0;

sql := 'select * from retail_order where order_code=' + QuotedStr(order_code);
syssdk.SqlQuery(sql, qry2);

sql := 'select 数量,type from vi_xiao where 订单号=' + QuotedStr(order_code);
syssdk.SqlQuery(sql, qry);
while not qry.Eof do
begin
if qry.FieldByName('type').AsInteger = 2 then
i := i + 1
else
i := i + qry.FieldByName('数量').AsInteger;
qry.Next;
end;
sl := inttostr(i);
//,
sql := 'SELECT 原价-现价 as 优惠,* from vi_xiao where 订单号=' + QuotedStr(order_code);

qry.Filter := '商品列表';
syssdk.SqlQuery(sql, qry);

sql := 'SELECT sum(price) as price,attr_name FROM vi_attr_vs where order_code=' + QuotedStr(order_code) + ' group by attr_code';
syssdk.SqlQuery(sql, qry4);
qry4.Filter := '商品属性';

sql := 'select * from vi_xiao where 状态=2 and 订单号=' + QuotedStr(order_code);
syssdk.SqlQuery(sql, qry1);
DataSet := TClientDataSet.Create(nil);
sysJSON.QuerytoDataSet(qry1.DataSet, DataSet, 'Fsum,id');

DataSet.First;
i := DataSet.RecordCount;
i := 0;
while not DataSet.Eof do
begin
DataSet.Edit;
DataSet.FieldByName('id').AsInteger := i;
DataSet.FieldByName('Fsum').AsString := syssdk.sfloat(DataSet.FieldByName('金额').AsFloat);

DataSet.Post;
DataSet.Next;
Inc(i);
end;
s := DataSet.FieldByName('pay_method').AsString;
s := DataSet.FieldByName('Fsum').AsString;
i := DataSet.RecordCount;
DataSet.Filter := '支付列表';

plist := TStringList.Create;

print_storexx('零售', plist);
plist.AddPair('收银员', userjson._[0].s['cas_name']);
plist.AddPair('下单时间', syssdk.UnixDateToDateTime(qry2.FieldByName('addtime').AsInteger));
plist.AddPair('订单号', order_code);

syssdk.frxprint(plist, qry.DataSet, qry4.DataSet, DataSet, Forder_print.printfile, Forder_print.Name, Forder_print.copies,Forder_print.Line_number,Forder_print.wholeprint,Forder_print.cuttingbool, bo);



dll中对应的frxprint涵数大致如下:

procedure TTest.Frxprint(Alist: Pointer{TStrings}; FileName, PrinterName: pchar; Number: Integer; Openpreview: BOOL; ds1: Pointer{TDataSet}; ds2: Pointer{TDataSet}; ds3: Pointer{TDataSet}; ds4: Pointer{TDataSet});
var
i: Integer;
Category: TfrxVariable;
FileNames, PrinterNames, uname: AnsiString;
frxbrcdbjct1: TfrxBarCodeObject;
Ffrxrprt1: TfrxReport;
frxdsgnr1: TfrxDesigner;
Ffrxdbdtst1: TfrxDBDataset;
Ffrxdbdtst2: TfrxDBDataset;
Ffrxdbdtst3: TfrxDBDataset;
Ffrxdbdtst4: TfrxDBDataset;
begin

try
Flist := TStringList.Create;
frxbrcdbjct1 := TfrxBarCodeObject.Create(Self);
Ffrxrprt1 := TfrxReport.Create(Self);
frxdsgnr1 := TfrxDesigner.Create(self);
Ffrxdbdtst1 := TfrxDBDataset.Create(Self);
Ffrxdbdtst2 := TfrxDBDataset.Create(Self);
Ffrxdbdtst3 := TfrxDBDataset.Create(Self);
Ffrxdbdtst4 := TfrxDBDataset.Create(Self);
Ffrxrprt1.OnGetValue := Ffrxrprt1GetValue;

FileNames := FileName;
PrinterNames := PrinterName;
if tstrings(Alist) <> nil then
Flist.CommaText := tstrings(Alist).CommaText;
Ffrxdbdtst1.UserName := '空';
Ffrxdbdtst2.UserName := '空';
Ffrxdbdtst3.UserName := '空';
Ffrxdbdtst4.UserName := '空';

if ds1 <> nil then
begin
Ffrxdbdtst1.DataSet := TDataSet(ds1);
uname := TDataSet(ds1).Filter;
Ffrxdbdtst1.UserName := uname;
end;

if ds2 <> nil then
begin
Ffrxdbdtst2.DataSet := TDataSet(ds2);
uname := TDataSet(ds2).Filter;
Ffrxdbdtst2.UserName := uname;
end;

if ds3 <> nil then
begin
Ffrxdbdtst3.DataSet := TDataSet(ds3);
uname := TDataSet(ds3).Filter;
Ffrxdbdtst3.UserName := uname;
end;

if ds4 <> nil then
begin
Ffrxdbdtst4.DataSet := TDataSet(ds4);
uname := TDataSet(ds4).Filter;
Ffrxdbdtst4.UserName := uname;
end;

Test.log(PChar('PReportZZQ:TDataSet(ds3).FieldsCount=' + TDataSet(ds3).FieldCount.tostring + ' Ffrxdbdtst3.FieldsCount=' + Ffrxdbdtst3.FieldsCount.ToString));



现在就是发现TDataSet(ds3).FieldsCount跟主程序中的值是一样的,是正确的。
而Ffrxdbdtst3.FieldsCount确不对。
对应的Ffrxdbdtst1和Ffrxdbdtst2也是正确的。
求大师指点下,我是哪个地方弄的不对?或是要怎么处理才可以?
...全文
122 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
sisssoft 2019-10-13
  • 打赏
  • 举报
回复
实在是找不到是哪的原因了。奇怪。
delphi的大神们,能帮忙诊断下不?
sisssoft 2019-10-12
  • 打赏
  • 举报
回复
有大神愿意帮帮我么?
sisssoft 2019-10-12
  • 打赏
  • 举报
回复
不明白dll中为何
Ffrxdbdtst3.DataSet := TDataSet(ds3);
这里有什么问题,而导至数据集不对?


Ffrxdbdtst2.DataSet := TDataSet(ds2);和
Ffrxdbdtst1.DataSet := TDataSet(ds1);
确都是正常的。
这个指南让你熟悉报表设计器和了解报表设计的基本概念(各种区域,数据源,二次表,等等)。指南将帮助你开始用FastReport创建报表,但它不能告诉你怎样使用其它基本的报表设计器。 如果你不熟悉报表设计器,我们建议你参考QuickReport的帮助系统。QuickReport的指南已经包含在你的Delphi拷贝中。QuickReport的大部分基本概念也适用于FastReport,然而,FastReport能提供更多的弹性和最终用户的自定义。 关于FastReport的说明 FastReport是高弹性的报表设计器,用于报表的数据可以从任何类型的数据源获取,包含字符列表,BDE数据库,ADO数据源(不使用BDE),Interbase(使用IBO),Pascal数组和记录,以及一些不常用的数据源。 整个FastReport系统是用Delphi的Pascal编写的。FastReport不需要动态链接库,但需在你的项目中占用大约400kb(Delphi 5)。如果你想最终用户拥有设计能力,这将在你的.EXE中增加大约500kb。虽然这看上去比较大,但这只是其它设计的几分之一。你同样应该考虑到FastReport不仅仅只是包含最终用户更改报表设计的能力,还能够适应查询和数据库的变化。FastReport还包含自己的脚本语言,让应用程序和最终用户能够更容易地改变报表。如果你的大部分应用使用FastReport,你可以简单地配置FastReport BPL(大约1400kb)而所有你的应用程序只需要保留很少的一部分。 你可以发现FastReport一个非常吸引人的用户界面,使用最新的用户界面组件,例如可停靠的工具栏。你的最终用户将会非常愿意使用这个设计器,只需使用鼠标就可以创建大多数报表。 FastReport是名副其实的快速报表:较其它一些Delphi报表设计器而言,你可以发现没有什么可以接近于它的开发速度。报表预览窗口一直是大多数报表设计器的弱点,高品质的外观,赋于你的应用程序非常专业的用户界面。 FastReport一个已经拥有三年历史的非常成熟的报表设计器,成长使它拥有其它Delphi报表设计器所不能相比的诸多先进特性。
这个指南让你熟悉报表设计器和了解报表设计的基本概念(各种区域,数据源,二次表,等等)。指南将帮助你开始用FastReport创建报表,但它不能告诉你怎样使用其它基本的报表设计器。 如果你不熟悉报表设计器,我们建议你参考QuickReport的帮助系统。QuickReport的指南已经包含在你的Delphi拷贝中。QuickReport的大部分基本概念也适用于FastReport,然而,FastReport能提供更多的弹性和最终用户的自定义。 关于FastReport的说明 FastReport是高弹性的报表设计器,用于报表的数据可以从任何类型的数据源获取,包含字符列表,BDE数据库,ADO数据源(不使用BDE),Interbase(使用IBO),Pascal数组和记录,以及一些不常用的数据源。 整个FastReport系统是用Delphi的Pascal编写的。FastReport不需要动态链接库,但需在你的项目中占用大约400kb(Delphi 5)。如果你想最终用户拥有设计能力,这将在你的.EXE中增加大约500kb。虽然这看上去比较大,但这只是其它设计的几分之一。你同样应该考虑到FastReport不仅仅只是包含最终用户更改报表设计的能力,还能够适应查询和数据库的变化。FastReport还包含自己的脚本语言,让应用程序和最终用户能够更容易地改变报表。如果你的大部分应用使用FastReport,你可以简单地配置FastReport BPL(大约1400kb)而所有你的应用程序只需要保留很少的一部分。 你可以发现FastReport一个非常吸引人的用户界面,使用最新的用户界面组件,例如可停靠的工具栏。你的最终用户将会非常愿意使用这个设计器,只需使用鼠标就可以创建大多数报表。 FastReport是名副其实的快速报表:较其它一些Delphi报表设计器而言,你可以发现没有什么可以接近于它的开发速度。报表预览窗口一直是大多数报表设计器的弱点,高品质的外观,赋于你的应用程序非常专业的用户界面。 FastReport一个已经拥有三年历史的非常成熟的报表设计器,成长使它拥有其它Delphi报表设计器所不能相比的诸多先进特性。

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧